libMesh
Public Types | Public Member Functions | Static Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes | Static Protected Attributes | List of all members
libMesh::FEL2Hierarchic< Dim > Class Template Reference

Discontinuous Hierarchic finite elements. More...

#include <fe.h>

Inheritance diagram for libMesh::FEL2Hierarchic< Dim >:
[legend]

Public Types

typedef FEGenericBase< typename FEOutputType< T >::type >::OutputShape OutputShape
 
typedef TensorTools::IncrementRank< OutputShape >::type OutputGradient
 
typedef TensorTools::IncrementRank< OutputGradient >::type OutputTensor
 
typedef TensorTools::DecrementRank< OutputShape >::type OutputDivergence
 
typedef TensorTools::MakeNumber< OutputShape >::type OutputNumber
 
typedef TensorTools::IncrementRank< OutputNumber >::type OutputNumberGradient
 
typedef TensorTools::IncrementRank< OutputNumberGradient >::type OutputNumberTensor
 
typedef TensorTools::DecrementRank< OutputNumber >::type OutputNumberDivergence
 

Public Member Functions

 FEL2Hierarchic (const FEType &fet)
 Constructor. More...
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 Subdivision finite elements. More...
 
Real shape (const ElemType, const Order, const unsigned int libmesh_dbg_var(i), const Point &)
 
Real shape (const Elem *, const Order, const unsigned int libmesh_dbg_var(i), const Point &, const bool)
 
Real shape (const ElemType, const Order order, const unsigned int i, const Point &p)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order, const unsigned int libmesh_dbg_var(i), const Point &)
 
Real shape (const Elem *, const Order, const unsigned int libmesh_dbg_var(i), const Point &, const bool)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *libmesh_dbg_var(elem), const Order, const unsigned int, const Point &, const bool)
 
Real shape (const ElemType, const Order, const unsigned int libmesh_dbg_var(i), const Point &)
 
Real shape (const Elem *, const Order, const unsigned int libmesh_dbg_var(i), const Point &, const bool)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *elem, const Order libmesh_dbg_var(order), const unsigned int i, const Point &p, const bool libmesh_dbg_var(add_p_level))
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order, const unsigned int libmesh_dbg_var(i), const Point &)
 
Real shape (const Elem *, const Order, const unsigned int libmesh_dbg_var(i), const Point &, const bool)
 
Real shape (const ElemType, const Order, const unsigned int libmesh_dbg_var(i), const Point &)
 
Real shape (const Elem *, const Order, const unsigned int libmesh_dbg_var(i), const Point &, const bool)
 
Real shape (const ElemType elem_type, const Order order, const unsigned int i, const Point &p)
 
Real shape (const ElemType elem_type, const Order order, const unsigned int i, const Point &p)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order, const unsigned int libmesh_dbg_var(i), const Point &)
 
Real shape (const Elem *, const Order, const unsigned int libmesh_dbg_var(i), const Point &, const bool)
 
Real shape (const ElemType, const Order, const unsigned int libmesh_dbg_var(i), const Point &)
 
Real shape (const Elem *, const Order, const unsigned int libmesh_dbg_var(i), const Point &, const bool)
 
Real shape (const ElemType, const Order order, const unsigned int i, const Point &p)
 
Real shape (const ElemType, const Order order, const unsigned int i, const Point &p)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType type, const Order order, const unsigned int i, const Point &p)
 
Real shape (const ElemType type, const Order order, const unsigned int i, const Point &p)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType type, const Order order, const unsigned int i, const Point &p)
 
Real shape (const ElemType type, const Order order, const unsigned int i, const Point &p)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
RealGradient shape (const ElemType type, const Order order, const unsigned int i, const Point &p)
 
RealGradient shape (const ElemType type, const Order order, const unsigned int i, const Point &p)
 
RealGradient shape (const ElemType type, const Order order, const unsigned int i, const Point &p)
 
RealGradient shape (const ElemType type, const Order order, const unsigned int i, const Point &p)
 
RealGradient shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
RealGradient shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
RealGradient shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
RealGradient shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order, const unsigned int libmesh_dbg_var(i), const Point &)
 
Real shape (const Elem *, const Order, const unsigned int libmesh_dbg_var(i), const Point &, const bool)
 
Real shape (const ElemType, const Order libmesh_dbg_var(order), const unsigned int i, const Point &p)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order libmesh_dbg_var(order), const unsigned int i, const Point &p)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order libmesh_dbg_var(order), const unsigned int i, const Point &p)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
RealVectorValue shape (const ElemType type, const Order order, const unsigned int i, const Point &p)
 
RealVectorValue shape (const ElemType type, const Order order, const unsigned int i, const Point &p)
 
RealVectorValue shape (const ElemType type, const Order order, const unsigned int i, const Point &p)
 
RealVectorValue shape (const ElemType type, const Order order, const unsigned int i, const Point &p)
 
RealVectorValue shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
RealVectorValue shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
RealVectorValue shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
RealVectorValue shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
RealGradient shape (const ElemType, const Order, const unsigned int, const Point &)
 
RealGradient shape (const Elem *, const Order, const unsigned int, const Point &, const bool)
 
RealGradient shape (const ElemType, const Order, const unsigned int, const Point &)
 
RealGradient shape (const Elem *, const Order, const unsigned int, const Point &, const bool)
 
RealGradient shape (const ElemType, const Order, const unsigned int, const Point &)
 
RealGradient shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
RealGradient shape (const ElemType, const Order, const unsigned int, const Point &)
 
RealGradient shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order, const unsigned int libmesh_dbg_var(i), const Point &)
 
Real shape (const Elem *, const Order, const unsigned int libmesh_dbg_var(i), const Point &, const bool)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *, const Order, const unsigned int, const Point &, const bool)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *, const Order, const unsigned int, const Point &, const bool)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *, const Order, const unsigned int, const Point &, const bool)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *, const Order, const unsigned int, const Point &, const bool)
 
Real shape (const ElemType type, const Order order, const unsigned int i, const Point &p)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order, const unsigned int libmesh_dbg_var(i), const Point &)
 
Real shape (const Elem *, const Order, const unsigned int libmesh_dbg_var(i), const Point &, const bool)
 
Real shape (const ElemType, const Order libmesh_dbg_var(order), const unsigned int i, const Point &p)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *elem, const Order order, const unsigned int i, const Point &p, const bool add_p_level)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *, const Order, const unsigned int, const Point &, const bool)
 
Real shape (const ElemType, const Order, const unsigned int libmesh_dbg_var(i), const Point &)
 
Real shape (const Elem *, const Order, const unsigned int libmesh_dbg_var(i), const Point &, const bool)
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *elem, const Order libmesh_dbg_var(order), const unsigned int i, const Point &point_in, const bool libmesh_dbg_var(add_p_level))
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *elem, const Order libmesh_dbg_var(order), const unsigned int i, const Point &point_in, const bool libmesh_dbg_var(add_p_level))
 
Real shape (const ElemType, const Order, const unsigned int, const Point &)
 
Real shape (const Elem *elem, const Order libmesh_dbg_var(order), const unsigned int i, const Point &point_in, const bool libmesh_dbg_var(add_p_level))
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_deriv (const ElemType, const Order order, const unsigned int i, const unsigned int libmesh_dbg_var(j), const Point &p)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *libmesh_dbg_var(elem), const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *elem, const Order libmesh_dbg_var(order), const unsigned int i, const unsigned int, const Point &p, const bool libmesh_dbg_var(add_p_level))
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_deriv (const ElemType elem_type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_deriv (const ElemType elem_type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_deriv (const ElemType, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_deriv (const ElemType, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
RealGradient shape_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
RealGradient shape_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
RealGradient shape_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
RealGradient shape_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
RealGradient shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
RealGradient shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
RealGradient shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
RealGradient shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_deriv (const ElemType, const Order libmesh_dbg_var(order), const unsigned int i, const unsigned int libmesh_dbg_var(j), const Point &p)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order libmesh_dbg_var(order), const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order libmesh_dbg_var(order), const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
RealVectorValue shape_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
RealVectorValue shape_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
RealVectorValue shape_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
RealVectorValue shape_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
RealVectorValue shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
RealVectorValue shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
RealVectorValue shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
RealVectorValue shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
RealGradient shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
RealGradient shape_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
RealGradient shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
RealGradient shape_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
RealGradient shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
RealGradient shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &, const bool add_p_level)
 
RealGradient shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
RealGradient shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int libmesh_dbg_var(j), const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_deriv (const ElemType, const Order libmesh_dbg_var(order), const unsigned int i, const unsigned int libmesh_dbg_var(j), const Point &p)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *elem, const Order libmesh_dbg_var(order), const unsigned int i, const unsigned int libmesh_dbg_var(j), const Point &point_in, const bool libmesh_dbg_var(add_p_level))
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *elem, const Order libmesh_dbg_var(order), const unsigned int i, const unsigned int j, const Point &point_in, const bool libmesh_dbg_var(add_p_level))
 
Real shape_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_deriv (const Elem *elem, const Order libmesh_dbg_var(order), const unsigned int i, const unsigned int j, const Point &point_in, const bool libmesh_dbg_var(add_p_level))
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *libmesh_dbg_var(elem), const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *elem, const Order libmesh_dbg_var(order), const unsigned int i, const unsigned int, const Point &p, const bool libmesh_dbg_var(add_p_level))
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType elem_type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_second_deriv (const ElemType elem_type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_second_deriv (const ElemType, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_second_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_second_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
RealGradient shape_second_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
RealGradient shape_second_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
RealGradient shape_second_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
RealGradient shape_second_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
RealGradient shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
RealGradient shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
RealGradient shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
RealGradient shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order libmesh_dbg_var(order), const unsigned int i, const unsigned int libmesh_dbg_var(j), const Point &p)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const ElemType, const Order libmesh_dbg_var(order), const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const ElemType, const Order libmesh_dbg_var(order), const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
RealVectorValue shape_second_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
RealVectorValue shape_second_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
RealVectorValue shape_second_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
RealVectorValue shape_second_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
RealVectorValue shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
RealVectorValue shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
RealVectorValue shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
RealVectorValue shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
RealGradient shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
RealGradient shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
RealGradient shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
RealGradient shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
RealGradient shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
RealGradient shape_second_deriv (const Elem *elem, const Order order, const unsigned int libmesh_dbg_var(i), const unsigned int libmesh_dbg_var(j), const Point &, const bool add_p_level)
 
RealGradient shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
RealGradient shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &libmesh_dbg_var(p), const bool add_p_level)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int libmesh_dbg_var(j), const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType type, const Order order, const unsigned int i, const unsigned int j, const Point &p)
 
Real shape_second_deriv (const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *, const Order, const unsigned int, const unsigned int, const Point &, const bool)
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *elem, const Order libmesh_dbg_var(order), const unsigned int i, const unsigned int libmesh_dbg_var(j), const Point &point_in, const bool libmesh_dbg_var(add_p_level))
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *elem, const Order libmesh_dbg_var(order), const unsigned int i, const unsigned int j, const Point &point_in, const bool libmesh_dbg_var(add_p_level))
 
Real shape_second_deriv (const ElemType, const Order, const unsigned int, const unsigned int, const Point &)
 
Real shape_second_deriv (const Elem *elem, const Order libmesh_dbg_var(order), const unsigned int i, const unsigned int j, const Point &point_in, const bool libmesh_dbg_var(add_p_level))
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *, const Order, const std::vector< Number > &, std::vector< Number > &)
 
void nodal_soln (const Elem *, const Order, const std::vector< Number > &, std::vector< Number > &)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
void nodal_soln (const Elem *elem, const Order order, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 
virtual unsigned int n_shape_functions () const override
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType, const Order)
 
unsigned int n_dofs (const ElemType, const Order)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType, const Order o)
 
unsigned int n_dofs (const ElemType, const Order o)
 
unsigned int n_dofs (const ElemType, const Order o)
 
unsigned int n_dofs (const ElemType, const Order o)
 
unsigned int n_dofs (const ElemType, const Order)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs (const ElemType t, const Order o)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_at_node (const ElemType, const Order, const unsigned int)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType, const Order)
 
unsigned int n_dofs_per_elem (const ElemType, const Order)
 
unsigned int n_dofs_per_elem (const ElemType, const Order)
 
unsigned int n_dofs_per_elem (const ElemType, const Order)
 
unsigned int n_dofs_per_elem (const ElemType, const Order)
 
unsigned int n_dofs_per_elem (const ElemType, const Order)
 
unsigned int n_dofs_per_elem (const ElemType, const Order)
 
unsigned int n_dofs_per_elem (const ElemType, const Order)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType, const Order)
 
unsigned int n_dofs_per_elem (const ElemType, const Order)
 
unsigned int n_dofs_per_elem (const ElemType, const Order)
 
unsigned int n_dofs_per_elem (const ElemType, const Order)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType, const Order)
 
unsigned int n_dofs_per_elem (const ElemType, const Order)
 
unsigned int n_dofs_per_elem (const ElemType, const Order)
 
unsigned int n_dofs_per_elem (const ElemType, const Order)
 
unsigned int n_dofs_per_elem (const ElemType, const Order)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
virtual FEContinuity get_continuity () const override
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
FEContinuity get_continuity () const
 
virtual bool is_hierarchic () const override
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
bool is_hierarchic () const
 
void dofs_on_side (const Elem *const, const Order, unsigned int, std::vector< unsigned int > &di)
 
void dofs_on_edge (const Elem *const, const Order, unsigned int, std::vector< unsigned int > &di)
 
Point inverse_map (const Elem *, const Point &, const Real, const bool)
 
void inverse_map (const Elem *, const std::vector< Point > &, std::vector< Point > &, Real, bool)
 
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. More...
 
virtual void reinit (const Elem *elem, const unsigned int side, 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 side of face. More...
 
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. More...
 
void edge_reinit (Elem const *, unsigned int, Real, const std::vector< Point > *const, const std::vector< Real > *const)
 Reinitializes all the physical element-dependent data based on the edge of the element elem. More...
 
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 points. More...
 
void side_map (const Elem *, const Elem *, const unsigned int, const std::vector< Point > &, std::vector< Point > &)
 Computes the reference space quadrature points on the side of an element based on the side quadrature points. More...
 
virtual void attach_quadrature_rule (QBase *q) override
 Provides the class with the quadrature rule, which provides the locations (on a reference element) where the shape functions are to be calculated. More...
 
virtual unsigned int n_quadrature_points () const override
 
void compute_constraints (DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
 
void compute_constraints (DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
 
void compute_constraints (DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
 
void compute_constraints (DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
 
void compute_constraints (DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
 
void compute_constraints (DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
 
void compute_constraints (DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
 
void compute_constraints (DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
 
void compute_constraints (DofConstraints &, DofMap &, const unsigned int, const Elem *)
 
void compute_constraints (DofConstraints &, DofMap &, const unsigned int, const Elem *)
 
void compute_constraints (DofConstraints &, DofMap &, const unsigned int, const Elem *)
 
void compute_constraints (DofConstraints &, DofMap &, const unsigned int, const Elem *)
 
void compute_constraints (DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
 
void compute_constraints (DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
 
void compute_constraints (DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
 
void compute_constraints (DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
 
void compute_constraints (DofConstraints &, DofMap &, const unsigned int, const Elem *)
 
void compute_constraints (DofConstraints &, DofMap &, const unsigned int, const Elem *)
 
void compute_constraints (DofConstraints &, DofMap &, const unsigned int, const Elem *)
 
void compute_constraints (DofConstraints &, DofMap &, const unsigned int, const Elem *)
 
void compute_constraints (DofConstraints &, DofMap &, const unsigned int, const Elem *)
 
void compute_constraints (DofConstraints &, DofMap &, const unsigned int, const Elem *)
 
void compute_constraints (DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
 
void compute_constraints (DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
 
void compute_constraints (DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
 
void compute_constraints (DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
 
void compute_constraints (DofConstraints &, DofMap &, const unsigned int, const Elem *)
 
void compute_constraints (DofConstraints &, DofMap &, const unsigned int, const Elem *)
 
void compute_constraints (DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
 
void compute_constraints (DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
 
void compute_constraints (DofConstraints &, DofMap &, const unsigned int, const Elem *)
 
void compute_constraints (DofConstraints &, DofMap &, const unsigned int, const Elem *)
 
virtual bool shapes_need_reinit () const override
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
bool shapes_need_reinit () const
 
std::unique_ptr< FEGenericBase< Real > > build (const unsigned int dim, const FEType &fet)
 
std::unique_ptr< FEGenericBase< RealGradient > > build (const unsigned int dim, const FEType &fet)
 
std::unique_ptr< FEGenericBase< Real > > build_InfFE (const unsigned int dim, const FEType &fet)
 
std::unique_ptr< FEGenericBase< RealGradient > > build_InfFE (const unsigned int, const FEType &)
 
const std::vector< std::vector< OutputShape > > & get_phi () const
 
const std::vector< std::vector< OutputGradient > > & get_dphi () const
 
const std::vector< std::vector< OutputShape > > & get_curl_phi () const
 
const std::vector< std::vector< OutputDivergence > > & get_div_phi () const
 
const std::vector< std::vector< OutputShape > > & get_dphidx () const
 
const std::vector< std::vector< OutputShape > > & get_dphidy () const
 
const std::vector< std::vector< OutputShape > > & get_dphidz () const
 
const std::vector< std::vector< OutputShape > > & get_dphidxi () const
 
const std::vector< std::vector< OutputShape > > & get_dphideta () const
 
const std::vector< std::vector< OutputShape > > & get_dphidzeta () const
 
const std::vector< std::vector< OutputTensor > > & get_d2phi () const
 
const std::vector< std::vector< OutputShape > > & get_d2phidx2 () const
 
const std::vector< std::vector< OutputShape > > & get_d2phidxdy () const
 
const std::vector< std::vector< OutputShape > > & get_d2phidxdz () const
 
const std::vector< std::vector< OutputShape > > & get_d2phidy2 () const
 
const std::vector< std::vector< OutputShape > > & get_d2phidydz () const
 
const std::vector< std::vector< OutputShape > > & get_d2phidz2 () const
 
const std::vector< std::vector< OutputShape > > & get_d2phidxi2 () const
 
const std::vector< std::vector< OutputShape > > & get_d2phidxideta () const
 
const std::vector< std::vector< OutputShape > > & get_d2phidxidzeta () const
 
const std::vector< std::vector< OutputShape > > & get_d2phideta2 () const
 
const std::vector< std::vector< OutputShape > > & get_d2phidetadzeta () const
 
const std::vector< std::vector< OutputShape > > & get_d2phidzeta2 () const
 
const std::vector< OutputGradient > & get_dphase () const
 
const std::vector< Real > & get_Sobolev_weight () const
 
const std::vector< RealGradient > & get_Sobolev_dweight () const
 
void print_phi (std::ostream &os) const
 Prints the value of each shape function at each quadrature point. More...
 
void print_dphi (std::ostream &os) const
 Prints the value of each shape function's derivative at each quadrature point. More...
 
void print_d2phi (std::ostream &os) const
 Prints the value of each shape function's second derivatives at each quadrature point. More...
 
unsigned int get_dim () const
 
const std::vector< Point > & get_xyz () const
 
const std::vector< Real > & get_JxW () const
 
const std::vector< RealGradient > & get_dxyzdxi () const
 
const std::vector< RealGradient > & get_dxyzdeta () const
 
const std::vector< RealGradient > & get_dxyzdzeta () const
 
const std::vector< RealGradient > & get_d2xyzdxi2 () const
 
const std::vector< RealGradient > & get_d2xyzdeta2 () const
 
const std::vector< RealGradient > & get_d2xyzdzeta2 () const
 
const std::vector< RealGradient > & get_d2xyzdxideta () const
 
const std::vector< RealGradient > & get_d2xyzdxidzeta () const
 
const std::vector< RealGradient > & get_d2xyzdetadzeta () const
 
const std::vector< Real > & get_dxidx () const
 
const std::vector< Real > & get_dxidy () const
 
const std::vector< Real > & get_dxidz () const
 
const std::vector< Real > & get_detadx () const
 
const std::vector< Real > & get_detady () const
 
const std::vector< Real > & get_detadz () const
 
const std::vector< Real > & get_dzetadx () const
 
const std::vector< Real > & get_dzetady () const
 
const std::vector< Real > & get_dzetadz () const
 
const std::vector< std::vector< Point > > & get_tangents () const
 
const std::vector< Point > & get_normals () const
 
const std::vector< Real > & get_curvatures () const
 
ElemType get_type () const
 
unsigned int get_p_level () const
 
FEType get_fe_type () const
 
Order get_order () const
 
void set_fe_order (int new_order)
 Sets the base FE order of the finite element. More...
 
FEFamily get_family () const
 
const FEMapget_fe_map () const
 
FEMapget_fe_map ()
 
void print_JxW (std::ostream &os) const
 Prints the Jacobian times the weight for each quadrature point. More...
 
void print_xyz (std::ostream &os) const
 Prints the spatial location of each quadrature point (on the physical element). More...
 
void print_info (std::ostream &os) const
 Prints all the relevant information about the current element. More...
 

Static Public Member Functions

static OutputShape shape (const ElemType t, const Order o, const unsigned int i, const Point &p)
 
static OutputShape shape (const Elem *elem, const Order o, const unsigned int i, const Point &p, const bool add_p_level=true)
 
static OutputShape shape_deriv (const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
 
static OutputShape shape_deriv (const Elem *elem, const Order o, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level=true)
 
static OutputShape shape_second_deriv (const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
 
static OutputShape shape_second_deriv (const Elem *elem, const Order o, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level=true)
 
static void nodal_soln (const Elem *elem, const Order o, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
 Build the nodal soln from the element soln. More...
 
static unsigned int n_shape_functions (const ElemType t, const Order o)
 
static unsigned int n_dofs (const ElemType t, const Order o)
 
static unsigned int n_dofs_at_node (const ElemType t, const Order o, const unsigned int n)
 
static unsigned int n_dofs_per_elem (const ElemType t, const Order o)
 
static void dofs_on_side (const Elem *const elem, const Order o, 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. More...
 
static void dofs_on_edge (const Elem *const elem, const Order o, 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. More...
 
static Point inverse_map (const Elem *elem, const Point &p, const Real tolerance=TOLERANCE, const bool secure=true)
 
static void inverse_map (const Elem *elem, const std::vector< Point > &physical_points, std::vector< Point > &reference_points, const Real tolerance=TOLERANCE, const bool secure=true)
 
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 variable number var_number, using element-specific optimizations if possible. More...
 
static Point map (const Elem *elem, const Point &reference_point)
 
static Point map_xi (const Elem *elem, const Point &reference_point)
 
static Point map_eta (const Elem *elem, const Point &reference_point)
 
static Point map_zeta (const Elem *elem, const Point &reference_point)
 
static std::unique_ptr< FEGenericBasebuild (const unsigned int dim, const FEType &type)
 Builds a specific finite element type. More...
 
static std::unique_ptr< FEGenericBasebuild_InfFE (const unsigned int dim, const FEType &type)
 Builds a specific infinite element type. More...
 
static void compute_proj_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 variable number var_number, using generic projections. More...
 
static void coarsened_dof_values (const NumericVector< Number > &global_vector, const DofMap &dof_map, const Elem *coarse_elem, DenseVector< Number > &coarse_dofs, const unsigned int var, const bool use_old_dof_indices=false)
 Creates a local projection on coarse_elem, based on the DoF values in global_vector for it's children. More...
 
static void coarsened_dof_values (const NumericVector< Number > &global_vector, const DofMap &dof_map, const Elem *coarse_elem, DenseVector< Number > &coarse_dofs, const bool use_old_dof_indices=false)
 Creates a local projection on coarse_elem, based on the DoF values in global_vector for it's children. More...
 
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) corresponding to variable number var_number, using generic projections. More...
 
static bool on_reference_element (const Point &p, const ElemType t, const Real eps=TOLERANCE)
 
static void get_refspace_nodes (const ElemType t, std::vector< Point > &nodes)
 
static void compute_node_constraints (NodeConstraints &constraints, const Elem *elem)
 Computes the nodal constraint contributions (for non-conforming adapted meshes), using Lagrange geometry. More...
 
static void compute_periodic_node_constraints (NodeConstraints &constraints, const PeriodicBoundaries &boundaries, const MeshBase &mesh, const PointLocatorBase *point_locator, const Elem *elem)
 Computes the node position constraint equation contributions (for meshes with periodic boundary conditions) More...
 
static void print_info (std::ostream &out=libMesh::out)
 Prints the reference information, by default to libMesh::out. More...
 
static std::string get_info ()
 Gets a string containing the reference information. More...
 
static unsigned int n_objects ()
 Prints the number of outstanding (created, but not yet destroyed) objects. More...
 
static void enable_print_counter_info ()
 Methods to enable/disable the reference counter output from print_info() More...
 
static void disable_print_counter_info ()
 

Protected Types

typedef std::map< std::string, std::pair< unsigned int, unsigned int > > Counts
 Data structure to log the information. More...
 

Protected Member Functions

virtual void init_shape_functions (const std::vector< Point > &qp, const Elem *e)
 Update the various member data fields phi, dphidxi, dphideta, dphidzeta, etc. More...
 
virtual void init_base_shape_functions (const std::vector< Point > &qp, const Elem *e) override
 Initialize the data fields for the base of an an infinite element. More...
 
void determine_calculations ()
 Determine which values are to be calculated, for both the FE itself and for the FEMap. More...
 
virtual void compute_shape_functions (const Elem *elem, const std::vector< Point > &qp)
 After having updated the jacobian and the transformation from local to global coordinates in FEAbstract::compute_map(), the first derivatives of the shape functions are transformed to global coordinates, giving dphi, dphidx, dphidy, and dphidz. More...
 
void increment_constructor_count (const std::string &name)
 Increments the construction counter. More...
 
void increment_destructor_count (const std::string &name)
 Increments the destruction counter. More...
 

Protected Attributes

std::vector< Pointcached_nodes
 An array of the node locations on the last element we computed on. More...
 
ElemType last_side
 The last side and last edge we did a reinit on. More...
 
unsigned int last_edge
 
std::unique_ptr< FETransformationBase< FEOutputType< T >::type > > _fe_trans
 Object that handles computing shape function values, gradients, etc in the physical domain. More...
 
std::vector< std::vector< OutputShape > > phi
 Shape function values. More...
 
std::vector< std::vector< OutputGradient > > dphi
 Shape function derivative values. More...
 
std::vector< std::vector< OutputShape > > curl_phi
 Shape function curl values. More...
 
std::vector< std::vector< OutputDivergence > > div_phi
 Shape function divergence values. More...
 
std::vector< std::vector< OutputShape > > dphidxi
 Shape function derivatives in the xi direction. More...
 
std::vector< std::vector< OutputShape > > dphideta
 Shape function derivatives in the eta direction. More...
 
std::vector< std::vector< OutputShape > > dphidzeta
 Shape function derivatives in the zeta direction. More...
 
std::vector< std::vector< OutputShape > > dphidx
 Shape function derivatives in the x direction. More...
 
std::vector< std::vector< OutputShape > > dphidy
 Shape function derivatives in the y direction. More...
 
std::vector< std::vector< OutputShape > > dphidz
 Shape function derivatives in the z direction. More...
 
std::vector< std::vector< OutputTensor > > d2phi
 Shape function second derivative values. More...
 
std::vector< std::vector< OutputShape > > d2phidxi2
 Shape function second derivatives in the xi direction. More...
 
std::vector< std::vector< OutputShape > > d2phidxideta
 Shape function second derivatives in the xi-eta direction. More...
 
std::vector< std::vector< OutputShape > > d2phidxidzeta
 Shape function second derivatives in the xi-zeta direction. More...
 
std::vector< std::vector< OutputShape > > d2phideta2
 Shape function second derivatives in the eta direction. More...
 
std::vector< std::vector< OutputShape > > d2phidetadzeta
 Shape function second derivatives in the eta-zeta direction. More...
 
std::vector< std::vector< OutputShape > > d2phidzeta2
 Shape function second derivatives in the zeta direction. More...
 
std::vector< std::vector< OutputShape > > d2phidx2
 Shape function second derivatives in the x direction. More...
 
std::vector< std::vector< OutputShape > > d2phidxdy
 Shape function second derivatives in the x-y direction. More...
 
std::vector< std::vector< OutputShape > > d2phidxdz
 Shape function second derivatives in the x-z direction. More...
 
std::vector< std::vector< OutputShape > > d2phidy2
 Shape function second derivatives in the y direction. More...
 
std::vector< std::vector< OutputShape > > d2phidydz
 Shape function second derivatives in the y-z direction. More...
 
std::vector< std::vector< OutputShape > > d2phidz2
 Shape function second derivatives in the z direction. More...
 
std::vector< OutputGradientdphase
 Used for certain infinite element families: the first derivatives of the phase term in global coordinates, over all quadrature points. More...
 
std::vector< RealGradientdweight
 Used for certain infinite element families: the global derivative of the additional radial weight \( 1/{r^2} \), over all quadrature points. More...
 
std::vector< Realweight
 Used for certain infinite element families: the additional radial weight \( 1/{r^2} \) in local coordinates, over all quadrature points. More...
 
std::unique_ptr< FEMap_fe_map
 
const unsigned int dim
 The dimensionality of the object. More...
 
bool calculations_started
 Have calculations with this object already been started? Then all get_* functions should already have been called. More...
 
bool calculate_map
 Are we calculating mapping functions? More...
 
bool calculate_phi
 Should we calculate shape functions? More...
 
bool calculate_dphi
 Should we calculate shape function gradients? More...
 
bool calculate_d2phi
 Should we calculate shape function hessians? More...
 
const bool calculate_d2phi =false
 
bool calculate_curl_phi
 Should we calculate shape function curls? More...
 
bool calculate_div_phi
 Should we calculate shape function divergences? More...
 
bool calculate_dphiref
 Should we calculate reference shape function gradients? More...
 
FEType fe_type
 The finite element type for this object. More...
 
ElemType elem_type
 The element type the current data structures are set up for. More...
 
unsigned int _p_level
 The p refinement level the current data structures are set up for. More...
 
QBaseqrule
 A pointer to the quadrature rule employed. More...
 
bool shapes_on_quadrature
 A flag indicating if current data structures correspond to quadrature rule points. More...
 

Static Protected Attributes

static Counts _counts
 Actually holds the data. More...
 
static Threads::atomic< unsigned int_n_objects
 The number of objects. More...
 
static Threads::spin_mutex _mutex
 Mutual exclusion object to enable thread-safe reference counting. More...
 
static bool _enable_print_counter = true
 Flag to control whether reference count information is printed when print_info is called. More...
 

Detailed Description

template<unsigned int Dim>
class libMesh::FEL2Hierarchic< Dim >

Discontinuous Hierarchic finite elements.

Still templated on the dimension, Dim.

Author
Truman E. Ellis
Date
2011

Definition at line 723 of file fe.h.

Member Typedef Documentation

◆ Counts

typedef std::map<std::string, std::pair<unsigned int, unsigned int> > libMesh::ReferenceCounter::Counts
protectedinherited

Data structure to log the information.

The log is identified by the class name.

Definition at line 117 of file reference_counter.h.

◆ OutputDivergence

Definition at line 121 of file fe_base.h.

◆ OutputGradient

Definition at line 119 of file fe_base.h.

◆ OutputNumber

Definition at line 122 of file fe_base.h.

◆ OutputNumberDivergence

Definition at line 125 of file fe_base.h.

◆ OutputNumberGradient

Definition at line 123 of file fe_base.h.

◆ OutputNumberTensor

Definition at line 124 of file fe_base.h.

◆ OutputShape

typedef FEGenericBase<typename FEOutputType<T>::type>::OutputShape libMesh::FE< Dim, T >::OutputShape
inherited

Definition at line 107 of file fe.h.

◆ OutputTensor

Definition at line 120 of file fe_base.h.

Constructor & Destructor Documentation

◆ FEL2Hierarchic()

template<unsigned int Dim>
libMesh::FEL2Hierarchic< Dim >::FEL2Hierarchic ( const FEType fet)
inlineexplicit

Constructor.

Creates a hierarchic finite element to be used in dimension Dim.

Definition at line 732 of file fe.h.

732  :
733  FE<Dim,L2_HIERARCHIC> (fet)
734  {}

Member Function Documentation

◆ attach_quadrature_rule()

void libMesh::FE< Dim, T >::attach_quadrature_rule ( QBase q)
overridevirtualinherited

Provides the class with the quadrature rule, which provides the locations (on a reference element) where the shape functions are to be calculated.

Implements libMesh::FEAbstract.

Definition at line 58 of file fe.C.

59 {
60  libmesh_assert(q);
61  this->qrule = q;
62  // make sure we don't cache results from a previous quadrature rule
63  this->elem_type = INVALID_ELEM;
64  return;
65 }

◆ build() [1/3]

std::unique_ptr< FEGenericBase< Real > > libMesh::FEGenericBase< Real >::build ( const unsigned int  dim,
const FEType fet 
)
inherited

Definition at line 186 of file fe_base.C.

188 {
189  switch (dim)
190  {
191  // 0D
192  case 0:
193  {
194  switch (fet.family)
195  {
196  case CLOUGH:
197  return libmesh_make_unique<FE<0,CLOUGH>>(fet);
198 
199  case HERMITE:
200  return libmesh_make_unique<FE<0,HERMITE>>(fet);
201 
202  case LAGRANGE:
203  return libmesh_make_unique<FE<0,LAGRANGE>>(fet);
204 
205  case L2_LAGRANGE:
206  return libmesh_make_unique<FE<0,L2_LAGRANGE>>(fet);
207 
208  case HIERARCHIC:
209  return libmesh_make_unique<FE<0,HIERARCHIC>>(fet);
210 
211  case L2_HIERARCHIC:
212  return libmesh_make_unique<FE<0,L2_HIERARCHIC>>(fet);
213 
214  case MONOMIAL:
215  return libmesh_make_unique<FE<0,MONOMIAL>>(fet);
216 
217 #ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
218  case SZABAB:
219  return libmesh_make_unique<FE<0,SZABAB>>(fet);
220 
221  case BERNSTEIN:
222  return libmesh_make_unique<FE<0,BERNSTEIN>>(fet);
223 
224  case RATIONAL_BERNSTEIN:
225  return libmesh_make_unique<FE<0,RATIONAL_BERNSTEIN>>(fet);
226 #endif
227 
228  case XYZ:
229  return libmesh_make_unique<FEXYZ<0>>(fet);
230 
231  case SCALAR:
232  return libmesh_make_unique<FEScalar<0>>(fet);
233 
234  default:
235  libmesh_error_msg("ERROR: Bad FEType.family= " << fet.family);
236  }
237  }
238  // 1D
239  case 1:
240  {
241  switch (fet.family)
242  {
243  case CLOUGH:
244  return libmesh_make_unique<FE<1,CLOUGH>>(fet);
245 
246  case HERMITE:
247  return libmesh_make_unique<FE<1,HERMITE>>(fet);
248 
249  case LAGRANGE:
250  return libmesh_make_unique<FE<1,LAGRANGE>>(fet);
251 
252  case L2_LAGRANGE:
253  return libmesh_make_unique<FE<1,L2_LAGRANGE>>(fet);
254 
255  case HIERARCHIC:
256  return libmesh_make_unique<FE<1,HIERARCHIC>>(fet);
257 
258  case L2_HIERARCHIC:
259  return libmesh_make_unique<FE<1,L2_HIERARCHIC>>(fet);
260 
261  case MONOMIAL:
262  return libmesh_make_unique<FE<1,MONOMIAL>>(fet);
263 
264 #ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
265  case SZABAB:
266  return libmesh_make_unique<FE<1,SZABAB>>(fet);
267 
268  case BERNSTEIN:
269  return libmesh_make_unique<FE<1,BERNSTEIN>>(fet);
270 
271  case RATIONAL_BERNSTEIN:
272  return libmesh_make_unique<FE<1,RATIONAL_BERNSTEIN>>(fet);
273 #endif
274 
275  case XYZ:
276  return libmesh_make_unique<FEXYZ<1>>(fet);
277 
278  case SCALAR:
279  return libmesh_make_unique<FEScalar<1>>(fet);
280 
281  default:
282  libmesh_error_msg("ERROR: Bad FEType.family= " << fet.family);
283  }
284  }
285 
286 
287  // 2D
288  case 2:
289  {
290  switch (fet.family)
291  {
292  case CLOUGH:
293  return libmesh_make_unique<FE<2,CLOUGH>>(fet);
294 
295  case HERMITE:
296  return libmesh_make_unique<FE<2,HERMITE>>(fet);
297 
298  case LAGRANGE:
299  return libmesh_make_unique<FE<2,LAGRANGE>>(fet);
300 
301  case L2_LAGRANGE:
302  return libmesh_make_unique<FE<2,L2_LAGRANGE>>(fet);
303 
304  case HIERARCHIC:
305  return libmesh_make_unique<FE<2,HIERARCHIC>>(fet);
306 
307  case L2_HIERARCHIC:
308  return libmesh_make_unique<FE<2,L2_HIERARCHIC>>(fet);
309 
310  case MONOMIAL:
311  return libmesh_make_unique<FE<2,MONOMIAL>>(fet);
312 
313 #ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
314  case SZABAB:
315  return libmesh_make_unique<FE<2,SZABAB>>(fet);
316 
317  case BERNSTEIN:
318  return libmesh_make_unique<FE<2,BERNSTEIN>>(fet);
319 
320  case RATIONAL_BERNSTEIN:
321  return libmesh_make_unique<FE<2,RATIONAL_BERNSTEIN>>(fet);
322 #endif
323 
324  case XYZ:
325  return libmesh_make_unique<FEXYZ<2>>(fet);
326 
327  case SCALAR:
328  return libmesh_make_unique<FEScalar<2>>(fet);
329 
330  case SUBDIVISION:
331  return libmesh_make_unique<FESubdivision>(fet);
332 
333  default:
334  libmesh_error_msg("ERROR: Bad FEType.family= " << fet.family);
335  }
336  }
337 
338 
339  // 3D
340  case 3:
341  {
342  switch (fet.family)
343  {
344  case CLOUGH:
345  libmesh_error_msg("ERROR: Clough-Tocher elements currently only support 1D and 2D");
346 
347  case HERMITE:
348  return libmesh_make_unique<FE<3,HERMITE>>(fet);
349 
350  case LAGRANGE:
351  return libmesh_make_unique<FE<3,LAGRANGE>>(fet);
352 
353  case L2_LAGRANGE:
354  return libmesh_make_unique<FE<3,L2_LAGRANGE>>(fet);
355 
356  case HIERARCHIC:
357  return libmesh_make_unique<FE<3,HIERARCHIC>>(fet);
358 
359  case L2_HIERARCHIC:
360  return libmesh_make_unique<FE<3,L2_HIERARCHIC>>(fet);
361 
362  case MONOMIAL:
363  return libmesh_make_unique<FE<3,MONOMIAL>>(fet);
364 
365 #ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
366  case SZABAB:
367  return libmesh_make_unique<FE<3,SZABAB>>(fet);
368 
369  case BERNSTEIN:
370  return libmesh_make_unique<FE<3,BERNSTEIN>>(fet);
371 
372  case RATIONAL_BERNSTEIN:
373  return libmesh_make_unique<FE<3,RATIONAL_BERNSTEIN>>(fet);
374 #endif
375 
376  case XYZ:
377  return libmesh_make_unique<FEXYZ<3>>(fet);
378 
379  case SCALAR:
380  return libmesh_make_unique<FEScalar<3>>(fet);
381 
382  default:
383  libmesh_error_msg("ERROR: Bad FEType.family= " << fet.family);
384  }
385  }
386 
387  default:
388  libmesh_error_msg("Invalid dimension dim = " << dim);
389  }
390 }

◆ build() [2/3]

std::unique_ptr< FEGenericBase< RealGradient > > libMesh::FEGenericBase< RealGradient >::build ( const unsigned int  dim,
const FEType fet 
)
inherited

Definition at line 396 of file fe_base.C.

398 {
399  switch (dim)
400  {
401  // 0D
402  case 0:
403  {
404  switch (fet.family)
405  {
406  case LAGRANGE_VEC:
407  return libmesh_make_unique<FELagrangeVec<0>>(fet);
408 
409  case MONOMIAL_VEC:
410  return libmesh_make_unique<FEMonomialVec<0>>(fet);
411 
412  default:
413  libmesh_error_msg("ERROR: Bad FEType.family= " << fet.family);
414  }
415  }
416  case 1:
417  {
418  switch (fet.family)
419  {
420  case LAGRANGE_VEC:
421  return libmesh_make_unique<FELagrangeVec<1>>(fet);
422 
423  case MONOMIAL_VEC:
424  return libmesh_make_unique<FEMonomialVec<1>>(fet);
425 
426  default:
427  libmesh_error_msg("ERROR: Bad FEType.family= " << fet.family);
428  }
429  }
430  case 2:
431  {
432  switch (fet.family)
433  {
434  case LAGRANGE_VEC:
435  return libmesh_make_unique<FELagrangeVec<2>>(fet);
436 
437  case MONOMIAL_VEC:
438  return libmesh_make_unique<FEMonomialVec<2>>(fet);
439 
440  case NEDELEC_ONE:
441  return libmesh_make_unique<FENedelecOne<2>>(fet);
442 
443  default:
444  libmesh_error_msg("ERROR: Bad FEType.family= " << fet.family);
445  }
446  }
447  case 3:
448  {
449  switch (fet.family)
450  {
451  case LAGRANGE_VEC:
452  return libmesh_make_unique<FELagrangeVec<3>>(fet);
453 
454  case MONOMIAL_VEC:
455  return libmesh_make_unique<FEMonomialVec<3>>(fet);
456 
457  case NEDELEC_ONE:
458  return libmesh_make_unique<FENedelecOne<3>>(fet);
459 
460  default:
461  libmesh_error_msg("ERROR: Bad FEType.family= " << fet.family);
462  }
463  }
464 
465  default:
466  libmesh_error_msg("Invalid dimension dim = " << dim);
467  } // switch(dim)
468 }

◆ build() [3/3]

static std::unique_ptr<FEGenericBase> libMesh::FEGenericBase< FEOutputType< T >::type >::build ( const unsigned int  dim,
const FEType type 
)
staticinherited

Builds a specific finite element type.

A std::unique_ptr<FEGenericBase> is returned to prevent a memory leak. This way the user need not remember to delete the object.

The build call will fail if the OutputType of this class is not compatible with the output required for the requested type

◆ build_InfFE() [1/3]

std::unique_ptr< FEGenericBase< Real > > libMesh::FEGenericBase< Real >::build_InfFE ( const unsigned int  dim,
const FEType fet 
)
inherited

Definition at line 481 of file fe_base.C.

483 {
484  switch (dim)
485  {
486 
487  // 1D
488  case 1:
489  {
490  switch (fet.radial_family)
491  {
492  case INFINITE_MAP:
493  libmesh_error_msg("ERROR: Can't build an infinite element with FEFamily = " << fet.radial_family);
494 
495  case JACOBI_20_00:
496  {
497  switch (fet.inf_map)
498  {
499  case CARTESIAN:
500  return libmesh_make_unique<InfFE<1,JACOBI_20_00,CARTESIAN>>(fet);
501 
502  default:
503  libmesh_error_msg("ERROR: Can't build an infinite element with InfMapType = " << fet.inf_map);
504  }
505  }
506 
507  case JACOBI_30_00:
508  {
509  switch (fet.inf_map)
510  {
511  case CARTESIAN:
512  return libmesh_make_unique<InfFE<1,JACOBI_30_00,CARTESIAN>>(fet);
513 
514  default:
515  libmesh_error_msg("ERROR: Can't build an infinite element with InfMapType = " << fet.inf_map);
516  }
517  }
518 
519  case LEGENDRE:
520  {
521  switch (fet.inf_map)
522  {
523  case CARTESIAN:
524  return libmesh_make_unique<InfFE<1,LEGENDRE,CARTESIAN>>(fet);
525 
526  default:
527  libmesh_error_msg("ERROR: Can't build an infinite element with InfMapType = " << fet.inf_map);
528  }
529  }
530 
531  case LAGRANGE:
532  {
533  switch (fet.inf_map)
534  {
535  case CARTESIAN:
536  return libmesh_make_unique<InfFE<1,LAGRANGE,CARTESIAN>>(fet);
537 
538  default:
539  libmesh_error_msg("ERROR: Can't build an infinite element with InfMapType = " << fet.inf_map);
540  }
541  }
542 
543  default:
544  libmesh_error_msg("ERROR: Bad FEType.radial_family= " << fet.radial_family);
545  }
546  }
547 
548 
549 
550 
551  // 2D
552  case 2:
553  {
554  switch (fet.radial_family)
555  {
556  case INFINITE_MAP:
557  libmesh_error_msg("ERROR: Can't build an infinite element with FEFamily = " << fet.radial_family);
558 
559  case JACOBI_20_00:
560  {
561  switch (fet.inf_map)
562  {
563  case CARTESIAN:
564  return libmesh_make_unique<InfFE<2,JACOBI_20_00,CARTESIAN>>(fet);
565 
566  default:
567  libmesh_error_msg("ERROR: Don't build an infinite element with InfMapType = " << fet.inf_map);
568  }
569  }
570 
571  case JACOBI_30_00:
572  {
573  switch (fet.inf_map)
574  {
575  case CARTESIAN:
576  return libmesh_make_unique<InfFE<2,JACOBI_30_00,CARTESIAN>>(fet);
577 
578  default:
579  libmesh_error_msg("ERROR: Don't build an infinite element with InfMapType = " << fet.inf_map);
580  }
581  }
582 
583  case LEGENDRE:
584  {
585  switch (fet.inf_map)
586  {
587  case CARTESIAN:
588  return libmesh_make_unique<InfFE<2,LEGENDRE,CARTESIAN>>(fet);
589 
590  default:
591  libmesh_error_msg("ERROR: Don't build an infinite element with InfMapType = " << fet.inf_map);
592  }
593  }
594 
595  case LAGRANGE:
596  {
597  switch (fet.inf_map)
598  {
599  case CARTESIAN:
600  return libmesh_make_unique<InfFE<2,LAGRANGE,CARTESIAN>>(fet);
601 
602  default:
603  libmesh_error_msg("ERROR: Don't build an infinite element with InfMapType = " << fet.inf_map);
604  }
605  }
606 
607  default:
608  libmesh_error_msg("ERROR: Bad FEType.radial_family= " << fet.radial_family);
609  }
610  }
611 
612 
613 
614 
615  // 3D
616  case 3:
617  {
618  switch (fet.radial_family)
619  {
620  case INFINITE_MAP:
621  libmesh_error_msg("ERROR: Don't build an infinite element with FEFamily = " << fet.radial_family);
622 
623  case JACOBI_20_00:
624  {
625  switch (fet.inf_map)
626  {
627  case CARTESIAN:
628  return libmesh_make_unique<InfFE<3,JACOBI_20_00,CARTESIAN>>(fet);
629 
630  default:
631  libmesh_error_msg("ERROR: Don't build an infinite element with InfMapType = " << fet.inf_map);
632  }
633  }
634 
635  case JACOBI_30_00:
636  {
637  switch (fet.inf_map)
638  {
639  case CARTESIAN:
640  return libmesh_make_unique<InfFE<3,JACOBI_30_00,CARTESIAN>>(fet);
641 
642  default:
643  libmesh_error_msg("ERROR: Don't build an infinite element with InfMapType = " << fet.inf_map);
644  }
645  }
646 
647  case LEGENDRE:
648  {
649  switch (fet.inf_map)
650  {
651  case CARTESIAN:
652  return libmesh_make_unique<InfFE<3,LEGENDRE,CARTESIAN>>(fet);
653 
654  default:
655  libmesh_error_msg("ERROR: Don't build an infinite element with InfMapType = " << fet.inf_map);
656  }
657  }
658 
659  case LAGRANGE:
660  {
661  switch (fet.inf_map)
662  {
663  case CARTESIAN:
664  return libmesh_make_unique<InfFE<3,LAGRANGE,CARTESIAN>>(fet);
665 
666  default:
667  libmesh_error_msg("ERROR: Don't build an infinite element with InfMapType = " << fet.inf_map);
668  }
669  }
670 
671  default:
672  libmesh_error_msg("ERROR: Bad FEType.radial_family= " << fet.radial_family);
673  }
674  }
675 
676  default:
677  libmesh_error_msg("Invalid dimension dim = " << dim);
678  }
679 }

◆ build_InfFE() [2/3]

static std::unique_ptr<FEGenericBase> libMesh::FEGenericBase< FEOutputType< T >::type >::build_InfFE ( const unsigned int  dim,
const FEType type 
)
staticinherited

Builds a specific infinite element type.

A std::unique_ptr<FEGenericBase> is returned to prevent a memory leak. This way the user need not remember to delete the object.

The build call will fail if the OutputShape of this class is not compatible with the output required for the requested type

◆ build_InfFE() [3/3]

std::unique_ptr< FEGenericBase< RealGradient > > libMesh::FEGenericBase< RealGradient >::build_InfFE ( const unsigned int  ,
const FEType  
)
inherited

Definition at line 685 of file fe_base.C.

687 {
688  // No vector types defined... YET.
689  libmesh_not_implemented();
690  return std::unique_ptr<FEVectorBase>();
691 }

◆ coarsened_dof_values() [1/2]

void libMesh::FEGenericBase< FEOutputType< T >::type >::coarsened_dof_values ( const NumericVector< Number > &  global_vector,
const DofMap dof_map,
const Elem coarse_elem,
DenseVector< Number > &  coarse_dofs,
const bool  use_old_dof_indices = false 
)
staticinherited

Creates a local projection on coarse_elem, based on the DoF values in global_vector for it's children.

Computes a vector of coefficients corresponding to all dof_indices.

Definition at line 1373 of file fe_base.C.

1378 {
1379  Ue.resize(0);
1380 
1381  for (unsigned int v=0; v != dof_map.n_variables(); ++v)
1382  {
1383  DenseVector<Number> Usub;
1384 
1385  coarsened_dof_values(old_vector, dof_map, elem, Usub,
1386  v, use_old_dof_indices);
1387 
1388  Ue.append (Usub);
1389  }
1390 }

◆ coarsened_dof_values() [2/2]

void libMesh::FEGenericBase< FEOutputType< T >::type >::coarsened_dof_values ( const NumericVector< Number > &  global_vector,
const DofMap dof_map,
const Elem coarse_elem,
DenseVector< Number > &  coarse_dofs,
const unsigned int  var,
const bool  use_old_dof_indices = false 
)
staticinherited

Creates a local projection on coarse_elem, based on the DoF values in global_vector for it's children.

Computes a vector of coefficients corresponding to dof_indices for only the single given var

Definition at line 822 of file fe_base.C.

828 {
829  // Side/edge local DOF indices
830  std::vector<unsigned int> new_side_dofs, old_side_dofs;
831 
832  // FIXME: what about 2D shells in 3D space?
833  unsigned int dim = elem->dim();
834 
835  // Cache n_children(); it's a virtual call but it's const.
836  const unsigned int n_children = elem->n_children();
837 
838  // We use local FE objects for now
839  // FIXME: we should use more, external objects instead for efficiency
840  const FEType & base_fe_type = dof_map.variable_type(var);
841  std::unique_ptr<FEGenericBase<OutputShape>> fe
842  (FEGenericBase<OutputShape>::build(dim, base_fe_type));
843  std::unique_ptr<FEGenericBase<OutputShape>> fe_coarse
844  (FEGenericBase<OutputShape>::build(dim, base_fe_type));
845 
846  std::unique_ptr<QBase> qrule (base_fe_type.default_quadrature_rule(dim));
847  std::unique_ptr<QBase> qedgerule (base_fe_type.default_quadrature_rule(1));
848  std::unique_ptr<QBase> qsiderule (base_fe_type.default_quadrature_rule(dim-1));
849  std::vector<Point> coarse_qpoints;
850 
851  // The values of the shape functions at the quadrature
852  // points
853  const std::vector<std::vector<OutputShape>> & phi_values =
854  fe->get_phi();
855  const std::vector<std::vector<OutputShape>> & phi_coarse =
856  fe_coarse->get_phi();
857 
858  // The gradients of the shape functions at the quadrature
859  // points on the child element.
860  const std::vector<std::vector<OutputGradient>> * dphi_values =
861  nullptr;
862  const std::vector<std::vector<OutputGradient>> * dphi_coarse =
863  nullptr;
864 
865  const FEContinuity cont = fe->get_continuity();
866 
867  if (cont == C_ONE)
868  {
869  const std::vector<std::vector<OutputGradient>> &
870  ref_dphi_values = fe->get_dphi();
871  dphi_values = &ref_dphi_values;
872  const std::vector<std::vector<OutputGradient>> &
873  ref_dphi_coarse = fe_coarse->get_dphi();
874  dphi_coarse = &ref_dphi_coarse;
875  }
876 
877  // The Jacobian * quadrature weight at the quadrature points
878  const std::vector<Real> & JxW =
879  fe->get_JxW();
880 
881  // The XYZ locations of the quadrature points on the
882  // child element
883  const std::vector<Point> & xyz_values =
884  fe->get_xyz();
885 
886 
887 
888  FEType fe_type = base_fe_type, temp_fe_type;
889  const ElemType elem_type = elem->type();
890  fe_type.order = static_cast<Order>(fe_type.order +
891  elem->max_descendant_p_level());
892 
893  // Number of nodes on parent element
894  const unsigned int n_nodes = elem->n_nodes();
895 
896  // Number of dofs on parent element
897  const unsigned int new_n_dofs =
898  FEInterface::n_dofs(dim, fe_type, elem_type);
899 
900  // Fixed vs. free DoFs on edge/face projections
901  std::vector<char> dof_is_fixed(new_n_dofs, false); // bools
902  std::vector<int> free_dof(new_n_dofs, 0);
903 
906  Ue.resize(new_n_dofs); Ue.zero();
907 
908 
909  // When coarsening, in general, we need a series of
910  // projections to ensure a unique and continuous
911  // solution. We start by interpolating nodes, then
912  // hold those fixed and project edges, then
913  // hold those fixed and project faces, then
914  // hold those fixed and project interiors
915 
916  // Copy node values first
917  {
918  std::vector<dof_id_type> node_dof_indices;
919  if (use_old_dof_indices)
920  dof_map.old_dof_indices (elem, node_dof_indices, var);
921  else
922  dof_map.dof_indices (elem, node_dof_indices, var);
923 
924  unsigned int current_dof = 0;
925  for (unsigned int n=0; n!= n_nodes; ++n)
926  {
927  // FIXME: this should go through the DofMap,
928  // not duplicate dof_indices code badly!
929  const unsigned int my_nc =
930  FEInterface::n_dofs_at_node (dim, fe_type,
931  elem_type, n);
932  if (!elem->is_vertex(n))
933  {
934  current_dof += my_nc;
935  continue;
936  }
937 
938  temp_fe_type = base_fe_type;
939  // We're assuming here that child n shares vertex n,
940  // which is wrong on non-simplices right now
941  // ... but this code isn't necessary except on elements
942  // where p refinement creates more vertex dofs; we have
943  // no such elements yet.
944  /*
945  if (elem->child_ptr(n)->p_level() < elem->p_level())
946  {
947  temp_fe_type.order =
948  static_cast<Order>(temp_fe_type.order +
949  elem->child_ptr(n)->p_level());
950  }
951  */
952  const unsigned int nc =
953  FEInterface::n_dofs_at_node (dim, temp_fe_type,
954  elem_type, n);
955  for (unsigned int i=0; i!= nc; ++i)
956  {
957  Ue(current_dof) =
958  old_vector(node_dof_indices[current_dof]);
959  dof_is_fixed[current_dof] = true;
960  current_dof++;
961  }
962  }
963  }
964 
965  // In 3D, project any edge values next
966  if (dim > 2 && cont != DISCONTINUOUS)
967  for (auto e : elem->edge_index_range())
968  {
969  FEInterface::dofs_on_edge(elem, dim, fe_type,
970  e, new_side_dofs);
971 
972  const unsigned int n_new_side_dofs =
973  cast_int<unsigned int>(new_side_dofs.size());
974 
975  // Some edge dofs are on nodes and already
976  // fixed, others are free to calculate
977  unsigned int free_dofs = 0;
978  for (unsigned int i=0; i != n_new_side_dofs; ++i)
979  if (!dof_is_fixed[new_side_dofs[i]])
980  free_dof[free_dofs++] = i;
981  Ke.resize (free_dofs, free_dofs); Ke.zero();
982  Fe.resize (free_dofs); Fe.zero();
983  // The new edge coefficients
984  DenseVector<Number> Uedge(free_dofs);
985 
986  // Add projection terms from each child sharing
987  // this edge
988  for (unsigned int c=0; c != n_children; ++c)
989  {
990  if (!elem->is_child_on_edge(c,e))
991  continue;
992  const Elem * child = elem->child_ptr(c);
993 
994  std::vector<dof_id_type> child_dof_indices;
995  if (use_old_dof_indices)
996  dof_map.old_dof_indices (child,
997  child_dof_indices, var);
998  else
999  dof_map.dof_indices (child,
1000  child_dof_indices, var);
1001  const unsigned int child_n_dofs =
1002  cast_int<unsigned int>
1003  (child_dof_indices.size());
1004 
1005  temp_fe_type = base_fe_type;
1006  temp_fe_type.order =
1007  static_cast<Order>(temp_fe_type.order +
1008  child->p_level());
1009 
1010  FEInterface::dofs_on_edge(child, dim,
1011  temp_fe_type, e, old_side_dofs);
1012 
1013  // Initialize both child and parent FE data
1014  // on the child's edge
1015  fe->attach_quadrature_rule (qedgerule.get());
1016  fe->edge_reinit (child, e);
1017  const unsigned int n_qp = qedgerule->n_points();
1018 
1019  FEMap::inverse_map (dim, elem, xyz_values,
1020  coarse_qpoints);
1021 
1022  fe_coarse->reinit(elem, &coarse_qpoints);
1023 
1024  // Loop over the quadrature points
1025  for (unsigned int qp=0; qp<n_qp; qp++)
1026  {
1027  // solution value at the quadrature point
1028  OutputNumber fineval = libMesh::zero;
1029  // solution grad at the quadrature point
1030  OutputNumberGradient finegrad;
1031 
1032  // Sum the solution values * the DOF
1033  // values at the quadrature point to
1034  // get the solution value and gradient.
1035  for (unsigned int i=0; i<child_n_dofs;
1036  i++)
1037  {
1038  fineval +=
1039  (old_vector(child_dof_indices[i])*
1040  phi_values[i][qp]);
1041  if (cont == C_ONE)
1042  finegrad += (*dphi_values)[i][qp] *
1043  old_vector(child_dof_indices[i]);
1044  }
1045 
1046  // Form edge projection matrix
1047  for (unsigned int sidei=0, freei=0; sidei != n_new_side_dofs; ++sidei)
1048  {
1049  unsigned int i = new_side_dofs[sidei];
1050  // fixed DoFs aren't test functions
1051  if (dof_is_fixed[i])
1052  continue;
1053  for (unsigned int sidej=0, freej=0; sidej != n_new_side_dofs; ++sidej)
1054  {
1055  unsigned int j =
1056  new_side_dofs[sidej];
1057  if (dof_is_fixed[j])
1058  Fe(freei) -=
1059  TensorTools::inner_product(phi_coarse[i][qp],
1060  phi_coarse[j][qp]) *
1061  JxW[qp] * Ue(j);
1062  else
1063  Ke(freei,freej) +=
1064  TensorTools::inner_product(phi_coarse[i][qp],
1065  phi_coarse[j][qp]) *
1066  JxW[qp];
1067  if (cont == C_ONE)
1068  {
1069  if (dof_is_fixed[j])
1070  Fe(freei) -=
1071  TensorTools::inner_product((*dphi_coarse)[i][qp],
1072  (*dphi_coarse)[j][qp]) *
1073  JxW[qp] * Ue(j);
1074  else
1075  Ke(freei,freej) +=
1076  TensorTools::inner_product((*dphi_coarse)[i][qp],
1077  (*dphi_coarse)[j][qp]) *
1078  JxW[qp];
1079  }
1080  if (!dof_is_fixed[j])
1081  freej++;
1082  }
1083  Fe(freei) += TensorTools::inner_product(phi_coarse[i][qp],
1084  fineval) * JxW[qp];
1085  if (cont == C_ONE)
1086  Fe(freei) +=
1087  TensorTools::inner_product(finegrad, (*dphi_coarse)[i][qp]) * JxW[qp];
1088  freei++;
1089  }
1090  }
1091  }
1092  Ke.cholesky_solve(Fe, Uedge);
1093 
1094  // Transfer new edge solutions to element
1095  for (unsigned int i=0; i != free_dofs; ++i)
1096  {
1097  Number & ui = Ue(new_side_dofs[free_dof[i]]);
1099  std::abs(ui - Uedge(i)) < TOLERANCE);
1100  ui = Uedge(i);
1101  dof_is_fixed[new_side_dofs[free_dof[i]]] = true;
1102  }
1103  }
1104 
1105  // Project any side values (edges in 2D, faces in 3D)
1106  if (dim > 1 && cont != DISCONTINUOUS)
1107  for (auto s : elem->side_index_range())
1108  {
1109  FEInterface::dofs_on_side(elem, dim, fe_type,
1110  s, new_side_dofs);
1111 
1112  const unsigned int n_new_side_dofs =
1113  cast_int<unsigned int>(new_side_dofs.size());
1114 
1115  // Some side dofs are on nodes/edges and already
1116  // fixed, others are free to calculate
1117  unsigned int free_dofs = 0;
1118  for (unsigned int i=0; i != n_new_side_dofs; ++i)
1119  if (!dof_is_fixed[new_side_dofs[i]])
1120  free_dof[free_dofs++] = i;
1121  Ke.resize (free_dofs, free_dofs); Ke.zero();
1122  Fe.resize (free_dofs); Fe.zero();
1123  // The new side coefficients
1124  DenseVector<Number> Uside(free_dofs);
1125 
1126  // Add projection terms from each child sharing
1127  // this side
1128  for (unsigned int c=0; c != n_children; ++c)
1129  {
1130  if (!elem->is_child_on_side(c,s))
1131  continue;
1132  const Elem * child = elem->child_ptr(c);
1133 
1134  std::vector<dof_id_type> child_dof_indices;
1135  if (use_old_dof_indices)
1136  dof_map.old_dof_indices (child,
1137  child_dof_indices, var);
1138  else
1139  dof_map.dof_indices (child,
1140  child_dof_indices, var);
1141  const unsigned int child_n_dofs =
1142  cast_int<unsigned int>
1143  (child_dof_indices.size());
1144 
1145  temp_fe_type = base_fe_type;
1146  temp_fe_type.order =
1147  static_cast<Order>(temp_fe_type.order +
1148  child->p_level());
1149 
1150  FEInterface::dofs_on_side(child, dim,
1151  temp_fe_type, s, old_side_dofs);
1152 
1153  // Initialize both child and parent FE data
1154  // on the child's side
1155  fe->attach_quadrature_rule (qsiderule.get());
1156  fe->reinit (child, s);
1157  const unsigned int n_qp = qsiderule->n_points();
1158 
1159  FEMap::inverse_map (dim, elem, xyz_values,
1160  coarse_qpoints);
1161 
1162  fe_coarse->reinit(elem, &coarse_qpoints);
1163 
1164  // Loop over the quadrature points
1165  for (unsigned int qp=0; qp<n_qp; qp++)
1166  {
1167  // solution value at the quadrature point
1168  OutputNumber fineval = libMesh::zero;
1169  // solution grad at the quadrature point
1170  OutputNumberGradient finegrad;
1171 
1172  // Sum the solution values * the DOF
1173  // values at the quadrature point to
1174  // get the solution value and gradient.
1175  for (unsigned int i=0; i<child_n_dofs;
1176  i++)
1177  {
1178  fineval +=
1179  old_vector(child_dof_indices[i]) *
1180  phi_values[i][qp];
1181  if (cont == C_ONE)
1182  finegrad += (*dphi_values)[i][qp] *
1183  old_vector(child_dof_indices[i]);
1184  }
1185 
1186  // Form side projection matrix
1187  for (unsigned int sidei=0, freei=0; sidei != n_new_side_dofs; ++sidei)
1188  {
1189  unsigned int i = new_side_dofs[sidei];
1190  // fixed DoFs aren't test functions
1191  if (dof_is_fixed[i])
1192  continue;
1193  for (unsigned int sidej=0, freej=0; sidej != n_new_side_dofs; ++sidej)
1194  {
1195  unsigned int j =
1196  new_side_dofs[sidej];
1197  if (dof_is_fixed[j])
1198  Fe(freei) -=
1199  TensorTools::inner_product(phi_coarse[i][qp],
1200  phi_coarse[j][qp]) *
1201  JxW[qp] * Ue(j);
1202  else
1203  Ke(freei,freej) +=
1204  TensorTools::inner_product(phi_coarse[i][qp],
1205  phi_coarse[j][qp]) *
1206  JxW[qp];
1207  if (cont == C_ONE)
1208  {
1209  if (dof_is_fixed[j])
1210  Fe(freei) -=
1211  TensorTools::inner_product((*dphi_coarse)[i][qp],
1212  (*dphi_coarse)[j][qp]) *
1213  JxW[qp] * Ue(j);
1214  else
1215  Ke(freei,freej) +=
1216  TensorTools::inner_product((*dphi_coarse)[i][qp],
1217  (*dphi_coarse)[j][qp]) *
1218  JxW[qp];
1219  }
1220  if (!dof_is_fixed[j])
1221  freej++;
1222  }
1223  Fe(freei) += TensorTools::inner_product(fineval, phi_coarse[i][qp]) * JxW[qp];
1224  if (cont == C_ONE)
1225  Fe(freei) +=
1226  TensorTools::inner_product(finegrad, (*dphi_coarse)[i][qp]) * JxW[qp];
1227  freei++;
1228  }
1229  }
1230  }
1231  Ke.cholesky_solve(Fe, Uside);
1232 
1233  // Transfer new side solutions to element
1234  for (unsigned int i=0; i != free_dofs; ++i)
1235  {
1236  Number & ui = Ue(new_side_dofs[free_dof[i]]);
1238  std::abs(ui - Uside(i)) < TOLERANCE);
1239  ui = Uside(i);
1240  dof_is_fixed[new_side_dofs[free_dof[i]]] = true;
1241  }
1242  }
1243 
1244  // Project the interior values, finally
1245 
1246  // Some interior dofs are on nodes/edges/sides and
1247  // already fixed, others are free to calculate
1248  unsigned int free_dofs = 0;
1249  for (unsigned int i=0; i != new_n_dofs; ++i)
1250  if (!dof_is_fixed[i])
1251  free_dof[free_dofs++] = i;
1252  Ke.resize (free_dofs, free_dofs); Ke.zero();
1253  Fe.resize (free_dofs); Fe.zero();
1254  // The new interior coefficients
1255  DenseVector<Number> Uint(free_dofs);
1256 
1257  // Add projection terms from each child
1258  for (auto & child : elem->child_ref_range())
1259  {
1260  std::vector<dof_id_type> child_dof_indices;
1261  if (use_old_dof_indices)
1262  dof_map.old_dof_indices (&child,
1263  child_dof_indices, var);
1264  else
1265  dof_map.dof_indices (&child,
1266  child_dof_indices, var);
1267  const unsigned int child_n_dofs =
1268  cast_int<unsigned int>
1269  (child_dof_indices.size());
1270 
1271  // Initialize both child and parent FE data
1272  // on the child's quadrature points
1273  fe->attach_quadrature_rule (qrule.get());
1274  fe->reinit (&child);
1275  const unsigned int n_qp = qrule->n_points();
1276 
1277  FEMap::inverse_map (dim, elem, xyz_values, coarse_qpoints);
1278 
1279  fe_coarse->reinit(elem, &coarse_qpoints);
1280 
1281  // Loop over the quadrature points
1282  for (unsigned int qp=0; qp<n_qp; qp++)
1283  {
1284  // solution value at the quadrature point
1285  OutputNumber fineval = libMesh::zero;
1286  // solution grad at the quadrature point
1287  OutputNumberGradient finegrad;
1288 
1289  // Sum the solution values * the DOF
1290  // values at the quadrature point to
1291  // get the solution value and gradient.
1292  for (unsigned int i=0; i<child_n_dofs; i++)
1293  {
1294  fineval +=
1295  (old_vector(child_dof_indices[i]) *
1296  phi_values[i][qp]);
1297  if (cont == C_ONE)
1298  finegrad += (*dphi_values)[i][qp] *
1299  old_vector(child_dof_indices[i]);
1300  }
1301 
1302  // Form interior projection matrix
1303  for (unsigned int i=0, freei=0;
1304  i != new_n_dofs; ++i)
1305  {
1306  // fixed DoFs aren't test functions
1307  if (dof_is_fixed[i])
1308  continue;
1309  for (unsigned int j=0, freej=0; j !=
1310  new_n_dofs; ++j)
1311  {
1312  if (dof_is_fixed[j])
1313  Fe(freei) -=
1314  TensorTools::inner_product(phi_coarse[i][qp],
1315  phi_coarse[j][qp]) *
1316  JxW[qp] * Ue(j);
1317  else
1318  Ke(freei,freej) +=
1319  TensorTools::inner_product(phi_coarse[i][qp],
1320  phi_coarse[j][qp]) *
1321  JxW[qp];
1322  if (cont == C_ONE)
1323  {
1324  if (dof_is_fixed[j])
1325  Fe(freei) -=
1326  TensorTools::inner_product((*dphi_coarse)[i][qp],
1327  (*dphi_coarse)[j][qp]) *
1328  JxW[qp] * Ue(j);
1329  else
1330  Ke(freei,freej) +=
1331  TensorTools::inner_product((*dphi_coarse)[i][qp],
1332  (*dphi_coarse)[j][qp]) *
1333  JxW[qp];
1334  }
1335  if (!dof_is_fixed[j])
1336  freej++;
1337  }
1338  Fe(freei) += TensorTools::inner_product(phi_coarse[i][qp], fineval) *
1339  JxW[qp];
1340  if (cont == C_ONE)
1341  Fe(freei) += TensorTools::inner_product(finegrad, (*dphi_coarse)[i][qp]) * JxW[qp];
1342  freei++;
1343  }
1344  }
1345  }
1346  Ke.cholesky_solve(Fe, Uint);
1347 
1348  // Transfer new interior solutions to element
1349  for (unsigned int i=0; i != free_dofs; ++i)
1350  {
1351  Number & ui = Ue(free_dof[i]);
1353  std::abs(ui - Uint(i)) < TOLERANCE);
1354  ui = Uint(i);
1355  // We should be fixing all dofs by now; no need to keep track of
1356  // that unless we're debugging
1357 #ifndef NDEBUG
1358  dof_is_fixed[free_dof[i]] = true;
1359 #endif
1360  }
1361 
1362 #ifndef NDEBUG
1363  // Make sure every DoF got reached!
1364  for (unsigned int i=0; i != new_n_dofs; ++i)
1365  libmesh_assert(dof_is_fixed[i]);
1366 #endif
1367 }

◆ compute_constraints() [1/33]

void libMesh::FE< 2, SCALAR >::compute_constraints ( DofConstraints ,
DofMap ,
const unsigned int  ,
const Elem  
)
inherited

Definition at line 122 of file fe_scalar.C.

126 { }

◆ compute_constraints() [2/33]

void libMesh::FE< 3, SCALAR >::compute_constraints ( DofConstraints ,
DofMap ,
const unsigned int  ,
const Elem  
)
inherited

Definition at line 129 of file fe_scalar.C.

133 { }

◆ compute_constraints() [3/33]

void libMesh::FE< 2, L2_HIERARCHIC >::compute_constraints ( DofConstraints ,
DofMap ,
const unsigned int  ,
const Elem  
)
inherited

Definition at line 207 of file fe_l2_hierarchic.C.

211 { }

◆ compute_constraints() [4/33]

void libMesh::FE< 3, L2_HIERARCHIC >::compute_constraints ( DofConstraints ,
DofMap ,
const unsigned int  ,
const Elem  
)
inherited

Definition at line 214 of file fe_l2_hierarchic.C.

218 { }

◆ compute_constraints() [5/33]

void libMesh::FE< 2, MONOMIAL >::compute_constraints ( DofConstraints ,
DofMap ,
const unsigned int  ,
const Elem  
)
inherited

Definition at line 415 of file fe_monomial.C.

415 {}

◆ compute_constraints() [6/33]

void libMesh::FE< 3, MONOMIAL >::compute_constraints ( DofConstraints ,
DofMap ,
const unsigned int  ,
const Elem  
)
inherited

Definition at line 416 of file fe_monomial.C.

416 {}

◆ compute_constraints() [7/33]

void libMesh::FE< 2, L2_LAGRANGE >::compute_constraints ( DofConstraints ,
DofMap ,
const unsigned int  ,
const Elem  
)
inherited

Definition at line 500 of file fe_l2_lagrange.C.

504 { }

◆ compute_constraints() [8/33]

void libMesh::FE< 3, L2_LAGRANGE >::compute_constraints ( DofConstraints ,
DofMap ,
const unsigned int  ,
const Elem  
)
inherited

Definition at line 507 of file fe_l2_lagrange.C.

511 { }

◆ compute_constraints() [9/33]

void libMesh::FE< 0, NEDELEC_ONE >::compute_constraints ( DofConstraints ,
DofMap ,
const unsigned int  ,
const Elem  
)
inherited

Definition at line 558 of file fe_nedelec_one.C.

562 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ compute_constraints() [10/33]

void libMesh::FE< 1, NEDELEC_ONE >::compute_constraints ( DofConstraints ,
DofMap ,
const unsigned int  ,
const Elem  
)
inherited

Definition at line 565 of file fe_nedelec_one.C.

569 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ compute_constraints() [11/33]

void libMesh::FE< 2, MONOMIAL_VEC >::compute_constraints ( DofConstraints ,
DofMap ,
const unsigned int  ,
const Elem  
)
inherited

Definition at line 839 of file fe_monomial_vec.C.

843 {
844 }

◆ compute_constraints() [12/33]

void libMesh::FE< 3, MONOMIAL_VEC >::compute_constraints ( DofConstraints ,
DofMap ,
const unsigned int  ,
const Elem  
)
inherited

Definition at line 848 of file fe_monomial_vec.C.

852 {
853 }

◆ compute_constraints() [13/33]

void libMesh::FE< 2, XYZ >::compute_constraints ( DofConstraints ,
DofMap ,
const unsigned int  ,
const Elem  
)
inherited

Definition at line 942 of file fe_xyz.C.

942 {}

◆ compute_constraints() [14/33]

void libMesh::FE< 3, XYZ >::compute_constraints ( DofConstraints ,
DofMap ,
const unsigned int  ,
const Elem  
)
inherited

Definition at line 943 of file fe_xyz.C.

943 {}

◆ compute_constraints() [15/33]

void libMesh::FE< 2, RATIONAL_BERNSTEIN >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
inherited

Definition at line 180 of file fe_rational.C.

184 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }

◆ compute_constraints() [16/33]

void libMesh::FE< 3, RATIONAL_BERNSTEIN >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
inherited

Definition at line 187 of file fe_rational.C.

191 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }

◆ compute_constraints() [17/33]

void libMesh::FE< 2, CLOUGH >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
inherited

Definition at line 303 of file fe_clough.C.

307 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }

◆ compute_constraints() [18/33]

void libMesh::FE< 3, CLOUGH >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
inherited

Definition at line 310 of file fe_clough.C.

314 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }

◆ compute_constraints() [19/33]

void libMesh::FE< 2, HERMITE >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
inherited

Definition at line 355 of file fe_hermite.C.

359 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }

◆ compute_constraints() [20/33]

void libMesh::FE< 3, HERMITE >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
inherited

Definition at line 362 of file fe_hermite.C.

366 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }

◆ compute_constraints() [21/33]

void libMesh::FE< 2, HIERARCHIC >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
inherited

Definition at line 384 of file fe_hierarchic.C.

388 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }

◆ compute_constraints() [22/33]

void libMesh::FE< 3, HIERARCHIC >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
inherited

Definition at line 391 of file fe_hierarchic.C.

395 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }

◆ compute_constraints() [23/33]

static void libMesh::FE< Dim, T >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
staticinherited

Computes the constraint matrix contributions (for non-conforming adapted meshes) corresponding to variable number var_number, using element-specific optimizations if possible.

◆ compute_constraints() [24/33]

void libMesh::FE< 2, BERNSTEIN >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
inherited

Definition at line 451 of file fe_bernstein.C.

455 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }

◆ compute_constraints() [25/33]

void libMesh::FE< 3, BERNSTEIN >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
inherited

Definition at line 458 of file fe_bernstein.C.

462 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }

◆ compute_constraints() [26/33]

void libMesh::FE< 2, NEDELEC_ONE >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
inherited

Definition at line 572 of file fe_nedelec_one.C.

576 { nedelec_one_compute_constraints(constraints, dof_map, variable_number, elem, /*Dim=*/2); }

◆ compute_constraints() [27/33]

void libMesh::FE< 3, NEDELEC_ONE >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
inherited

Definition at line 579 of file fe_nedelec_one.C.

583 { nedelec_one_compute_constraints(constraints, dof_map, variable_number, elem, /*Dim=*/3); }

◆ compute_constraints() [28/33]

void libMesh::FE< 2, LAGRANGE >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
inherited

Definition at line 896 of file fe_lagrange.C.

900 { lagrange_compute_constraints(constraints, dof_map, variable_number, elem, /*Dim=*/2); }

◆ compute_constraints() [29/33]

void libMesh::FE< 3, LAGRANGE >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
inherited

Definition at line 903 of file fe_lagrange.C.

907 { lagrange_compute_constraints(constraints, dof_map, variable_number, elem, /*Dim=*/3); }

◆ compute_constraints() [30/33]

void libMesh::FE< 2, LAGRANGE_VEC >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
inherited

Definition at line 994 of file fe_lagrange_vec.C.

998 { //libmesh_not_implemented();
999  FEVectorBase::compute_proj_constraints(constraints, dof_map, variable_number, elem);
1000 }

◆ compute_constraints() [31/33]

void libMesh::FE< 3, LAGRANGE_VEC >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
inherited

Definition at line 1003 of file fe_lagrange_vec.C.

1007 { //libmesh_not_implemented();
1008  FEVectorBase::compute_proj_constraints(constraints, dof_map, variable_number, elem);
1009 }

◆ compute_constraints() [32/33]

void libMesh::FE< 2, SZABAB >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
inherited

Definition at line 1287 of file fe_szabab.C.

1291 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }

◆ compute_constraints() [33/33]

void libMesh::FE< 3, SZABAB >::compute_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
inherited

Definition at line 1294 of file fe_szabab.C.

1298 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }

◆ compute_node_constraints()

void libMesh::FEAbstract::compute_node_constraints ( NodeConstraints constraints,
const Elem elem 
)
staticinherited

Computes the nodal constraint contributions (for non-conforming adapted meshes), using Lagrange geometry.

Definition at line 845 of file fe_abstract.C.

847 {
848  libmesh_assert(elem);
849 
850  const unsigned int Dim = elem->dim();
851 
852  // Only constrain elements in 2,3D.
853  if (Dim == 1)
854  return;
855 
856  // Only constrain active and ancestor elements
857  if (elem->subactive())
858  return;
859 
860  const FEFamily mapping_family = FEMap::map_fe_type(*elem);
861  const FEType fe_type(elem->default_order(), mapping_family);
862 
863  // Pull objects out of the loop to reduce heap operations
864  std::vector<const Node *> my_nodes, parent_nodes;
865  std::unique_ptr<const Elem> my_side, parent_side;
866 
867  // Look at the element faces. Check to see if we need to
868  // build constraints.
869  for (auto s : elem->side_index_range())
870  if (elem->neighbor_ptr(s) != nullptr &&
871  elem->neighbor_ptr(s) != remote_elem)
872  if (elem->neighbor_ptr(s)->level() < elem->level()) // constrain dofs shared between
873  { // this element and ones coarser
874  // than this element.
875  // Get pointers to the elements of interest and its parent.
876  const Elem * parent = elem->parent();
877 
878  // This can't happen... Only level-0 elements have nullptr
879  // parents, and no level-0 elements can be at a higher
880  // level than their neighbors!
881  libmesh_assert(parent);
882 
883  elem->build_side_ptr(my_side, s);
884  parent->build_side_ptr(parent_side, s);
885 
886  const unsigned int n_side_nodes = my_side->n_nodes();
887 
888  my_nodes.clear();
889  my_nodes.reserve (n_side_nodes);
890  parent_nodes.clear();
891  parent_nodes.reserve (n_side_nodes);
892 
893  for (unsigned int n=0; n != n_side_nodes; ++n)
894  my_nodes.push_back(my_side->node_ptr(n));
895 
896  for (unsigned int n=0; n != n_side_nodes; ++n)
897  parent_nodes.push_back(parent_side->node_ptr(n));
898 
899  for (unsigned int my_side_n=0;
900  my_side_n < n_side_nodes;
901  my_side_n++)
902  {
903  libmesh_assert_less (my_side_n, FEInterface::n_dofs(Dim-1, fe_type, my_side->type()));
904 
905  const Node * my_node = my_nodes[my_side_n];
906 
907  // The support point of the DOF
908  const Point & support_point = *my_node;
909 
910  // Figure out where my node lies on their reference element.
911  const Point mapped_point = FEMap::inverse_map(Dim-1,
912  parent_side.get(),
913  support_point);
914 
915  // Compute the parent's side shape function values.
916  for (unsigned int their_side_n=0;
917  their_side_n < n_side_nodes;
918  their_side_n++)
919  {
920  libmesh_assert_less (their_side_n, FEInterface::n_dofs(Dim-1, fe_type, parent_side->type()));
921 
922  const Node * their_node = parent_nodes[their_side_n];
923  libmesh_assert(their_node);
924 
925  const Real their_value = FEInterface::shape(Dim-1,
926  fe_type,
927  parent_side->type(),
928  their_side_n,
929  mapped_point);
930 
931  const Real their_mag = std::abs(their_value);
932 #ifdef DEBUG
933  // Protect for the case u_i ~= u_j,
934  // in which case i better equal j.
935  if (their_mag > 0.999)
936  {
937  libmesh_assert_equal_to (my_node, their_node);
938  libmesh_assert_less (std::abs(their_value - 1.), 0.001);
939  }
940  else
941 #endif
942  // To make nodal constraints useful for constructing
943  // sparsity patterns faster, we need to get EVERY
944  // POSSIBLE constraint coupling identified, even if
945  // there is no coupling in the isoparametric
946  // Lagrange case.
947  if (their_mag < 1.e-5)
948  {
949  // since we may be running this method concurrently
950  // on multiple threads we need to acquire a lock
951  // before modifying the shared constraint_row object.
952  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
953 
954  // A reference to the constraint row.
955  NodeConstraintRow & constraint_row = constraints[my_node].first;
956 
957  constraint_row.insert(std::make_pair (their_node,
958  0.));
959  }
960  // To get nodal coordinate constraints right, only
961  // add non-zero and non-identity values for Lagrange
962  // basis functions.
963  else // (1.e-5 <= their_mag <= .999)
964  {
965  // since we may be running this method concurrently
966  // on multiple threads we need to acquire a lock
967  // before modifying the shared constraint_row object.
968  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
969 
970  // A reference to the constraint row.
971  NodeConstraintRow & constraint_row = constraints[my_node].first;
972 
973  constraint_row.insert(std::make_pair (their_node,
974  their_value));
975  }
976  }
977  }
978  }
979 }

References std::abs(), libMesh::Elem::build_side_ptr(), libMesh::Elem::default_order(), libMesh::Elem::dim(), libMesh::FEAbstract::fe_type, libMesh::FEMap::inverse_map(), libMesh::Elem::level(), libMesh::libmesh_assert(), libMesh::FEMap::map_fe_type(), libMesh::FEInterface::n_dofs(), libMesh::Elem::neighbor_ptr(), libMesh::Elem::parent(), libMesh::Real, libMesh::remote_elem, libMesh::FEInterface::shape(), libMesh::Elem::side_index_range(), libMesh::Threads::spin_mtx, and libMesh::Elem::subactive().

◆ compute_periodic_constraints()

void libMesh::FEGenericBase< FEOutputType< T >::type >::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 
)
staticinherited

Computes the constraint matrix contributions (for meshes with periodic boundary conditions) corresponding to variable number var_number, using generic projections.

Definition at line 1692 of file fe_base.C.

1699 {
1700  // Only bother if we truly have periodic boundaries
1701  if (boundaries.empty())
1702  return;
1703 
1704  libmesh_assert(elem);
1705 
1706  // Only constrain active elements with this method
1707  if (!elem->active())
1708  return;
1709 
1710  const unsigned int Dim = elem->dim();
1711 
1712  // We need sys_number and variable_number for DofObject methods
1713  // later
1714  const unsigned int sys_number = dof_map.sys_number();
1715 
1716  const FEType & base_fe_type = dof_map.variable_type(variable_number);
1717 
1718  // Construct FE objects for this element and its pseudo-neighbors.
1719  std::unique_ptr<FEGenericBase<OutputShape>> my_fe
1720  (FEGenericBase<OutputShape>::build(Dim, base_fe_type));
1721  const FEContinuity cont = my_fe->get_continuity();
1722 
1723  // We don't need to constrain discontinuous elements
1724  if (cont == DISCONTINUOUS)
1725  return;
1726  libmesh_assert (cont == C_ZERO || cont == C_ONE);
1727 
1728  // We'll use element size to generate relative tolerances later
1729  const Real primary_hmin = elem->hmin();
1730 
1731  std::unique_ptr<FEGenericBase<OutputShape>> neigh_fe
1732  (FEGenericBase<OutputShape>::build(Dim, base_fe_type));
1733 
1734  QGauss my_qface(Dim-1, base_fe_type.default_quadrature_order());
1735  my_fe->attach_quadrature_rule (&my_qface);
1736  std::vector<Point> neigh_qface;
1737 
1738  const std::vector<Real> & JxW = my_fe->get_JxW();
1739  const std::vector<Point> & q_point = my_fe->get_xyz();
1740  const std::vector<std::vector<OutputShape>> & phi = my_fe->get_phi();
1741  const std::vector<std::vector<OutputShape>> & neigh_phi =
1742  neigh_fe->get_phi();
1743  const std::vector<Point> * face_normals = nullptr;
1744  const std::vector<std::vector<OutputGradient>> * dphi = nullptr;
1745  const std::vector<std::vector<OutputGradient>> * neigh_dphi = nullptr;
1746  std::vector<dof_id_type> my_dof_indices, neigh_dof_indices;
1747  std::vector<unsigned int> my_side_dofs, neigh_side_dofs;
1748 
1749  if (cont != C_ZERO)
1750  {
1751  const std::vector<Point> & ref_face_normals =
1752  my_fe->get_normals();
1753  face_normals = &ref_face_normals;
1754  const std::vector<std::vector<OutputGradient>> & ref_dphi =
1755  my_fe->get_dphi();
1756  dphi = &ref_dphi;
1757  const std::vector<std::vector<OutputGradient>> & ref_neigh_dphi =
1758  neigh_fe->get_dphi();
1759  neigh_dphi = &ref_neigh_dphi;
1760  }
1761 
1762  DenseMatrix<Real> Ke;
1763  DenseVector<Real> Fe;
1764  std::vector<DenseVector<Real>> Ue;
1765 
1766  // Container to catch the boundary ids that BoundaryInfo hands us.
1767  std::vector<boundary_id_type> bc_ids;
1768 
1769  // Look at the element faces. Check to see if we need to
1770  // build constraints.
1771  const unsigned short int max_ns = elem->n_sides();
1772  for (unsigned short int s = 0; s != max_ns; ++s)
1773  {
1774  if (elem->neighbor_ptr(s))
1775  continue;
1776 
1777  mesh.get_boundary_info().boundary_ids (elem, s, bc_ids);
1778 
1779  for (const auto & boundary_id : bc_ids)
1780  {
1781  const PeriodicBoundaryBase * periodic = boundaries.boundary(boundary_id);
1782  if (periodic && periodic->is_my_variable(variable_number))
1783  {
1784  libmesh_assert(point_locator);
1785 
1786  // Get pointers to the element's neighbor.
1787  const Elem * neigh = boundaries.neighbor(boundary_id, *point_locator, elem, s);
1788 
1789  if (neigh == nullptr)
1790  libmesh_error_msg("PeriodicBoundaries point locator object returned nullptr!");
1791 
1792  // periodic (and possibly h refinement) constraints:
1793  // constrain dofs shared between
1794  // this element and ones as coarse
1795  // as or coarser than this element.
1796  if (neigh->level() <= elem->level())
1797  {
1798  unsigned int s_neigh =
1800  libmesh_assert_not_equal_to (s_neigh, libMesh::invalid_uint);
1801 
1802 #ifdef LIBMESH_ENABLE_AMR
1803  // Find the minimum p level; we build the h constraint
1804  // matrix with this and then constrain away all higher p
1805  // DoFs.
1806  libmesh_assert(neigh->active());
1807  const unsigned int min_p_level =
1808  std::min(elem->p_level(), neigh->p_level());
1809 
1810  // we may need to make the FE objects reinit with the
1811  // minimum shared p_level
1812  // FIXME - I hate using const_cast<> and avoiding
1813  // accessor functions; there's got to be a
1814  // better way to do this!
1815  const unsigned int old_elem_level = elem->p_level();
1816  if (old_elem_level != min_p_level)
1817  (const_cast<Elem *>(elem))->hack_p_level(min_p_level);
1818  const unsigned int old_neigh_level = neigh->p_level();
1819  if (old_neigh_level != min_p_level)
1820  (const_cast<Elem *>(neigh))->hack_p_level(min_p_level);
1821 #endif // #ifdef LIBMESH_ENABLE_AMR
1822 
1823  // We can do a projection with a single integration,
1824  // due to the assumption of nested finite element
1825  // subspaces.
1826  // FIXME: it might be more efficient to do nodes,
1827  // then edges, then side, to reduce the size of the
1828  // Cholesky factorization(s)
1829  my_fe->reinit(elem, s);
1830 
1831  dof_map.dof_indices (elem, my_dof_indices,
1832  variable_number);
1833  dof_map.dof_indices (neigh, neigh_dof_indices,
1834  variable_number);
1835 
1836  // We use neigh_dof_indices_all_variables in the case that the
1837  // periodic boundary condition involves mappings between multiple
1838  // variables.
1839  std::vector<std::vector<dof_id_type>> neigh_dof_indices_all_variables;
1840  if(periodic->has_transformation_matrix())
1841  {
1842  const std::set<unsigned int> & variables = periodic->get_variables();
1843  neigh_dof_indices_all_variables.resize(variables.size());
1844  unsigned int index = 0;
1845  for(unsigned int var : variables)
1846  {
1847  dof_map.dof_indices (neigh, neigh_dof_indices_all_variables[index],
1848  var);
1849  index++;
1850  }
1851  }
1852 
1853  const unsigned int n_qp = my_qface.n_points();
1854 
1855  // Translate the quadrature points over to the
1856  // neighbor's boundary
1857  std::vector<Point> neigh_point(q_point.size());
1858  for (auto i : index_range(neigh_point))
1859  neigh_point[i] = periodic->get_corresponding_pos(q_point[i]);
1860 
1861  FEMap::inverse_map (Dim, neigh, neigh_point,
1862  neigh_qface);
1863 
1864  neigh_fe->reinit(neigh, &neigh_qface);
1865 
1866  // We're only concerned with DOFs whose values (and/or first
1867  // derivatives for C1 elements) are supported on side nodes
1868  FEInterface::dofs_on_side(elem, Dim, base_fe_type, s, my_side_dofs);
1869  FEInterface::dofs_on_side(neigh, Dim, base_fe_type, s_neigh, neigh_side_dofs);
1870 
1871  // We're done with functions that examine Elem::p_level(),
1872  // so let's unhack those levels
1873 #ifdef LIBMESH_ENABLE_AMR
1874  if (elem->p_level() != old_elem_level)
1875  (const_cast<Elem *>(elem))->hack_p_level(old_elem_level);
1876  if (neigh->p_level() != old_neigh_level)
1877  (const_cast<Elem *>(neigh))->hack_p_level(old_neigh_level);
1878 #endif // #ifdef LIBMESH_ENABLE_AMR
1879 
1880  const unsigned int n_side_dofs =
1881  cast_int<unsigned int>
1882  (my_side_dofs.size());
1883  libmesh_assert_equal_to (n_side_dofs, neigh_side_dofs.size());
1884 
1885  Ke.resize (n_side_dofs, n_side_dofs);
1886  Ue.resize(n_side_dofs);
1887 
1888  // Form the projection matrix, (inner product of fine basis
1889  // functions against fine test functions)
1890  for (unsigned int is = 0; is != n_side_dofs; ++is)
1891  {
1892  const unsigned int i = my_side_dofs[is];
1893  for (unsigned int js = 0; js != n_side_dofs; ++js)
1894  {
1895  const unsigned int j = my_side_dofs[js];
1896  for (unsigned int qp = 0; qp != n_qp; ++qp)
1897  {
1898  Ke(is,js) += JxW[qp] *
1900  phi[j][qp]);
1901  if (cont != C_ZERO)
1902  Ke(is,js) += JxW[qp] *
1903  TensorTools::inner_product((*dphi)[i][qp] *
1904  (*face_normals)[qp],
1905  (*dphi)[j][qp] *
1906  (*face_normals)[qp]);
1907  }
1908  }
1909  }
1910 
1911  // Form the right hand sides, (inner product of coarse basis
1912  // functions against fine test functions)
1913  for (unsigned int is = 0; is != n_side_dofs; ++is)
1914  {
1915  const unsigned int i = neigh_side_dofs[is];
1916  Fe.resize (n_side_dofs);
1917  for (unsigned int js = 0; js != n_side_dofs; ++js)
1918  {
1919  const unsigned int j = my_side_dofs[js];
1920  for (unsigned int qp = 0; qp != n_qp; ++qp)
1921  {
1922  Fe(js) += JxW[qp] *
1923  TensorTools::inner_product(neigh_phi[i][qp],
1924  phi[j][qp]);
1925  if (cont != C_ZERO)
1926  Fe(js) += JxW[qp] *
1927  TensorTools::inner_product((*neigh_dphi)[i][qp] *
1928  (*face_normals)[qp],
1929  (*dphi)[j][qp] *
1930  (*face_normals)[qp]);
1931  }
1932  }
1933  Ke.cholesky_solve(Fe, Ue[is]);
1934  }
1935 
1936  // Make sure we're not adding recursive constraints
1937  // due to the redundancy in the way we add periodic
1938  // boundary constraints
1939  //
1940  // In order for this to work while threaded or on
1941  // distributed meshes, we need a rigorous way to
1942  // avoid recursive constraints. Here it is:
1943  //
1944  // For vertex DoFs, if there is a "prior" element
1945  // (i.e. a coarser element or an equally refined
1946  // element with a lower id) on this boundary which
1947  // contains the vertex point, then we will avoid
1948  // generating constraints; the prior element (or
1949  // something prior to it) may do so. If we are the
1950  // most prior (or "primary") element on this
1951  // boundary sharing this point, then we look at the
1952  // boundary periodic to us, we find the primary
1953  // element there, and if that primary is coarser or
1954  // equal-but-lower-id, then our vertex dofs are
1955  // constrained in terms of that element.
1956  //
1957  // For edge DoFs, if there is a coarser element
1958  // on this boundary sharing this edge, then we will
1959  // avoid generating constraints (we will be
1960  // constrained indirectly via AMR constraints
1961  // connecting us to the coarser element's DoFs). If
1962  // we are the coarsest element sharing this edge,
1963  // then we generate constraints if and only if we
1964  // are finer than the coarsest element on the
1965  // boundary periodic to us sharing the corresponding
1966  // periodic edge, or if we are at equal level but
1967  // our edge nodes have higher ids than the periodic
1968  // edge nodes (sorted from highest to lowest, then
1969  // compared lexicographically)
1970  //
1971  // For face DoFs, we generate constraints if we are
1972  // finer than our periodic neighbor, or if we are at
1973  // equal level but our element id is higher than its
1974  // element id.
1975  //
1976  // If the primary neighbor is also the current elem
1977  // (a 1-element-thick mesh) then we choose which
1978  // vertex dofs to constrain via lexicographic
1979  // ordering on point locations
1980 
1981  // FIXME: This code doesn't yet properly handle
1982  // cases where multiple different periodic BCs
1983  // intersect.
1984  std::set<dof_id_type> my_constrained_dofs;
1985 
1986  // Container to catch boundary IDs handed back by BoundaryInfo.
1987  std::vector<boundary_id_type> new_bc_ids;
1988 
1989  for (auto n : elem->node_index_range())
1990  {
1991  if (!elem->is_node_on_side(n,s))
1992  continue;
1993 
1994  const Node & my_node = elem->node_ref(n);
1995 
1996  if (elem->is_vertex(n))
1997  {
1998  // Find all boundary ids that include this
1999  // point and have periodic boundary
2000  // conditions for this variable
2001  std::set<boundary_id_type> point_bcids;
2002 
2003  for (unsigned int new_s = 0;
2004  new_s != max_ns; ++new_s)
2005  {
2006  if (!elem->is_node_on_side(n,new_s))
2007  continue;
2008 
2009  mesh.get_boundary_info().boundary_ids (elem, s, new_bc_ids);
2010 
2011  for (const auto & new_boundary_id : new_bc_ids)
2012  {
2013  const PeriodicBoundaryBase * new_periodic = boundaries.boundary(new_boundary_id);
2014  if (new_periodic && new_periodic->is_my_variable(variable_number))
2015  point_bcids.insert(new_boundary_id);
2016  }
2017  }
2018 
2019  // See if this vertex has point neighbors to
2020  // defer to
2021  if (primary_boundary_point_neighbor
2022  (elem, my_node, mesh.get_boundary_info(), point_bcids)
2023  != elem)
2024  continue;
2025 
2026  // Find the complementary boundary id set
2027  std::set<boundary_id_type> point_pairedids;
2028  for (const auto & new_boundary_id : point_bcids)
2029  {
2030  const PeriodicBoundaryBase * new_periodic = boundaries.boundary(new_boundary_id);
2031  point_pairedids.insert(new_periodic->pairedboundary);
2032  }
2033 
2034  // What do we want to constrain against?
2035  const Elem * primary_elem = nullptr;
2036  const Elem * main_neigh = nullptr;
2037  Point main_pt = my_node,
2038  primary_pt = my_node;
2039 
2040  for (const auto & new_boundary_id : point_bcids)
2041  {
2042  // Find the corresponding periodic point and
2043  // its primary neighbor
2044  const PeriodicBoundaryBase * new_periodic = boundaries.boundary(new_boundary_id);
2045 
2046  const Point neigh_pt =
2047  new_periodic->get_corresponding_pos(my_node);
2048 
2049  // If the point is getting constrained
2050  // to itself by this PBC then we don't
2051  // generate any constraints
2052  if (neigh_pt.absolute_fuzzy_equals
2053  (my_node, primary_hmin*TOLERANCE))
2054  continue;
2055 
2056  // Otherwise we'll have a constraint in
2057  // one direction or another
2058  if (!primary_elem)
2059  primary_elem = elem;
2060 
2061  const Elem * primary_neigh =
2062  primary_boundary_point_neighbor(neigh, neigh_pt,
2064  point_pairedids);
2065 
2066  libmesh_assert(primary_neigh);
2067 
2068  if (new_boundary_id == boundary_id)
2069  {
2070  main_neigh = primary_neigh;
2071  main_pt = neigh_pt;
2072  }
2073 
2074  // Finer elements will get constrained in
2075  // terms of coarser neighbors, not the
2076  // other way around
2077  if ((primary_neigh->level() > primary_elem->level()) ||
2078 
2079  // For equal-level elements, the one with
2080  // higher id gets constrained in terms of
2081  // the one with lower id
2082  (primary_neigh->level() == primary_elem->level() &&
2083  primary_neigh->id() > primary_elem->id()) ||
2084 
2085  // On a one-element-thick mesh, we compare
2086  // points to see what side gets constrained
2087  (primary_neigh == primary_elem &&
2088  (neigh_pt > primary_pt)))
2089  continue;
2090 
2091  primary_elem = primary_neigh;
2092  primary_pt = neigh_pt;
2093  }
2094 
2095  if (!primary_elem ||
2096  primary_elem != main_neigh ||
2097  primary_pt != main_pt)
2098  continue;
2099  }
2100  else if (elem->is_edge(n))
2101  {
2102  // Find which edge we're on
2103  unsigned int e=0, ne = elem->n_edges();
2104  for (; e != ne; ++e)
2105  {
2106  if (elem->is_node_on_edge(n,e))
2107  break;
2108  }
2109  libmesh_assert_less (e, elem->n_edges());
2110 
2111  // Find the edge end nodes
2112  const Node
2113  * e1 = nullptr,
2114  * e2 = nullptr;
2115  for (auto nn : elem->node_index_range())
2116  {
2117  if (nn == n)
2118  continue;
2119 
2120  if (elem->is_node_on_edge(nn, e))
2121  {
2122  if (e1 == nullptr)
2123  {
2124  e1 = elem->node_ptr(nn);
2125  }
2126  else
2127  {
2128  e2 = elem->node_ptr(nn);
2129  break;
2130  }
2131  }
2132  }
2133  libmesh_assert (e1 && e2);
2134 
2135  // Find all boundary ids that include this
2136  // edge and have periodic boundary
2137  // conditions for this variable
2138  std::set<boundary_id_type> edge_bcids;
2139 
2140  for (unsigned int new_s = 0;
2141  new_s != max_ns; ++new_s)
2142  {
2143  if (!elem->is_node_on_side(n,new_s))
2144  continue;
2145 
2146  // We're reusing the new_bc_ids vector created outside the loop over nodes.
2147  mesh.get_boundary_info().boundary_ids (elem, s, new_bc_ids);
2148 
2149  for (const auto & new_boundary_id : new_bc_ids)
2150  {
2151  const PeriodicBoundaryBase * new_periodic = boundaries.boundary(new_boundary_id);
2152  if (new_periodic && new_periodic->is_my_variable(variable_number))
2153  edge_bcids.insert(new_boundary_id);
2154  }
2155  }
2156 
2157 
2158  // See if this edge has neighbors to defer to
2159  if (primary_boundary_edge_neighbor
2160  (elem, *e1, *e2, mesh.get_boundary_info(), edge_bcids)
2161  != elem)
2162  continue;
2163 
2164  // Find the complementary boundary id set
2165  std::set<boundary_id_type> edge_pairedids;
2166  for (const auto & new_boundary_id : edge_bcids)
2167  {
2168  const PeriodicBoundaryBase * new_periodic = boundaries.boundary(new_boundary_id);
2169  edge_pairedids.insert(new_periodic->pairedboundary);
2170  }
2171 
2172  // What do we want to constrain against?
2173  const Elem * primary_elem = nullptr;
2174  const Elem * main_neigh = nullptr;
2175  Point main_pt1 = *e1,
2176  main_pt2 = *e2,
2177  primary_pt1 = *e1,
2178  primary_pt2 = *e2;
2179 
2180  for (const auto & new_boundary_id : edge_bcids)
2181  {
2182  // Find the corresponding periodic edge and
2183  // its primary neighbor
2184  const PeriodicBoundaryBase * new_periodic = boundaries.boundary(new_boundary_id);
2185 
2186  Point neigh_pt1 = new_periodic->get_corresponding_pos(*e1),
2187  neigh_pt2 = new_periodic->get_corresponding_pos(*e2);
2188 
2189  // If the edge is getting constrained
2190  // to itself by this PBC then we don't
2191  // generate any constraints
2192  if (neigh_pt1.absolute_fuzzy_equals
2193  (*e1, primary_hmin*TOLERANCE) &&
2194  neigh_pt2.absolute_fuzzy_equals
2195  (*e2, primary_hmin*TOLERANCE))
2196  continue;
2197 
2198  // Otherwise we'll have a constraint in
2199  // one direction or another
2200  if (!primary_elem)
2201  primary_elem = elem;
2202 
2203  const Elem * primary_neigh = primary_boundary_edge_neighbor
2204  (neigh, neigh_pt1, neigh_pt2,
2205  mesh.get_boundary_info(), edge_pairedids);
2206 
2207  libmesh_assert(primary_neigh);
2208 
2209  if (new_boundary_id == boundary_id)
2210  {
2211  main_neigh = primary_neigh;
2212  main_pt1 = neigh_pt1;
2213  main_pt2 = neigh_pt2;
2214  }
2215 
2216  // If we have a one-element thick mesh,
2217  // we'll need to sort our points to get a
2218  // consistent ordering rule
2219  //
2220  // Use >= in this test to make sure that,
2221  // for angular constraints, no node gets
2222  // constrained to itself.
2223  if (primary_neigh == primary_elem)
2224  {
2225  if (primary_pt1 > primary_pt2)
2226  std::swap(primary_pt1, primary_pt2);
2227  if (neigh_pt1 > neigh_pt2)
2228  std::swap(neigh_pt1, neigh_pt2);
2229 
2230  if (neigh_pt2 >= primary_pt2)
2231  continue;
2232  }
2233 
2234  // Otherwise:
2235  // Finer elements will get constrained in
2236  // terms of coarser ones, not the other way
2237  // around
2238  if ((primary_neigh->level() > primary_elem->level()) ||
2239 
2240  // For equal-level elements, the one with
2241  // higher id gets constrained in terms of
2242  // the one with lower id
2243  (primary_neigh->level() == primary_elem->level() &&
2244  primary_neigh->id() > primary_elem->id()))
2245  continue;
2246 
2247  primary_elem = primary_neigh;
2248  primary_pt1 = neigh_pt1;
2249  primary_pt2 = neigh_pt2;
2250  }
2251 
2252  if (!primary_elem ||
2253  primary_elem != main_neigh ||
2254  primary_pt1 != main_pt1 ||
2255  primary_pt2 != main_pt2)
2256  continue;
2257  }
2258  else if (elem->is_face(n))
2259  {
2260  // If we have a one-element thick mesh,
2261  // use the ordering of the face node and its
2262  // periodic counterpart to determine what
2263  // gets constrained
2264  if (neigh == elem)
2265  {
2266  const Point neigh_pt =
2267  periodic->get_corresponding_pos(my_node);
2268  if (neigh_pt > my_node)
2269  continue;
2270  }
2271 
2272  // Otherwise:
2273  // Finer elements will get constrained in
2274  // terms of coarser ones, not the other way
2275  // around
2276  if ((neigh->level() > elem->level()) ||
2277 
2278  // For equal-level elements, the one with
2279  // higher id gets constrained in terms of
2280  // the one with lower id
2281  (neigh->level() == elem->level() &&
2282  neigh->id() > elem->id()))
2283  continue;
2284  }
2285 
2286  // If we made it here without hitting a continue
2287  // statement, then we're at a node whose dofs
2288  // should be constrained by this element's
2289  // calculations.
2290  const unsigned int n_comp =
2291  my_node.n_comp(sys_number, variable_number);
2292 
2293  for (unsigned int i=0; i != n_comp; ++i)
2294  my_constrained_dofs.insert
2295  (my_node.dof_number
2296  (sys_number, variable_number, i));
2297  }
2298 
2299  // FIXME: old code for disambiguating periodic BCs:
2300  // this is not threadsafe nor safe to run on a
2301  // non-serialized mesh.
2302  /*
2303  std::vector<bool> recursive_constraint(n_side_dofs, false);
2304 
2305  for (unsigned int is = 0; is != n_side_dofs; ++is)
2306  {
2307  const unsigned int i = neigh_side_dofs[is];
2308  const dof_id_type their_dof_g = neigh_dof_indices[i];
2309  libmesh_assert_not_equal_to (their_dof_g, DofObject::invalid_id);
2310 
2311  {
2312  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
2313 
2314  if (!dof_map.is_constrained_dof(their_dof_g))
2315  continue;
2316  }
2317 
2318  DofConstraintRow & their_constraint_row =
2319  constraints[their_dof_g].first;
2320 
2321  for (unsigned int js = 0; js != n_side_dofs; ++js)
2322  {
2323  const unsigned int j = my_side_dofs[js];
2324  const dof_id_type my_dof_g = my_dof_indices[j];
2325  libmesh_assert_not_equal_to (my_dof_g, DofObject::invalid_id);
2326 
2327  if (their_constraint_row.count(my_dof_g))
2328  recursive_constraint[js] = true;
2329  }
2330  }
2331  */
2332 
2333  for (unsigned int js = 0; js != n_side_dofs; ++js)
2334  {
2335  // FIXME: old code path
2336  // if (recursive_constraint[js])
2337  // continue;
2338 
2339  const unsigned int j = my_side_dofs[js];
2340  const dof_id_type my_dof_g = my_dof_indices[j];
2341  libmesh_assert_not_equal_to (my_dof_g, DofObject::invalid_id);
2342 
2343  // FIXME: new code path
2344  if (!my_constrained_dofs.count(my_dof_g))
2345  continue;
2346 
2347  DofConstraintRow * constraint_row;
2348 
2349  // we may be running constraint methods concurrently
2350  // on multiple threads, so we need a lock to
2351  // ensure that this constraint is "ours"
2352  {
2353  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
2354 
2355  if (dof_map.is_constrained_dof(my_dof_g))
2356  continue;
2357 
2358  constraint_row = &(constraints[my_dof_g]);
2359  libmesh_assert(constraint_row->empty());
2360  }
2361 
2362  for (unsigned int is = 0; is != n_side_dofs; ++is)
2363  {
2364  const unsigned int i = neigh_side_dofs[is];
2365  const dof_id_type their_dof_g = neigh_dof_indices[i];
2366  libmesh_assert_not_equal_to (their_dof_g, DofObject::invalid_id);
2367 
2368  // Periodic constraints should never be
2369  // self-constraints
2370  // libmesh_assert_not_equal_to (their_dof_g, my_dof_g);
2371 
2372  const Real their_dof_value = Ue[is](js);
2373 
2374  if (their_dof_g == my_dof_g)
2375  {
2376  libmesh_assert_less (std::abs(their_dof_value-1.), 1.e-5);
2377  for (unsigned int k = 0; k != n_side_dofs; ++k)
2378  libmesh_assert(k == is || std::abs(Ue[k](js)) < 1.e-5);
2379  continue;
2380  }
2381 
2382  if (std::abs(their_dof_value) < 10*TOLERANCE)
2383  continue;
2384 
2385  if(!periodic->has_transformation_matrix())
2386  {
2387  constraint_row->insert(std::make_pair(their_dof_g,
2388  their_dof_value));
2389  }
2390  else
2391  {
2392  // In this case the current variable is constrained in terms of other variables.
2393  // We assume that all variables in this constraint have the same FE type (this
2394  // is asserted below), and hence we can create the constraint row contribution
2395  // by multiplying their_dof_value by the corresponding row of the transformation
2396  // matrix.
2397 
2398  const std::set<unsigned int> & variables = periodic->get_variables();
2399  neigh_dof_indices_all_variables.resize(variables.size());
2400  unsigned int index = 0;
2401  for(unsigned int other_var : variables)
2402  {
2403  libmesh_assert_msg(base_fe_type == dof_map.variable_type(other_var), "FE types must match for all variables involved in constraint");
2404 
2405  Real var_weighting = periodic->get_transformation_matrix()(variable_number, other_var);
2406  constraint_row->insert(std::make_pair(neigh_dof_indices_all_variables[index][i],
2407  var_weighting*their_dof_value));
2408  index++;
2409  }
2410  }
2411 
2412  }
2413  }
2414  }
2415  // p refinement constraints:
2416  // constrain dofs shared between
2417  // active elements and neighbors with
2418  // lower polynomial degrees
2419 #ifdef LIBMESH_ENABLE_AMR
2420  const unsigned int min_p_level =
2421  neigh->min_p_level_by_neighbor(elem, elem->p_level());
2422  if (min_p_level < elem->p_level())
2423  {
2424  // Adaptive p refinement of non-hierarchic bases will
2425  // require more coding
2426  libmesh_assert(my_fe->is_hierarchic());
2427  dof_map.constrain_p_dofs(variable_number, elem,
2428  s, min_p_level);
2429  }
2430 #endif // #ifdef LIBMESH_ENABLE_AMR
2431  }
2432  }
2433  }
2434 }

◆ compute_periodic_node_constraints()

void libMesh::FEAbstract::compute_periodic_node_constraints ( NodeConstraints constraints,
const PeriodicBoundaries boundaries,
const MeshBase mesh,
const PointLocatorBase point_locator,
const Elem elem 
)
staticinherited

Computes the node position constraint equation contributions (for meshes with periodic boundary conditions)

Definition at line 990 of file fe_abstract.C.

995 {
996  // Only bother if we truly have periodic boundaries
997  if (boundaries.empty())
998  return;
999 
1000  libmesh_assert(elem);
1001 
1002  // Only constrain active elements with this method
1003  if (!elem->active())
1004  return;
1005 
1006  const unsigned int Dim = elem->dim();
1007 
1008  const FEFamily mapping_family = FEMap::map_fe_type(*elem);
1009  const FEType fe_type(elem->default_order(), mapping_family);
1010 
1011  // Pull objects out of the loop to reduce heap operations
1012  std::vector<const Node *> my_nodes, neigh_nodes;
1013  std::unique_ptr<const Elem> my_side, neigh_side;
1014 
1015  // Look at the element faces. Check to see if we need to
1016  // build constraints.
1017  std::vector<boundary_id_type> bc_ids;
1018  for (auto s : elem->side_index_range())
1019  {
1020  if (elem->neighbor_ptr(s))
1021  continue;
1022 
1023  mesh.get_boundary_info().boundary_ids (elem, s, bc_ids);
1024  for (const auto & boundary_id : bc_ids)
1025  {
1026  const PeriodicBoundaryBase * periodic = boundaries.boundary(boundary_id);
1027  if (periodic)
1028  {
1029  libmesh_assert(point_locator);
1030 
1031  // Get pointers to the element's neighbor.
1032  const Elem * neigh = boundaries.neighbor(boundary_id, *point_locator, elem, s);
1033 
1034  // h refinement constraints:
1035  // constrain dofs shared between
1036  // this element and ones as coarse
1037  // as or coarser than this element.
1038  if (neigh->level() <= elem->level())
1039  {
1040  unsigned int s_neigh =
1041  mesh.get_boundary_info().side_with_boundary_id(neigh, periodic->pairedboundary);
1042  libmesh_assert_not_equal_to (s_neigh, libMesh::invalid_uint);
1043 
1044 #ifdef LIBMESH_ENABLE_AMR
1045  libmesh_assert(neigh->active());
1046 #endif // #ifdef LIBMESH_ENABLE_AMR
1047 
1048  elem->build_side_ptr(my_side, s);
1049  neigh->build_side_ptr(neigh_side, s_neigh);
1050 
1051  const unsigned int n_side_nodes = my_side->n_nodes();
1052 
1053  my_nodes.clear();
1054  my_nodes.reserve (n_side_nodes);
1055  neigh_nodes.clear();
1056  neigh_nodes.reserve (n_side_nodes);
1057 
1058  for (unsigned int n=0; n != n_side_nodes; ++n)
1059  my_nodes.push_back(my_side->node_ptr(n));
1060 
1061  for (unsigned int n=0; n != n_side_nodes; ++n)
1062  neigh_nodes.push_back(neigh_side->node_ptr(n));
1063 
1064  // Make sure we're not adding recursive constraints
1065  // due to the redundancy in the way we add periodic
1066  // boundary constraints, or adding constraints to
1067  // nodes that already have AMR constraints
1068  std::vector<bool> skip_constraint(n_side_nodes, false);
1069 
1070  for (unsigned int my_side_n=0;
1071  my_side_n < n_side_nodes;
1072  my_side_n++)
1073  {
1074  libmesh_assert_less (my_side_n, FEInterface::n_dofs(Dim-1, fe_type, my_side->type()));
1075 
1076  const Node * my_node = my_nodes[my_side_n];
1077 
1078  // Figure out where my node lies on their reference element.
1079  const Point neigh_point = periodic->get_corresponding_pos(*my_node);
1080 
1081  const Point mapped_point =
1082  FEMap::inverse_map(Dim-1, neigh_side.get(),
1083  neigh_point);
1084 
1085  // If we've already got a constraint on this
1086  // node, then the periodic constraint is
1087  // redundant
1088  {
1089  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
1090 
1091  if (constraints.count(my_node))
1092  {
1093  skip_constraint[my_side_n] = true;
1094  continue;
1095  }
1096  }
1097 
1098  // Compute the neighbors's side shape function values.
1099  for (unsigned int their_side_n=0;
1100  their_side_n < n_side_nodes;
1101  their_side_n++)
1102  {
1103  libmesh_assert_less (their_side_n, FEInterface::n_dofs(Dim-1, fe_type, neigh_side->type()));
1104 
1105  const Node * their_node = neigh_nodes[their_side_n];
1106 
1107  // If there's a constraint on an opposing node,
1108  // we need to see if it's constrained by
1109  // *our side* making any periodic constraint
1110  // on us recursive
1111  {
1112  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
1113 
1114  if (!constraints.count(their_node))
1115  continue;
1116 
1117  const NodeConstraintRow & their_constraint_row =
1118  constraints[their_node].first;
1119 
1120  for (unsigned int orig_side_n=0;
1121  orig_side_n < n_side_nodes;
1122  orig_side_n++)
1123  {
1124  libmesh_assert_less (orig_side_n, FEInterface::n_dofs(Dim-1, fe_type, my_side->type()));
1125 
1126  const Node * orig_node = my_nodes[orig_side_n];
1127 
1128  if (their_constraint_row.count(orig_node))
1129  skip_constraint[orig_side_n] = true;
1130  }
1131  }
1132  }
1133  }
1134  for (unsigned int my_side_n=0;
1135  my_side_n < n_side_nodes;
1136  my_side_n++)
1137  {
1138  libmesh_assert_less (my_side_n, FEInterface::n_dofs(Dim-1, fe_type, my_side->type()));
1139 
1140  if (skip_constraint[my_side_n])
1141  continue;
1142 
1143  const Node * my_node = my_nodes[my_side_n];
1144 
1145  // Figure out where my node lies on their reference element.
1146  const Point neigh_point = periodic->get_corresponding_pos(*my_node);
1147 
1148  // Figure out where my node lies on their reference element.
1149  const Point mapped_point =
1150  FEMap::inverse_map(Dim-1, neigh_side.get(),
1151  neigh_point);
1152 
1153  for (unsigned int their_side_n=0;
1154  their_side_n < n_side_nodes;
1155  their_side_n++)
1156  {
1157  libmesh_assert_less (their_side_n, FEInterface::n_dofs(Dim-1, fe_type, neigh_side->type()));
1158 
1159  const Node * their_node = neigh_nodes[their_side_n];
1160  libmesh_assert(their_node);
1161 
1162  const Real their_value = FEInterface::shape(Dim-1,
1163  fe_type,
1164  neigh_side->type(),
1165  their_side_n,
1166  mapped_point);
1167 
1168  // since we may be running this method concurrently
1169  // on multiple threads we need to acquire a lock
1170  // before modifying the shared constraint_row object.
1171  {
1172  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
1173 
1174  NodeConstraintRow & constraint_row =
1175  constraints[my_node].first;
1176 
1177  constraint_row.insert(std::make_pair(their_node,
1178  their_value));
1179  }
1180  }
1181  }
1182  }
1183  }
1184  }
1185  }
1186 }

References libMesh::Elem::active(), libMesh::PeriodicBoundaries::boundary(), libMesh::Elem::build_side_ptr(), libMesh::Elem::default_order(), libMesh::Elem::dim(), libMesh::FEAbstract::fe_type, libMesh::PeriodicBoundaryBase::get_corresponding_pos(), libMesh::invalid_uint, libMesh::FEMap::inverse_map(), libMesh::Elem::level(), libMesh::libmesh_assert(), libMesh::FEMap::map_fe_type(), mesh, libMesh::FEInterface::n_dofs(), libMesh::PeriodicBoundaries::neighbor(), libMesh::Elem::neighbor_ptr(), libMesh::PeriodicBoundaryBase::pairedboundary, libMesh::Real, libMesh::FEInterface::shape(), libMesh::Elem::side_index_range(), and libMesh::Threads::spin_mtx.

◆ compute_proj_constraints()

void libMesh::FEGenericBase< FEOutputType< T >::type >::compute_proj_constraints ( DofConstraints constraints,
DofMap dof_map,
const unsigned int  variable_number,
const Elem elem 
)
staticinherited

Computes the constraint matrix contributions (for non-conforming adapted meshes) corresponding to variable number var_number, using generic projections.

Definition at line 1396 of file fe_base.C.

1400 {
1401  libmesh_assert(elem);
1402 
1403  const unsigned int Dim = elem->dim();
1404 
1405  // Only constrain elements in 2,3D.
1406  if (Dim == 1)
1407  return;
1408 
1409  // Only constrain active elements with this method
1410  if (!elem->active())
1411  return;
1412 
1413  const Variable & var = dof_map.variable(variable_number);
1414  const FEType & base_fe_type = var.type();
1415 
1416  // Construct FE objects for this element and its neighbors.
1417  std::unique_ptr<FEGenericBase<OutputShape>> my_fe
1418  (FEGenericBase<OutputShape>::build(Dim, base_fe_type));
1419  const FEContinuity cont = my_fe->get_continuity();
1420 
1421  // We don't need to constrain discontinuous elements
1422  if (cont == DISCONTINUOUS)
1423  return;
1424  libmesh_assert (cont == C_ZERO || cont == C_ONE);
1425 
1426  std::unique_ptr<FEGenericBase<OutputShape>> neigh_fe
1427  (FEGenericBase<OutputShape>::build(Dim, base_fe_type));
1428 
1429  QGauss my_qface(Dim-1, base_fe_type.default_quadrature_order());
1430  my_fe->attach_quadrature_rule (&my_qface);
1431  std::vector<Point> neigh_qface;
1432 
1433  const std::vector<Real> & JxW = my_fe->get_JxW();
1434  const std::vector<Point> & q_point = my_fe->get_xyz();
1435  const std::vector<std::vector<OutputShape>> & phi = my_fe->get_phi();
1436  const std::vector<std::vector<OutputShape>> & neigh_phi =
1437  neigh_fe->get_phi();
1438  const std::vector<Point> * face_normals = nullptr;
1439  const std::vector<std::vector<OutputGradient>> * dphi = nullptr;
1440  const std::vector<std::vector<OutputGradient>> * neigh_dphi = nullptr;
1441 
1442  std::vector<dof_id_type> my_dof_indices, neigh_dof_indices;
1443  std::vector<unsigned int> my_side_dofs, neigh_side_dofs;
1444 
1445  if (cont != C_ZERO)
1446  {
1447  const std::vector<Point> & ref_face_normals =
1448  my_fe->get_normals();
1449  face_normals = &ref_face_normals;
1450  const std::vector<std::vector<OutputGradient>> & ref_dphi =
1451  my_fe->get_dphi();
1452  dphi = &ref_dphi;
1453  const std::vector<std::vector<OutputGradient>> & ref_neigh_dphi =
1454  neigh_fe->get_dphi();
1455  neigh_dphi = &ref_neigh_dphi;
1456  }
1457 
1458  DenseMatrix<Real> Ke;
1459  DenseVector<Real> Fe;
1460  std::vector<DenseVector<Real>> Ue;
1461 
1462  // Look at the element faces. Check to see if we need to
1463  // build constraints.
1464  for (auto s : elem->side_index_range())
1465  {
1466  // Get pointers to the element's neighbor.
1467  const Elem * neigh = elem->neighbor_ptr(s);
1468 
1469  if (!neigh)
1470  continue;
1471 
1472  if (!var.active_on_subdomain(neigh->subdomain_id()))
1473  continue;
1474 
1475  // h refinement constraints:
1476  // constrain dofs shared between
1477  // this element and ones coarser
1478  // than this element.
1479  if (neigh->level() < elem->level())
1480  {
1481  unsigned int s_neigh = neigh->which_neighbor_am_i(elem);
1482  libmesh_assert_less (s_neigh, neigh->n_neighbors());
1483 
1484  // Find the minimum p level; we build the h constraint
1485  // matrix with this and then constrain away all higher p
1486  // DoFs.
1487  libmesh_assert(neigh->active());
1488  const unsigned int min_p_level =
1489  std::min(elem->p_level(), neigh->p_level());
1490 
1491  // we may need to make the FE objects reinit with the
1492  // minimum shared p_level
1493  const unsigned int old_elem_level = elem->p_level();
1494  if (elem->p_level() != min_p_level)
1495  my_fe->set_fe_order(my_fe->get_fe_type().order.get_order() - old_elem_level + min_p_level);
1496  const unsigned int old_neigh_level = neigh->p_level();
1497  if (old_neigh_level != min_p_level)
1498  neigh_fe->set_fe_order(neigh_fe->get_fe_type().order.get_order() - old_neigh_level + min_p_level);
1499 
1500  my_fe->reinit(elem, s);
1501 
1502  // This function gets called element-by-element, so there
1503  // will be a lot of memory allocation going on. We can
1504  // at least minimize this for the case of the dof indices
1505  // by efficiently preallocating the requisite storage.
1506  // n_nodes is not necessarily n_dofs, but it is better
1507  // than nothing!
1508  my_dof_indices.reserve (elem->n_nodes());
1509  neigh_dof_indices.reserve (neigh->n_nodes());
1510 
1511  dof_map.dof_indices (elem, my_dof_indices,
1512  variable_number,
1513  min_p_level);
1514  dof_map.dof_indices (neigh, neigh_dof_indices,
1515  variable_number,
1516  min_p_level);
1517 
1518  const unsigned int n_qp = my_qface.n_points();
1519 
1520  FEMap::inverse_map (Dim, neigh, q_point, neigh_qface);
1521 
1522  neigh_fe->reinit(neigh, &neigh_qface);
1523 
1524  // We're only concerned with DOFs whose values (and/or first
1525  // derivatives for C1 elements) are supported on side nodes
1526  FEType elem_fe_type = base_fe_type;
1527  if (old_elem_level != min_p_level)
1528  elem_fe_type.order = base_fe_type.order.get_order() - old_elem_level + min_p_level;
1529  FEType neigh_fe_type = base_fe_type;
1530  if (old_neigh_level != min_p_level)
1531  neigh_fe_type.order = base_fe_type.order.get_order() - old_neigh_level + min_p_level;
1532  FEInterface::dofs_on_side(elem, Dim, elem_fe_type, s, my_side_dofs);
1533  FEInterface::dofs_on_side(neigh, Dim, neigh_fe_type, s_neigh, neigh_side_dofs);
1534 
1535  const unsigned int n_side_dofs =
1536  cast_int<unsigned int>(my_side_dofs.size());
1537  libmesh_assert_equal_to (n_side_dofs, neigh_side_dofs.size());
1538 
1539 #ifndef NDEBUG
1540  for (auto i : my_side_dofs)
1541  libmesh_assert_less(i, my_dof_indices.size());
1542  for (auto i : neigh_side_dofs)
1543  libmesh_assert_less(i, neigh_dof_indices.size());
1544 #endif
1545 
1546  Ke.resize (n_side_dofs, n_side_dofs);
1547  Ue.resize(n_side_dofs);
1548 
1549  // Form the projection matrix, (inner product of fine basis
1550  // functions against fine test functions)
1551  for (unsigned int is = 0; is != n_side_dofs; ++is)
1552  {
1553  const unsigned int i = my_side_dofs[is];
1554  for (unsigned int js = 0; js != n_side_dofs; ++js)
1555  {
1556  const unsigned int j = my_side_dofs[js];
1557  for (unsigned int qp = 0; qp != n_qp; ++qp)
1558  {
1559  Ke(is,js) += JxW[qp] * TensorTools::inner_product(phi[i][qp], phi[j][qp]);
1560  if (cont != C_ZERO)
1561  Ke(is,js) += JxW[qp] *
1562  TensorTools::inner_product((*dphi)[i][qp] *
1563  (*face_normals)[qp],
1564  (*dphi)[j][qp] *
1565  (*face_normals)[qp]);
1566  }
1567  }
1568  }
1569 
1570  // Form the right hand sides, (inner product of coarse basis
1571  // functions against fine test functions)
1572  for (unsigned int is = 0; is != n_side_dofs; ++is)
1573  {
1574  const unsigned int i = neigh_side_dofs[is];
1575  Fe.resize (n_side_dofs);
1576  for (unsigned int js = 0; js != n_side_dofs; ++js)
1577  {
1578  const unsigned int j = my_side_dofs[js];
1579  for (unsigned int qp = 0; qp != n_qp; ++qp)
1580  {
1581  Fe(js) += JxW[qp] *
1582  TensorTools::inner_product(neigh_phi[i][qp],
1583  phi[j][qp]);
1584  if (cont != C_ZERO)
1585  Fe(js) += JxW[qp] *
1586  TensorTools::inner_product((*neigh_dphi)[i][qp] *
1587  (*face_normals)[qp],
1588  (*dphi)[j][qp] *
1589  (*face_normals)[qp]);
1590  }
1591  }
1592  Ke.cholesky_solve(Fe, Ue[is]);
1593  }
1594 
1595  for (unsigned int js = 0; js != n_side_dofs; ++js)
1596  {
1597  const unsigned int j = my_side_dofs[js];
1598  const dof_id_type my_dof_g = my_dof_indices[j];
1599  libmesh_assert_not_equal_to (my_dof_g, DofObject::invalid_id);
1600 
1601  // Hunt for "constraining against myself" cases before
1602  // we bother creating a constraint row
1603  bool self_constraint = false;
1604  for (unsigned int is = 0; is != n_side_dofs; ++is)
1605  {
1606  const unsigned int i = neigh_side_dofs[is];
1607  const dof_id_type their_dof_g = neigh_dof_indices[i];
1608  libmesh_assert_not_equal_to (their_dof_g, DofObject::invalid_id);
1609 
1610  if (their_dof_g == my_dof_g)
1611  {
1612 #ifndef NDEBUG
1613  const Real their_dof_value = Ue[is](js);
1614  libmesh_assert_less (std::abs(their_dof_value-1.),
1615  10*TOLERANCE);
1616 
1617  for (unsigned int k = 0; k != n_side_dofs; ++k)
1618  libmesh_assert(k == is ||
1619  std::abs(Ue[k](js)) <
1620  10*TOLERANCE);
1621 #endif
1622 
1623  self_constraint = true;
1624  break;
1625  }
1626  }
1627 
1628  if (self_constraint)
1629  continue;
1630 
1631  DofConstraintRow * constraint_row;
1632 
1633  // we may be running constraint methods concurrently
1634  // on multiple threads, so we need a lock to
1635  // ensure that this constraint is "ours"
1636  {
1637  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
1638 
1639  if (dof_map.is_constrained_dof(my_dof_g))
1640  continue;
1641 
1642  constraint_row = &(constraints[my_dof_g]);
1643  libmesh_assert(constraint_row->empty());
1644  }
1645 
1646  for (unsigned int is = 0; is != n_side_dofs; ++is)
1647  {
1648  const unsigned int i = neigh_side_dofs[is];
1649  const dof_id_type their_dof_g = neigh_dof_indices[i];
1650  libmesh_assert_not_equal_to (their_dof_g, DofObject::invalid_id);
1651  libmesh_assert_not_equal_to (their_dof_g, my_dof_g);
1652 
1653  const Real their_dof_value = Ue[is](js);
1654 
1655  if (std::abs(their_dof_value) < 10*TOLERANCE)
1656  continue;
1657 
1658  constraint_row->insert(std::make_pair(their_dof_g,
1659  their_dof_value));
1660  }
1661  }
1662 
1663  my_fe->set_fe_order(my_fe->get_fe_type().order.get_order() + old_elem_level - min_p_level);
1664  neigh_fe->set_fe_order(neigh_fe->get_fe_type().order.get_order() + old_neigh_level - min_p_level);
1665  }
1666 
1667  // p refinement constraints:
1668  // constrain dofs shared between
1669  // active elements and neighbors with
1670  // lower polynomial degrees
1671  const unsigned int min_p_level =
1672  neigh->min_p_level_by_neighbor(elem, elem->p_level());
1673  if (min_p_level < elem->p_level())
1674  {
1675  // Adaptive p refinement of non-hierarchic bases will
1676  // require more coding
1677  libmesh_assert(my_fe->is_hierarchic());
1678  dof_map.constrain_p_dofs(variable_number, elem,
1679  s, min_p_level);
1680  }
1681  }
1682 }

◆ compute_shape_functions()

void libMesh::FEGenericBase< FEOutputType< T >::type >::compute_shape_functions ( const Elem elem,
const std::vector< Point > &  qp 
)
protectedvirtualinherited

After having updated the jacobian and the transformation from local to global coordinates in FEAbstract::compute_map(), the first derivatives of the shape functions are transformed to global coordinates, giving dphi, dphidx, dphidy, and dphidz.

This method should rarely be re-defined in derived classes, but still should be usable for children. Therefore, keep it protected.

Implements libMesh::FEAbstract.

Reimplemented in libMesh::FEXYZ< Dim >.

Definition at line 697 of file fe_base.C.

699 {
700  //-------------------------------------------------------------------------
701  // Compute the shape function values (and derivatives)
702  // at the Quadrature points. Note that the actual values
703  // have already been computed via init_shape_functions
704 
705  // Start logging the shape function computation
706  LOG_SCOPE("compute_shape_functions()", "FE");
707 
708  this->determine_calculations();
709 
710  if (calculate_phi)
711  this->_fe_trans->map_phi(this->dim, elem, qp, (*this), this->phi);
712 
713  if (calculate_dphi)
714  this->_fe_trans->map_dphi(this->dim, elem, qp, (*this), this->dphi,
715  this->dphidx, this->dphidy, this->dphidz);
716 
717 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
718  if (calculate_d2phi)
719  this->_fe_trans->map_d2phi(this->dim, qp, (*this), this->d2phi,
720  this->d2phidx2, this->d2phidxdy, this->d2phidxdz,
721  this->d2phidy2, this->d2phidydz, this->d2phidz2);
722 #endif //LIBMESH_ENABLE_SECOND_DERIVATIVES
723 
724  // Only compute curl for vector-valued elements
726  this->_fe_trans->map_curl(this->dim, elem, qp, (*this), this->curl_phi);
727 
728  // Only compute div for vector-valued elements
730  this->_fe_trans->map_div(this->dim, elem, qp, (*this), this->div_phi);
731 }

◆ determine_calculations()

void libMesh::FEGenericBase< FEOutputType< T >::type >::determine_calculations ( )
protectedinherited

Determine which values are to be calculated, for both the FE itself and for the FEMap.

Definition at line 756 of file fe_base.C.

757 {
758  this->calculations_started = true;
759 
760  // If the user forgot to request anything, we'll be safe and
761  // calculate everything:
762 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
763  if (!this->calculate_phi && !this->calculate_dphi &&
764  !this->calculate_d2phi && !this->calculate_curl_phi &&
765  !this->calculate_div_phi && !this->calculate_map)
766  {
767  this->calculate_phi = this->calculate_dphi = this->calculate_d2phi = this->calculate_dphiref = true;
768  if (FEInterface::field_type(fe_type.family) == TYPE_VECTOR)
769  {
770  this->calculate_curl_phi = true;
771  this->calculate_div_phi = true;
772  }
773  }
774 #else
775  if (!this->calculate_phi && !this->calculate_dphi &&
776  !this->calculate_curl_phi && !this->calculate_div_phi &&
777  !this->calculate_map)
778  {
779  this->calculate_phi = this->calculate_dphi = this->calculate_dphiref = true;
780  if (FEInterface::field_type(fe_type.family) == TYPE_VECTOR)
781  {
782  this->calculate_curl_phi = true;
783  this->calculate_div_phi = true;
784  }
785  }
786 #endif // LIBMESH_ENABLE_SECOND_DERIVATIVES
787 
788  // Request whichever terms are necessary from the FEMap
789  if (this->calculate_phi)
790  this->_fe_trans->init_map_phi(*this);
791 
792  if (this->calculate_dphiref)
793  this->_fe_trans->init_map_dphi(*this);
794 
795 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
796  if (this->calculate_d2phi)
797  this->_fe_trans->init_map_d2phi(*this);
798 #endif //LIBMESH_ENABLE_SECOND_DERIVATIVES
799 }

◆ disable_print_counter_info()

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 106 of file reference_counter.C.

107 {
108  _enable_print_counter = false;
109  return;
110 }

References libMesh::ReferenceCounter::_enable_print_counter.

Referenced by libMesh::LibMeshInit::LibMeshInit().

◆ dofs_on_edge() [1/2]

void libMesh::FE< Dim, T >::dofs_on_edge ( const Elem *const  elem,
const Order  o,
unsigned int  e,
std::vector< unsigned int > &  di 
)
staticinherited

Fills the vector di with the local degree of freedom indices associated with edge e of element elem.

On a p-refined element, o should be the base order of the element.

Definition at line 103 of file fe.C.

107 {
108  libmesh_assert(elem);
109  libmesh_assert_less (e, elem->n_edges());
110 
111  di.clear();
112  unsigned int nodenum = 0;
113  const unsigned int n_nodes = elem->n_nodes();
114  for (unsigned int n = 0; n != n_nodes; ++n)
115  {
116  const unsigned int n_dofs = n_dofs_at_node(elem->type(),
117  static_cast<Order>(o + elem->p_level()), n);
118  if (elem->is_node_on_edge(n, e))
119  for (unsigned int i = 0; i != n_dofs; ++i)
120  di.push_back(nodenum++);
121  else
122  nodenum += n_dofs;
123  }
124 }

◆ dofs_on_edge() [2/2]

void libMesh::FE< 2, SUBDIVISION >::dofs_on_edge ( const Elem * const  ,
const  Order,
unsigned int  ,
std::vector< unsigned int > &  di 
)
inherited

Definition at line 919 of file fe_subdivision_2D.C.

919 { di.resize(0); }

◆ dofs_on_side() [1/2]

void libMesh::FE< Dim, T >::dofs_on_side ( const Elem *const  elem,
const Order  o,
unsigned int  s,
std::vector< unsigned int > &  di 
)
staticinherited

Fills the vector di with the local degree of freedom indices associated with side s of element elem.

On a p-refined element, o should be the base order of the element.

Definition at line 77 of file fe.C.

81 {
82  libmesh_assert(elem);
83  libmesh_assert_less (s, elem->n_sides());
84 
85  di.clear();
86  unsigned int nodenum = 0;
87  const unsigned int n_nodes = elem->n_nodes();
88  for (unsigned int n = 0; n != n_nodes; ++n)
89  {
90  const unsigned int n_dofs = n_dofs_at_node(elem->type(),
91  static_cast<Order>(o + elem->p_level()), n);
92  if (elem->is_node_on_side(n, s))
93  for (unsigned int i = 0; i != n_dofs; ++i)
94  di.push_back(nodenum++);
95  else
96  nodenum += n_dofs;
97  }
98 }

◆ dofs_on_side() [2/2]

void libMesh::FE< 2, SUBDIVISION >::dofs_on_side ( const Elem * const  ,
const  Order,
unsigned int  ,
std::vector< unsigned int > &  di 
)
inherited

Definition at line 918 of file fe_subdivision_2D.C.

918 { di.resize(0); }

◆ edge_reinit() [1/2]

void libMesh::FE< Dim, T >::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 
)
overridevirtualinherited

Reinitializes all the physical element-dependent data based on the edge.

The tolerance parameter is passed to the involved call to inverse_map(). By default the shape functions and associated data are computed at the quadrature points specified by the quadrature rule qrule, but may be any points specified on the reference side element specified in the optional argument pts.

Implements libMesh::FEAbstract.

Definition at line 232 of file fe_boundary.C.

237 {
238  libmesh_assert(elem);
239  libmesh_assert (this->qrule != nullptr || pts != nullptr);
240  // We don't do this for 1D elements!
241  libmesh_assert_not_equal_to (Dim, 1);
242 
243  // We're (possibly re-) calculating now! Time to determine what.
244  // FIXME - we currently just assume that we're using JxW and calling
245  // edge_map later.
246  this->_fe_map->calculations_started = false;
247  this->_fe_map->get_JxW();
248  this->_fe_map->get_xyz();
249  this->determine_calculations();
250 
251  // Build the side of interest
252  const std::unique_ptr<const Elem> edge(elem->build_edge_ptr(e));
253 
254  // Initialize the shape functions at the user-specified
255  // points
256  if (pts != nullptr)
257  {
258  // The shape functions do not correspond to the qrule
259  this->shapes_on_quadrature = false;
260 
261  // Initialize the edge shape functions
262  this->_fe_map->template init_edge_shape_functions<Dim> (*pts, edge.get());
263 
264  // Compute the Jacobian*Weight on the face for integration
265  if (weights != nullptr)
266  {
267  this->_fe_map->compute_edge_map (Dim, *weights, edge.get());
268  }
269  else
270  {
271  std::vector<Real> dummy_weights (pts->size(), 1.);
272  this->_fe_map->compute_edge_map (Dim, dummy_weights, edge.get());
273  }
274  }
275  // If there are no user specified points, we use the
276  // quadrature rule
277  else
278  {
279  // initialize quadrature rule
280  this->qrule->init(edge->type(), elem->p_level());
281 
282  if (this->qrule->shapes_need_reinit())
283  this->shapes_on_quadrature = false;
284 
285  // We might not need to reinitialize the shape functions
286  if ((this->get_type() != elem->type()) ||
287  (edge->type() != static_cast<int>(last_edge)) || // Comparison between enum and unsigned, cast the unsigned to int
288  this->shapes_need_reinit() ||
289  !this->shapes_on_quadrature)
290  {
291  // Set the element type
292  this->elem_type = elem->type();
293 
294  // Set the last_edge
295  last_edge = edge->type();
296 
297  // Initialize the edge shape functions
298  this->_fe_map->template init_edge_shape_functions<Dim> (this->qrule->get_points(), edge.get());
299  }
300 
301  // Compute the Jacobian*Weight on the face for integration
302  this->_fe_map->compute_edge_map (Dim, this->qrule->get_weights(), edge.get());
303 
304  // The shape functions correspond to the qrule
305  this->shapes_on_quadrature = true;
306  }
307 
308  // make a copy of the Jacobian for integration
309  const std::vector<Real> JxW_int(this->_fe_map->get_JxW());
310 
311  // Find where the integration points are located on the
312  // full element.
313  std::vector<Point> qp;
314  FEMap::inverse_map (Dim, elem, this->_fe_map->get_xyz(), qp, tolerance);
315 
316  // compute the shape function and derivative values
317  // at the points qp
318  this->reinit (elem, &qp);
319 
320  // copy back old data
321  this->_fe_map->get_JxW() = JxW_int;
322 }

◆ edge_reinit() [2/2]

void libMesh::FE< 2, SUBDIVISION >::edge_reinit ( Elem const *  ,
unsigned int  ,
Real  ,
const std::vector< Point > * const  ,
const std::vector< Real > * const   
)
virtualinherited

Reinitializes all the physical element-dependent data based on the edge of the element elem.

The tolerance parameter is passed to the involved call to inverse_map(). By default the element data are computed at the quadrature points specified by the quadrature rule qrule, but any set of points on the reference edge element may be specified in the optional argument pts.

Implements libMesh::FEAbstract.

Definition at line 878 of file fe_subdivision_2D.C.

883 {
884  libmesh_not_implemented();
885 }

◆ enable_print_counter_info()

void libMesh::ReferenceCounter::enable_print_counter_info ( )
staticinherited

Methods to enable/disable the reference counter output from print_info()

Definition at line 100 of file reference_counter.C.

101 {
102  _enable_print_counter = true;
103  return;
104 }

References libMesh::ReferenceCounter::_enable_print_counter.

◆ get_continuity() [1/62]

FEContinuity libMesh::FE< 0, SCALAR >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 107 of file fe_scalar.C.

107 { return DISCONTINUOUS; }

◆ get_continuity() [2/62]

FEContinuity libMesh::FE< 1, SCALAR >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 108 of file fe_scalar.C.

108 { return DISCONTINUOUS; }

◆ get_continuity() [3/62]

FEContinuity libMesh::FE< 2, SCALAR >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 109 of file fe_scalar.C.

109 { return DISCONTINUOUS; }

◆ get_continuity() [4/62]

FEContinuity libMesh::FE< 3, SCALAR >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 110 of file fe_scalar.C.

110 { return DISCONTINUOUS; }

◆ get_continuity() [5/62]

FEContinuity libMesh::FE< 0, RATIONAL_BERNSTEIN >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 166 of file fe_rational.C.

166 { return C_ZERO; }

◆ get_continuity() [6/62]

FEContinuity libMesh::FE< 1, RATIONAL_BERNSTEIN >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 167 of file fe_rational.C.

167 { return C_ZERO; }

◆ get_continuity() [7/62]

FEContinuity libMesh::FE< 2, RATIONAL_BERNSTEIN >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 168 of file fe_rational.C.

168 { return C_ZERO; }

◆ get_continuity() [8/62]

FEContinuity libMesh::FE< 3, RATIONAL_BERNSTEIN >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 169 of file fe_rational.C.

169 { return C_ZERO; }

◆ get_continuity() [9/62]

FEContinuity libMesh::FE< 0, L2_HIERARCHIC >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 193 of file fe_l2_hierarchic.C.

193 { return DISCONTINUOUS; }

◆ get_continuity() [10/62]

FEContinuity libMesh::FE< 1, L2_HIERARCHIC >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 194 of file fe_l2_hierarchic.C.

194 { return DISCONTINUOUS; }

◆ get_continuity() [11/62]

FEContinuity libMesh::FE< 2, L2_HIERARCHIC >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 195 of file fe_l2_hierarchic.C.

195 { return DISCONTINUOUS; }

◆ get_continuity() [12/62]

FEContinuity libMesh::FE< 3, L2_HIERARCHIC >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 196 of file fe_l2_hierarchic.C.

196 { return DISCONTINUOUS; }

◆ get_continuity() [13/62]

FEContinuity libMesh::FE< 0, CLOUGH >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 289 of file fe_clough.C.

289 { return C_ONE; }

◆ get_continuity() [14/62]

FEContinuity libMesh::FE< 1, CLOUGH >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 290 of file fe_clough.C.

290 { return C_ONE; }

◆ get_continuity() [15/62]

FEContinuity libMesh::FE< 2, CLOUGH >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 291 of file fe_clough.C.

291 { return C_ONE; }

◆ get_continuity() [16/62]

FEContinuity libMesh::FE< 3, CLOUGH >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 292 of file fe_clough.C.

292 { return C_ONE; }

◆ get_continuity() [17/62]

FEContinuity libMesh::FE< 0, HERMITE >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 340 of file fe_hermite.C.

340 { return C_ONE; }

◆ get_continuity() [18/62]

FEContinuity libMesh::FE< 1, HERMITE >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 341 of file fe_hermite.C.

341 { return C_ONE; }

◆ get_continuity() [19/62]

FEContinuity libMesh::FE< 2, HERMITE >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 342 of file fe_hermite.C.

342 { return C_ONE; }

◆ get_continuity() [20/62]

FEContinuity libMesh::FE< 3, HERMITE >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 343 of file fe_hermite.C.

343 { return C_ONE; }

◆ get_continuity() [21/62]

FEContinuity libMesh::FE< 0, HIERARCHIC >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 370 of file fe_hierarchic.C.

370 { return C_ZERO; }

◆ get_continuity() [22/62]

FEContinuity libMesh::FE< 1, HIERARCHIC >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 371 of file fe_hierarchic.C.

371 { return C_ZERO; }

◆ get_continuity() [23/62]

FEContinuity libMesh::FE< 2, HIERARCHIC >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 372 of file fe_hierarchic.C.

372 { return C_ZERO; }

◆ get_continuity() [24/62]

FEContinuity libMesh::FE< 3, HIERARCHIC >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 373 of file fe_hierarchic.C.

373 { return C_ZERO; }

◆ get_continuity() [25/62]

FEContinuity libMesh::FE< 0, MONOMIAL >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 398 of file fe_monomial.C.

398 { return DISCONTINUOUS; }

◆ get_continuity() [26/62]

FEContinuity libMesh::FE< 1, MONOMIAL >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 399 of file fe_monomial.C.

399 { return DISCONTINUOUS; }

◆ get_continuity() [27/62]

FEContinuity libMesh::FE< 2, MONOMIAL >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 400 of file fe_monomial.C.

400 { return DISCONTINUOUS; }

◆ get_continuity() [28/62]

FEContinuity libMesh::FE< 3, MONOMIAL >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 401 of file fe_monomial.C.

401 { return DISCONTINUOUS; }

◆ get_continuity() [29/62]

FEContinuity libMesh::FE< 0, BERNSTEIN >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 437 of file fe_bernstein.C.

437 { return C_ZERO; }

◆ get_continuity() [30/62]

FEContinuity libMesh::FE< 1, BERNSTEIN >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 438 of file fe_bernstein.C.

438 { return C_ZERO; }

◆ get_continuity() [31/62]

FEContinuity libMesh::FE< 2, BERNSTEIN >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 439 of file fe_bernstein.C.

439 { return C_ZERO; }

◆ get_continuity() [32/62]

FEContinuity libMesh::FE< 3, BERNSTEIN >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 440 of file fe_bernstein.C.

440 { return C_ZERO; }

◆ get_continuity() [33/62]

FEContinuity libMesh::FE< 0, L2_LAGRANGE >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 479 of file fe_l2_lagrange.C.

479 { return DISCONTINUOUS; }

◆ get_continuity() [34/62]

FEContinuity libMesh::FE< 1, L2_LAGRANGE >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 480 of file fe_l2_lagrange.C.

480 { return DISCONTINUOUS; }

◆ get_continuity() [35/62]

FEContinuity libMesh::FE< 2, L2_LAGRANGE >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 481 of file fe_l2_lagrange.C.

481 { return DISCONTINUOUS; }

◆ get_continuity() [36/62]

FEContinuity libMesh::FE< 3, L2_LAGRANGE >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 482 of file fe_l2_lagrange.C.

482 { return DISCONTINUOUS; }

◆ get_continuity() [37/62]

FEContinuity libMesh::FE< 0, NEDELEC_ONE >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 539 of file fe_nedelec_one.C.

539 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ get_continuity() [38/62]

FEContinuity libMesh::FE< 1, NEDELEC_ONE >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 540 of file fe_nedelec_one.C.

540 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ get_continuity() [39/62]

FEContinuity libMesh::FE< 2, NEDELEC_ONE >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 541 of file fe_nedelec_one.C.

541 { return H_CURL; }

◆ get_continuity() [40/62]

FEContinuity libMesh::FE< 3, NEDELEC_ONE >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 542 of file fe_nedelec_one.C.

542 { return H_CURL; }

◆ get_continuity() [41/62]

FEContinuity libMesh::FE< 0, MONOMIAL_VEC >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 758 of file fe_monomial_vec.C.

759 {
760  return DISCONTINUOUS;
761 }

◆ get_continuity() [42/62]

FEContinuity libMesh::FE< 1, MONOMIAL_VEC >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 764 of file fe_monomial_vec.C.

765 {
766  return DISCONTINUOUS;
767 }

◆ get_continuity() [43/62]

FEContinuity libMesh::FE< 2, MONOMIAL_VEC >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 770 of file fe_monomial_vec.C.

771 {
772  return DISCONTINUOUS;
773 }

◆ get_continuity() [44/62]

FEContinuity libMesh::FE< 3, MONOMIAL_VEC >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 776 of file fe_monomial_vec.C.

777 {
778  return DISCONTINUOUS;
779 }

◆ get_continuity() [45/62]

FEContinuity libMesh::FE< 0, LAGRANGE >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 873 of file fe_lagrange.C.

873 { return C_ZERO; }

◆ get_continuity() [46/62]

FEContinuity libMesh::FE< 1, LAGRANGE >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 874 of file fe_lagrange.C.

874 { return C_ZERO; }

◆ get_continuity() [47/62]

FEContinuity libMesh::FE< 2, LAGRANGE >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 875 of file fe_lagrange.C.

875 { return C_ZERO; }

◆ get_continuity() [48/62]

FEContinuity libMesh::FE< 3, LAGRANGE >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 876 of file fe_lagrange.C.

876 { return C_ZERO; }

◆ get_continuity() [49/62]

FEContinuity libMesh::FE< 2, SUBDIVISION >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 922 of file fe_subdivision_2D.C.

922 { return C_ONE; }

◆ get_continuity() [50/62]

FEContinuity libMesh::FE< 0, XYZ >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 925 of file fe_xyz.C.

925 { return DISCONTINUOUS; }

◆ get_continuity() [51/62]

FEContinuity libMesh::FE< 1, XYZ >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 926 of file fe_xyz.C.

926 { return DISCONTINUOUS; }

◆ get_continuity() [52/62]

FEContinuity libMesh::FE< 2, XYZ >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 927 of file fe_xyz.C.

927 { return DISCONTINUOUS; }

◆ get_continuity() [53/62]

FEContinuity libMesh::FE< 3, XYZ >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 928 of file fe_xyz.C.

928 { return DISCONTINUOUS; }

◆ get_continuity() [54/62]

FEContinuity libMesh::FE< 0, LAGRANGE_VEC >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 971 of file fe_lagrange_vec.C.

971 { return C_ZERO; }

◆ get_continuity() [55/62]

FEContinuity libMesh::FE< 1, LAGRANGE_VEC >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 972 of file fe_lagrange_vec.C.

972 { return C_ZERO; }

◆ get_continuity() [56/62]

FEContinuity libMesh::FE< 2, LAGRANGE_VEC >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 973 of file fe_lagrange_vec.C.

973 { return C_ZERO; }

◆ get_continuity() [57/62]

FEContinuity libMesh::FE< 3, LAGRANGE_VEC >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 974 of file fe_lagrange_vec.C.

974 { return C_ZERO; }

◆ get_continuity() [58/62]

FEContinuity libMesh::FE< 0, SZABAB >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 1273 of file fe_szabab.C.

1273 { return C_ZERO; }

◆ get_continuity() [59/62]

FEContinuity libMesh::FE< 1, SZABAB >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 1274 of file fe_szabab.C.

1274 { return C_ZERO; }

◆ get_continuity() [60/62]

FEContinuity libMesh::FE< 2, SZABAB >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 1275 of file fe_szabab.C.

1275 { return C_ZERO; }

◆ get_continuity() [61/62]

FEContinuity libMesh::FE< 3, SZABAB >::get_continuity ( ) const
virtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

Definition at line 1276 of file fe_szabab.C.

1276 { return C_ZERO; }

◆ get_continuity() [62/62]

virtual FEContinuity libMesh::FE< Dim, T >::get_continuity ( ) const
overridevirtualinherited
Returns
The continuity level of the finite element.

Implements libMesh::FEAbstract.

◆ get_curl_phi()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_curl_phi ( ) const
inlineinherited
Returns
The curl of the shape function at the quadrature points.

Definition at line 222 of file fe_base.h.

◆ get_curvatures()

const std::vector<Real>& libMesh::FEAbstract::get_curvatures ( ) const
inlineinherited
Returns
The curvatures for use in face integration.

Definition at line 387 of file fe_abstract.h.

388  { calculate_map = true; return this->_fe_map->get_curvatures();}

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_d2phi()

const std::vector<std::vector<OutputTensor> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phi ( ) const
inlineinherited
Returns
The shape function second derivatives at the quadrature points.

Definition at line 288 of file fe_base.h.

◆ get_d2phideta2()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phideta2 ( ) const
inlineinherited
Returns
The shape function second derivatives at the quadrature points, in reference coordinates

Definition at line 368 of file fe_base.h.

◆ get_d2phidetadzeta()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidetadzeta ( ) const
inlineinherited
Returns
The shape function second derivatives at the quadrature points, in reference coordinates

Definition at line 376 of file fe_base.h.

◆ get_d2phidx2()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidx2 ( ) const
inlineinherited
Returns
The shape function second derivatives at the quadrature points.

Definition at line 296 of file fe_base.h.

◆ get_d2phidxdy()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidxdy ( ) const
inlineinherited
Returns
The shape function second derivatives at the quadrature points.

Definition at line 304 of file fe_base.h.

◆ get_d2phidxdz()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidxdz ( ) const
inlineinherited
Returns
The shape function second derivatives at the quadrature points.

Definition at line 312 of file fe_base.h.

◆ get_d2phidxi2()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidxi2 ( ) const
inlineinherited
Returns
The shape function second derivatives at the quadrature points, in reference coordinates

Definition at line 344 of file fe_base.h.

◆ get_d2phidxideta()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidxideta ( ) const
inlineinherited
Returns
The shape function second derivatives at the quadrature points, in reference coordinates

Definition at line 352 of file fe_base.h.

◆ get_d2phidxidzeta()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidxidzeta ( ) const
inlineinherited
Returns
The shape function second derivatives at the quadrature points, in reference coordinates

Definition at line 360 of file fe_base.h.

◆ get_d2phidy2()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidy2 ( ) const
inlineinherited
Returns
The shape function second derivatives at the quadrature points.

Definition at line 320 of file fe_base.h.

◆ get_d2phidydz()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidydz ( ) const
inlineinherited
Returns
The shape function second derivatives at the quadrature points.

Definition at line 328 of file fe_base.h.

◆ get_d2phidz2()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidz2 ( ) const
inlineinherited
Returns
The shape function second derivatives at the quadrature points.

Definition at line 336 of file fe_base.h.

◆ get_d2phidzeta2()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidzeta2 ( ) const
inlineinherited
Returns
The shape function second derivatives at the quadrature points, in reference coordinates

Definition at line 384 of file fe_base.h.

◆ get_d2xyzdeta2()

const std::vector<RealGradient>& libMesh::FEAbstract::get_d2xyzdeta2 ( ) const
inlineinherited
Returns
The second partial derivatives in eta.

Definition at line 279 of file fe_abstract.h.

280  { calculate_map = true; return this->_fe_map->get_d2xyzdeta2(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_d2xyzdetadzeta()

const std::vector<RealGradient>& libMesh::FEAbstract::get_d2xyzdetadzeta ( ) const
inlineinherited
Returns
The second partial derivatives in eta-zeta.

Definition at line 303 of file fe_abstract.h.

304  { calculate_map = true; return this->_fe_map->get_d2xyzdetadzeta(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_d2xyzdxi2()

const std::vector<RealGradient>& libMesh::FEAbstract::get_d2xyzdxi2 ( ) const
inlineinherited
Returns
The second partial derivatives in xi.

Definition at line 273 of file fe_abstract.h.

274  { calculate_map = true; return this->_fe_map->get_d2xyzdxi2(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_d2xyzdxideta()

const std::vector<RealGradient>& libMesh::FEAbstract::get_d2xyzdxideta ( ) const
inlineinherited
Returns
The second partial derivatives in xi-eta.

Definition at line 291 of file fe_abstract.h.

292  { calculate_map = true; return this->_fe_map->get_d2xyzdxideta(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_d2xyzdxidzeta()

const std::vector<RealGradient>& libMesh::FEAbstract::get_d2xyzdxidzeta ( ) const
inlineinherited
Returns
The second partial derivatives in xi-zeta.

Definition at line 297 of file fe_abstract.h.

298  { calculate_map = true; return this->_fe_map->get_d2xyzdxidzeta(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_d2xyzdzeta2()

const std::vector<RealGradient>& libMesh::FEAbstract::get_d2xyzdzeta2 ( ) const
inlineinherited
Returns
The second partial derivatives in zeta.

Definition at line 285 of file fe_abstract.h.

286  { calculate_map = true; return this->_fe_map->get_d2xyzdzeta2(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_detadx()

const std::vector<Real>& libMesh::FEAbstract::get_detadx ( ) const
inlineinherited
Returns
The deta/dx entry in the transformation matrix from physical to local coordinates.

Definition at line 333 of file fe_abstract.h.

334  { calculate_map = true; return this->_fe_map->get_detadx(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_detady()

const std::vector<Real>& libMesh::FEAbstract::get_detady ( ) const
inlineinherited
Returns
The deta/dy entry in the transformation matrix from physical to local coordinates.

Definition at line 340 of file fe_abstract.h.

341  { calculate_map = true; return this->_fe_map->get_detady(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_detadz()

const std::vector<Real>& libMesh::FEAbstract::get_detadz ( ) const
inlineinherited
Returns
The deta/dz entry in the transformation matrix from physical to local coordinates.

Definition at line 347 of file fe_abstract.h.

348  { calculate_map = true; return this->_fe_map->get_detadz(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_dim()

unsigned int libMesh::FEAbstract::get_dim ( ) const
inlineinherited
Returns
the dimension of this FE

Definition at line 230 of file fe_abstract.h.

231  { return dim; }

References libMesh::FEAbstract::dim.

◆ get_div_phi()

const std::vector<std::vector<OutputDivergence> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_div_phi ( ) const
inlineinherited
Returns
The divergence of the shape function at the quadrature points.

Definition at line 230 of file fe_base.h.

◆ get_dphase()

const std::vector<OutputGradient>& libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphase ( ) const
inlineinherited
Returns
The global first derivative of the phase term which is used in infinite elements, evaluated at the quadrature points.

In case of the general finite element class FE this field is initialized to all zero, so that the variational formulation for an infinite element produces correct element matrices for a mesh using both finite and infinite elements.

Definition at line 402 of file fe_base.h.

403  { return dphase; }

◆ get_dphi()

const std::vector<std::vector<OutputGradient> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphi ( ) const
inlineinherited
Returns
The shape function derivatives at the quadrature points.

Definition at line 214 of file fe_base.h.

◆ get_dphideta()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphideta ( ) const
inlineinherited
Returns
The shape function eta-derivative at the quadrature points.

Definition at line 270 of file fe_base.h.

◆ get_dphidx()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphidx ( ) const
inlineinherited
Returns
The shape function x-derivative at the quadrature points.

Definition at line 238 of file fe_base.h.

◆ get_dphidxi()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphidxi ( ) const
inlineinherited
Returns
The shape function xi-derivative at the quadrature points.

Definition at line 262 of file fe_base.h.

◆ get_dphidy()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphidy ( ) const
inlineinherited
Returns
The shape function y-derivative at the quadrature points.

Definition at line 246 of file fe_base.h.

◆ get_dphidz()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphidz ( ) const
inlineinherited
Returns
The shape function z-derivative at the quadrature points.

Definition at line 254 of file fe_base.h.

◆ get_dphidzeta()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphidzeta ( ) const
inlineinherited
Returns
The shape function zeta-derivative at the quadrature points.

Definition at line 278 of file fe_base.h.

◆ get_dxidx()

const std::vector<Real>& libMesh::FEAbstract::get_dxidx ( ) const
inlineinherited
Returns
The dxi/dx entry in the transformation matrix from physical to local coordinates.

Definition at line 312 of file fe_abstract.h.

313  { calculate_map = true; return this->_fe_map->get_dxidx(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_dxidy()

const std::vector<Real>& libMesh::FEAbstract::get_dxidy ( ) const
inlineinherited
Returns
The dxi/dy entry in the transformation matrix from physical to local coordinates.

Definition at line 319 of file fe_abstract.h.

320  { calculate_map = true; return this->_fe_map->get_dxidy(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_dxidz()

const std::vector<Real>& libMesh::FEAbstract::get_dxidz ( ) const
inlineinherited
Returns
The dxi/dz entry in the transformation matrix from physical to local coordinates.

Definition at line 326 of file fe_abstract.h.

327  { calculate_map = true; return this->_fe_map->get_dxidz(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_dxyzdeta()

const std::vector<RealGradient>& libMesh::FEAbstract::get_dxyzdeta ( ) const
inlineinherited
Returns
The element tangents in eta-direction at the quadrature points.

Definition at line 258 of file fe_abstract.h.

259  { calculate_map = true; return this->_fe_map->get_dxyzdeta(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_dxyzdxi()

const std::vector<RealGradient>& libMesh::FEAbstract::get_dxyzdxi ( ) const
inlineinherited
Returns
The element tangents in xi-direction at the quadrature points.

Definition at line 251 of file fe_abstract.h.

252  { calculate_map = true; return this->_fe_map->get_dxyzdxi(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_dxyzdzeta()

const std::vector<RealGradient>& libMesh::FEAbstract::get_dxyzdzeta ( ) const
inlineinherited
Returns
The element tangents in zeta-direction at the quadrature points.

Definition at line 265 of file fe_abstract.h.

266  { return _fe_map->get_dxyzdzeta(); }

References libMesh::FEAbstract::_fe_map.

◆ get_dzetadx()

const std::vector<Real>& libMesh::FEAbstract::get_dzetadx ( ) const
inlineinherited
Returns
The dzeta/dx entry in the transformation matrix from physical to local coordinates.

Definition at line 354 of file fe_abstract.h.

355  { calculate_map = true; return this->_fe_map->get_dzetadx(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_dzetady()

const std::vector<Real>& libMesh::FEAbstract::get_dzetady ( ) const
inlineinherited
Returns
The dzeta/dy entry in the transformation matrix from physical to local coordinates.

Definition at line 361 of file fe_abstract.h.

362  { calculate_map = true; return this->_fe_map->get_dzetady(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_dzetadz()

const std::vector<Real>& libMesh::FEAbstract::get_dzetadz ( ) const
inlineinherited
Returns
The dzeta/dz entry in the transformation matrix from physical to local coordinates.

Definition at line 368 of file fe_abstract.h.

369  { calculate_map = true; return this->_fe_map->get_dzetadz(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_family()

FEFamily libMesh::FEAbstract::get_family ( ) const
inlineinherited
Returns
The finite element family of this element.

Definition at line 453 of file fe_abstract.h.

453 { return fe_type.family; }

References libMesh::FEType::family, and libMesh::FEAbstract::fe_type.

◆ get_fe_map() [1/2]

FEMap& libMesh::FEAbstract::get_fe_map ( )
inlineinherited

Definition at line 459 of file fe_abstract.h.

459 { return *_fe_map.get(); }

References libMesh::FEAbstract::_fe_map.

◆ get_fe_map() [2/2]

const FEMap& libMesh::FEAbstract::get_fe_map ( ) const
inlineinherited

◆ get_fe_type()

FEType libMesh::FEAbstract::get_fe_type ( ) const
inlineinherited

◆ get_info()

std::string libMesh::ReferenceCounter::get_info ( )
staticinherited

Gets a string containing the reference information.

Definition at line 47 of file reference_counter.C.

48 {
49 #if defined(LIBMESH_ENABLE_REFERENCE_COUNTING) && defined(DEBUG)
50 
51  std::ostringstream oss;
52 
53  oss << '\n'
54  << " ---------------------------------------------------------------------------- \n"
55  << "| Reference count information |\n"
56  << " ---------------------------------------------------------------------------- \n";
57 
58  for (const auto & pr : _counts)
59  {
60  const std::string name(pr.first);
61  const unsigned int creations = pr.second.first;
62  const unsigned int destructions = pr.second.second;
63 
64  oss << "| " << name << " reference count information:\n"
65  << "| Creations: " << creations << '\n'
66  << "| Destructions: " << destructions << '\n';
67  }
68 
69  oss << " ---------------------------------------------------------------------------- \n";
70 
71  return oss.str();
72 
73 #else
74 
75  return "";
76 
77 #endif
78 }

References libMesh::ReferenceCounter::_counts, and libMesh::Quality::name().

Referenced by libMesh::ReferenceCounter::print_info().

◆ get_JxW()

const std::vector<Real>& libMesh::FEAbstract::get_JxW ( ) const
inlineinherited
Returns
The element Jacobian times the quadrature weight for each quadrature point.

Definition at line 244 of file fe_abstract.h.

245  { calculate_map = true; return this->_fe_map->get_JxW(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

Referenced by libMesh::ExactSolution::_compute_error(), assemble_SchroedingerEquation(), assembly_with_dg_fem_context(), libMesh::DiscontinuityMeasure::boundary_side_integration(), libMesh::KellyErrorEstimator::boundary_side_integration(), libMesh::System::calculate_norm(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubProjector::construct_projection(), NavierSystem::element_constraint(), CoupledSystem::element_constraint(), PoissonSystem::element_postprocess(), LaplaceSystem::element_postprocess(), LaplaceQoI::element_qoi(), LaplaceQoI::element_qoi_derivative(), LaplaceSystem::element_qoi_derivative(), HeatSystem::element_qoi_derivative(), NavierSystem::element_time_derivative(), SolidSystem::element_time_derivative(), PoissonSystem::element_time_derivative(), LaplaceSystem::element_time_derivative(), CurlCurlSystem::element_time_derivative(), ElasticitySystem::element_time_derivative(), CoupledSystem::element_time_derivative(), libMesh::ExactErrorEstimator::find_squared_element_error(), LaplaceQoI::init_context(), NavierSystem::init_context(), SolidSystem::init_context(), PoissonSystem::init_context(), LaplaceSystem::init_context(), CurlCurlSystem::init_context(), ElasticitySystem::init_context(), CoupledSystem::init_context(), ElasticityRBConstruction::init_context(), libMesh::FEMSystem::init_context(), libMesh::RBEIMConstruction::init_context_with_sys(), libMesh::LaplacianErrorEstimator::internal_side_integration(), libMesh::DiscontinuityMeasure::internal_side_integration(), libMesh::KellyErrorEstimator::internal_side_integration(), NavierSystem::mass_residual(), ElasticitySystem::mass_residual(), libMesh::FEMPhysics::mass_residual(), LaplaceSystem::side_constraint(), LaplaceSystem::side_postprocess(), CoupledSystemQoI::side_qoi(), CoupledSystemQoI::side_qoi_derivative(), LaplaceSystem::side_qoi_derivative(), SolidSystem::side_time_derivative(), CurlCurlSystem::side_time_derivative(), ElasticitySystem::side_time_derivative(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::SubFunctor(), and libMesh::RBEIMConstruction::truth_solve().

◆ get_normals()

const std::vector<Point>& libMesh::FEAbstract::get_normals ( ) const
inlineinherited

◆ get_order()

Order libMesh::FEAbstract::get_order ( ) const
inlineinherited
Returns
The approximation order of the finite element.

Definition at line 432 of file fe_abstract.h.

432 { return static_cast<Order>(fe_type.order + _p_level); }

References libMesh::FEAbstract::_p_level, libMesh::FEAbstract::fe_type, and libMesh::FEType::order.

◆ get_p_level()

unsigned int libMesh::FEAbstract::get_p_level ( ) const
inlineinherited
Returns
The p refinement level that the current shape functions have been calculated for.

Definition at line 422 of file fe_abstract.h.

422 { return _p_level; }

References libMesh::FEAbstract::_p_level.

◆ get_phi()

const std::vector<std::vector<OutputShape> >& libMesh::FEGenericBase< FEOutputType< T >::type >::get_phi ( ) const
inlineinherited
Returns
The shape function values at the quadrature points on the element.

Definition at line 206 of file fe_base.h.

208  calculate_phi = true; return phi; }

◆ get_refspace_nodes()

void libMesh::FEAbstract::get_refspace_nodes ( const ElemType  t,
std::vector< Point > &  nodes 
)
staticinherited
Returns
The reference space coordinates of nodes based on the element type.

Definition at line 308 of file fe_abstract.C.

309 {
310  switch(itemType)
311  {
312  case EDGE2:
313  {
314  nodes.resize(2);
315  nodes[0] = Point (-1.,0.,0.);
316  nodes[1] = Point (1.,0.,0.);
317  return;
318  }
319  case EDGE3:
320  {
321  nodes.resize(3);
322  nodes[0] = Point (-1.,0.,0.);
323  nodes[1] = Point (1.,0.,0.);
324  nodes[2] = Point (0.,0.,0.);
325  return;
326  }
327  case TRI3:
328  case TRISHELL3:
329  {
330  nodes.resize(3);
331  nodes[0] = Point (0.,0.,0.);
332  nodes[1] = Point (1.,0.,0.);
333  nodes[2] = Point (0.,1.,0.);
334  return;
335  }
336  case TRI6:
337  {
338  nodes.resize(6);
339  nodes[0] = Point (0.,0.,0.);
340  nodes[1] = Point (1.,0.,0.);
341  nodes[2] = Point (0.,1.,0.);
342  nodes[3] = Point (.5,0.,0.);
343  nodes[4] = Point (.5,.5,0.);
344  nodes[5] = Point (0.,.5,0.);
345  return;
346  }
347  case QUAD4:
348  case QUADSHELL4:
349  {
350  nodes.resize(4);
351  nodes[0] = Point (-1.,-1.,0.);
352  nodes[1] = Point (1.,-1.,0.);
353  nodes[2] = Point (1.,1.,0.);
354  nodes[3] = Point (-1.,1.,0.);
355  return;
356  }
357  case QUAD8:
358  case QUADSHELL8:
359  {
360  nodes.resize(8);
361  nodes[0] = Point (-1.,-1.,0.);
362  nodes[1] = Point (1.,-1.,0.);
363  nodes[2] = Point (1.,1.,0.);
364  nodes[3] = Point (-1.,1.,0.);
365  nodes[4] = Point (0.,-1.,0.);
366  nodes[5] = Point (1.,0.,0.);
367  nodes[6] = Point (0.,1.,0.);
368  nodes[7] = Point (-1.,0.,0.);
369  return;
370  }
371  case QUAD9:
372  {
373  nodes.resize(9);
374  nodes[0] = Point (-1.,-1.,0.);
375  nodes[1] = Point (1.,-1.,0.);
376  nodes[2] = Point (1.,1.,0.);
377  nodes[3] = Point (-1.,1.,0.);
378  nodes[4] = Point (0.,-1.,0.);
379  nodes[5] = Point (1.,0.,0.);
380  nodes[6] = Point (0.,1.,0.);
381  nodes[7] = Point (-1.,0.,0.);
382  nodes[8] = Point (0.,0.,0.);
383  return;
384  }
385  case TET4:
386  {
387  nodes.resize(4);
388  nodes[0] = Point (0.,0.,0.);
389  nodes[1] = Point (1.,0.,0.);
390  nodes[2] = Point (0.,1.,0.);
391  nodes[3] = Point (0.,0.,1.);
392  return;
393  }
394  case TET10:
395  {
396  nodes.resize(10);
397  nodes[0] = Point (0.,0.,0.);
398  nodes[1] = Point (1.,0.,0.);
399  nodes[2] = Point (0.,1.,0.);
400  nodes[3] = Point (0.,0.,1.);
401  nodes[4] = Point (.5,0.,0.);
402  nodes[5] = Point (.5,.5,0.);
403  nodes[6] = Point (0.,.5,0.);
404  nodes[7] = Point (0.,0.,.5);
405  nodes[8] = Point (.5,0.,.5);
406  nodes[9] = Point (0.,.5,.5);
407  return;
408  }
409  case HEX8:
410  {
411  nodes.resize(8);
412  nodes[0] = Point (-1.,-1.,-1.);
413  nodes[1] = Point (1.,-1.,-1.);
414  nodes[2] = Point (1.,1.,-1.);
415  nodes[3] = Point (-1.,1.,-1.);
416  nodes[4] = Point (-1.,-1.,1.);
417  nodes[5] = Point (1.,-1.,1.);
418  nodes[6] = Point (1.,1.,1.);
419  nodes[7] = Point (-1.,1.,1.);
420  return;
421  }
422  case HEX20:
423  {
424  nodes.resize(20);
425  nodes[0] = Point (-1.,-1.,-1.);
426  nodes[1] = Point (1.,-1.,-1.);
427  nodes[2] = Point (1.,1.,-1.);
428  nodes[3] = Point (-1.,1.,-1.);
429  nodes[4] = Point (-1.,-1.,1.);
430  nodes[5] = Point (1.,-1.,1.);
431  nodes[6] = Point (1.,1.,1.);
432  nodes[7] = Point (-1.,1.,1.);
433  nodes[8] = Point (0.,-1.,-1.);
434  nodes[9] = Point (1.,0.,-1.);
435  nodes[10] = Point (0.,1.,-1.);
436  nodes[11] = Point (-1.,0.,-1.);
437  nodes[12] = Point (-1.,-1.,0.);
438  nodes[13] = Point (1.,-1.,0.);
439  nodes[14] = Point (1.,1.,0.);
440  nodes[15] = Point (-1.,1.,0.);
441  nodes[16] = Point (0.,-1.,1.);
442  nodes[17] = Point (1.,0.,1.);
443  nodes[18] = Point (0.,1.,1.);
444  nodes[19] = Point (-1.,0.,1.);
445  return;
446  }
447  case HEX27:
448  {
449  nodes.resize(27);
450  nodes[0] = Point (-1.,-1.,-1.);
451  nodes[1] = Point (1.,-1.,-1.);
452  nodes[2] = Point (1.,1.,-1.);
453  nodes[3] = Point (-1.,1.,-1.);
454  nodes[4] = Point (-1.,-1.,1.);
455  nodes[5] = Point (1.,-1.,1.);
456  nodes[6] = Point (1.,1.,1.);
457  nodes[7] = Point (-1.,1.,1.);
458  nodes[8] = Point (0.,-1.,-1.);
459  nodes[9] = Point (1.,0.,-1.);
460  nodes[10] = Point (0.,1.,-1.);
461  nodes[11] = Point (-1.,0.,-1.);
462  nodes[12] = Point (-1.,-1.,0.);
463  nodes[13] = Point (1.,-1.,0.);
464  nodes[14] = Point (1.,1.,0.);
465  nodes[15] = Point (-1.,1.,0.);
466  nodes[16] = Point (0.,-1.,1.);
467  nodes[17] = Point (1.,0.,1.);
468  nodes[18] = Point (0.,1.,1.);
469  nodes[19] = Point (-1.,0.,1.);
470  nodes[20] = Point (0.,0.,-1.);
471  nodes[21] = Point (0.,-1.,0.);
472  nodes[22] = Point (1.,0.,0.);
473  nodes[23] = Point (0.,1.,0.);
474  nodes[24] = Point (-1.,0.,0.);
475  nodes[25] = Point (0.,0.,1.);
476  nodes[26] = Point (0.,0.,0.);
477  return;
478  }
479  case PRISM6:
480  {
481  nodes.resize(6);
482  nodes[0] = Point (0.,0.,-1.);
483  nodes[1] = Point (1.,0.,-1.);
484  nodes[2] = Point (0.,1.,-1.);
485  nodes[3] = Point (0.,0.,1.);
486  nodes[4] = Point (1.,0.,1.);
487  nodes[5] = Point (0.,1.,1.);
488  return;
489  }
490  case PRISM15:
491  {
492  nodes.resize(15);
493  nodes[0] = Point (0.,0.,-1.);
494  nodes[1] = Point (1.,0.,-1.);
495  nodes[2] = Point (0.,1.,-1.);
496  nodes[3] = Point (0.,0.,1.);
497  nodes[4] = Point (1.,0.,1.);
498  nodes[5] = Point (0.,1.,1.);
499  nodes[6] = Point (.5,0.,-1.);
500  nodes[7] = Point (.5,.5,-1.);
501  nodes[8] = Point (0.,.5,-1.);
502  nodes[9] = Point (0.,0.,0.);
503  nodes[10] = Point (1.,0.,0.);
504  nodes[11] = Point (0.,1.,0.);
505  nodes[12] = Point (.5,0.,1.);
506  nodes[13] = Point (.5,.5,1.);
507  nodes[14] = Point (0.,.5,1.);
508  return;
509  }
510  case PRISM18:
511  {
512  nodes.resize(18);
513  nodes[0] = Point (0.,0.,-1.);
514  nodes[1] = Point (1.,0.,-1.);
515  nodes[2] = Point (0.,1.,-1.);
516  nodes[3] = Point (0.,0.,1.);
517  nodes[4] = Point (1.,0.,1.);
518  nodes[5] = Point (0.,1.,1.);
519  nodes[6] = Point (.5,0.,-1.);
520  nodes[7] = Point (.5,.5,-1.);
521  nodes[8] = Point (0.,.5,-1.);
522  nodes[9] = Point (0.,0.,0.);
523  nodes[10] = Point (1.,0.,0.);
524  nodes[11] = Point (0.,1.,0.);
525  nodes[12] = Point (.5,0.,1.);
526  nodes[13] = Point (.5,.5,1.);
527  nodes[14] = Point (0.,.5,1.);
528  nodes[15] = Point (.5,0.,0.);
529  nodes[16] = Point (.5,.5,0.);
530  nodes[17] = Point (0.,.5,0.);
531  return;
532  }
533  case PYRAMID5:
534  {
535  nodes.resize(5);
536  nodes[0] = Point (-1.,-1.,0.);
537  nodes[1] = Point (1.,-1.,0.);
538  nodes[2] = Point (1.,1.,0.);
539  nodes[3] = Point (-1.,1.,0.);
540  nodes[4] = Point (0.,0.,1.);
541  return;
542  }
543  case PYRAMID13:
544  {
545  nodes.resize(13);
546 
547  // base corners
548  nodes[0] = Point (-1.,-1.,0.);
549  nodes[1] = Point (1.,-1.,0.);
550  nodes[2] = Point (1.,1.,0.);
551  nodes[3] = Point (-1.,1.,0.);
552 
553  // apex
554  nodes[4] = Point (0.,0.,1.);
555 
556  // base midedge
557  nodes[5] = Point (0.,-1.,0.);
558  nodes[6] = Point (1.,0.,0.);
559  nodes[7] = Point (0.,1.,0.);
560  nodes[8] = Point (-1,0.,0.);
561 
562  // lateral midedge
563  nodes[9] = Point (-.5,-.5,.5);
564  nodes[10] = Point (.5,-.5,.5);
565  nodes[11] = Point (.5,.5,.5);
566  nodes[12] = Point (-.5,.5,.5);
567 
568  return;
569  }
570  case PYRAMID14:
571  {
572  nodes.resize(14);
573 
574  // base corners
575  nodes[0] = Point (-1.,-1.,0.);
576  nodes[1] = Point (1.,-1.,0.);
577  nodes[2] = Point (1.,1.,0.);
578  nodes[3] = Point (-1.,1.,0.);
579 
580  // apex
581  nodes[4] = Point (0.,0.,1.);
582 
583  // base midedge
584  nodes[5] = Point (0.,-1.,0.);
585  nodes[6] = Point (1.,0.,0.);
586  nodes[7] = Point (0.,1.,0.);
587  nodes[8] = Point (-1,0.,0.);
588 
589  // lateral midedge
590  nodes[9] = Point (-.5,-.5,.5);
591  nodes[10] = Point (.5,-.5,.5);
592  nodes[11] = Point (.5,.5,.5);
593  nodes[12] = Point (-.5,.5,.5);
594 
595  // base center
596  nodes[13] = Point (0.,0.,0.);
597 
598  return;
599  }
600 
601  default:
602  libmesh_error_msg("ERROR: Unknown element type " << itemType);
603  }
604 }

References libMesh::EDGE2, libMesh::EDGE3, libMesh::HEX20, libMesh::HEX27, libMesh::HEX8, libMesh::PRISM15, libMesh::PRISM18, libMesh::PRISM6, libMesh::PYRAMID13, libMesh::PYRAMID14, libMesh::PYRAMID5, libMesh::QUAD4, libMesh::QUAD8, libMesh::QUAD9, libMesh::QUADSHELL4, libMesh::QUADSHELL8, libMesh::TET10, libMesh::TET4, libMesh::TRI3, libMesh::TRI6, and libMesh::TRISHELL3.

◆ get_Sobolev_dweight()

const std::vector<RealGradient>& libMesh::FEGenericBase< FEOutputType< T >::type >::get_Sobolev_dweight ( ) const
inlineinherited
Returns
The first global derivative of the multiplicative weight at each quadrature point. See get_Sobolev_weight() for details. In case of FE initialized to all zero.

Definition at line 426 of file fe_base.h.

427  { return dweight; }

◆ get_Sobolev_weight()

const std::vector<Real>& libMesh::FEGenericBase< FEOutputType< T >::type >::get_Sobolev_weight ( ) const
inlineinherited
Returns
The multiplicative weight at each quadrature point. This weight is used for certain infinite element weak formulations, so that weighted Sobolev spaces are used for the trial function space. This renders the variational form easily computable.

In case of the general finite element class FE this field is initialized to all ones, so that the variational formulation for an infinite element produces correct element matrices for a mesh using both finite and infinite elements.

Definition at line 418 of file fe_base.h.

419  { return weight; }

◆ get_tangents()

const std::vector<std::vector<Point> >& libMesh::FEAbstract::get_tangents ( ) const
inlineinherited
Returns
The tangent vectors for face integration.

Definition at line 374 of file fe_abstract.h.

375  { calculate_map = true; return this->_fe_map->get_tangents(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

◆ get_type()

ElemType libMesh::FEAbstract::get_type ( ) const
inlineinherited
Returns
The element type that the current shape functions have been calculated for. Useful in determining when shape functions must be recomputed.

Definition at line 416 of file fe_abstract.h.

416 { return elem_type; }

References libMesh::FEAbstract::elem_type.

◆ get_xyz()

const std::vector<Point>& libMesh::FEAbstract::get_xyz ( ) const
inlineinherited
Returns
The xyz spatial locations of the quadrature points on the element.

Definition at line 237 of file fe_abstract.h.

238  { calculate_map = true; return this->_fe_map->get_xyz(); }

References libMesh::FEAbstract::_fe_map, and libMesh::FEAbstract::calculate_map.

Referenced by libMesh::ExactSolution::_compute_error(), assemble_SchroedingerEquation(), libMesh::DiscontinuityMeasure::boundary_side_integration(), libMesh::KellyErrorEstimator::boundary_side_integration(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubProjector::construct_projection(), PoissonSystem::element_postprocess(), LaplaceSystem::element_postprocess(), LaplaceQoI::element_qoi(), LaplaceQoI::element_qoi_derivative(), LaplaceSystem::element_qoi_derivative(), NavierSystem::element_time_derivative(), PoissonSystem::element_time_derivative(), CurlCurlSystem::element_time_derivative(), libMesh::RBEIMConstruction::enrich_RB_space(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::ParsedFEMFunction< T >::eval_args(), libMesh::ExactErrorEstimator::find_squared_element_error(), LaplaceQoI::init_context(), NavierSystem::init_context(), SolidSystem::init_context(), LaplaceSystem::init_context(), PoissonSystem::init_context(), CurlCurlSystem::init_context(), CoupledSystem::init_context(), libMesh::ParsedFEMFunction< T >::init_context(), libMesh::RBEIMConstruction::init_context_with_sys(), libMesh::DGFEMContext::neighbor_side_fe_reinit(), RationalMapTest< elem_type >::setUp(), LaplaceSystem::side_constraint(), LaplaceSystem::side_postprocess(), CoupledSystemQoI::side_qoi(), CoupledSystemQoI::side_qoi_derivative(), LaplaceSystem::side_qoi_derivative(), SolidSystem::side_time_derivative(), CurlCurlSystem::side_time_derivative(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::SubFunctor(), SlitMeshRefinedSystemTest::testRestart(), SlitMeshRefinedSystemTest::testSystem(), and libMesh::RBEIMConstruction::truth_solve().

◆ increment_constructor_count()

void libMesh::ReferenceCounter::increment_constructor_count ( const std::string &  name)
inlineprotectedinherited

Increments the construction counter.

Should be called in the constructor of any derived class that will be reference counted.

Definition at line 181 of file reference_counter.h.

182 {
183  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
184  std::pair<unsigned int, unsigned int> & p = _counts[name];
185 
186  p.first++;
187 }

References libMesh::ReferenceCounter::_counts, libMesh::Quality::name(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< RBParametrized >::ReferenceCountedObject().

◆ increment_destructor_count()

void libMesh::ReferenceCounter::increment_destructor_count ( const std::string &  name)
inlineprotectedinherited

Increments the destruction counter.

Should be called in the destructor of any derived class that will be reference counted.

Definition at line 194 of file reference_counter.h.

195 {
196  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
197  std::pair<unsigned int, unsigned int> & p = _counts[name];
198 
199  p.second++;
200 }

References libMesh::ReferenceCounter::_counts, libMesh::Quality::name(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< RBParametrized >::~ReferenceCountedObject().

◆ init_base_shape_functions()

void libMesh::FE< Dim, T >::init_base_shape_functions ( const std::vector< Point > &  qp,
const Elem e 
)
overrideprotectedvirtualinherited

Initialize the data fields for the base of an an infinite element.

Implements libMesh::FEGenericBase< FEOutputType< T >::type >.

Definition at line 548 of file fe.C.

550 {
551  this->elem_type = e->type();
552  this->_fe_map->template init_reference_to_physical_map<Dim>(qp, e);
553  init_shape_functions(qp, e);
554 }

◆ init_shape_functions()

void libMesh::FE< Dim, T >::init_shape_functions ( const std::vector< Point > &  qp,
const Elem e 
)
protectedvirtualinherited

Update the various member data fields phi, dphidxi, dphideta, dphidzeta, etc.

for the current element. These data will be computed at the points qp, which are generally (but need not be) the quadrature points.

Definition at line 292 of file fe.C.

294 {
295  // Start logging the shape function initialization
296  LOG_SCOPE("init_shape_functions()", "FE");
297 
298  // The number of quadrature points.
299  const unsigned int n_qp = cast_int<unsigned int>(qp.size());
300 
301  // Number of shape functions in the finite element approximation
302  // space.
303  const unsigned int n_approx_shape_functions =
304  this->n_shape_functions(this->get_type(),
305  this->get_order());
306 
307  // resize the vectors to hold current data
308  // Phi are the shape functions used for the FE approximation
309  // Phi_map are the shape functions used for the FE mapping
310  if (this->calculate_phi)
311  this->phi.resize (n_approx_shape_functions);
312 
313  if (this->calculate_dphi)
314  {
315  this->dphi.resize (n_approx_shape_functions);
316  this->dphidx.resize (n_approx_shape_functions);
317  this->dphidy.resize (n_approx_shape_functions);
318  this->dphidz.resize (n_approx_shape_functions);
319  }
320 
321  if (this->calculate_dphiref)
322  {
323  if (Dim > 0)
324  this->dphidxi.resize (n_approx_shape_functions);
325 
326  if (Dim > 1)
327  this->dphideta.resize (n_approx_shape_functions);
328 
329  if (Dim > 2)
330  this->dphidzeta.resize (n_approx_shape_functions);
331  }
332 
333  if (this->calculate_curl_phi && (FEInterface::field_type(T) == TYPE_VECTOR))
334  this->curl_phi.resize(n_approx_shape_functions);
335 
336  if (this->calculate_div_phi && (FEInterface::field_type(T) == TYPE_VECTOR))
337  this->div_phi.resize(n_approx_shape_functions);
338 
339 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
340  if (this->calculate_d2phi)
341  {
342  this->d2phi.resize (n_approx_shape_functions);
343  this->d2phidx2.resize (n_approx_shape_functions);
344  this->d2phidxdy.resize (n_approx_shape_functions);
345  this->d2phidxdz.resize (n_approx_shape_functions);
346  this->d2phidy2.resize (n_approx_shape_functions);
347  this->d2phidydz.resize (n_approx_shape_functions);
348  this->d2phidz2.resize (n_approx_shape_functions);
349 
350  if (Dim > 0)
351  this->d2phidxi2.resize (n_approx_shape_functions);
352 
353  if (Dim > 1)
354  {
355  this->d2phidxideta.resize (n_approx_shape_functions);
356  this->d2phideta2.resize (n_approx_shape_functions);
357  }
358  if (Dim > 2)
359  {
360  this->d2phidxidzeta.resize (n_approx_shape_functions);
361  this->d2phidetadzeta.resize (n_approx_shape_functions);
362  this->d2phidzeta2.resize (n_approx_shape_functions);
363  }
364  }
365 #endif // ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
366 
367  for (unsigned int i=0; i<n_approx_shape_functions; i++)
368  {
369  if (this->calculate_phi)
370  this->phi[i].resize (n_qp);
371  if (this->calculate_dphi)
372  {
373  this->dphi[i].resize (n_qp);
374  this->dphidx[i].resize (n_qp);
375  this->dphidy[i].resize (n_qp);
376  this->dphidz[i].resize (n_qp);
377  }
378 
379  if (this->calculate_dphiref)
380  {
381  if (Dim > 0)
382  this->dphidxi[i].resize(n_qp);
383 
384  if (Dim > 1)
385  this->dphideta[i].resize(n_qp);
386 
387  if (Dim > 2)
388  this->dphidzeta[i].resize(n_qp);
389  }
390 
391  if (this->calculate_curl_phi && (FEInterface::field_type(T) == TYPE_VECTOR))
392  this->curl_phi[i].resize(n_qp);
393 
394  if (this->calculate_div_phi && (FEInterface::field_type(T) == TYPE_VECTOR))
395  this->div_phi[i].resize(n_qp);
396 
397 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
398  if (this->calculate_d2phi)
399  {
400  this->d2phi[i].resize (n_qp);
401  this->d2phidx2[i].resize (n_qp);
402  this->d2phidxdy[i].resize (n_qp);
403  this->d2phidxdz[i].resize (n_qp);
404  this->d2phidy2[i].resize (n_qp);
405  this->d2phidydz[i].resize (n_qp);
406  this->d2phidz2[i].resize (n_qp);
407  if (Dim > 0)
408  this->d2phidxi2[i].resize (n_qp);
409  if (Dim > 1)
410  {
411  this->d2phidxideta[i].resize (n_qp);
412  this->d2phideta2[i].resize (n_qp);
413  }
414  if (Dim > 2)
415  {
416  this->d2phidxidzeta[i].resize (n_qp);
417  this->d2phidetadzeta[i].resize (n_qp);
418  this->d2phidzeta2[i].resize (n_qp);
419  }
420  }
421 #endif // ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
422  }
423 
424 
425 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
426  //------------------------------------------------------------
427  // Initialize the data fields, which should only be used for infinite
428  // elements, to some sensible values, so that using a FE with the
429  // variational formulation of an InfFE, correct element matrices are
430  // returned
431 
432  {
433  this->weight.resize (n_qp);
434  this->dweight.resize (n_qp);
435  this->dphase.resize (n_qp);
436 
437  for (unsigned int p=0; p<n_qp; p++)
438  {
439  this->weight[p] = 1.;
440  this->dweight[p].zero();
441  this->dphase[p].zero();
442  }
443 
444  }
445 #endif // ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
446 
447  switch (Dim)
448  {
449 
450  //------------------------------------------------------------
451  // 0D
452  case 0:
453  {
454  break;
455  }
456 
457  //------------------------------------------------------------
458  // 1D
459  case 1:
460  {
461  // Compute the value of the approximation shape function i at quadrature point p
462  if (this->calculate_dphiref)
463  for (unsigned int i=0; i<n_approx_shape_functions; i++)
464  for (unsigned int p=0; p<n_qp; p++)
465  this->dphidxi[i][p] = FE<Dim,T>::shape_deriv (elem, this->fe_type.order, i, 0, qp[p]);
466 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
467  if (this->calculate_d2phi)
468  for (unsigned int i=0; i<n_approx_shape_functions; i++)
469  for (unsigned int p=0; p<n_qp; p++)
470  this->d2phidxi2[i][p] = FE<Dim,T>::shape_second_deriv (elem, this->fe_type.order, i, 0, qp[p]);
471 #endif // ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
472 
473  break;
474  }
475 
476 
477 
478  //------------------------------------------------------------
479  // 2D
480  case 2:
481  {
482  // Compute the value of the approximation shape function i at quadrature point p
483  if (this->calculate_dphiref)
484  for (unsigned int i=0; i<n_approx_shape_functions; i++)
485  for (unsigned int p=0; p<n_qp; p++)
486  {
487  this->dphidxi[i][p] = FE<Dim,T>::shape_deriv (elem, this->fe_type.order, i, 0, qp[p]);
488  this->dphideta[i][p] = FE<Dim,T>::shape_deriv (elem, this->fe_type.order, i, 1, qp[p]);
489  }
490 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
491  if (this->calculate_d2phi)
492  for (unsigned int i=0; i<n_approx_shape_functions; i++)
493  for (unsigned int p=0; p<n_qp; p++)
494  {
495  this->d2phidxi2[i][p] = FE<Dim,T>::shape_second_deriv (elem, this->fe_type.order, i, 0, qp[p]);
496  this->d2phidxideta[i][p] = FE<Dim,T>::shape_second_deriv (elem, this->fe_type.order, i, 1, qp[p]);
497  this->d2phideta2[i][p] = FE<Dim,T>::shape_second_deriv (elem, this->fe_type.order, i, 2, qp[p]);
498  }
499 #endif // ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
500 
501 
502  break;
503  }
504 
505 
506 
507  //------------------------------------------------------------
508  // 3D
509  case 3:
510  {
511  // Compute the value of the approximation shape function i at quadrature point p
512  if (this->calculate_dphiref)
513  for (unsigned int i=0; i<n_approx_shape_functions; i++)
514  for (unsigned int p=0; p<n_qp; p++)
515  {
516  this->dphidxi[i][p] = FE<Dim,T>::shape_deriv (elem, this->fe_type.order, i, 0, qp[p]);
517  this->dphideta[i][p] = FE<Dim,T>::shape_deriv (elem, this->fe_type.order, i, 1, qp[p]);
518  this->dphidzeta[i][p] = FE<Dim,T>::shape_deriv (elem, this->fe_type.order, i, 2, qp[p]);
519  }
520 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
521  if (this->calculate_d2phi)
522  for (unsigned int i=0; i<n_approx_shape_functions; i++)
523  for (unsigned int p=0; p<n_qp; p++)
524  {
525  this->d2phidxi2[i][p] = FE<Dim,T>::shape_second_deriv (elem, this->fe_type.order, i, 0, qp[p]);
526  this->d2phidxideta[i][p] = FE<Dim,T>::shape_second_deriv (elem, this->fe_type.order, i, 1, qp[p]);
527  this->d2phideta2[i][p] = FE<Dim,T>::shape_second_deriv (elem, this->fe_type.order, i, 2, qp[p]);
528  this->d2phidxidzeta[i][p] = FE<Dim,T>::shape_second_deriv (elem, this->fe_type.order, i, 3, qp[p]);
529  this->d2phidetadzeta[i][p] = FE<Dim,T>::shape_second_deriv (elem, this->fe_type.order, i, 4, qp[p]);
530  this->d2phidzeta2[i][p] = FE<Dim,T>::shape_second_deriv (elem, this->fe_type.order, i, 5, qp[p]);
531  }
532 #endif // ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
533 
534  break;
535  }
536 
537 
538  default:
539  libmesh_error_msg("Invalid dimension Dim = " << Dim);
540  }
541 }

◆ inverse_map() [1/4]

Point libMesh::FE< 2, SUBDIVISION >::inverse_map ( const Elem ,
const Point ,
const  Real,
const bool   
)
inherited

Definition at line 888 of file fe_subdivision_2D.C.

892 {
893  libmesh_not_implemented();
894 }

◆ inverse_map() [2/4]

void libMesh::FE< 2, SUBDIVISION >::inverse_map ( const Elem ,
const std::vector< Point > &  ,
std::vector< Point > &  ,
Real  ,
bool   
)
inherited

Definition at line 897 of file fe_subdivision_2D.C.

902 {
903  libmesh_not_implemented();
904 }

◆ inverse_map() [3/4]

static Point libMesh::FE< Dim, T >::inverse_map ( const Elem elem,
const Point p,
const Real  tolerance = TOLERANCE,
const bool  secure = true 
)
inlinestaticinherited

Definition at line 309 of file fe.h.

312  {
313  // libmesh_deprecated(); // soon
314  return FEMap::inverse_map(Dim, elem, p, tolerance, secure);
315  }

◆ inverse_map() [4/4]

static void libMesh::FE< Dim, T >::inverse_map ( const Elem elem,
const std::vector< Point > &  physical_points,
std::vector< Point > &  reference_points,
const Real  tolerance = TOLERANCE,
const bool  secure = true 
)
inlinestaticinherited

Definition at line 317 of file fe.h.

321  {
322  // libmesh_deprecated(); // soon
323  FEMap::inverse_map(Dim, elem, physical_points, reference_points,
324  tolerance, secure);
325  }

◆ is_hierarchic() [1/62]

bool libMesh::FE< 0, SCALAR >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 113 of file fe_scalar.C.

113 { return false; }

◆ is_hierarchic() [2/62]

bool libMesh::FE< 1, SCALAR >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 114 of file fe_scalar.C.

114 { return false; }

◆ is_hierarchic() [3/62]

bool libMesh::FE< 2, SCALAR >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 115 of file fe_scalar.C.

115 { return false; }

◆ is_hierarchic() [4/62]

bool libMesh::FE< 3, SCALAR >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 116 of file fe_scalar.C.

116 { return false; }

◆ is_hierarchic() [5/62]

bool libMesh::FE< 0, RATIONAL_BERNSTEIN >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 172 of file fe_rational.C.

172 { return false; }

◆ is_hierarchic() [6/62]

bool libMesh::FE< 1, RATIONAL_BERNSTEIN >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 173 of file fe_rational.C.

173 { return false; }

◆ is_hierarchic() [7/62]

bool libMesh::FE< 2, RATIONAL_BERNSTEIN >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 174 of file fe_rational.C.

174 { return false; }

◆ is_hierarchic() [8/62]

bool libMesh::FE< 3, RATIONAL_BERNSTEIN >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 175 of file fe_rational.C.

175 { return false; }

◆ is_hierarchic() [9/62]

bool libMesh::FE< 0, L2_HIERARCHIC >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 199 of file fe_l2_hierarchic.C.

199 { return true; }

◆ is_hierarchic() [10/62]

bool libMesh::FE< 1, L2_HIERARCHIC >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 200 of file fe_l2_hierarchic.C.

200 { return true; }

◆ is_hierarchic() [11/62]

bool libMesh::FE< 2, L2_HIERARCHIC >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 201 of file fe_l2_hierarchic.C.

201 { return true; }

◆ is_hierarchic() [12/62]

bool libMesh::FE< 3, L2_HIERARCHIC >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 202 of file fe_l2_hierarchic.C.

202 { return true; }

◆ is_hierarchic() [13/62]

bool libMesh::FE< 0, CLOUGH >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 295 of file fe_clough.C.

295 { return false; } // FIXME - this will be changed

◆ is_hierarchic() [14/62]

bool libMesh::FE< 1, CLOUGH >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 296 of file fe_clough.C.

296 { return false; } // FIXME - this will be changed

◆ is_hierarchic() [15/62]

bool libMesh::FE< 2, CLOUGH >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 297 of file fe_clough.C.

297 { return false; } // FIXME - this will be changed

◆ is_hierarchic() [16/62]

bool libMesh::FE< 3, CLOUGH >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 298 of file fe_clough.C.

298 { return false; } // FIXME - this will be changed

◆ is_hierarchic() [17/62]

bool libMesh::FE< 0, HERMITE >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 346 of file fe_hermite.C.

346 { return true; }

◆ is_hierarchic() [18/62]

bool libMesh::FE< 1, HERMITE >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 347 of file fe_hermite.C.

347 { return true; }

◆ is_hierarchic() [19/62]

bool libMesh::FE< 2, HERMITE >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 348 of file fe_hermite.C.

348 { return true; }

◆ is_hierarchic() [20/62]

bool libMesh::FE< 3, HERMITE >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 349 of file fe_hermite.C.

349 { return true; }

◆ is_hierarchic() [21/62]

bool libMesh::FE< 0, HIERARCHIC >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 376 of file fe_hierarchic.C.

376 { return true; }

◆ is_hierarchic() [22/62]

bool libMesh::FE< 1, HIERARCHIC >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 377 of file fe_hierarchic.C.

377 { return true; }

◆ is_hierarchic() [23/62]

bool libMesh::FE< 2, HIERARCHIC >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 378 of file fe_hierarchic.C.

378 { return true; }

◆ is_hierarchic() [24/62]

bool libMesh::FE< 3, HIERARCHIC >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 379 of file fe_hierarchic.C.

379 { return true; }

◆ is_hierarchic() [25/62]

bool libMesh::FE< 0, MONOMIAL >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 405 of file fe_monomial.C.

405 { return true; }

◆ is_hierarchic() [26/62]

bool libMesh::FE< 1, MONOMIAL >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 406 of file fe_monomial.C.

406 { return true; }

◆ is_hierarchic() [27/62]

bool libMesh::FE< 2, MONOMIAL >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 407 of file fe_monomial.C.

407 { return true; }

◆ is_hierarchic() [28/62]

bool libMesh::FE< 3, MONOMIAL >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 408 of file fe_monomial.C.

408 { return true; }

◆ is_hierarchic() [29/62]

bool libMesh::FE< 0, BERNSTEIN >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 443 of file fe_bernstein.C.

443 { return false; }

◆ is_hierarchic() [30/62]

bool libMesh::FE< 1, BERNSTEIN >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 444 of file fe_bernstein.C.

444 { return false; }

◆ is_hierarchic() [31/62]

bool libMesh::FE< 2, BERNSTEIN >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 445 of file fe_bernstein.C.

445 { return false; }

◆ is_hierarchic() [32/62]

bool libMesh::FE< 3, BERNSTEIN >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 446 of file fe_bernstein.C.

446 { return false; }

◆ is_hierarchic() [33/62]

bool libMesh::FE< 0, L2_LAGRANGE >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 485 of file fe_l2_lagrange.C.

485 { return false; }

◆ is_hierarchic() [34/62]

bool libMesh::FE< 1, L2_LAGRANGE >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 486 of file fe_l2_lagrange.C.

486 { return false; }

◆ is_hierarchic() [35/62]

bool libMesh::FE< 2, L2_LAGRANGE >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 487 of file fe_l2_lagrange.C.

487 { return false; }

◆ is_hierarchic() [36/62]

bool libMesh::FE< 3, L2_LAGRANGE >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 488 of file fe_l2_lagrange.C.

488 { return false; }

◆ is_hierarchic() [37/62]

bool libMesh::FE< 0, NEDELEC_ONE >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 545 of file fe_nedelec_one.C.

545 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ is_hierarchic() [38/62]

bool libMesh::FE< 1, NEDELEC_ONE >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 546 of file fe_nedelec_one.C.

546 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ is_hierarchic() [39/62]

bool libMesh::FE< 2, NEDELEC_ONE >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 547 of file fe_nedelec_one.C.

547 { return false; }

◆ is_hierarchic() [40/62]

bool libMesh::FE< 3, NEDELEC_ONE >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 548 of file fe_nedelec_one.C.

548 { return false; }

◆ is_hierarchic() [41/62]

bool libMesh::FE< 0, MONOMIAL_VEC >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 784 of file fe_monomial_vec.C.

785 {
786  return true;
787 }

◆ is_hierarchic() [42/62]

bool libMesh::FE< 1, MONOMIAL_VEC >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 790 of file fe_monomial_vec.C.

791 {
792  return true;
793 }

◆ is_hierarchic() [43/62]

bool libMesh::FE< 2, MONOMIAL_VEC >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 796 of file fe_monomial_vec.C.

797 {
798  return true;
799 }

◆ is_hierarchic() [44/62]

bool libMesh::FE< 3, MONOMIAL_VEC >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 802 of file fe_monomial_vec.C.

803 {
804  return true;
805 }

◆ is_hierarchic() [45/62]

bool libMesh::FE< 0, LAGRANGE >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 879 of file fe_lagrange.C.

879 { return false; }

◆ is_hierarchic() [46/62]

bool libMesh::FE< 1, LAGRANGE >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 880 of file fe_lagrange.C.

880 { return false; }

◆ is_hierarchic() [47/62]

bool libMesh::FE< 2, LAGRANGE >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 881 of file fe_lagrange.C.

881 { return false; }

◆ is_hierarchic() [48/62]

bool libMesh::FE< 3, LAGRANGE >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 882 of file fe_lagrange.C.

882 { return false; }

◆ is_hierarchic() [49/62]

bool libMesh::FE< 2, SUBDIVISION >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 925 of file fe_subdivision_2D.C.

925 { return false; }

◆ is_hierarchic() [50/62]

bool libMesh::FE< 0, XYZ >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 932 of file fe_xyz.C.

932 { return true; }

◆ is_hierarchic() [51/62]

bool libMesh::FE< 1, XYZ >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 933 of file fe_xyz.C.

933 { return true; }

◆ is_hierarchic() [52/62]

bool libMesh::FE< 2, XYZ >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 934 of file fe_xyz.C.

934 { return true; }

◆ is_hierarchic() [53/62]

bool libMesh::FE< 3, XYZ >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 935 of file fe_xyz.C.

935 { return true; }

◆ is_hierarchic() [54/62]

bool libMesh::FE< 0, LAGRANGE_VEC >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 977 of file fe_lagrange_vec.C.

977 { return false; }

◆ is_hierarchic() [55/62]

bool libMesh::FE< 1, LAGRANGE_VEC >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 978 of file fe_lagrange_vec.C.

978 { return false; }

◆ is_hierarchic() [56/62]

bool libMesh::FE< 2, LAGRANGE_VEC >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 979 of file fe_lagrange_vec.C.

979 { return false; }

◆ is_hierarchic() [57/62]

bool libMesh::FE< 3, LAGRANGE_VEC >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 980 of file fe_lagrange_vec.C.

980 { return false; }

◆ is_hierarchic() [58/62]

bool libMesh::FE< 0, SZABAB >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 1279 of file fe_szabab.C.

1279 { return true; }

◆ is_hierarchic() [59/62]

bool libMesh::FE< 1, SZABAB >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 1280 of file fe_szabab.C.

1280 { return true; }

◆ is_hierarchic() [60/62]

bool libMesh::FE< 2, SZABAB >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 1281 of file fe_szabab.C.

1281 { return true; }

◆ is_hierarchic() [61/62]

bool libMesh::FE< 3, SZABAB >::is_hierarchic ( ) const
virtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

Definition at line 1282 of file fe_szabab.C.

1282 { return true; }

◆ is_hierarchic() [62/62]

virtual bool libMesh::FE< Dim, T >::is_hierarchic ( ) const
overridevirtualinherited
Returns
true if the finite element's higher order shape functions are hierarchic

Implements libMesh::FEAbstract.

◆ map()

static Point libMesh::FE< Dim, T >::map ( const Elem elem,
const Point reference_point 
)
inlinestaticinherited

Definition at line 416 of file fe.h.

417  {
418  // libmesh_deprecated(); // soon
419  return FEMap::map(Dim, elem, reference_point);
420  }

◆ map_eta()

static Point libMesh::FE< Dim, T >::map_eta ( const Elem elem,
const Point reference_point 
)
inlinestaticinherited

Definition at line 428 of file fe.h.

429  {
430  // libmesh_deprecated(); // soon
431  return FEMap::map_deriv(Dim, elem, 1, reference_point);
432  }

◆ map_xi()

static Point libMesh::FE< Dim, T >::map_xi ( const Elem elem,
const Point reference_point 
)
inlinestaticinherited

Definition at line 422 of file fe.h.

423  {
424  // libmesh_deprecated(); // soon
425  return FEMap::map_deriv(Dim, elem, 0, reference_point);
426  }

◆ map_zeta()

static Point libMesh::FE< Dim, T >::map_zeta ( const Elem elem,
const Point reference_point 
)
inlinestaticinherited

Definition at line 434 of file fe.h.

435  {
436  // libmesh_deprecated(); // soon
437  return FEMap::map_deriv(Dim, elem, 2, reference_point);
438  }

◆ n_dofs() [1/62]

unsigned int libMesh::FE< 0, RATIONAL_BERNSTEIN >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 148 of file fe_rational.C.

148 { return FE<0,_underlying_fe_family>::n_dofs(t, o); }

◆ n_dofs() [2/62]

unsigned int libMesh::FE< 1, RATIONAL_BERNSTEIN >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 149 of file fe_rational.C.

149 { return FE<1,_underlying_fe_family>::n_dofs(t, o); }

◆ n_dofs() [3/62]

unsigned int libMesh::FE< 2, RATIONAL_BERNSTEIN >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 150 of file fe_rational.C.

150 { return FE<2,_underlying_fe_family>::n_dofs(t, o); }

◆ n_dofs() [4/62]

unsigned int libMesh::FE< 3, RATIONAL_BERNSTEIN >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 151 of file fe_rational.C.

151 { return FE<3,_underlying_fe_family>::n_dofs(t, o); }

◆ n_dofs() [5/62]

unsigned int libMesh::FE< 0, L2_HIERARCHIC >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 174 of file fe_l2_hierarchic.C.

174 { return l2_hierarchic_n_dofs(t, o); }

◆ n_dofs() [6/62]

unsigned int libMesh::FE< 1, L2_HIERARCHIC >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 175 of file fe_l2_hierarchic.C.

175 { return l2_hierarchic_n_dofs(t, o); }

◆ n_dofs() [7/62]

unsigned int libMesh::FE< 2, L2_HIERARCHIC >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 176 of file fe_l2_hierarchic.C.

176 { return l2_hierarchic_n_dofs(t, o); }

◆ n_dofs() [8/62]

unsigned int libMesh::FE< 3, L2_HIERARCHIC >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 177 of file fe_l2_hierarchic.C.

177 { return l2_hierarchic_n_dofs(t, o); }

◆ n_dofs() [9/62]

static unsigned int libMesh::FE< Dim, T >::n_dofs ( const ElemType  t,
const Order  o 
)
staticinherited
Returns
The number of shape functions associated with this finite element.

On a p-refined element, o should be the total order of the element.

◆ n_dofs() [10/62]

unsigned int libMesh::FE< 0, CLOUGH >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 270 of file fe_clough.C.

270 { return clough_n_dofs(t, o); }

◆ n_dofs() [11/62]

unsigned int libMesh::FE< 1, CLOUGH >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 271 of file fe_clough.C.

271 { return clough_n_dofs(t, o); }

◆ n_dofs() [12/62]

unsigned int libMesh::FE< 2, CLOUGH >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 272 of file fe_clough.C.

272 { return clough_n_dofs(t, o); }

◆ n_dofs() [13/62]

unsigned int libMesh::FE< 3, CLOUGH >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 273 of file fe_clough.C.

273 { return clough_n_dofs(t, o); }

◆ n_dofs() [14/62]

unsigned int libMesh::FE< 0, HERMITE >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 321 of file fe_hermite.C.

321 { return hermite_n_dofs(t, o); }

◆ n_dofs() [15/62]

unsigned int libMesh::FE< 1, HERMITE >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 322 of file fe_hermite.C.

322 { return hermite_n_dofs(t, o); }

◆ n_dofs() [16/62]

unsigned int libMesh::FE< 2, HERMITE >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 323 of file fe_hermite.C.

323 { return hermite_n_dofs(t, o); }

◆ n_dofs() [17/62]

unsigned int libMesh::FE< 3, HERMITE >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 324 of file fe_hermite.C.

324 { return hermite_n_dofs(t, o); }

◆ n_dofs() [18/62]

unsigned int libMesh::FE< 0, HIERARCHIC >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 352 of file fe_hierarchic.C.

352 { return hierarchic_n_dofs(t, o); }

◆ n_dofs() [19/62]

unsigned int libMesh::FE< 1, HIERARCHIC >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 353 of file fe_hierarchic.C.

353 { return hierarchic_n_dofs(t, o); }

◆ n_dofs() [20/62]

unsigned int libMesh::FE< 2, HIERARCHIC >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 354 of file fe_hierarchic.C.

354 { return hierarchic_n_dofs(t, o); }

◆ n_dofs() [21/62]

unsigned int libMesh::FE< 3, HIERARCHIC >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 355 of file fe_hierarchic.C.

355 { return hierarchic_n_dofs(t, o); }

◆ n_dofs() [22/62]

unsigned int libMesh::FE< 0, MONOMIAL >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 378 of file fe_monomial.C.

378 { return monomial_n_dofs(t, o); }

◆ n_dofs() [23/62]

unsigned int libMesh::FE< 1, MONOMIAL >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 379 of file fe_monomial.C.

379 { return monomial_n_dofs(t, o); }

◆ n_dofs() [24/62]

unsigned int libMesh::FE< 2, MONOMIAL >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 380 of file fe_monomial.C.

380 { return monomial_n_dofs(t, o); }

◆ n_dofs() [25/62]

unsigned int libMesh::FE< 3, MONOMIAL >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 381 of file fe_monomial.C.

381 { return monomial_n_dofs(t, o); }

◆ n_dofs() [26/62]

unsigned int libMesh::FE< 0, BERNSTEIN >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 419 of file fe_bernstein.C.

419 { return bernstein_n_dofs(t, o); }

◆ n_dofs() [27/62]

unsigned int libMesh::FE< 1, BERNSTEIN >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 420 of file fe_bernstein.C.

420 { return bernstein_n_dofs(t, o); }

◆ n_dofs() [28/62]

unsigned int libMesh::FE< 2, BERNSTEIN >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 421 of file fe_bernstein.C.

421 { return bernstein_n_dofs(t, o); }

◆ n_dofs() [29/62]

unsigned int libMesh::FE< 3, BERNSTEIN >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 422 of file fe_bernstein.C.

422 { return bernstein_n_dofs(t, o); }

◆ n_dofs() [30/62]

unsigned int libMesh::FE< 0, L2_LAGRANGE >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 459 of file fe_l2_lagrange.C.

459 { return l2_lagrange_n_dofs(t, o); }

◆ n_dofs() [31/62]

unsigned int libMesh::FE< 1, L2_LAGRANGE >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 460 of file fe_l2_lagrange.C.

460 { return l2_lagrange_n_dofs(t, o); }

◆ n_dofs() [32/62]

unsigned int libMesh::FE< 2, L2_LAGRANGE >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 461 of file fe_l2_lagrange.C.

461 { return l2_lagrange_n_dofs(t, o); }

◆ n_dofs() [33/62]

unsigned int libMesh::FE< 3, L2_LAGRANGE >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 462 of file fe_l2_lagrange.C.

462 { return l2_lagrange_n_dofs(t, o); }

◆ n_dofs() [34/62]

unsigned int libMesh::FE< 2, NEDELEC_ONE >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 519 of file fe_nedelec_one.C.

519 { return nedelec_one_n_dofs(t, o); }

◆ n_dofs() [35/62]

unsigned int libMesh::FE< 3, NEDELEC_ONE >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 520 of file fe_nedelec_one.C.

520 { return nedelec_one_n_dofs(t, o); }

◆ n_dofs() [36/62]

unsigned int libMesh::FE< 0, MONOMIAL_VEC >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 682 of file fe_monomial_vec.C.

683 {
684  return FE<0, MONOMIAL>::n_dofs(t, o);
685 }

◆ n_dofs() [37/62]

unsigned int libMesh::FE< 1, MONOMIAL_VEC >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 688 of file fe_monomial_vec.C.

689 {
690  return FE<1, MONOMIAL>::n_dofs(t, o);
691 }

◆ n_dofs() [38/62]

unsigned int libMesh::FE< 2, MONOMIAL_VEC >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 694 of file fe_monomial_vec.C.

695 {
696  return 2 * FE<2, MONOMIAL>::n_dofs(t, o);
697 }

◆ n_dofs() [39/62]

unsigned int libMesh::FE< 3, MONOMIAL_VEC >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 700 of file fe_monomial_vec.C.

701 {
702  return 3 * FE<3, MONOMIAL>::n_dofs(t, o);
703 }

◆ n_dofs() [40/62]

unsigned int libMesh::FE< 0, LAGRANGE >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 851 of file fe_lagrange.C.

851 { return lagrange_n_dofs(t, o); }

◆ n_dofs() [41/62]

unsigned int libMesh::FE< 1, LAGRANGE >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 852 of file fe_lagrange.C.

852 { return lagrange_n_dofs(t, o); }

◆ n_dofs() [42/62]

unsigned int libMesh::FE< 2, LAGRANGE >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 853 of file fe_lagrange.C.

853 { return lagrange_n_dofs(t, o); }

◆ n_dofs() [43/62]

unsigned int libMesh::FE< 3, LAGRANGE >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 854 of file fe_lagrange.C.

854 { return lagrange_n_dofs(t, o); }

◆ n_dofs() [44/62]

unsigned int libMesh::FE< 0, XYZ >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 906 of file fe_xyz.C.

906 { return xyz_n_dofs(t, o); }

◆ n_dofs() [45/62]

unsigned int libMesh::FE< 1, XYZ >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 907 of file fe_xyz.C.

907 { return xyz_n_dofs(t, o); }

◆ n_dofs() [46/62]

unsigned int libMesh::FE< 2, XYZ >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 908 of file fe_xyz.C.

908 { return xyz_n_dofs(t, o); }

◆ n_dofs() [47/62]

unsigned int libMesh::FE< 3, XYZ >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 909 of file fe_xyz.C.

909 { return xyz_n_dofs(t, o); }

◆ n_dofs() [48/62]

unsigned int libMesh::FE< 0, LAGRANGE_VEC >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 949 of file fe_lagrange_vec.C.

949 { return FE<0,LAGRANGE>::n_dofs(t,o); }

◆ n_dofs() [49/62]

unsigned int libMesh::FE< 1, LAGRANGE_VEC >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 950 of file fe_lagrange_vec.C.

950 { return FE<1,LAGRANGE>::n_dofs(t,o); }

◆ n_dofs() [50/62]

unsigned int libMesh::FE< 2, LAGRANGE_VEC >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 951 of file fe_lagrange_vec.C.

951 { return 2*FE<2,LAGRANGE>::n_dofs(t,o); }

◆ n_dofs() [51/62]

unsigned int libMesh::FE< 3, LAGRANGE_VEC >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 952 of file fe_lagrange_vec.C.

952 { return 3*FE<3,LAGRANGE>::n_dofs(t,o); }

◆ n_dofs() [52/62]

unsigned int libMesh::FE< 0, SZABAB >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 1255 of file fe_szabab.C.

1255 { return szabab_n_dofs(t, o); }

◆ n_dofs() [53/62]

unsigned int libMesh::FE< 1, SZABAB >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 1256 of file fe_szabab.C.

1256 { return szabab_n_dofs(t, o); }

◆ n_dofs() [54/62]

unsigned int libMesh::FE< 2, SZABAB >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 1257 of file fe_szabab.C.

1257 { return szabab_n_dofs(t, o); }

◆ n_dofs() [55/62]

unsigned int libMesh::FE< 3, SZABAB >::n_dofs ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 1258 of file fe_szabab.C.

1258 { return szabab_n_dofs(t, o); }

◆ n_dofs() [56/62]

unsigned int libMesh::FE< 0, SCALAR >::n_dofs ( const  ElemType,
const Order  o 
)
inherited

Definition at line 87 of file fe_scalar.C.

87 { return o; }

◆ n_dofs() [57/62]

unsigned int libMesh::FE< 1, SCALAR >::n_dofs ( const  ElemType,
const Order  o 
)
inherited

Definition at line 88 of file fe_scalar.C.

88 { return o; }

◆ n_dofs() [58/62]

unsigned int libMesh::FE< 2, SCALAR >::n_dofs ( const  ElemType,
const Order  o 
)
inherited

Definition at line 89 of file fe_scalar.C.

89 { return o; }

◆ n_dofs() [59/62]

unsigned int libMesh::FE< 3, SCALAR >::n_dofs ( const  ElemType,
const Order  o 
)
inherited

Definition at line 90 of file fe_scalar.C.

90 { return o; }

◆ n_dofs() [60/62]

unsigned int libMesh::FE< 0, NEDELEC_ONE >::n_dofs ( const  ElemType,
const  Order 
)
inherited

Definition at line 517 of file fe_nedelec_one.C.

517 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ n_dofs() [61/62]

unsigned int libMesh::FE< 1, NEDELEC_ONE >::n_dofs ( const  ElemType,
const  Order 
)
inherited

Definition at line 518 of file fe_nedelec_one.C.

518 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ n_dofs() [62/62]

unsigned int libMesh::FE< 2, SUBDIVISION >::n_dofs ( const  ElemType,
const  Order 
)
inherited

Definition at line 909 of file fe_subdivision_2D.C.

909 { libmesh_not_implemented(); return 0; }

◆ n_dofs_at_node() [1/62]

unsigned int libMesh::FE< 0, RATIONAL_BERNSTEIN >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 154 of file fe_rational.C.

◆ n_dofs_at_node() [2/62]

unsigned int libMesh::FE< 1, RATIONAL_BERNSTEIN >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 155 of file fe_rational.C.

◆ n_dofs_at_node() [3/62]

unsigned int libMesh::FE< 2, RATIONAL_BERNSTEIN >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 156 of file fe_rational.C.

◆ n_dofs_at_node() [4/62]

unsigned int libMesh::FE< 3, RATIONAL_BERNSTEIN >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 157 of file fe_rational.C.

◆ n_dofs_at_node() [5/62]

static unsigned int libMesh::FE< Dim, T >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
staticinherited
Returns
The number of dofs at node n for a finite element of type t and order o.

On a p-refined element, o should be the total order of the element.

◆ n_dofs_at_node() [6/62]

unsigned int libMesh::FE< 0, CLOUGH >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 277 of file fe_clough.C.

277 { return clough_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [7/62]

unsigned int libMesh::FE< 1, CLOUGH >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 278 of file fe_clough.C.

278 { return clough_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [8/62]

unsigned int libMesh::FE< 2, CLOUGH >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 279 of file fe_clough.C.

279 { return clough_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [9/62]

unsigned int libMesh::FE< 3, CLOUGH >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 280 of file fe_clough.C.

280 { return clough_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [10/62]

unsigned int libMesh::FE< 0, HERMITE >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 328 of file fe_hermite.C.

328 { return hermite_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [11/62]

unsigned int libMesh::FE< 1, HERMITE >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 329 of file fe_hermite.C.

329 { return hermite_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [12/62]

unsigned int libMesh::FE< 2, HERMITE >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 330 of file fe_hermite.C.

330 { return hermite_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [13/62]

unsigned int libMesh::FE< 3, HERMITE >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 331 of file fe_hermite.C.

331 { return hermite_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [14/62]

unsigned int libMesh::FE< 0, HIERARCHIC >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 358 of file fe_hierarchic.C.

358 { return hierarchic_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [15/62]

unsigned int libMesh::FE< 1, HIERARCHIC >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 359 of file fe_hierarchic.C.

359 { return hierarchic_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [16/62]

unsigned int libMesh::FE< 2, HIERARCHIC >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 360 of file fe_hierarchic.C.

360 { return hierarchic_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [17/62]

unsigned int libMesh::FE< 3, HIERARCHIC >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 361 of file fe_hierarchic.C.

361 { return hierarchic_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [18/62]

unsigned int libMesh::FE< 0, BERNSTEIN >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 425 of file fe_bernstein.C.

425 { return bernstein_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [19/62]

unsigned int libMesh::FE< 1, BERNSTEIN >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 426 of file fe_bernstein.C.

426 { return bernstein_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [20/62]

unsigned int libMesh::FE< 2, BERNSTEIN >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 427 of file fe_bernstein.C.

427 { return bernstein_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [21/62]

unsigned int libMesh::FE< 3, BERNSTEIN >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 428 of file fe_bernstein.C.

428 { return bernstein_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [22/62]

unsigned int libMesh::FE< 2, NEDELEC_ONE >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 527 of file fe_nedelec_one.C.

527 { return nedelec_one_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [23/62]

unsigned int libMesh::FE< 3, NEDELEC_ONE >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 528 of file fe_nedelec_one.C.

528 { return nedelec_one_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [24/62]

unsigned int libMesh::FE< 0, LAGRANGE >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 859 of file fe_lagrange.C.

859 { return lagrange_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [25/62]

unsigned int libMesh::FE< 1, LAGRANGE >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 860 of file fe_lagrange.C.

860 { return lagrange_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [26/62]

unsigned int libMesh::FE< 2, LAGRANGE >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 861 of file fe_lagrange.C.

861 { return lagrange_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [27/62]

unsigned int libMesh::FE< 3, LAGRANGE >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 862 of file fe_lagrange.C.

862 { return lagrange_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [28/62]

unsigned int libMesh::FE< 0, LAGRANGE_VEC >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 957 of file fe_lagrange_vec.C.

957 { return FE<0,LAGRANGE>::n_dofs_at_node(t,o,n); }

◆ n_dofs_at_node() [29/62]

unsigned int libMesh::FE< 1, LAGRANGE_VEC >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 958 of file fe_lagrange_vec.C.

958 { return FE<1,LAGRANGE>::n_dofs_at_node(t,o,n); }

◆ n_dofs_at_node() [30/62]

unsigned int libMesh::FE< 2, LAGRANGE_VEC >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 959 of file fe_lagrange_vec.C.

959 { return 2*FE<2,LAGRANGE>::n_dofs_at_node(t,o,n); }

◆ n_dofs_at_node() [31/62]

unsigned int libMesh::FE< 3, LAGRANGE_VEC >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 960 of file fe_lagrange_vec.C.

960 { return 3*FE<2,LAGRANGE>::n_dofs_at_node(t,o,n); }

◆ n_dofs_at_node() [32/62]

unsigned int libMesh::FE< 0, SZABAB >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 1261 of file fe_szabab.C.

1261 { return szabab_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [33/62]

unsigned int libMesh::FE< 1, SZABAB >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 1262 of file fe_szabab.C.

1262 { return szabab_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [34/62]

unsigned int libMesh::FE< 2, SZABAB >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 1263 of file fe_szabab.C.

1263 { return szabab_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [35/62]

unsigned int libMesh::FE< 3, SZABAB >::n_dofs_at_node ( const ElemType  t,
const Order  o,
const unsigned int  n 
)
inherited

Definition at line 1264 of file fe_szabab.C.

1264 { return szabab_n_dofs_at_node(t, o, n); }

◆ n_dofs_at_node() [36/62]

unsigned int libMesh::FE< 0, SCALAR >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 94 of file fe_scalar.C.

94 { return 0; }

◆ n_dofs_at_node() [37/62]

unsigned int libMesh::FE< 1, SCALAR >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 95 of file fe_scalar.C.

95 { return 0; }

◆ n_dofs_at_node() [38/62]

unsigned int libMesh::FE< 2, SCALAR >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 96 of file fe_scalar.C.

96 { return 0; }

◆ n_dofs_at_node() [39/62]

unsigned int libMesh::FE< 3, SCALAR >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 97 of file fe_scalar.C.

97 { return 0; }

◆ n_dofs_at_node() [40/62]

unsigned int libMesh::FE< 0, L2_HIERARCHIC >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 181 of file fe_l2_hierarchic.C.

181 { return 0; }

◆ n_dofs_at_node() [41/62]

unsigned int libMesh::FE< 1, L2_HIERARCHIC >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 182 of file fe_l2_hierarchic.C.

182 { return 0; }

◆ n_dofs_at_node() [42/62]

unsigned int libMesh::FE< 2, L2_HIERARCHIC >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 183 of file fe_l2_hierarchic.C.

183 { return 0; }

◆ n_dofs_at_node() [43/62]

unsigned int libMesh::FE< 3, L2_HIERARCHIC >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 184 of file fe_l2_hierarchic.C.

184 { return 0; }

◆ n_dofs_at_node() [44/62]

unsigned int libMesh::FE< 0, MONOMIAL >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 385 of file fe_monomial.C.

385 { return 0; }

◆ n_dofs_at_node() [45/62]

unsigned int libMesh::FE< 1, MONOMIAL >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 386 of file fe_monomial.C.

386 { return 0; }

◆ n_dofs_at_node() [46/62]

unsigned int libMesh::FE< 2, MONOMIAL >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 387 of file fe_monomial.C.

387 { return 0; }

◆ n_dofs_at_node() [47/62]

unsigned int libMesh::FE< 3, MONOMIAL >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 388 of file fe_monomial.C.

388 { return 0; }

◆ n_dofs_at_node() [48/62]

unsigned int libMesh::FE< 0, L2_LAGRANGE >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 466 of file fe_l2_lagrange.C.

466 { return 0; }

◆ n_dofs_at_node() [49/62]

unsigned int libMesh::FE< 1, L2_LAGRANGE >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 467 of file fe_l2_lagrange.C.

467 { return 0; }

◆ n_dofs_at_node() [50/62]

unsigned int libMesh::FE< 2, L2_LAGRANGE >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 468 of file fe_l2_lagrange.C.

468 { return 0; }

◆ n_dofs_at_node() [51/62]

unsigned int libMesh::FE< 3, L2_LAGRANGE >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 469 of file fe_l2_lagrange.C.

469 { return 0; }

◆ n_dofs_at_node() [52/62]

unsigned int libMesh::FE< 0, NEDELEC_ONE >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 525 of file fe_nedelec_one.C.

525 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ n_dofs_at_node() [53/62]

unsigned int libMesh::FE< 1, NEDELEC_ONE >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 526 of file fe_nedelec_one.C.

526 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ n_dofs_at_node() [54/62]

unsigned int libMesh::FE< 0, MONOMIAL_VEC >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 707 of file fe_monomial_vec.C.

708 {
709  return 0;
710 }

◆ n_dofs_at_node() [55/62]

unsigned int libMesh::FE< 1, MONOMIAL_VEC >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 713 of file fe_monomial_vec.C.

714 {
715  return 0;
716 }

◆ n_dofs_at_node() [56/62]

unsigned int libMesh::FE< 2, MONOMIAL_VEC >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 719 of file fe_monomial_vec.C.

720 {
721  return 0;
722 }

◆ n_dofs_at_node() [57/62]

unsigned int libMesh::FE< 3, MONOMIAL_VEC >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 725 of file fe_monomial_vec.C.

726 {
727  return 0;
728 }

◆ n_dofs_at_node() [58/62]

unsigned int libMesh::FE< 2, SUBDIVISION >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 912 of file fe_subdivision_2D.C.

912 { return 1; }

◆ n_dofs_at_node() [59/62]

unsigned int libMesh::FE< 0, XYZ >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 913 of file fe_xyz.C.

913 { return 0; }

◆ n_dofs_at_node() [60/62]

unsigned int libMesh::FE< 1, XYZ >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 914 of file fe_xyz.C.

914 { return 0; }

◆ n_dofs_at_node() [61/62]

unsigned int libMesh::FE< 2, XYZ >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 915 of file fe_xyz.C.

915 { return 0; }

◆ n_dofs_at_node() [62/62]

unsigned int libMesh::FE< 3, XYZ >::n_dofs_at_node ( const  ElemType,
const  Order,
const unsigned int   
)
inherited

Definition at line 916 of file fe_xyz.C.

916 { return 0; }

◆ n_dofs_per_elem() [1/62]

unsigned int libMesh::FE< 0, RATIONAL_BERNSTEIN >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 160 of file fe_rational.C.

◆ n_dofs_per_elem() [2/62]

unsigned int libMesh::FE< 1, RATIONAL_BERNSTEIN >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 161 of file fe_rational.C.

◆ n_dofs_per_elem() [3/62]

unsigned int libMesh::FE< 2, RATIONAL_BERNSTEIN >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 162 of file fe_rational.C.

◆ n_dofs_per_elem() [4/62]

unsigned int libMesh::FE< 3, RATIONAL_BERNSTEIN >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 163 of file fe_rational.C.

◆ n_dofs_per_elem() [5/62]

unsigned int libMesh::FE< 0, L2_HIERARCHIC >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 187 of file fe_l2_hierarchic.C.

187 { return l2_hierarchic_n_dofs(t, o); }

◆ n_dofs_per_elem() [6/62]

unsigned int libMesh::FE< 1, L2_HIERARCHIC >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 188 of file fe_l2_hierarchic.C.

188 { return l2_hierarchic_n_dofs(t, o); }

◆ n_dofs_per_elem() [7/62]

unsigned int libMesh::FE< 2, L2_HIERARCHIC >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 189 of file fe_l2_hierarchic.C.

189 { return l2_hierarchic_n_dofs(t, o); }

◆ n_dofs_per_elem() [8/62]

unsigned int libMesh::FE< 3, L2_HIERARCHIC >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 190 of file fe_l2_hierarchic.C.

190 { return l2_hierarchic_n_dofs(t, o); }

◆ n_dofs_per_elem() [9/62]

static unsigned int libMesh::FE< Dim, T >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
staticinherited
Returns
The number of dofs interior to the element, not associated with any interior nodes.

On a p-refined element, o should be the total order of the element.

◆ n_dofs_per_elem() [10/62]

unsigned int libMesh::FE< 0, CLOUGH >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 283 of file fe_clough.C.

283 { return clough_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [11/62]

unsigned int libMesh::FE< 1, CLOUGH >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 284 of file fe_clough.C.

284 { return clough_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [12/62]

unsigned int libMesh::FE< 2, CLOUGH >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 285 of file fe_clough.C.

285 { return clough_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [13/62]

unsigned int libMesh::FE< 3, CLOUGH >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 286 of file fe_clough.C.

286 { return clough_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [14/62]

unsigned int libMesh::FE< 0, HERMITE >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 334 of file fe_hermite.C.

334 { return hermite_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [15/62]

unsigned int libMesh::FE< 1, HERMITE >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 335 of file fe_hermite.C.

335 { return hermite_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [16/62]

unsigned int libMesh::FE< 2, HERMITE >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 336 of file fe_hermite.C.

336 { return hermite_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [17/62]

unsigned int libMesh::FE< 3, HERMITE >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 337 of file fe_hermite.C.

337 { return hermite_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [18/62]

unsigned int libMesh::FE< 0, HIERARCHIC >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 364 of file fe_hierarchic.C.

364 { return hierarchic_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [19/62]

unsigned int libMesh::FE< 1, HIERARCHIC >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 365 of file fe_hierarchic.C.

365 { return hierarchic_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [20/62]

unsigned int libMesh::FE< 2, HIERARCHIC >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 366 of file fe_hierarchic.C.

366 { return hierarchic_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [21/62]

unsigned int libMesh::FE< 3, HIERARCHIC >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 367 of file fe_hierarchic.C.

367 { return hierarchic_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [22/62]

unsigned int libMesh::FE< 0, MONOMIAL >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 391 of file fe_monomial.C.

391 { return monomial_n_dofs(t, o); }

◆ n_dofs_per_elem() [23/62]

unsigned int libMesh::FE< 1, MONOMIAL >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 392 of file fe_monomial.C.

392 { return monomial_n_dofs(t, o); }

◆ n_dofs_per_elem() [24/62]

unsigned int libMesh::FE< 2, MONOMIAL >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 393 of file fe_monomial.C.

393 { return monomial_n_dofs(t, o); }

◆ n_dofs_per_elem() [25/62]

unsigned int libMesh::FE< 3, MONOMIAL >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 394 of file fe_monomial.C.

394 { return monomial_n_dofs(t, o); }

◆ n_dofs_per_elem() [26/62]

unsigned int libMesh::FE< 0, BERNSTEIN >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 431 of file fe_bernstein.C.

431 { return bernstein_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [27/62]

unsigned int libMesh::FE< 1, BERNSTEIN >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 432 of file fe_bernstein.C.

432 { return bernstein_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [28/62]

unsigned int libMesh::FE< 2, BERNSTEIN >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 433 of file fe_bernstein.C.

433 { return bernstein_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [29/62]

unsigned int libMesh::FE< 3, BERNSTEIN >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 434 of file fe_bernstein.C.

434 { return bernstein_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [30/62]

unsigned int libMesh::FE< 0, L2_LAGRANGE >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 473 of file fe_l2_lagrange.C.

473 { return l2_lagrange_n_dofs(t, o); }

◆ n_dofs_per_elem() [31/62]

unsigned int libMesh::FE< 1, L2_LAGRANGE >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 474 of file fe_l2_lagrange.C.

474 { return l2_lagrange_n_dofs(t, o); }

◆ n_dofs_per_elem() [32/62]

unsigned int libMesh::FE< 2, L2_LAGRANGE >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 475 of file fe_l2_lagrange.C.

475 { return l2_lagrange_n_dofs(t, o); }

◆ n_dofs_per_elem() [33/62]

unsigned int libMesh::FE< 3, L2_LAGRANGE >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 476 of file fe_l2_lagrange.C.

476 { return l2_lagrange_n_dofs(t, o); }

◆ n_dofs_per_elem() [34/62]

unsigned int libMesh::FE< 0, MONOMIAL_VEC >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 732 of file fe_monomial_vec.C.

733 {
734  return FE<0, MONOMIAL>::n_dofs_per_elem(t, o);
735 }

◆ n_dofs_per_elem() [35/62]

unsigned int libMesh::FE< 1, MONOMIAL_VEC >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 738 of file fe_monomial_vec.C.

739 {
740  return FE<1, MONOMIAL>::n_dofs_per_elem(t, o);
741 }

◆ n_dofs_per_elem() [36/62]

unsigned int libMesh::FE< 2, MONOMIAL_VEC >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 744 of file fe_monomial_vec.C.

745 {
746  return 2 * FE<2, MONOMIAL>::n_dofs_per_elem(t, o);
747 }

◆ n_dofs_per_elem() [37/62]

unsigned int libMesh::FE< 3, MONOMIAL_VEC >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 750 of file fe_monomial_vec.C.

751 {
752  return 3 * FE<3, MONOMIAL>::n_dofs_per_elem(t, o);
753 }

◆ n_dofs_per_elem() [38/62]

unsigned int libMesh::FE< 0, XYZ >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 919 of file fe_xyz.C.

919 { return xyz_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [39/62]

unsigned int libMesh::FE< 1, XYZ >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 920 of file fe_xyz.C.

920 { return xyz_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [40/62]

unsigned int libMesh::FE< 2, XYZ >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 921 of file fe_xyz.C.

921 { return xyz_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [41/62]

unsigned int libMesh::FE< 3, XYZ >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 922 of file fe_xyz.C.

922 { return xyz_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [42/62]

unsigned int libMesh::FE< 0, SZABAB >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 1267 of file fe_szabab.C.

1267 { return szabab_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [43/62]

unsigned int libMesh::FE< 1, SZABAB >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 1268 of file fe_szabab.C.

1268 { return szabab_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [44/62]

unsigned int libMesh::FE< 2, SZABAB >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 1269 of file fe_szabab.C.

1269 { return szabab_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [45/62]

unsigned int libMesh::FE< 3, SZABAB >::n_dofs_per_elem ( const ElemType  t,
const Order  o 
)
inherited

Definition at line 1270 of file fe_szabab.C.

1270 { return szabab_n_dofs_per_elem(t, o); }

◆ n_dofs_per_elem() [46/62]

unsigned int libMesh::FE< 0, SCALAR >::n_dofs_per_elem ( const  ElemType,
const  Order 
)
inherited

Definition at line 101 of file fe_scalar.C.

101 { return 0; }

◆ n_dofs_per_elem() [47/62]

unsigned int libMesh::FE< 1, SCALAR >::n_dofs_per_elem ( const  ElemType,
const  Order 
)
inherited

Definition at line 102 of file fe_scalar.C.

102 { return 0; }

◆ n_dofs_per_elem() [48/62]

unsigned int libMesh::FE< 2, SCALAR >::n_dofs_per_elem ( const  ElemType,
const  Order 
)
inherited

Definition at line 103 of file fe_scalar.C.

103 { return 0; }

◆ n_dofs_per_elem() [49/62]

unsigned int libMesh::FE< 3, SCALAR >::n_dofs_per_elem ( const  ElemType,
const  Order 
)
inherited

Definition at line 104 of file fe_scalar.C.

104 { return 0; }

◆ n_dofs_per_elem() [50/62]

unsigned int libMesh::FE< 0, NEDELEC_ONE >::n_dofs_per_elem ( const  ElemType,
const  Order 
)
inherited

Definition at line 533 of file fe_nedelec_one.C.

533 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ n_dofs_per_elem() [51/62]

unsigned int libMesh::FE< 1, NEDELEC_ONE >::n_dofs_per_elem ( const  ElemType,
const  Order 
)
inherited

Definition at line 534 of file fe_nedelec_one.C.

534 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ n_dofs_per_elem() [52/62]

unsigned int libMesh::FE< 2, NEDELEC_ONE >::n_dofs_per_elem ( const  ElemType,
const  Order 
)
inherited

Definition at line 535 of file fe_nedelec_one.C.

535 { return 0; }

◆ n_dofs_per_elem() [53/62]

unsigned int libMesh::FE< 3, NEDELEC_ONE >::n_dofs_per_elem ( const  ElemType,
const  Order 
)
inherited

Definition at line 536 of file fe_nedelec_one.C.

536 { return 0; }

◆ n_dofs_per_elem() [54/62]

unsigned int libMesh::FE< 0, LAGRANGE >::n_dofs_per_elem ( const  ElemType,
const  Order 
)
inherited

Definition at line 867 of file fe_lagrange.C.

867 { return 0; }

◆ n_dofs_per_elem() [55/62]

unsigned int libMesh::FE< 1, LAGRANGE >::n_dofs_per_elem ( const  ElemType,
const  Order 
)
inherited

Definition at line 868 of file fe_lagrange.C.

868 { return 0; }

◆ n_dofs_per_elem() [56/62]

unsigned int libMesh::FE< 2, LAGRANGE >::n_dofs_per_elem ( const  ElemType,
const  Order 
)
inherited

Definition at line 869 of file fe_lagrange.C.

869 { return 0; }

◆ n_dofs_per_elem() [57/62]

unsigned int libMesh::FE< 3, LAGRANGE >::n_dofs_per_elem ( const  ElemType,
const  Order 
)
inherited

Definition at line 870 of file fe_lagrange.C.

870 { return 0; }

◆ n_dofs_per_elem() [58/62]

unsigned int libMesh::FE< 2, SUBDIVISION >::n_dofs_per_elem ( const  ElemType,
const  Order 
)
inherited

Definition at line 915 of file fe_subdivision_2D.C.

915 { return 0; }

◆ n_dofs_per_elem() [59/62]

unsigned int libMesh::FE< 0, LAGRANGE_VEC >::n_dofs_per_elem ( const  ElemType,
const  Order 
)
inherited

Definition at line 965 of file fe_lagrange_vec.C.

965 { return 0; }

◆ n_dofs_per_elem() [60/62]

unsigned int libMesh::FE< 1, LAGRANGE_VEC >::n_dofs_per_elem ( const  ElemType,
const  Order 
)
inherited

Definition at line 966 of file fe_lagrange_vec.C.

966 { return 0; }

◆ n_dofs_per_elem() [61/62]

unsigned int libMesh::FE< 2, LAGRANGE_VEC >::n_dofs_per_elem ( const  ElemType,
const  Order 
)
inherited

Definition at line 967 of file fe_lagrange_vec.C.

967 { return 0; }

◆ n_dofs_per_elem() [62/62]

unsigned int libMesh::FE< 3, LAGRANGE_VEC >::n_dofs_per_elem ( const  ElemType,
const  Order 
)
inherited

Definition at line 968 of file fe_lagrange_vec.C.

968 { return 0; }

◆ n_objects()

static unsigned int libMesh::ReferenceCounter::n_objects ( )
inlinestaticinherited

Prints the number of outstanding (created, but not yet destroyed) objects.

Definition at line 83 of file reference_counter.h.

84  { return _n_objects; }

References libMesh::ReferenceCounter::_n_objects.

◆ n_quadrature_points()

unsigned int libMesh::FE< Dim, T >::n_quadrature_points ( ) const
overridevirtualinherited
Returns
The total number of quadrature points. Call this to get an upper bound for the for loop in your simulation for matrix assembly of the current element.

Implements libMesh::FEAbstract.

Definition at line 69 of file fe.C.

70 {
71  libmesh_assert(this->qrule);
72  return this->qrule->n_points();
73 }

◆ n_shape_functions() [1/2]

unsigned int libMesh::FE< Dim, T >::n_shape_functions ( ) const
overridevirtualinherited
Returns
The number of shape functions associated with this finite element.

Implements libMesh::FEAbstract.

Definition at line 50 of file fe.C.

51 {
52  return FE<Dim,T>::n_dofs (this->elem_type,
53  static_cast<Order>(this->fe_type.order + this->_p_level));
54 }

◆ n_shape_functions() [2/2]

static unsigned int libMesh::FE< Dim, T >::n_shape_functions ( const ElemType  t,
const Order  o 
)
inlinestaticinherited
Returns
The number of shape functions associated with a finite element of type t and approximation order o.

On a p-refined element, o should be the total order of the element.

Definition at line 245 of file fe.h.

247  { return FE<Dim,T>::n_dofs (t,o); }

◆ nodal_soln() [1/62]

void libMesh::FE< 0, NEDELEC_ONE >::nodal_soln ( const Elem ,
const  Order,
const std::vector< Number > &  ,
std::vector< Number > &   
)
inherited

Definition at line 486 of file fe_nedelec_one.C.

490 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ nodal_soln() [2/62]

void libMesh::FE< 1, NEDELEC_ONE >::nodal_soln ( const Elem ,
const  Order,
const std::vector< Number > &  ,
std::vector< Number > &   
)
inherited

Definition at line 493 of file fe_nedelec_one.C.

497 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ nodal_soln() [3/62]

static void libMesh::FE< Dim, T >::nodal_soln ( const Elem elem,
const Order  o,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
staticinherited

Build the nodal soln from the element soln.

This is the solution that will be plotted.

On a p-refined element, o should be the base order of the element.

◆ nodal_soln() [4/62]

void libMesh::FE< 0, SCALAR >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 58 of file fe_scalar.C.

62 { scalar_nodal_soln(elem, order, elem_soln, nodal_soln); }

◆ nodal_soln() [5/62]

void libMesh::FE< 1, SCALAR >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 65 of file fe_scalar.C.

69 { scalar_nodal_soln(elem, order, elem_soln, nodal_soln); }

◆ nodal_soln() [6/62]

void libMesh::FE< 2, SCALAR >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 72 of file fe_scalar.C.

76 { scalar_nodal_soln(elem, order, elem_soln, nodal_soln); }

◆ nodal_soln() [7/62]

void libMesh::FE< 3, SCALAR >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 79 of file fe_scalar.C.

83 { scalar_nodal_soln(elem, order, elem_soln, nodal_soln); }

◆ nodal_soln() [8/62]

void libMesh::FE< 0, RATIONAL_BERNSTEIN >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 119 of file fe_rational.C.

123 { rational_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/0); }

◆ nodal_soln() [9/62]

void libMesh::FE< 0, MONOMIAL_VEC >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 121 of file fe_monomial_vec.C.

125 {
126  FE<0, MONOMIAL>::nodal_soln(elem, order, elem_soln, nodal_soln);
127 }

◆ nodal_soln() [10/62]

void libMesh::FE< 1, RATIONAL_BERNSTEIN >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 126 of file fe_rational.C.

130 { rational_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/1); }

◆ nodal_soln() [11/62]

void libMesh::FE< 1, MONOMIAL_VEC >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 131 of file fe_monomial_vec.C.

135 {
136  FE<1, MONOMIAL>::nodal_soln(elem, order, elem_soln, nodal_soln);
137 }

◆ nodal_soln() [12/62]

void libMesh::FE< 2, RATIONAL_BERNSTEIN >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 133 of file fe_rational.C.

137 { rational_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/2); }

◆ nodal_soln() [13/62]

void libMesh::FE< 3, RATIONAL_BERNSTEIN >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 140 of file fe_rational.C.

144 { rational_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/3); }

◆ nodal_soln() [14/62]

void libMesh::FE< 2, MONOMIAL_VEC >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 141 of file fe_monomial_vec.C.

145 {
146  monomial_vec_nodal_soln(elem, order, elem_soln, 2 /*dimension*/, nodal_soln);
147 }

◆ nodal_soln() [15/62]

void libMesh::FE< 0, L2_HIERARCHIC >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 146 of file fe_l2_hierarchic.C.

150 { l2_hierarchic_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/0); }

◆ nodal_soln() [16/62]

void libMesh::FE< 3, MONOMIAL_VEC >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 151 of file fe_monomial_vec.C.

155 {
156  monomial_vec_nodal_soln(elem, order, elem_soln, 3 /*dimension*/, nodal_soln);
157 }

◆ nodal_soln() [17/62]

void libMesh::FE< 1, L2_HIERARCHIC >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 153 of file fe_l2_hierarchic.C.

157 { l2_hierarchic_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/1); }

◆ nodal_soln() [18/62]

void libMesh::FE< 2, L2_HIERARCHIC >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 160 of file fe_l2_hierarchic.C.

164 { l2_hierarchic_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/2); }

◆ nodal_soln() [19/62]

void libMesh::FE< 3, L2_HIERARCHIC >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 167 of file fe_l2_hierarchic.C.

171 { l2_hierarchic_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/3); }

◆ nodal_soln() [20/62]

void libMesh::FE< 0, CLOUGH >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 241 of file fe_clough.C.

245 { clough_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/0); }

◆ nodal_soln() [21/62]

void libMesh::FE< 1, CLOUGH >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 248 of file fe_clough.C.

252 { clough_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/1); }

◆ nodal_soln() [22/62]

void libMesh::FE< 2, CLOUGH >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 255 of file fe_clough.C.

259 { clough_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/2); }

◆ nodal_soln() [23/62]

void libMesh::FE< 3, CLOUGH >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 262 of file fe_clough.C.

266 { clough_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/3); }

◆ nodal_soln() [24/62]

void libMesh::FE< 0, HERMITE >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 288 of file fe_hermite.C.

292 { hermite_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/0); }

◆ nodal_soln() [25/62]

void libMesh::FE< 1, HERMITE >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 295 of file fe_hermite.C.

299 { hermite_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/1); }

◆ nodal_soln() [26/62]

void libMesh::FE< 2, HERMITE >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 302 of file fe_hermite.C.

306 { hermite_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/2); }

◆ nodal_soln() [27/62]

void libMesh::FE< 3, HERMITE >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 309 of file fe_hermite.C.

313 { hermite_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/3); }

◆ nodal_soln() [28/62]

void libMesh::FE< 0, HIERARCHIC >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 323 of file fe_hierarchic.C.

327 { hierarchic_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/0); }

◆ nodal_soln() [29/62]

void libMesh::FE< 1, HIERARCHIC >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 330 of file fe_hierarchic.C.

334 { hierarchic_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/1); }

◆ nodal_soln() [30/62]

void libMesh::FE< 2, HIERARCHIC >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 337 of file fe_hierarchic.C.

341 { hierarchic_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/2); }

◆ nodal_soln() [31/62]

void libMesh::FE< 3, HIERARCHIC >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 344 of file fe_hierarchic.C.

348 { hierarchic_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/3); }

◆ nodal_soln() [32/62]

void libMesh::FE< 0, MONOMIAL >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 349 of file fe_monomial.C.

353 { monomial_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/0); }

◆ nodal_soln() [33/62]

void libMesh::FE< 1, MONOMIAL >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 356 of file fe_monomial.C.

360 { monomial_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/1); }

◆ nodal_soln() [34/62]

void libMesh::FE< 2, MONOMIAL >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 363 of file fe_monomial.C.

367 { monomial_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/2); }

◆ nodal_soln() [35/62]

void libMesh::FE< 3, MONOMIAL >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 370 of file fe_monomial.C.

374 { monomial_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/3); }

◆ nodal_soln() [36/62]

void libMesh::FE< 0, BERNSTEIN >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 390 of file fe_bernstein.C.

394 { bernstein_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/0); }

◆ nodal_soln() [37/62]

void libMesh::FE< 1, BERNSTEIN >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 397 of file fe_bernstein.C.

401 { bernstein_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/1); }

◆ nodal_soln() [38/62]

void libMesh::FE< 2, BERNSTEIN >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 404 of file fe_bernstein.C.

408 { bernstein_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/2); }

◆ nodal_soln() [39/62]

void libMesh::FE< 3, BERNSTEIN >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 411 of file fe_bernstein.C.

415 { bernstein_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/3); }

◆ nodal_soln() [40/62]

void libMesh::FE< 0, L2_LAGRANGE >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 428 of file fe_l2_lagrange.C.

432 { l2_lagrange_nodal_soln(elem, order, elem_soln, nodal_soln); }

◆ nodal_soln() [41/62]

void libMesh::FE< 1, L2_LAGRANGE >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 435 of file fe_l2_lagrange.C.

439 { l2_lagrange_nodal_soln(elem, order, elem_soln, nodal_soln); }

◆ nodal_soln() [42/62]

void libMesh::FE< 2, L2_LAGRANGE >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 442 of file fe_l2_lagrange.C.

446 { l2_lagrange_nodal_soln(elem, order, elem_soln, nodal_soln); }

◆ nodal_soln() [43/62]

void libMesh::FE< 3, L2_LAGRANGE >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 449 of file fe_l2_lagrange.C.

453 { l2_lagrange_nodal_soln(elem, order, elem_soln, nodal_soln); }

◆ nodal_soln() [44/62]

void libMesh::FE< 2, NEDELEC_ONE >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 500 of file fe_nedelec_one.C.

504 { nedelec_one_nodal_soln(elem, order, elem_soln, 2 /*dim*/, nodal_soln); }

◆ nodal_soln() [45/62]

void libMesh::FE< 0, LAGRANGE_VEC >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 506 of file fe_lagrange_vec.C.

510 { FE<0,LAGRANGE>::nodal_soln(elem, order, elem_soln, nodal_soln); }

◆ nodal_soln() [46/62]

void libMesh::FE< 3, NEDELEC_ONE >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 507 of file fe_nedelec_one.C.

511 { nedelec_one_nodal_soln(elem, order, elem_soln, 3 /*dim*/, nodal_soln); }

◆ nodal_soln() [47/62]

void libMesh::FE< 1, LAGRANGE_VEC >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 513 of file fe_lagrange_vec.C.

517 { FE<1,LAGRANGE>::nodal_soln(elem, order, elem_soln, nodal_soln); }

◆ nodal_soln() [48/62]

void libMesh::FE< 2, LAGRANGE_VEC >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 520 of file fe_lagrange_vec.C.

524 { lagrange_vec_nodal_soln(elem, order, elem_soln, 2 /*dimension*/, nodal_soln); }

◆ nodal_soln() [49/62]

void libMesh::FE< 3, LAGRANGE_VEC >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 527 of file fe_lagrange_vec.C.

531 { lagrange_vec_nodal_soln(elem, order, elem_soln, 3 /*dimension*/, nodal_soln); }

◆ nodal_soln() [50/62]

void libMesh::FE< 0, LAGRANGE >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 820 of file fe_lagrange.C.

824 { lagrange_nodal_soln(elem, order, elem_soln, nodal_soln); }

◆ nodal_soln() [51/62]

void libMesh::FE< 1, LAGRANGE >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 827 of file fe_lagrange.C.

831 { lagrange_nodal_soln(elem, order, elem_soln, nodal_soln); }

◆ nodal_soln() [52/62]

void libMesh::FE< 2, LAGRANGE >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 834 of file fe_lagrange.C.

838 { lagrange_nodal_soln(elem, order, elem_soln, nodal_soln); }

◆ nodal_soln() [53/62]

void libMesh::FE< 3, LAGRANGE >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 841 of file fe_lagrange.C.

845 { lagrange_nodal_soln(elem, order, elem_soln, nodal_soln); }

◆ nodal_soln() [54/62]

void libMesh::FE< 0, XYZ >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 876 of file fe_xyz.C.

880 { xyz_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/0); }

◆ nodal_soln() [55/62]

void libMesh::FE< 1, XYZ >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 883 of file fe_xyz.C.

887 { xyz_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/1); }

◆ nodal_soln() [56/62]

void libMesh::FE< 2, XYZ >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 890 of file fe_xyz.C.

894 { xyz_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/2); }

◆ nodal_soln() [57/62]

void libMesh::FE< 3, XYZ >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 897 of file fe_xyz.C.

901 { xyz_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/3); }

◆ nodal_soln() [58/62]

void libMesh::FE< 0, SZABAB >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 1226 of file fe_szabab.C.

1230 { szabab_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/0); }

◆ nodal_soln() [59/62]

void libMesh::FE< 1, SZABAB >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 1233 of file fe_szabab.C.

1237 { szabab_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/1); }

◆ nodal_soln() [60/62]

void libMesh::FE< 2, SZABAB >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 1240 of file fe_szabab.C.

1244 { szabab_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/2); }

◆ nodal_soln() [61/62]

void libMesh::FE< 3, SZABAB >::nodal_soln ( const Elem elem,
const Order  order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 1247 of file fe_szabab.C.

1251 { szabab_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/3); }

◆ nodal_soln() [62/62]

void libMesh::FE< 2, SUBDIVISION >::nodal_soln ( const Elem elem,
const  Order,
const std::vector< Number > &  elem_soln,
std::vector< Number > &  nodal_soln 
)
inherited

Definition at line 830 of file fe_subdivision_2D.C.

834 {
835  libmesh_assert(elem);
836  libmesh_assert_equal_to(elem->type(), TRI3SUBDIVISION);
837  const Tri3Subdivision * sd_elem = static_cast<const Tri3Subdivision *>(elem);
838 
839  nodal_soln.resize(3); // three nodes per element
840 
841  // Ghost nodes are auxiliary.
842  if (sd_elem->is_ghost())
843  {
844  nodal_soln[0] = 0;
845  nodal_soln[1] = 0;
846  nodal_soln[2] = 0;
847  return;
848  }
849 
850  // First node (node 0 in the element patch):
851  unsigned int j = sd_elem->local_node_number(sd_elem->get_ordered_node(0)->id());
852  nodal_soln[j] = elem_soln[0];
853 
854  // Second node (node 1 in the element patch):
855  j = sd_elem->local_node_number(sd_elem->get_ordered_node(1)->id());
856  nodal_soln[j] = elem_soln[1];
857 
858  // Third node (node 'valence' in the element patch):
859  j = sd_elem->local_node_number(sd_elem->get_ordered_node(2)->id());
860  nodal_soln[j] = elem_soln[sd_elem->get_ordered_valence(0)];
861 }

◆ on_reference_element()

bool libMesh::FEAbstract::on_reference_element ( const Point p,
const ElemType  t,
const Real  eps = TOLERANCE 
)
staticinherited
Returns
true if the point p is located on the reference element for element type t, false otherwise. Since we are doing floating point comparisons here the parameter eps can be specified to indicate a tolerance. For example, \( x \le 1 \) becomes \( x \le 1 + \epsilon \).

Definition at line 606 of file fe_abstract.C.

607 {
608  libmesh_assert_greater_equal (eps, 0.);
609 
610  const Real xi = p(0);
611 #if LIBMESH_DIM > 1
612  const Real eta = p(1);
613 #else
614  const Real eta = 0.;
615 #endif
616 #if LIBMESH_DIM > 2
617  const Real zeta = p(2);
618 #else
619  const Real zeta = 0.;
620 #endif
621 
622  switch (t)
623  {
624  case NODEELEM:
625  {
626  return (!xi && !eta && !zeta);
627  }
628  case EDGE2:
629  case EDGE3:
630  case EDGE4:
631  {
632  // The reference 1D element is [-1,1].
633  if ((xi >= -1.-eps) &&
634  (xi <= 1.+eps))
635  return true;
636 
637  return false;
638  }
639 
640 
641  case TRI3:
642  case TRISHELL3:
643  case TRI6:
644  {
645  // The reference triangle is isosceles
646  // and is bound by xi=0, eta=0, and xi+eta=1.
647  if ((xi >= 0.-eps) &&
648  (eta >= 0.-eps) &&
649  ((xi + eta) <= 1.+eps))
650  return true;
651 
652  return false;
653  }
654 
655 
656  case QUAD4:
657  case QUADSHELL4:
658  case QUAD8:
659  case QUADSHELL8:
660  case QUAD9:
661  {
662  // The reference quadrilateral element is [-1,1]^2.
663  if ((xi >= -1.-eps) &&
664  (xi <= 1.+eps) &&
665  (eta >= -1.-eps) &&
666  (eta <= 1.+eps))
667  return true;
668 
669  return false;
670  }
671 
672 
673  case TET4:
674  case TET10:
675  {
676  // The reference tetrahedral is isosceles
677  // and is bound by xi=0, eta=0, zeta=0,
678  // and xi+eta+zeta=1.
679  if ((xi >= 0.-eps) &&
680  (eta >= 0.-eps) &&
681  (zeta >= 0.-eps) &&
682  ((xi + eta + zeta) <= 1.+eps))
683  return true;
684 
685  return false;
686  }
687 
688 
689  case HEX8:
690  case HEX20:
691  case HEX27:
692  {
693  /*
694  if ((xi >= -1.) &&
695  (xi <= 1.) &&
696  (eta >= -1.) &&
697  (eta <= 1.) &&
698  (zeta >= -1.) &&
699  (zeta <= 1.))
700  return true;
701  */
702 
703  // The reference hexahedral element is [-1,1]^3.
704  if ((xi >= -1.-eps) &&
705  (xi <= 1.+eps) &&
706  (eta >= -1.-eps) &&
707  (eta <= 1.+eps) &&
708  (zeta >= -1.-eps) &&
709  (zeta <= 1.+eps))
710  {
711  // libMesh::out << "Strange Point:\n";
712  // p.print();
713  return true;
714  }
715 
716  return false;
717  }
718 
719  case PRISM6:
720  case PRISM15:
721  case PRISM18:
722  {
723  // Figure this one out...
724  // inside the reference triangle with zeta in [-1,1]
725  if ((xi >= 0.-eps) &&
726  (eta >= 0.-eps) &&
727  (zeta >= -1.-eps) &&
728  (zeta <= 1.+eps) &&
729  ((xi + eta) <= 1.+eps))
730  return true;
731 
732  return false;
733  }
734 
735 
736  case PYRAMID5:
737  case PYRAMID13:
738  case PYRAMID14:
739  {
740  // Check that the point is on the same side of all the faces
741  // by testing whether:
742  //
743  // n_i.(x - x_i) <= 0
744  //
745  // for each i, where:
746  // n_i is the outward normal of face i,
747  // x_i is a point on face i.
748  if ((-eta - 1. + zeta <= 0.+eps) &&
749  ( xi - 1. + zeta <= 0.+eps) &&
750  ( eta - 1. + zeta <= 0.+eps) &&
751  ( -xi - 1. + zeta <= 0.+eps) &&
752  ( zeta >= 0.-eps))
753  return true;
754 
755  return false;
756  }
757 
758 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
759  case INFHEX8:
760  case INFHEX16:
761  case INFHEX18:
762  {
763  // The reference infhex8 is a [-1,1]^3.
764  if ((xi >= -1.-eps) &&
765  (xi <= 1.+eps) &&
766  (eta >= -1.-eps) &&
767  (eta <= 1.+eps) &&
768  (zeta >= -1.-eps) &&
769  (zeta <= 1.+eps))
770  {
771  return true;
772  }
773  return false;
774  }
775 
776  case INFPRISM6:
777  case INFPRISM12:
778  {
779  // inside the reference triangle with zeta in [-1,1]
780  if ((xi >= 0.-eps) &&
781  (eta >= 0.-eps) &&
782  (zeta >= -1.-eps) &&
783  (zeta <= 1.+eps) &&
784  ((xi + eta) <= 1.+eps))
785  {
786  return true;
787  }
788 
789  return false;
790  }
791 #endif
792 
793  default:
794  libmesh_error_msg("ERROR: Unknown element type " << t);
795  }
796 
797  // If we get here then the point is _not_ in the
798  // reference element. Better return false.
799 
800  return false;
801 }

References libMesh::EDGE2, libMesh::EDGE3, libMesh::EDGE4, libMesh::HEX20, libMesh::HEX27, libMesh::HEX8, libMesh::INFHEX16, libMesh::INFHEX18, libMesh::INFHEX8, libMesh::INFPRISM12, libMesh::INFPRISM6, libMesh::NODEELEM, libMesh::PRISM15, libMesh::PRISM18, libMesh::PRISM6, libMesh::PYRAMID13, libMesh::PYRAMID14, libMesh::PYRAMID5, libMesh::QUAD4, libMesh::QUAD8, libMesh::QUAD9, libMesh::QUADSHELL4, libMesh::QUADSHELL8, libMesh::Real, libMesh::TET10, libMesh::TET4, libMesh::TRI3, libMesh::TRI6, and libMesh::TRISHELL3.

Referenced by libMesh::FEInterface::ifem_on_reference_element(), libMesh::FEMap::inverse_map(), and libMesh::FEInterface::on_reference_element().

◆ print_d2phi()

void libMesh::FEGenericBase< FEOutputType< T >::type >::print_d2phi ( std::ostream &  os) const
virtualinherited

Prints the value of each shape function's second derivatives at each quadrature point.

Implements libMesh::FEAbstract.

Definition at line 807 of file fe_base.C.

808 {
809  for (auto i : index_range(dphi))
810  for (auto j : index_range(dphi[i]))
811  os << " d2phi[" << i << "][" << j << "]=" << d2phi[i][j];
812 }

◆ print_dphi()

void libMesh::FEGenericBase< FEOutputType< T >::type >::print_dphi ( std::ostream &  os) const
virtualinherited

Prints the value of each shape function's derivative at each quadrature point.

Implements libMesh::FEAbstract.

Definition at line 746 of file fe_base.C.

747 {
748  for (auto i : index_range(dphi))
749  for (auto j : index_range(dphi[i]))
750  os << " dphi[" << i << "][" << j << "]=" << dphi[i][j];
751 }

◆ print_info() [1/2]

void libMesh::FEAbstract::print_info ( std::ostream &  os) const
inherited

Prints all the relevant information about the current element.

Definition at line 818 of file fe_abstract.C.

819 {
820  os << "phi[i][j]: Shape function i at quadrature pt. j" << std::endl;
821  this->print_phi(os);
822 
823  os << "dphi[i][j]: Shape function i's gradient at quadrature pt. j" << std::endl;
824  this->print_dphi(os);
825 
826  os << "XYZ locations of the quadrature pts." << std::endl;
827  this->print_xyz(os);
828 
829  os << "Values of JxW at the quadrature pts." << std::endl;
830  this->print_JxW(os);
831 }

References libMesh::FEAbstract::print_dphi(), libMesh::FEAbstract::print_JxW(), libMesh::FEAbstract::print_phi(), and libMesh::FEAbstract::print_xyz().

Referenced by libMesh::operator<<().

◆ print_info() [2/2]

void libMesh::ReferenceCounter::print_info ( std::ostream &  out = libMesh::out)
staticinherited

Prints the reference information, by default to libMesh::out.

Definition at line 87 of file reference_counter.C.

88 {
90  out_stream << ReferenceCounter::get_info();
91 }

References libMesh::ReferenceCounter::_enable_print_counter, and libMesh::ReferenceCounter::get_info().

◆ print_JxW()

void libMesh::FEAbstract::print_JxW ( std::ostream &  os) const
inherited

Prints the Jacobian times the weight for each quadrature point.

Definition at line 805 of file fe_abstract.C.

806 {
807  this->_fe_map->print_JxW(os);
808 }

References libMesh::FEAbstract::_fe_map.

Referenced by libMesh::FEAbstract::print_info().

◆ print_phi()

void libMesh::FEGenericBase< FEOutputType< T >::type >::print_phi ( std::ostream &  os) const
virtualinherited

Prints the value of each shape function at each quadrature point.

Implements libMesh::FEAbstract.

Definition at line 735 of file fe_base.C.

736 {
737  for (auto i : index_range(phi))
738  for (auto j : index_range(phi[i]))
739  os << " phi[" << i << "][" << j << "]=" << phi[i][j] << std::endl;
740 }

◆ print_xyz()

void libMesh::FEAbstract::print_xyz ( std::ostream &  os) const
inherited

Prints the spatial location of each quadrature point (on the physical element).

Definition at line 812 of file fe_abstract.C.

813 {
814  this->_fe_map->print_xyz(os);
815 }

References libMesh::FEAbstract::_fe_map.

Referenced by libMesh::FEAbstract::print_info().

◆ reinit() [1/2]

void libMesh::FE< Dim, T >::reinit ( const Elem elem,
const std::vector< Point > *const  pts = nullptr,
const std::vector< Real > *const  weights = nullptr 
)
overridevirtualinherited

This is at the core of this class.

Use this for each new element in the mesh. Reinitializes all the physical element-dependent data based on the current element elem. By default the shape functions and associated data are computed at the quadrature points specified by the quadrature rule qrule, but may be any points specified on the reference element specified in the optional argument pts.

Implements libMesh::FEAbstract.

Definition at line 129 of file fe.C.

132 {
133  // We can be called with no element. If we're evaluating SCALAR
134  // dofs we'll still have work to do.
135  // libmesh_assert(elem);
136 
137  // We're calculating now! Time to determine what.
138  this->determine_calculations();
139 
140  // Try to avoid calling init_shape_functions
141  // even when shapes_need_reinit
142  bool cached_nodes_still_fit = false;
143 
144  // Most of the hard work happens when we have an actual element
145  if (elem)
146  {
147  // Initialize the shape functions at the user-specified
148  // points
149  if (pts != nullptr)
150  {
151  // Set the type and p level for this element
152  this->elem_type = elem->type();
153  this->_p_level = elem->p_level();
154 
155  // Initialize the shape functions
156  this->_fe_map->template init_reference_to_physical_map<Dim>
157  (*pts, elem);
158  this->init_shape_functions (*pts, elem);
159 
160  // The shape functions do not correspond to the qrule
161  this->shapes_on_quadrature = false;
162  }
163 
164  // If there are no user specified points, we use the
165  // quadrature rule
166 
167  // update the type in accordance to the current cell
168  // and reinit if the cell type has changed or (as in
169  // the case of the hierarchics) the shape functions need
170  // reinit, since they depend on the particular element shape
171  else
172  {
173  libmesh_assert(this->qrule);
174  this->qrule->init(elem->type(), elem->p_level());
175 
176  if (this->qrule->shapes_need_reinit())
177  this->shapes_on_quadrature = false;
178 
179  if (this->elem_type != elem->type() ||
180  this->_p_level != elem->p_level() ||
181  !this->shapes_on_quadrature)
182  {
183  // Set the type and p level for this element
184  this->elem_type = elem->type();
185  this->_p_level = elem->p_level();
186  // Initialize the shape functions
187  this->_fe_map->template init_reference_to_physical_map<Dim>
188  (this->qrule->get_points(), elem);
189  this->init_shape_functions (this->qrule->get_points(), elem);
190 
191  if (this->shapes_need_reinit())
192  {
193  cached_nodes.resize(elem->n_nodes());
194  for (auto n : elem->node_index_range())
195  cached_nodes[n] = elem->point(n);
196  }
197  }
198  else
199  {
200  // libmesh_assert_greater (elem->n_nodes(), 1);
201 
202  cached_nodes_still_fit = true;
203  if (cached_nodes.size() != elem->n_nodes())
204  cached_nodes_still_fit = false;
205  else
206  for (auto n : IntRange<unsigned int>(1, elem->n_nodes()))
207  {
208  if (!(elem->point(n) - elem->point(0)).relative_fuzzy_equals
209  ((cached_nodes[n] - cached_nodes[0]), 1e-13))
210  {
211  cached_nodes_still_fit = false;
212  break;
213  }
214  }
215 
216  if (this->shapes_need_reinit() && !cached_nodes_still_fit)
217  {
218  this->_fe_map->template init_reference_to_physical_map<Dim>
219  (this->qrule->get_points(), elem);
220  this->init_shape_functions (this->qrule->get_points(), elem);
221  cached_nodes.resize(elem->n_nodes());
222  for (auto n : elem->node_index_range())
223  cached_nodes[n] = elem->point(n);
224  }
225  }
226 
227  // The shape functions correspond to the qrule
228  this->shapes_on_quadrature = true;
229  }
230  }
231  else // With no defined elem, so mapping or caching to
232  // be done, and our "quadrature rule" is one point for nonlocal
233  // (SCALAR) variables and zero points for local variables.
234  {
235  this->elem_type = INVALID_ELEM;
236  this->_p_level = 0;
237 
238  if (!pts)
239  {
240  if (T == SCALAR)
241  {
242  this->qrule->get_points() =
243  std::vector<Point>(1,Point(0));
244 
245  this->qrule->get_weights() =
246  std::vector<Real>(1,1);
247  }
248  else
249  {
250  this->qrule->get_points().clear();
251  this->qrule->get_weights().clear();
252  }
253 
254  this->init_shape_functions (this->qrule->get_points(), elem);
255  }
256  else
257  this->init_shape_functions (*pts, elem);
258  }
259 
260  // Compute the map for this element.
261  if (pts != nullptr)
262  {
263  if (weights != nullptr)
264  {
265  this->_fe_map->compute_map (this->dim, *weights, elem, this->calculate_d2phi);
266  }
267  else
268  {
269  std::vector<Real> dummy_weights (pts->size(), 1.);
270  this->_fe_map->compute_map (this->dim, dummy_weights, elem, this->calculate_d2phi);
271  }
272  }
273  else
274  {
275  this->_fe_map->compute_map (this->dim, this->qrule->get_weights(), elem, this->calculate_d2phi);
276  }
277 
278  // Compute the shape functions and the derivatives at all of the
279  // quadrature points.
280  if (!cached_nodes_still_fit)
281  {
282  if (pts != nullptr)
283  this->compute_shape_functions (elem,*pts);
284  else
285  this->compute_shape_functions(elem,this->qrule->get_points());
286  }
287 }

◆ reinit() [2/2]

void libMesh::FE< Dim, T >::reinit ( const Elem elem,
const unsigned int  side,
const Real  tolerance = TOLERANCE,
const std::vector< Point > *const  pts = nullptr,
const std::vector< Real > *const  weights = nullptr 
)
overridevirtualinherited

Reinitializes all the physical element-dependent data based on the side of face.

The tolerance parameter is passed to the involved call to inverse_map(). By default the shape functions and associated data are computed at the quadrature points specified by the quadrature rule qrule, but may be any points specified on the reference side element specified in the optional argument pts.

Implements libMesh::FEAbstract.

Definition at line 114 of file fe_boundary.C.

119 {
120  libmesh_assert(elem);
121  libmesh_assert (this->qrule != nullptr || pts != nullptr);
122  // We now do this for 1D elements!
123  // libmesh_assert_not_equal_to (Dim, 1);
124 
125  // We're (possibly re-) calculating now! FIXME - we currently
126  // expect to be able to use side_map and JxW later, but we could
127  // optimize further here.
128  this->_fe_map->calculations_started = false;
129  this->_fe_map->get_JxW();
130  this->_fe_map->get_xyz();
131  this->determine_calculations();
132 
133  // Build the side of interest
134  const std::unique_ptr<const Elem> side(elem->build_side_ptr(s));
135 
136  // Find the max p_level to select
137  // the right quadrature rule for side integration
138  unsigned int side_p_level = elem->p_level();
139  if (elem->neighbor_ptr(s) != nullptr)
140  side_p_level = std::max(side_p_level, elem->neighbor_ptr(s)->p_level());
141 
142  // Initialize the shape functions at the user-specified
143  // points
144  if (pts != nullptr)
145  {
146  // The shape functions do not correspond to the qrule
147  this->shapes_on_quadrature = false;
148 
149  // Initialize the face shape functions
150  this->_fe_map->template init_face_shape_functions<Dim>(*pts, side.get());
151 
152  // Compute the Jacobian*Weight on the face for integration
153  if (weights != nullptr)
154  {
155  this->_fe_map->compute_face_map (Dim, *weights, side.get());
156  }
157  else
158  {
159  std::vector<Real> dummy_weights (pts->size(), 1.);
160  this->_fe_map->compute_face_map (Dim, dummy_weights, side.get());
161  }
162  }
163  // If there are no user specified points, we use the
164  // quadrature rule
165  else
166  {
167  // initialize quadrature rule
168  this->qrule->init(side->type(), side_p_level);
169 
170  if (this->qrule->shapes_need_reinit())
171  this->shapes_on_quadrature = false;
172 
173  // FIXME - could this break if the same FE object was used
174  // for both volume and face integrals? - RHS
175  // We might not need to reinitialize the shape functions
176  if ((this->get_type() != elem->type()) ||
177  (side->type() != last_side) ||
178  (this->get_p_level() != side_p_level) ||
179  this->shapes_need_reinit() ||
180  !this->shapes_on_quadrature)
181  {
182  // Set the element type and p_level
183  this->elem_type = elem->type();
184 
185  // Set the last_side
186  last_side = side->type();
187 
188  // Set the last p level
189  this->_p_level = side_p_level;
190 
191  // Initialize the face shape functions
192  this->_fe_map->template init_face_shape_functions<Dim>(this->qrule->get_points(), side.get());
193  }
194 
195  // Compute the Jacobian*Weight on the face for integration
196  this->_fe_map->compute_face_map (Dim, this->qrule->get_weights(), side.get());
197 
198  // The shape functions correspond to the qrule
199  this->shapes_on_quadrature = true;
200  }
201 
202  // make a copy of the Jacobian for integration
203  const std::vector<Real> JxW_int(this->_fe_map->get_JxW());
204 
205  // make a copy of shape on quadrature info
206  bool shapes_on_quadrature_side = this->shapes_on_quadrature;
207 
208  // Find where the integration points are located on the
209  // full element.
210  const std::vector<Point> * ref_qp;
211  if (pts != nullptr)
212  ref_qp = pts;
213  else
214  ref_qp = &this->qrule->get_points();
215 
216  std::vector<Point> qp;
217  this->side_map(elem, side.get(), s, *ref_qp, qp);
218 
219  // compute the shape function and derivative values
220  // at the points qp
221  this->reinit (elem, &qp);
222 
223  this->shapes_on_quadrature = shapes_on_quadrature_side;
224 
225  // copy back old data
226  this->_fe_map->get_JxW() = JxW_int;
227 }

◆ set_fe_order()

void libMesh::FEAbstract::set_fe_order ( int  new_order)
inlineinherited

Sets the base FE order of the finite element.

Definition at line 437 of file fe_abstract.h.

437 { fe_type.order = new_order; }

References libMesh::FEAbstract::fe_type, and libMesh::FEType::order.

◆ shape() [1/125]

Real libMesh::FE< 0, LAGRANGE >::shape ( const Elem ,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point ,
const bool   
)
inherited

Definition at line 39 of file fe_lagrange_shape_0D.C.

44 {
45  libmesh_assert_less (i, 1);
46  return 1.;
47 }

◆ shape() [2/125]

Real libMesh::FE< 0, HIERARCHIC >::shape ( const Elem ,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point ,
const bool   
)
inherited

Definition at line 40 of file fe_hierarchic_shape_0D.C.

45 {
46  libmesh_assert_less (i, 1);
47  return 1.;
48 }

◆ shape() [3/125]

Real libMesh::FE< 0, MONOMIAL >::shape ( const Elem ,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point ,
const bool   
)
inherited

Definition at line 44 of file fe_monomial_shape_0D.C.

49 {
50  libmesh_assert_less (i, 1);
51  return 1.;
52 }

◆ shape() [4/125]

Real libMesh::FE< 0, XYZ >::shape ( const Elem ,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point ,
const bool   
)
inherited

Definition at line 44 of file fe_xyz_shape_0D.C.

49 {
50  libmesh_assert_less (i, 1);
51  return 1.;
52 }

◆ shape() [5/125]

Real libMesh::FE< 0, HERMITE >::shape ( const Elem ,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point ,
const bool   
)
inherited

Definition at line 44 of file fe_hermite_shape_0D.C.

49 {
50  libmesh_assert_less (i, 1);
51  return 1.;
52 }

◆ shape() [6/125]

Real libMesh::FE< 0, RATIONAL_BERNSTEIN >::shape ( const Elem ,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point ,
const bool   
)
inherited

Definition at line 44 of file fe_rational_shape_0D.C.

49 {
50  libmesh_assert_less (i, 1);
51  return 1.;
52 }

◆ shape() [7/125]

Real libMesh::FE< 0, SZABAB >::shape ( const Elem ,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point ,
const bool   
)
inherited

Definition at line 44 of file fe_szabab_shape_0D.C.

49 {
50  libmesh_assert_less (i, 1);
51  return 1.;
52 }

◆ shape() [8/125]

Real libMesh::FE< 0, CLOUGH >::shape ( const Elem ,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point ,
const bool   
)
inherited

Definition at line 44 of file fe_clough_shape_0D.C.

49 {
50  libmesh_assert_less (i, 1);
51  return 1.;
52 }

◆ shape() [9/125]

Real libMesh::FE< 0, BERNSTEIN >::shape ( const Elem ,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point ,
const bool   
)
inherited

Definition at line 44 of file fe_bernstein_shape_0D.C.

49 {
50  libmesh_assert_less (i, 1);
51  return 1.;
52 }

◆ shape() [10/125]

Real libMesh::FE< 0, L2_LAGRANGE >::shape ( const Elem ,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point ,
const bool   
)
inherited

Definition at line 64 of file fe_lagrange_shape_0D.C.

69 {
70  libmesh_assert_less (i, 1);
71  return 1.;
72 }

◆ shape() [11/125]

Real libMesh::FE< 0, L2_HIERARCHIC >::shape ( const Elem ,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point ,
const bool   
)
inherited

Definition at line 65 of file fe_hierarchic_shape_0D.C.

70 {
71  libmesh_assert_less (i, 1);
72  return 1.;
73 }

◆ shape() [12/125]

Real libMesh::FE< 2, SCALAR >::shape ( const Elem ,
const  Order,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 38 of file fe_scalar_shape_2D.C.

43 {
44  return 1.;
45 }

◆ shape() [13/125]

Real libMesh::FE< 1, SCALAR >::shape ( const Elem ,
const  Order,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 38 of file fe_scalar_shape_1D.C.

43 {
44  return 1.;
45 }

◆ shape() [14/125]

Real libMesh::FE< 0, SCALAR >::shape ( const Elem ,
const  Order,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 38 of file fe_scalar_shape_0D.C.

43 {
44  return 1.;
45 }

◆ shape() [15/125]

Real libMesh::FE< 3, SCALAR >::shape ( const Elem ,
const  Order,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 38 of file fe_scalar_shape_3D.C.

43 {
44  return 1.;
45 }

◆ shape() [16/125]

Real libMesh::FE< 3, SZABAB >::shape ( const Elem ,
const  Order,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 44 of file fe_szabab_shape_3D.C.

49 {
50  libmesh_error_msg("Szabo-Babuska polynomials are not defined in 3D");
51  return 0.;
52 }

◆ shape() [17/125]

RealGradient libMesh::FE< 0, NEDELEC_ONE >::shape ( const Elem ,
const  Order,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 591 of file fe_nedelec_one.C.

592 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ shape() [18/125]

RealGradient libMesh::FE< 1, NEDELEC_ONE >::shape ( const Elem ,
const  Order,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 618 of file fe_nedelec_one.C.

619 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ shape() [19/125]

Real libMesh::FE< 1, HERMITE >::shape ( const Elem elem,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const Point p,
const bool  libmesh_dbg_varadd_p_level 
)
inherited

Definition at line 197 of file fe_hermite_shape_1D.C.

202 {
203  libmesh_assert(elem);
204 
205  // Coefficient naming: d(1)d(2n) is the coefficient of the
206  // global shape function corresponding to value 1 in terms of the
207  // local shape function corresponding to normal derivative 2
208  Real d1xd1x, d2xd2x;
209 
210  hermite_compute_coefs(elem, d1xd1x, d2xd2x);
211 
212  const ElemType type = elem->type();
213 
214 #ifndef NDEBUG
215  const unsigned int totalorder =
216  order + add_p_level * elem->p_level();
217 #endif
218 
219  switch (type)
220  {
221  // C1 functions on the C1 cubic edge
222  case EDGE2:
223  case EDGE3:
224  {
225  libmesh_assert_less (i, totalorder+1);
226 
227  switch (i)
228  {
229  case 0:
230  return FEHermite<1>::hermite_raw_shape(0, p(0));
231  case 1:
232  return d1xd1x * FEHermite<1>::hermite_raw_shape(2, p(0));
233  case 2:
234  return FEHermite<1>::hermite_raw_shape(1, p(0));
235  case 3:
236  return d2xd2x * FEHermite<1>::hermite_raw_shape(3, p(0));
237  default:
238  return FEHermite<1>::hermite_raw_shape(i, p(0));
239  }
240  }
241  default:
242  libmesh_error_msg("ERROR: Unsupported element type = " << type);
243  }
244 }

◆ shape() [20/125]

Real libMesh::FE< 1, XYZ >::shape ( const Elem elem,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const Point point_in,
const bool  libmesh_dbg_varadd_p_level 
)
inherited

Definition at line 44 of file fe_xyz_shape_1D.C.

49 {
50  libmesh_assert(elem);
51  libmesh_assert_less_equal (i, order + add_p_level * elem->p_level());
52 
53  Point centroid = elem->centroid();
54  Real max_distance = 0.;
55  for (const Point & p : elem->node_ref_range())
56  {
57  const Real distance = std::abs(centroid(0) - p(0));
58  max_distance = std::max(distance, max_distance);
59  }
60 
61  const Real x = point_in(0);
62  const Real xc = centroid(0);
63  const Real dx = (x - xc)/max_distance;
64 
65  // monomials. since they are hierarchic we only need one case block.
66  switch (i)
67  {
68  case 0:
69  return 1.;
70 
71  case 1:
72  return dx;
73 
74  case 2:
75  return dx*dx;
76 
77  case 3:
78  return dx*dx*dx;
79 
80  case 4:
81  return dx*dx*dx*dx;
82 
83  default:
84  Real val = 1.;
85  for (unsigned int index = 0; index != i; ++index)
86  val *= dx;
87  return val;
88  }
89 }

◆ shape() [21/125]

Real libMesh::FE< 2, XYZ >::shape ( const Elem elem,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const Point point_in,
const bool  libmesh_dbg_varadd_p_level 
)
inherited

Definition at line 44 of file fe_xyz_shape_2D.C.

49 {
50 #if LIBMESH_DIM > 1
51 
52  libmesh_assert(elem);
53 
54  Point centroid = elem->centroid();
55  Point max_distance = Point(0.,0.,0.);
56  for (const Point & p : elem->node_ref_range())
57  for (unsigned int d = 0; d < 2; d++)
58  {
59  const Real distance = std::abs(centroid(d) - p(d));
60  max_distance(d) = std::max(distance, max_distance(d));
61  }
62 
63  const Real x = point_in(0);
64  const Real y = point_in(1);
65  const Real xc = centroid(0);
66  const Real yc = centroid(1);
67  const Real distx = max_distance(0);
68  const Real disty = max_distance(1);
69  const Real dx = (x - xc)/distx;
70  const Real dy = (y - yc)/disty;
71 
72 #ifndef NDEBUG
73  // totalorder is only used in the assertion below, so
74  // we avoid declaring it when asserts are not active.
75  const unsigned int totalorder = order + add_p_level * elem->p_level();
76 #endif
77  libmesh_assert_less (i, (totalorder+1)*(totalorder+2)/2);
78 
79 
80  // monomials. since they are hierarchic we only need one case block.
81  switch (i)
82  {
83  // constant
84  case 0:
85  return 1.;
86 
87  // linear
88  case 1:
89  return dx;
90 
91  case 2:
92  return dy;
93 
94  // quadratics
95  case 3:
96  return dx*dx;
97 
98  case 4:
99  return dx*dy;
100 
101  case 5:
102  return dy*dy;
103 
104  // cubics
105  case 6:
106  return dx*dx*dx;
107 
108  case 7:
109  return dx*dx*dy;
110 
111  case 8:
112  return dx*dy*dy;
113 
114  case 9:
115  return dy*dy*dy;
116 
117  // quartics
118  case 10:
119  return dx*dx*dx*dx;
120 
121  case 11:
122  return dx*dx*dx*dy;
123 
124  case 12:
125  return dx*dx*dy*dy;
126 
127  case 13:
128  return dx*dy*dy*dy;
129 
130  case 14:
131  return dy*dy*dy*dy;
132 
133  default:
134  unsigned int o = 0;
135  for (; i >= (o+1)*(o+2)/2; o++) { }
136  unsigned int i2 = i - (o*(o+1)/2);
137  Real val = 1.;
138  for (unsigned int index=i2; index != o; index++)
139  val *= dx;
140  for (unsigned int index=0; index != i2; index++)
141  val *= dy;
142  return val;
143  }
144 
145 #else // LIBMESH_DIM <= 1
146  libmesh_assert(true || order || add_p_level);
147  libmesh_ignore(elem, i, point_in);
148  libmesh_not_implemented();
149 #endif
150 }

◆ shape() [22/125]

Real libMesh::FE< 3, XYZ >::shape ( const Elem elem,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const Point point_in,
const bool  libmesh_dbg_varadd_p_level 
)
inherited

Definition at line 44 of file fe_xyz_shape_3D.C.

49 {
50 #if LIBMESH_DIM == 3
51  libmesh_assert(elem);
52 
53  Point centroid = elem->centroid();
54  Point max_distance = Point(0.,0.,0.);
55  for (unsigned int p = 0; p < elem->n_nodes(); p++)
56  for (unsigned int d = 0; d < 3; d++)
57  {
58  const Real distance = std::abs(centroid(d) - elem->point(p)(d));
59  max_distance(d) = std::max(distance, max_distance(d));
60  }
61 
62  const Real x = point_in(0);
63  const Real y = point_in(1);
64  const Real z = point_in(2);
65  const Real xc = centroid(0);
66  const Real yc = centroid(1);
67  const Real zc = centroid(2);
68  const Real distx = max_distance(0);
69  const Real disty = max_distance(1);
70  const Real distz = max_distance(2);
71  const Real dx = (x - xc)/distx;
72  const Real dy = (y - yc)/disty;
73  const Real dz = (z - zc)/distz;
74 
75 #ifndef NDEBUG
76  // totalorder is only used in the assertion below, so
77  // we avoid declaring it when asserts are not active.
78  const unsigned int totalorder = order + add_p_level * elem->p_level();
79 #endif
80  libmesh_assert_less (i, (totalorder+1) * (totalorder+2) *
81  (totalorder+3)/6);
82 
83  // monomials. since they are hierarchic we only need one case block.
84  switch (i)
85  {
86  // constant
87  case 0:
88  return 1.;
89 
90  // linears
91  case 1:
92  return dx;
93 
94  case 2:
95  return dy;
96 
97  case 3:
98  return dz;
99 
100  // quadratics
101  case 4:
102  return dx*dx;
103 
104  case 5:
105  return dx*dy;
106 
107  case 6:
108  return dy*dy;
109 
110  case 7:
111  return dx*dz;
112 
113  case 8:
114  return dz*dy;
115 
116  case 9:
117  return dz*dz;
118 
119  // cubics
120  case 10:
121  return dx*dx*dx;
122 
123  case 11:
124  return dx*dx*dy;
125 
126  case 12:
127  return dx*dy*dy;
128 
129  case 13:
130  return dy*dy*dy;
131 
132  case 14:
133  return dx*dx*dz;
134 
135  case 15:
136  return dx*dy*dz;
137 
138  case 16:
139  return dy*dy*dz;
140 
141  case 17:
142  return dx*dz*dz;
143 
144  case 18:
145  return dy*dz*dz;
146 
147  case 19:
148  return dz*dz*dz;
149 
150  // quartics
151  case 20:
152  return dx*dx*dx*dx;
153 
154  case 21:
155  return dx*dx*dx*dy;
156 
157  case 22:
158  return dx*dx*dy*dy;
159 
160  case 23:
161  return dx*dy*dy*dy;
162 
163  case 24:
164  return dy*dy*dy*dy;
165 
166  case 25:
167  return dx*dx*dx*dz;
168 
169  case 26:
170  return dx*dx*dy*dz;
171 
172  case 27:
173  return dx*dy*dy*dz;
174 
175  case 28:
176  return dy*dy*dy*dz;
177 
178  case 29:
179  return dx*dx*dz*dz;
180 
181  case 30:
182  return dx*dy*dz*dz;
183 
184  case 31:
185  return dy*dy*dz*dz;
186 
187  case 32:
188  return dx*dz*dz*dz;
189 
190  case 33:
191  return dy*dz*dz*dz;
192 
193  case 34:
194  return dz*dz*dz*dz;
195 
196  default:
197  unsigned int o = 0;
198  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
199  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
200  unsigned int block=o, nz = 0;
201  for (; block < i2; block += (o-nz+1)) { nz++; }
202  const unsigned int nx = block - i2;
203  const unsigned int ny = o - nx - nz;
204  Real val = 1.;
205  for (unsigned int index=0; index != nx; index++)
206  val *= dx;
207  for (unsigned int index=0; index != ny; index++)
208  val *= dy;
209  for (unsigned int index=0; index != nz; index++)
210  val *= dz;
211  return val;
212  }
213 
214 #else // LIBMESH_DIM != 3
215  libmesh_assert(true || order || add_p_level);
216  libmesh_ignore(elem, i, point_in);
217  libmesh_not_implemented();
218 #endif
219 }

◆ shape() [23/125]

static OutputShape libMesh::FE< Dim, T >::shape ( const Elem elem,
const Order  o,
const unsigned int  i,
const Point p,
const bool  add_p_level = true 
)
staticinherited
Returns
The value of the \( i^{th} \) shape function at point p. This method allows you to specify the dimension, element type, and order directly. This allows the method to be static.

On a p-refined element, o should be the base order of the element if add_p_level is left true, or can be the base order of the element if add_p_level is set to false.

◆ shape() [24/125]

RealGradient libMesh::FE< 3, NEDELEC_ONE >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 41 of file fe_nedelec_one_shape_3D.C.

46 {
47 #if LIBMESH_DIM == 3
48  libmesh_assert(elem);
49 
50  const Order totalorder = static_cast<Order>(order + add_p_level * elem->p_level());
51 
52  switch (totalorder)
53  {
54  // linear Lagrange shape functions
55  case FIRST:
56  {
57  switch (elem->type())
58  {
59  case HEX20:
60  case HEX27:
61  {
62  libmesh_assert_less (i, 12);
63 
64  const Real xi = p(0);
65  const Real eta = p(1);
66  const Real zeta = p(2);
67 
68  // Even with a loose inverse_map tolerance we ought to
69  // be nearly on the element interior in master
70  // coordinates
71  libmesh_assert_less_equal ( std::fabs(xi), 1.0+10*TOLERANCE );
72  libmesh_assert_less_equal ( std::fabs(eta), 1.0+10*TOLERANCE );
73  libmesh_assert_less_equal ( std::fabs(zeta), 1.0+10*TOLERANCE );
74 
75  switch(i)
76  {
77  case 0:
78  {
79  if (elem->point(0) > elem->point(1))
80  return RealGradient( -0.125*(1.0-eta-zeta+eta*zeta), 0.0, 0.0 );
81  else
82  return RealGradient( 0.125*(1.0-eta-zeta+eta*zeta), 0.0, 0.0 );
83  }
84  case 1:
85  {
86  if (elem->point(1) > elem->point(2))
87  return RealGradient( 0.0, -0.125*(1.0+xi-zeta-xi*zeta), 0.0 );
88  else
89  return RealGradient( 0.0, 0.125*(1.0+xi-zeta-xi*zeta), 0.0 );
90  }
91  case 2:
92  {
93  if (elem->point(2) > elem->point(3))
94  return RealGradient( 0.125*(1.0+eta-zeta-eta*zeta), 0.0, 0.0 );
95  else
96  return RealGradient( -0.125*(1.0+eta-zeta-eta*zeta), 0.0, 0.0 );
97  }
98  case 3:
99  {
100  if (elem->point(3) > elem->point(0))
101  return RealGradient( 0.0, 0.125*(1.0-xi-zeta+xi*zeta), 0.0 );
102  else
103  return RealGradient( 0.0, -0.125*(1.0-xi-zeta+xi*zeta), 0.0 );
104  }
105  case 4:
106  {
107  if (elem->point(0) > elem->point(4))
108  return RealGradient( 0.0, 0.0, -0.125*(1.0-xi-eta+xi*eta) );
109  else
110  return RealGradient( 0.0, 0.0, 0.125*(1.0-xi-eta+xi*eta) );
111  }
112  case 5:
113  {
114  if (elem->point(1) > elem->point(5))
115  return RealGradient( 0.0, 0.0, -0.125*(1.0+xi-eta-xi*eta) );
116  else
117  return RealGradient( 0.0, 0.0, 0.125*(1.0+xi-eta-xi*eta) );
118  }
119  case 6:
120  {
121  if (elem->point(2) > elem->point(6))
122  return RealGradient( 0.0, 0.0, -0.125*(1.0+xi+eta+xi*eta) );
123  else
124  return RealGradient( 0.0, 0.0, 0.125*(1.0+xi+eta+xi*eta) );
125  }
126  case 7:
127  {
128  if (elem->point(3) > elem->point(7))
129  return RealGradient( 0.0, 0.0, -0.125*(1.0-xi+eta-xi*eta) );
130  else
131  return RealGradient( 0.0, 0.0, 0.125*(1.0-xi+eta-xi*eta) );
132  }
133  case 8:
134  {
135  if (elem->point(4) > elem->point(5))
136  return RealGradient( -0.125*(1.0-eta+zeta-eta*zeta), 0.0, 0.0 );
137  else
138  return RealGradient( 0.125*(1.0-eta+zeta-eta*zeta), 0.0, 0.0 );
139  }
140  case 9:
141  {
142  if (elem->point(5) > elem->point(6))
143  return RealGradient( 0.0, -0.125*(1.0+xi+zeta+xi*zeta), 0.0 );
144  else
145  return RealGradient( 0.0, 0.125*(1.0+xi+zeta+xi*zeta), 0.0 );
146  }
147  case 10:
148  {
149  if (elem->point(7) > elem->point(6))
150  return RealGradient( -0.125*(1.0+eta+zeta+eta*zeta), 0.0, 0.0 );
151  else
152  return RealGradient( 0.125*(1.0+eta+zeta+eta*zeta), 0.0, 0.0 );
153  }
154  case 11:
155  {
156  if (elem->point(4) > elem->point(7))
157  return RealGradient( 0.0, -0.125*(1.0-xi+zeta-xi*zeta), 0.0 );
158  else
159  return RealGradient( 0.0, 0.125*(1.0-xi+zeta-xi*zeta), 0.0 );
160  }
161 
162  default:
163  libmesh_error_msg("Invalid i = " << i);
164  }
165 
166  return RealGradient();
167  }
168 
169  case TET10:
170  {
171  libmesh_assert_less (i, 6);
172 
173  libmesh_not_implemented();
174  return RealGradient();
175  }
176 
177  default:
178  libmesh_error_msg("ERROR: Unsupported 3D element type!: " << elem->type());
179  }
180  }
181 
182  // unsupported order
183  default:
184  libmesh_error_msg("ERROR: Unsupported 3D FE order!: " << totalorder);
185  }
186 #else // LIBMESH_DIM != 3
187  libmesh_ignore(elem, order, i, p, add_p_level);
188  libmesh_not_implemented();
189 #endif
190 }

◆ shape() [25/125]

RealGradient libMesh::FE< 2, NEDELEC_ONE >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 42 of file fe_nedelec_one_shape_2D.C.

47 {
48 #if LIBMESH_DIM > 1
49  libmesh_assert(elem);
50 
51  const Order total_order = static_cast<Order>(order + add_p_level * elem->p_level());
52 
53  switch (total_order)
54  {
55  case FIRST:
56  {
57  switch (elem->type())
58  {
59  case QUAD8:
60  case QUAD9:
61  {
62  libmesh_assert_less (i, 4);
63 
64  const Real xi = p(0);
65  const Real eta = p(1);
66 
67  // Even with a loose inverse_map tolerance we ought to
68  // be nearly on the element interior in master
69  // coordinates
70  libmesh_assert_less_equal ( std::fabs(xi), 1.0+10*TOLERANCE );
71  libmesh_assert_less_equal ( std::fabs(eta), 1.0+10*TOLERANCE );
72 
73  switch(i)
74  {
75  case 0:
76  {
77  if (elem->point(0) > elem->point(1))
78  return RealGradient( -0.25*(1.0-eta), 0.0 );
79  else
80  return RealGradient( 0.25*(1.0-eta), 0.0 );
81  }
82  case 1:
83  {
84  if (elem->point(1) > elem->point(2))
85  return RealGradient( 0.0, -0.25*(1.0+xi) );
86  else
87  return RealGradient( 0.0, 0.25*(1.0+xi) );
88  }
89 
90  case 2:
91  {
92  if (elem->point(2) > elem->point(3))
93  return RealGradient( 0.25*(1.0+eta), 0.0 );
94  else
95  return RealGradient( -0.25*(1.0+eta), 0.0 );
96  }
97  case 3:
98  {
99  if (elem->point(3) > elem->point(0))
100  return RealGradient( 0.0, -0.25*(xi-1.0) );
101  else
102  return RealGradient( 0.0, 0.25*(xi-1.0) );
103  }
104 
105  default:
106  libmesh_error_msg("Invalid i = " << i);
107  }
108 
109  return RealGradient();
110  }
111 
112  case TRI6:
113  {
114  const Real xi = p(0);
115  const Real eta = p(1);
116 
117  libmesh_assert_less (i, 3);
118 
119  switch(i)
120  {
121  case 0:
122  {
123  if (elem->point(0) > elem->point(1))
124  return RealGradient( -1.0+eta, -xi );
125  else
126  return RealGradient( 1.0-eta, xi );
127  }
128  case 1:
129  {
130  if (elem->point(1) > elem->point(2))
131  return RealGradient( eta, -xi );
132  else
133  return RealGradient( -eta, xi );
134  }
135 
136  case 2:
137  {
138  if (elem->point(2) > elem->point(0))
139  return RealGradient( eta, -xi+1.0 );
140  else
141  return RealGradient( -eta, xi-1.0 );
142  }
143 
144  default:
145  libmesh_error_msg("Invalid i = " << i);
146  }
147  }
148 
149  default:
150  libmesh_error_msg("ERROR: Unsupported 2D element type!: " << elem->type());
151  }
152  }
153 
154  // unsupported order
155  default:
156  libmesh_error_msg("ERROR: Unsupported 2D FE order!: " << total_order);
157  }
158 #else // LIBMESH_DIM > 1
159  libmesh_ignore(elem, order, i, p, add_p_level);
160  libmesh_not_implemented();
161 #endif
162 }

◆ shape() [26/125]

Real libMesh::FE< 2, BERNSTEIN >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 46 of file fe_bernstein_shape_2D.C.

51 {
52  libmesh_assert(elem);
53 
54  const ElemType type = elem->type();
55 
56  const Order totalorder =
57  static_cast<Order>(order + add_p_level * elem->p_level());
58 
59  // Declare that we are using our own special power function
60  // from the Utility namespace. This saves typing later.
61  using Utility::pow;
62 
63  switch (type)
64  {
65  // Hierarchic shape functions on the quadrilateral.
66  case QUAD4:
67  case QUADSHELL4:
68  case QUAD9:
69  {
70  // Compute quad shape functions as a tensor-product
71  const Real xi = p(0);
72  const Real eta = p(1);
73 
74  libmesh_assert_less (i, (totalorder+1u)*(totalorder+1u));
75 
76  // Example i, i0, i1 values for totalorder = 5:
77  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
78  // static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 4, 5, 1, 1, 1, 1, 2, 3, 4, 5, 0, 0, 0, 0, 2, 3, 3, 2, 4, 4, 4, 3, 2, 5, 5, 5, 5, 4, 3, 2};
79  // static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 0, 0, 2, 3, 4, 5, 1, 1, 1, 1, 2, 3, 4, 5, 2, 2, 3, 3, 2, 3, 4, 4, 4, 2, 3, 4, 5, 5, 5, 5};
80 
81  unsigned int i0, i1;
82 
83  // Vertex DoFs
84  if (i == 0)
85  { i0 = 0; i1 = 0; }
86  else if (i == 1)
87  { i0 = 1; i1 = 0; }
88  else if (i == 2)
89  { i0 = 1; i1 = 1; }
90  else if (i == 3)
91  { i0 = 0; i1 = 1; }
92 
93 
94  // Edge DoFs
95  else if (i < totalorder + 3u)
96  { i0 = i - 2; i1 = 0; }
97  else if (i < 2u*totalorder + 2)
98  { i0 = 1; i1 = i - totalorder - 1; }
99  else if (i < 3u*totalorder + 1)
100  { i0 = i - 2u*totalorder; i1 = 1; }
101  else if (i < 4u*totalorder)
102  { i0 = 0; i1 = i - 3u*totalorder + 1; }
103  // Interior DoFs. Use Roy's number look up
104  else
105  {
106  unsigned int basisnum = i - 4*totalorder;
107  i0 = square_number_column[basisnum] + 2;
108  i1 = square_number_row[basisnum] + 2;
109  }
110 
111 
112  // Flip odd degree of freedom values if necessary
113  // to keep continuity on sides.
114  if ((i>= 4 && i<= 4+ totalorder-2u) && elem->point(0) > elem->point(1)) i0=totalorder+2-i0;//
115  else if ((i>= 4+ totalorder-1u && i<= 4+2*totalorder-3u) && elem->point(1) > elem->point(2)) i1=totalorder+2-i1;
116  else if ((i>= 4+2*totalorder-2u && i<= 4+3*totalorder-4u) && elem->point(3) > elem->point(2)) i0=totalorder+2-i0;
117  else if ((i>= 4+3*totalorder-3u && i<= 4+4*totalorder-5u) && elem->point(0) > elem->point(3)) i1=totalorder+2-i1;
118 
119 
120  return (FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i0, xi)*
121  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i1, eta));
122  }
123  // handle serendipity QUAD8 element separately
124  case QUAD8:
125  case QUADSHELL8:
126  {
127  libmesh_assert_less (totalorder, 3);
128 
129  const Real xi = p(0);
130  const Real eta = p(1);
131 
132  libmesh_assert_less (i, 8);
133 
134  // 0 1 2 3 4 5 6 7 8
135  static const unsigned int i0[] = {0, 1, 1, 0, 2, 1, 2, 0, 2};
136  static const unsigned int i1[] = {0, 0, 1, 1, 0, 2, 1, 2, 2};
137  static const Real scal[] = {-0.25, -0.25, -0.25, -0.25, 0.5, 0.5, 0.5, 0.5};
138 
139  //B_t,i0(i)|xi * B_s,i1(i)|eta + scal(i) * B_t,2|xi * B_t,2|eta
140  return (FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i0[i], xi)*
141  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i1[i], eta)
142  +scal[i]*
143  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i0[8], xi)*
144  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i1[8], eta));
145 
146  }
147 
148  case TRI3:
149  case TRISHELL3:
150  libmesh_assert_less (totalorder, 2);
151  libmesh_fallthrough();
152  case TRI6:
153  switch (totalorder)
154  {
155  case FIRST:
156  {
157  const Real x=p(0);
158  const Real y=p(1);
159  const Real r=1.-x-y;
160 
161  libmesh_assert_less (i, 3);
162 
163  switch(i)
164  {
165  case 0: return r; //f0,0,1
166  case 1: return x; //f0,1,1
167  case 2: return y; //f1,0,1
168 
169  default:
170  libmesh_error_msg("Invalid shape function index i = " << i);
171  }
172  }
173  case SECOND:
174  {
175  const Real x=p(0);
176  const Real y=p(1);
177  const Real r=1.-x-y;
178 
179  libmesh_assert_less (i, 6);
180 
181  switch(i)
182  {
183  case 0: return r*r;
184  case 1: return x*x;
185  case 2: return y*y;
186 
187  case 3: return 2.*x*r;
188  case 4: return 2.*x*y;
189  case 5: return 2.*r*y;
190 
191  default:
192  libmesh_error_msg("Invalid shape function index i = " << i);
193  }
194  }
195  case THIRD:
196  {
197  const Real x=p(0);
198  const Real y=p(1);
199  const Real r=1.-x-y;
200  libmesh_assert_less (i, 10);
201 
202  unsigned int shape=i;
203 
204 
205  if ((i==3||i==4) && elem->point(0) > elem->point(1)) shape=7-i;
206  if ((i==5||i==6) && elem->point(1) > elem->point(2)) shape=11-i;
207  if ((i==7||i==8) && elem->point(0) > elem->point(2)) shape=15-i;
208 
209  switch(shape)
210  {
211  case 0: return r*r*r;
212  case 1: return x*x*x;
213  case 2: return y*y*y;
214 
215  case 3: return 3.*x*r*r;
216  case 4: return 3.*x*x*r;
217 
218  case 5: return 3.*y*x*x;
219  case 6: return 3.*y*y*x;
220 
221  case 7: return 3.*y*r*r;
222  case 8: return 3.*y*y*r;
223 
224  case 9: return 6.*x*y*r;
225 
226  default:
227  libmesh_error_msg("Invalid shape function index shape = " << shape);
228  }
229  }
230  case FOURTH:
231  {
232  const Real x=p(0);
233  const Real y=p(1);
234  const Real r=1-x-y;
235  unsigned int shape=i;
236 
237  libmesh_assert_less (i, 15);
238 
239  if ((i==3||i== 5) && elem->point(0) > elem->point(1)) shape=8-i;
240  if ((i==6||i== 8) && elem->point(1) > elem->point(2)) shape=14-i;
241  if ((i==9||i==11) && elem->point(0) > elem->point(2)) shape=20-i;
242 
243 
244  switch(shape)
245  {
246  // point functions
247  case 0: return r*r*r*r;
248  case 1: return x*x*x*x;
249  case 2: return y*y*y*y;
250 
251  // edge functions
252  case 3: return 4.*x*r*r*r;
253  case 4: return 6.*x*x*r*r;
254  case 5: return 4.*x*x*x*r;
255 
256  case 6: return 4.*y*x*x*x;
257  case 7: return 6.*y*y*x*x;
258  case 8: return 4.*y*y*y*x;
259 
260  case 9: return 4.*y*r*r*r;
261  case 10: return 6.*y*y*r*r;
262  case 11: return 4.*y*y*y*r;
263 
264  // inner functions
265  case 12: return 12.*x*y*r*r;
266  case 13: return 12.*x*x*y*r;
267  case 14: return 12.*x*y*y*r;
268 
269  default:
270  libmesh_error_msg("Invalid shape function index shape = " << shape);
271  }
272  }
273  case FIFTH:
274  {
275  const Real x=p(0);
276  const Real y=p(1);
277  const Real r=1-x-y;
278  unsigned int shape=i;
279 
280  libmesh_assert_less (i, 21);
281 
282  if ((i>= 3&&i<= 6) && elem->point(0) > elem->point(1)) shape=9-i;
283  if ((i>= 7&&i<=10) && elem->point(1) > elem->point(2)) shape=17-i;
284  if ((i>=11&&i<=14) && elem->point(0) > elem->point(2)) shape=25-i;
285 
286  switch(shape)
287  {
288  //point functions
289  case 0: return pow<5>(r);
290  case 1: return pow<5>(x);
291  case 2: return pow<5>(y);
292 
293  //edge functions
294  case 3: return 5.*x *pow<4>(r);
295  case 4: return 10.*pow<2>(x)*pow<3>(r);
296  case 5: return 10.*pow<3>(x)*pow<2>(r);
297  case 6: return 5.*pow<4>(x)*r;
298 
299  case 7: return 5.*y *pow<4>(x);
300  case 8: return 10.*pow<2>(y)*pow<3>(x);
301  case 9: return 10.*pow<3>(y)*pow<2>(x);
302  case 10: return 5.*pow<4>(y)*x;
303 
304  case 11: return 5.*y *pow<4>(r);
305  case 12: return 10.*pow<2>(y)*pow<3>(r);
306  case 13: return 10.*pow<3>(y)*pow<2>(r);
307  case 14: return 5.*pow<4>(y)*r;
308 
309  //inner functions
310  case 15: return 20.*x*y*pow<3>(r);
311  case 16: return 30.*x*pow<2>(y)*pow<2>(r);
312  case 17: return 30.*pow<2>(x)*y*pow<2>(r);
313  case 18: return 20.*x*pow<3>(y)*r;
314  case 19: return 20.*pow<3>(x)*y*r;
315  case 20: return 30.*pow<2>(x)*pow<2>(y)*r;
316 
317  default:
318  libmesh_error_msg("Invalid shape function index shape = " << shape);
319  }
320  }
321  case SIXTH:
322  {
323  const Real x=p(0);
324  const Real y=p(1);
325  const Real r=1-x-y;
326  unsigned int shape=i;
327 
328  libmesh_assert_less (i, 28);
329 
330  if ((i>= 3&&i<= 7) && elem->point(0) > elem->point(1)) shape=10-i;
331  if ((i>= 8&&i<=12) && elem->point(1) > elem->point(2)) shape=20-i;
332  if ((i>=13&&i<=17) && elem->point(0) > elem->point(2)) shape=30-i;
333 
334  switch(shape)
335  {
336  //point functions
337  case 0: return pow<6>(r);
338  case 1: return pow<6>(x);
339  case 2: return pow<6>(y);
340 
341  //edge functions
342  case 3: return 6.*x *pow<5>(r);
343  case 4: return 15.*pow<2>(x)*pow<4>(r);
344  case 5: return 20.*pow<3>(x)*pow<3>(r);
345  case 6: return 15.*pow<4>(x)*pow<2>(r);
346  case 7: return 6.*pow<5>(x)*r;
347 
348  case 8: return 6.*y *pow<5>(x);
349  case 9: return 15.*pow<2>(y)*pow<4>(x);
350  case 10: return 20.*pow<3>(y)*pow<3>(x);
351  case 11: return 15.*pow<4>(y)*pow<2>(x);
352  case 12: return 6.*pow<5>(y)*x;
353 
354  case 13: return 6.*y *pow<5>(r);
355  case 14: return 15.*pow<2>(y)*pow<4>(r);
356  case 15: return 20.*pow<3>(y)*pow<3>(r);
357  case 16: return 15.*pow<4>(y)*pow<2>(r);
358  case 17: return 6.*pow<5>(y)*r;
359 
360  //inner functions
361  case 18: return 30.*x*y*pow<4>(r);
362  case 19: return 60.*x*pow<2>(y)*pow<3>(r);
363  case 20: return 60.* pow<2>(x)*y*pow<3>(r);
364  case 21: return 60.*x*pow<3>(y)*pow<2>(r);
365  case 22: return 60.*pow<3>(x)*y*pow<2>(r);
366  case 23: return 90.*pow<2>(x)*pow<2>(y)*pow<2>(r);
367  case 24: return 30.*x*pow<4>(y)*r;
368  case 25: return 60.*pow<2>(x)*pow<3>(y)*r;
369  case 26: return 60.*pow<3>(x)*pow<2>(y)*r;
370  case 27: return 30.*pow<4>(x)*y*r;
371 
372  default:
373  libmesh_error_msg("Invalid shape function index shape = " << shape);
374  } // switch shape
375  } // case TRI6
376  default:
377  libmesh_error_msg("Invalid totalorder = " << totalorder);
378  } // switch order
379 
380  default:
381  libmesh_error_msg("ERROR: Unsupported element type = " << type);
382  } // switch type
383 }

◆ shape() [27/125]

Real libMesh::FE< 1, LAGRANGE >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 47 of file fe_lagrange_shape_1D.C.

52 {
53  libmesh_assert(elem);
54 
55  return fe_lagrange_1D_shape(static_cast<Order>(order + add_p_level * elem->p_level()), i, p(0));
56 }

◆ shape() [28/125]

Real libMesh::FE< 3, BERNSTEIN >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 48 of file fe_bernstein_shape_3D.C.

53 {
54 
55 #if LIBMESH_DIM == 3
56 
57  libmesh_assert(elem);
58  const ElemType type = elem->type();
59 
60  const Order totalorder =
61  static_cast<Order>(order + add_p_level * elem->p_level());
62 
63  switch (totalorder)
64  {
65  // 1st order Bernstein.
66  case FIRST:
67  {
68  switch (type)
69  {
70 
71  // Bernstein shape functions on the tetrahedron.
72  case TET4:
73  case TET10:
74  {
75  libmesh_assert_less (i, 4);
76 
77  // Area coordinates
78  const Real zeta1 = p(0);
79  const Real zeta2 = p(1);
80  const Real zeta3 = p(2);
81  const Real zeta0 = 1. - zeta1 - zeta2 - zeta3;
82 
83  switch(i)
84  {
85  case 0: return zeta0;
86  case 1: return zeta1;
87  case 2: return zeta2;
88  case 3: return zeta3;
89 
90  default:
91  libmesh_error_msg("Invalid shape function index i = " << i);
92  }
93  }
94 
95  // Bernstein shape functions on the hexahedral.
96  case HEX8:
97  case HEX20:
98  case HEX27:
99  {
100  libmesh_assert_less (i, 8);
101 
102  // Compute hex shape functions as a tensor-product
103  const Real xi = p(0);
104  const Real eta = p(1);
105  const Real zeta = p(2);
106 
107  // The only way to make any sense of this
108  // is to look at the mgflo/mg2/mgf documentation
109  // and make the cut-out cube!
110  // 0 1 2 3 4 5 6 7
111  static const unsigned int i0[] = {0, 1, 1, 0, 0, 1, 1, 0};
112  static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 1, 1};
113  static const unsigned int i2[] = {0, 0, 0, 0, 1, 1, 1, 1};
114 
115  return (FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i0[i], xi)*
116  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i1[i], eta)*
117  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i2[i], zeta));
118  }
119 
120 
121  default:
122  libmesh_error_msg("Invalid element type = " << type);
123  }
124  }
125 
126 
127 
128 
129  case SECOND:
130  {
131  switch (type)
132  {
133 
134  // Bernstein shape functions on the tetrahedron.
135  case TET10:
136  {
137  libmesh_assert_less (i, 10);
138 
139  // Area coordinates
140  const Real zeta1 = p(0);
141  const Real zeta2 = p(1);
142  const Real zeta3 = p(2);
143  const Real zeta0 = 1. - zeta1 - zeta2 - zeta3;
144 
145  switch(i)
146  {
147  case 0: return zeta0*zeta0;
148  case 1: return zeta1*zeta1;
149  case 2: return zeta2*zeta2;
150  case 3: return zeta3*zeta3;
151  case 4: return 2.*zeta0*zeta1;
152  case 5: return 2.*zeta1*zeta2;
153  case 6: return 2.*zeta0*zeta2;
154  case 7: return 2.*zeta3*zeta0;
155  case 8: return 2.*zeta1*zeta3;
156  case 9: return 2.*zeta2*zeta3;
157 
158  default:
159  libmesh_error_msg("Invalid shape function index i = " << i);
160  }
161  }
162 
163  // Bernstein shape functions on the 20-noded hexahedral.
164  case HEX20:
165  {
166  libmesh_assert_less (i, 20);
167 
168  // Compute hex shape functions as a tensor-product
169  const Real xi = p(0);
170  const Real eta = p(1);
171  const Real zeta = p(2);
172 
173  // The only way to make any sense of this
174  // is to look at the mgflo/mg2/mgf documentation
175  // and make the cut-out cube!
176  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
177  static const unsigned int i0[] = {0, 1, 1, 0, 0, 1, 1, 0, 2, 1, 2, 0, 0, 1, 1, 0, 2, 1, 2, 0, 2, 2, 1, 2, 0, 2, 2};
178  static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 2, 1, 2, 0, 0, 1, 1, 0, 2, 1, 2, 2, 0, 2, 1, 2, 2, 2};
179  static const unsigned int i2[] = {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 1, 1, 1, 1, 0, 2, 2, 2, 2, 1, 2};
180  //To compute the hex20 shape functions the original shape functions for hex27 are used.
181  //scalx[i] tells how often the original x-th shape function has to be added to the original i-th shape function
182  //to compute the new i-th shape function for hex20
183  //example: B_0^HEX20 = B_0^HEX27 - 0.25*B_20^HEX27 - 0.25*B_21^HEX27 + 0*B_22^HEX27 + 0*B_23^HEX27 - 0.25*B_24^HEX27 + 0*B_25^HEX27 - 0.25*B_26^HEX27
184  // B_0^HEX20 = B_0^HEX27 + scal20[0]*B_20^HEX27 + scal21[0]*B_21^HEX27 + ...
185  static const Real scal20[] = {-0.25, -0.25, -0.25, -0.25, 0, 0, 0, 0, 0.5, 0.5, 0.5, 0.5, 0, 0, 0, 0, 0, 0, 0, 0};
186  static const Real scal21[] = {-0.25, -0.25, 0, 0, -0.25, -0.25, 0, 0, 0.5, 0, 0, 0, 0.5, 0.5, 0, 0, 0.5, 0, 0, 0};
187  static const Real scal22[] = {0, -0.25, -0.25, 0, 0, -0.25, -0.25, 0, 0, 0.5, 0, 0, 0, 0.5, 0.5, 0, 0, 0.5, 0, 0};
188  static const Real scal23[] = {0, 0, -0.25, -0.25, 0, 0, -0.25, -0.25, 0, 0, 0.5, 0, 0, 0, 0.5, 0.5, 0, 0, 0.5, 0};
189  static const Real scal24[] = {-0.25, 0, 0, -0.25, -0.25, 0, 0, -0.25, 0, 0, 0, 0.5, 0.5, 0, 0, 0.5, 0, 0, 0, 0.5};
190  static const Real scal25[] = {0, 0, 0, 0, -0.25, -0.25, -0.25, -0.25, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0.5, 0.5, 0.5};
191  static const Real scal26[] = {-0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25};
192 
193  return (FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i0[i], xi)*
194  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i1[i], eta)*
195  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i2[i], zeta)
196  +scal20[i]*
197  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i0[20], xi)*
198  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i1[20], eta)*
199  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i2[20], zeta)
200  +scal21[i]*
201  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i0[21], xi)*
202  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i1[21], eta)*
203  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i2[21], zeta)
204  +scal22[i]*
205  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i0[22], xi)*
206  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i1[22], eta)*
207  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i2[22], zeta)
208  +scal23[i]*
209  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i0[23], xi)*
210  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i1[23], eta)*
211  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i2[23], zeta)
212  +scal24[i]*
213  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i0[24], xi)*
214  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i1[24], eta)*
215  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i2[24], zeta)
216  +scal25[i]*
217  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i0[25], xi)*
218  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i1[25], eta)*
219  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i2[25], zeta)
220  +scal26[i]*
221  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i0[26], xi)*
222  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i1[26], eta)*
223  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i2[26], zeta));
224  }
225 
226  // Bernstein shape functions on the hexahedral.
227  case HEX27:
228  {
229  libmesh_assert_less (i, 27);
230 
231  // Compute hex shape functions as a tensor-product
232  const Real xi = p(0);
233  const Real eta = p(1);
234  const Real zeta = p(2);
235 
236  // The only way to make any sense of this
237  // is to look at the mgflo/mg2/mgf documentation
238  // and make the cut-out cube!
239  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
240  static const unsigned int i0[] = {0, 1, 1, 0, 0, 1, 1, 0, 2, 1, 2, 0, 0, 1, 1, 0, 2, 1, 2, 0, 2, 2, 1, 2, 0, 2, 2};
241  static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 2, 1, 2, 0, 0, 1, 1, 0, 2, 1, 2, 2, 0, 2, 1, 2, 2, 2};
242  static const unsigned int i2[] = {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 1, 1, 1, 1, 0, 2, 2, 2, 2, 1, 2};
243 
244  return (FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i0[i], xi)*
245  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i1[i], eta)*
246  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i2[i], zeta));
247  }
248 
249 
250  default:
251  libmesh_error_msg("Invalid element type = " << type);
252  }
253 
254  }
255 
256 
257 
258  // 3rd-order Bernstein.
259  case THIRD:
260  {
261  switch (type)
262  {
263 
264  // // Bernstein shape functions on the tetrahedron.
265  // case TET10:
266  // {
267  // libmesh_assert_less (i, 20);
268 
269  // // Area coordinates
270  // const Real zeta1 = p(0);
271  // const Real zeta2 = p(1);
272  // const Real zeta3 = p(2);
273  // const Real zeta0 = 1. - zeta1 - zeta2 - zeta3;
274 
275 
276  // unsigned int shape=i;
277 
278  // // handle the edge orientation
279 
280  // if ((i== 4||i== 5) && elem->node_id(0) > elem->node_id(1))shape= 9-i; //Edge 0
281  // if ((i== 6||i== 7) && elem->node_id(1) > elem->node_id(2))shape=13-i; //Edge 1
282  // if ((i== 8||i== 9) && elem->node_id(0) > elem->node_id(2))shape=17-i; //Edge 2
283  // if ((i==10||i==11) && elem->node_id(0) > elem->node_id(3))shape=21-i; //Edge 3
284  // if ((i==12||i==13) && elem->node_id(1) > elem->node_id(3))shape=25-i; //Edge 4
285  // if ((i==14||i==15) && elem->node_id(2) > elem->node_id(3))shape=29-i; //Edge 5
286 
287  // // No need to handle face orientation in 3rd order.
288 
289 
290  // switch(shape)
291  // {
292  // //point function
293  // case 0: return zeta0*zeta0*zeta0;
294  // case 1: return zeta1*zeta1*zeta1;
295  // case 2: return zeta2*zeta2*zeta2;
296  // case 3: return zeta3*zeta3*zeta3;
297 
298  // //edge functions
299  // case 4: return 3.*zeta0*zeta0*zeta1;
300  // case 5: return 3.*zeta1*zeta1*zeta0;
301 
302  // case 6: return 3.*zeta1*zeta1*zeta2;
303  // case 7: return 3.*zeta2*zeta2*zeta1;
304 
305  // case 8: return 3.*zeta0*zeta0*zeta2;
306  // case 9: return 3.*zeta2*zeta2*zeta0;
307 
308  // case 10: return 3.*zeta0*zeta0*zeta3;
309  // case 11: return 3.*zeta3*zeta3*zeta0;
310 
311  // case 12: return 3.*zeta1*zeta1*zeta3;
312  // case 13: return 3.*zeta3*zeta3*zeta1;
313 
314  // case 14: return 3.*zeta2*zeta2*zeta3;
315  // case 15: return 3.*zeta3*zeta3*zeta2;
316 
317  // //face functions
318  // case 16: return 6.*zeta0*zeta1*zeta2;
319  // case 17: return 6.*zeta0*zeta1*zeta3;
320  // case 18: return 6.*zeta1*zeta2*zeta3;
321  // case 19: return 6.*zeta2*zeta0*zeta3;
322 
323  // default:
324  // libmesh_error_msg("Invalid shape function index i = " << i);
325  // }
326  // }
327 
328 
329  // Bernstein shape functions on the hexahedral.
330  case HEX27:
331  {
332  libmesh_assert_less (i, 64);
333 
334  // Compute hex shape functions as a tensor-product
335  const Real xi = p(0);
336  const Real eta = p(1);
337  const Real zeta = p(2);
338  Real xi_mapped = p(0);
339  Real eta_mapped = p(1);
340  Real zeta_mapped = p(2);
341 
342  // The only way to make any sense of this
343  // is to look at the mgflo/mg2/mgf documentation
344  // and make the cut-out cube!
345  // Nodes 0 1 2 3 4 5 6 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 20 20 21 21 21 21 22 22 22 22 23 23 23 23 24 24 24 24 25 25 25 25 26 26 26 26 26 26 26 26
346  // DOFS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 18 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 60 62 63
347  static const unsigned int i0[] = {0, 1, 1, 0, 0, 1, 1, 0, 2, 3, 1, 1, 2, 3, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 2, 3, 1, 1, 2, 3, 0, 0, 2, 3, 2, 3, 2, 3, 2, 3, 1, 1, 1, 1, 2, 3, 2, 3, 0, 0, 0, 0, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3};
348  static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 2, 3, 1, 1, 2, 3, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 2, 3, 1, 1, 2, 3, 2, 2, 3, 3, 0, 0, 0, 0, 2, 3, 2, 3, 1, 1, 1, 1, 2, 3, 2, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3};
349  static const unsigned int i2[] = {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 2, 3, 2, 3, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3};
350 
351 
352 
353  // handle the edge orientation
354  {
355  // Edge 0
356  if ((i0[i] >= 2) && (i1[i] == 0) && (i2[i] == 0))
357  {
358  if (elem->point(0) != std::min(elem->point(0), elem->point(1)))
359  xi_mapped = -xi;
360  }
361  // Edge 1
362  else if ((i0[i] == 1) && (i1[i] >= 2) && (i2[i] == 0))
363  {
364  if (elem->point(1) != std::min(elem->point(1), elem->point(2)))
365  eta_mapped = -eta;
366  }
367  // Edge 2
368  else if ((i0[i] >= 2) && (i1[i] == 1) && (i2[i] == 0))
369  {
370  if (elem->point(3) != std::min(elem->point(3), elem->point(2)))
371  xi_mapped = -xi;
372  }
373  // Edge 3
374  else if ((i0[i] == 0) && (i1[i] >= 2) && (i2[i] == 0))
375  {
376  if (elem->point(0) != std::min(elem->point(0), elem->point(3)))
377  eta_mapped = -eta;
378  }
379  // Edge 4
380  else if ((i0[i] == 0) && (i1[i] == 0) && (i2[i] >=2 ))
381  {
382  if (elem->point(0) != std::min(elem->point(0), elem->point(4)))
383  zeta_mapped = -zeta;
384  }
385  // Edge 5
386  else if ((i0[i] == 1) && (i1[i] == 0) && (i2[i] >=2 ))
387  {
388  if (elem->point(1) != std::min(elem->point(1), elem->point(5)))
389  zeta_mapped = -zeta;
390  }
391  // Edge 6
392  else if ((i0[i] == 1) && (i1[i] == 1) && (i2[i] >=2 ))
393  {
394  if (elem->point(2) != std::min(elem->point(2), elem->point(6)))
395  zeta_mapped = -zeta;
396  }
397  // Edge 7
398  else if ((i0[i] == 0) && (i1[i] == 1) && (i2[i] >=2 ))
399  {
400  if (elem->point(3) != std::min(elem->point(3), elem->point(7)))
401  zeta_mapped = -zeta;
402  }
403  // Edge 8
404  else if ((i0[i] >=2 ) && (i1[i] == 0) && (i2[i] == 1))
405  {
406  if (elem->point(4) != std::min(elem->point(4), elem->point(5)))
407  xi_mapped = -xi;
408  }
409  // Edge 9
410  else if ((i0[i] == 1) && (i1[i] >=2 ) && (i2[i] == 1))
411  {
412  if (elem->point(5) != std::min(elem->point(5), elem->point(6)))
413  eta_mapped = -eta;
414  }
415  // Edge 10
416  else if ((i0[i] >=2 ) && (i1[i] == 1) && (i2[i] == 1))
417  {
418  if (elem->point(7) != std::min(elem->point(7), elem->point(6)))
419  xi_mapped = -xi;
420  }
421  // Edge 11
422  else if ((i0[i] == 0) && (i1[i] >=2 ) && (i2[i] == 1))
423  {
424  if (elem->point(4) != std::min(elem->point(4), elem->point(7)))
425  eta_mapped = -eta;
426  }
427  }
428 
429 
430  // handle the face orientation
431  {
432  // Face 0
433  if ((i2[i] == 0) && (i0[i] >= 2) && (i1[i] >= 2))
434  {
435  const Point min_point = std::min(elem->point(1),
436  std::min(elem->point(2),
437  std::min(elem->point(0),
438  elem->point(3))));
439  if (elem->point(0) == min_point)
440  if (elem->point(1) == std::min(elem->point(1), elem->point(3)))
441  {
442  // Case 1
443  xi_mapped = xi;
444  eta_mapped = eta;
445  }
446  else
447  {
448  // Case 2
449  xi_mapped = eta;
450  eta_mapped = xi;
451  }
452 
453  else if (elem->point(3) == min_point)
454  if (elem->point(0) == std::min(elem->point(0), elem->point(2)))
455  {
456  // Case 3
457  xi_mapped = -eta;
458  eta_mapped = xi;
459  }
460  else
461  {
462  // Case 4
463  xi_mapped = xi;
464  eta_mapped = -eta;
465  }
466 
467  else if (elem->point(2) == min_point)
468  if (elem->point(3) == std::min(elem->point(3), elem->point(1)))
469  {
470  // Case 5
471  xi_mapped = -xi;
472  eta_mapped = -eta;
473  }
474  else
475  {
476  // Case 6
477  xi_mapped = -eta;
478  eta_mapped = -xi;
479  }
480 
481  else if (elem->point(1) == min_point)
482  {
483  if (elem->point(2) == std::min(elem->point(2), elem->point(0)))
484  {
485  // Case 7
486  xi_mapped = eta;
487  eta_mapped = -xi;
488  }
489  else
490  {
491  // Case 8
492  xi_mapped = -xi;
493  eta_mapped = eta;
494  }
495  }
496  }
497 
498 
499  // Face 1
500  else if ((i1[i] == 0) && (i0[i] >= 2) && (i2[i] >= 2))
501  {
502  const Point min_point = std::min(elem->point(0),
503  std::min(elem->point(1),
504  std::min(elem->point(5),
505  elem->point(4))));
506  if (elem->point(0) == min_point)
507  if (elem->point(1) == std::min(elem->point(1), elem->point(4)))
508  {
509  // Case 1
510  xi_mapped = xi;
511  zeta_mapped = zeta;
512  }
513  else
514  {
515  // Case 2
516  xi_mapped = zeta;
517  zeta_mapped = xi;
518  }
519 
520  else if (elem->point(1) == min_point)
521  if (elem->point(5) == std::min(elem->point(5), elem->point(0)))
522  {
523  // Case 3
524  xi_mapped = zeta;
525  zeta_mapped = -xi;
526  }
527  else
528  {
529  // Case 4
530  xi_mapped = -xi;
531  zeta_mapped = zeta;
532  }
533 
534  else if (elem->point(5) == min_point)
535  if (elem->point(4) == std::min(elem->point(4), elem->point(1)))
536  {
537  // Case 5
538  xi_mapped = -xi;
539  zeta_mapped = -zeta;
540  }
541  else
542  {
543  // Case 6
544  xi_mapped = -zeta;
545  zeta_mapped = -xi;
546  }
547 
548  else if (elem->point(4) == min_point)
549  {
550  if (elem->point(0) == std::min(elem->point(0), elem->point(5)))
551  {
552  // Case 7
553  xi_mapped = -xi;
554  zeta_mapped = zeta;
555  }
556  else
557  {
558  // Case 8
559  xi_mapped = xi;
560  zeta_mapped = -zeta;
561  }
562  }
563  }
564 
565 
566  // Face 2
567  else if ((i0[i] == 1) && (i1[i] >= 2) && (i2[i] >= 2))
568  {
569  const Point min_point = std::min(elem->point(1),
570  std::min(elem->point(2),
571  std::min(elem->point(6),
572  elem->point(5))));
573  if (elem->point(1) == min_point)
574  if (elem->point(2) == std::min(elem->point(2), elem->point(5)))
575  {
576  // Case 1
577  eta_mapped = eta;
578  zeta_mapped = zeta;
579  }
580  else
581  {
582  // Case 2
583  eta_mapped = zeta;
584  zeta_mapped = eta;
585  }
586 
587  else if (elem->point(2) == min_point)
588  if (elem->point(6) == std::min(elem->point(6), elem->point(1)))
589  {
590  // Case 3
591  eta_mapped = zeta;
592  zeta_mapped = -eta;
593  }
594  else
595  {
596  // Case 4
597  eta_mapped = -eta;
598  zeta_mapped = zeta;
599  }
600 
601  else if (elem->point(6) == min_point)
602  if (elem->point(5) == std::min(elem->point(5), elem->point(2)))
603  {
604  // Case 5
605  eta_mapped = -eta;
606  zeta_mapped = -zeta;
607  }
608  else
609  {
610  // Case 6
611  eta_mapped = -zeta;
612  zeta_mapped = -eta;
613  }
614 
615  else if (elem->point(5) == min_point)
616  {
617  if (elem->point(1) == std::min(elem->point(1), elem->point(6)))
618  {
619  // Case 7
620  eta_mapped = -zeta;
621  zeta_mapped = eta;
622  }
623  else
624  {
625  // Case 8
626  eta_mapped = eta;
627  zeta_mapped = -zeta;
628  }
629  }
630  }
631 
632 
633  // Face 3
634  else if ((i1[i] == 1) && (i0[i] >= 2) && (i2[i] >= 2))
635  {
636  const Point min_point = std::min(elem->point(2),
637  std::min(elem->point(3),
638  std::min(elem->point(7),
639  elem->point(6))));
640  if (elem->point(3) == min_point)
641  if (elem->point(2) == std::min(elem->point(2), elem->point(7)))
642  {
643  // Case 1
644  xi_mapped = xi;
645  zeta_mapped = zeta;
646  }
647  else
648  {
649  // Case 2
650  xi_mapped = zeta;
651  zeta_mapped = xi;
652  }
653 
654  else if (elem->point(7) == min_point)
655  if (elem->point(3) == std::min(elem->point(3), elem->point(6)))
656  {
657  // Case 3
658  xi_mapped = -zeta;
659  zeta_mapped = xi;
660  }
661  else
662  {
663  // Case 4
664  xi_mapped = xi;
665  zeta_mapped = -zeta;
666  }
667 
668  else if (elem->point(6) == min_point)
669  if (elem->point(7) == std::min(elem->point(7), elem->point(2)))
670  {
671  // Case 5
672  xi_mapped = -xi;
673  zeta_mapped = -zeta;
674  }
675  else
676  {
677  // Case 6
678  xi_mapped = -zeta;
679  zeta_mapped = -xi;
680  }
681 
682  else if (elem->point(2) == min_point)
683  {
684  if (elem->point(6) == std::min(elem->point(3), elem->point(6)))
685  {
686  // Case 7
687  xi_mapped = zeta;
688  zeta_mapped = -xi;
689  }
690  else
691  {
692  // Case 8
693  xi_mapped = -xi;
694  zeta_mapped = zeta;
695  }
696  }
697  }
698 
699 
700  // Face 4
701  else if ((i0[i] == 0) && (i1[i] >= 2) && (i2[i] >= 2))
702  {
703  const Point min_point = std::min(elem->point(3),
704  std::min(elem->point(0),
705  std::min(elem->point(4),
706  elem->point(7))));
707  if (elem->point(0) == min_point)
708  if (elem->point(3) == std::min(elem->point(3), elem->point(4)))
709  {
710  // Case 1
711  eta_mapped = eta;
712  zeta_mapped = zeta;
713  }
714  else
715  {
716  // Case 2
717  eta_mapped = zeta;
718  zeta_mapped = eta;
719  }
720 
721  else if (elem->point(4) == min_point)
722  if (elem->point(0) == std::min(elem->point(0), elem->point(7)))
723  {
724  // Case 3
725  eta_mapped = -zeta;
726  zeta_mapped = eta;
727  }
728  else
729  {
730  // Case 4
731  eta_mapped = eta;
732  zeta_mapped = -zeta;
733  }
734 
735  else if (elem->point(7) == min_point)
736  if (elem->point(4) == std::min(elem->point(4), elem->point(3)))
737  {
738  // Case 5
739  eta_mapped = -eta;
740  zeta_mapped = -zeta;
741  }
742  else
743  {
744  // Case 6
745  eta_mapped = -zeta;
746  zeta_mapped = -eta;
747  }
748 
749  else if (elem->point(3) == min_point)
750  {
751  if (elem->point(7) == std::min(elem->point(7), elem->point(0)))
752  {
753  // Case 7
754  eta_mapped = zeta;
755  zeta_mapped = -eta;
756  }
757  else
758  {
759  // Case 8
760  eta_mapped = -eta;
761  zeta_mapped = zeta;
762  }
763  }
764  }
765 
766 
767  // Face 5
768  else if ((i2[i] == 1) && (i0[i] >= 2) && (i1[i] >= 2))
769  {
770  const Point min_point = std::min(elem->point(4),
771  std::min(elem->point(5),
772  std::min(elem->point(6),
773  elem->point(7))));
774  if (elem->point(4) == min_point)
775  if (elem->point(5) == std::min(elem->point(5), elem->point(7)))
776  {
777  // Case 1
778  xi_mapped = xi;
779  eta_mapped = eta;
780  }
781  else
782  {
783  // Case 2
784  xi_mapped = eta;
785  eta_mapped = xi;
786  }
787 
788  else if (elem->point(5) == min_point)
789  if (elem->point(6) == std::min(elem->point(6), elem->point(4)))
790  {
791  // Case 3
792  xi_mapped = eta;
793  eta_mapped = -xi;
794  }
795  else
796  {
797  // Case 4
798  xi_mapped = -xi;
799  eta_mapped = eta;
800  }
801 
802  else if (elem->point(6) == min_point)
803  if (elem->point(7) == std::min(elem->point(7), elem->point(5)))
804  {
805  // Case 5
806  xi_mapped = -xi;
807  eta_mapped = -eta;
808  }
809  else
810  {
811  // Case 6
812  xi_mapped = -eta;
813  eta_mapped = -xi;
814  }
815 
816  else if (elem->point(7) == min_point)
817  {
818  if (elem->point(4) == std::min(elem->point(4), elem->point(6)))
819  {
820  // Case 7
821  xi_mapped = -eta;
822  eta_mapped = xi;
823  }
824  else
825  {
826  // Case 8
827  xi_mapped = xi;
828  eta_mapped = eta;
829  }
830  }
831  }
832  }
833 
834  return (FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i0[i], xi_mapped)*
835  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i1[i], eta_mapped)*
836  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i2[i], zeta_mapped));
837  }
838 
839 
840  default:
841  libmesh_error_msg("Invalid element type = " << type);
842  } //case HEX27
843 
844  }//case THIRD
845 
846 
847  // 4th-order Bernstein.
848  case FOURTH:
849  {
850  switch (type)
851  {
852 
853  // Bernstein shape functions on the hexahedral.
854  case HEX27:
855  {
856  libmesh_assert_less (i, 125);
857 
858  // Compute hex shape functions as a tensor-product
859  const Real xi = p(0);
860  const Real eta = p(1);
861  const Real zeta = p(2);
862  Real xi_mapped = p(0);
863  Real eta_mapped = p(1);
864  Real zeta_mapped = p(2);
865 
866  // The only way to make any sense of this
867  // is to look at the mgflo/mg2/mgf documentation
868  // and make the cut-out cube!
869  // Nodes 0 1 2 3 4 5 6 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 20 20 21 21 21 21 22 22 22 22 23 23 23 23 24 24 24 24 25 25 25 25 26 26 26 26 26 26 26 26
870  // DOFS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 18 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
871  static const unsigned int i0[] = {0, 1, 1, 0, 0, 1, 1, 0, 2, 3, 4, 1, 1, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 3, 4, 1, 1, 1, 2, 3, 4, 0, 0, 0, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 2, 3, 4, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4};
872  static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 2, 3, 4, 1, 1, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 3, 4, 1, 1, 1, 2, 3, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 2, 3, 4, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4};
873  static const unsigned int i2[] = {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 3, 3, 3, 4, 4, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4};
874 
875 
876 
877  // handle the edge orientation
878  {
879  // Edge 0
880  if ((i0[i] >= 2) && (i1[i] == 0) && (i2[i] == 0))
881  {
882  if (elem->point(0) != std::min(elem->point(0), elem->point(1)))
883  xi_mapped = -xi;
884  }
885  // Edge 1
886  else if ((i0[i] == 1) && (i1[i] >= 2) && (i2[i] == 0))
887  {
888  if (elem->point(1) != std::min(elem->point(1), elem->point(2)))
889  eta_mapped = -eta;
890  }
891  // Edge 2
892  else if ((i0[i] >= 2) && (i1[i] == 1) && (i2[i] == 0))
893  {
894  if (elem->point(3) != std::min(elem->point(3), elem->point(2)))
895  xi_mapped = -xi;
896  }
897  // Edge 3
898  else if ((i0[i] == 0) && (i1[i] >= 2) && (i2[i] == 0))
899  {
900  if (elem->point(0) != std::min(elem->point(0), elem->point(3)))
901  eta_mapped = -eta;
902  }
903  // Edge 4
904  else if ((i0[i] == 0) && (i1[i] == 0) && (i2[i] >=2 ))
905  {
906  if (elem->point(0) != std::min(elem->point(0), elem->point(4)))
907  zeta_mapped = -zeta;
908  }
909  // Edge 5
910  else if ((i0[i] == 1) && (i1[i] == 0) && (i2[i] >=2 ))
911  {
912  if (elem->point(1) != std::min(elem->point(1), elem->point(5)))
913  zeta_mapped = -zeta;
914  }
915  // Edge 6
916  else if ((i0[i] == 1) && (i1[i] == 1) && (i2[i] >=2 ))
917  {
918  if (elem->point(2) != std::min(elem->point(2), elem->point(6)))
919  zeta_mapped = -zeta;
920  }
921  // Edge 7
922  else if ((i0[i] == 0) && (i1[i] == 1) && (i2[i] >=2 ))
923  {
924  if (elem->point(3) != std::min(elem->point(3), elem->point(7)))
925  zeta_mapped = -zeta;
926  }
927  // Edge 8
928  else if ((i0[i] >=2 ) && (i1[i] == 0) && (i2[i] == 1))
929  {
930  if (elem->point(4) != std::min(elem->point(4), elem->point(5)))
931  xi_mapped = -xi;
932  }
933  // Edge 9
934  else if ((i0[i] == 1) && (i1[i] >=2 ) && (i2[i] == 1))
935  {
936  if (elem->point(5) != std::min(elem->point(5), elem->point(6)))
937  eta_mapped = -eta;
938  }
939  // Edge 10
940  else if ((i0[i] >=2 ) && (i1[i] == 1) && (i2[i] == 1))
941  {
942  if (elem->point(7) != std::min(elem->point(7), elem->point(6)))
943  xi_mapped = -xi;
944  }
945  // Edge 11
946  else if ((i0[i] == 0) && (i1[i] >=2 ) && (i2[i] == 1))
947  {
948  if (elem->point(4) != std::min(elem->point(4), elem->point(7)))
949  eta_mapped = -eta;
950  }
951  }
952 
953 
954  // handle the face orientation
955  {
956  // Face 0
957  if ((i2[i] == 0) && (i0[i] >= 2) && (i1[i] >= 2))
958  {
959  const Point min_point = std::min(elem->point(1),
960  std::min(elem->point(2),
961  std::min(elem->point(0),
962  elem->point(3))));
963  if (elem->point(0) == min_point)
964  if (elem->point(1) == std::min(elem->point(1), elem->point(3)))
965  {
966  // Case 1
967  xi_mapped = xi;
968  eta_mapped = eta;
969  }
970  else
971  {
972  // Case 2
973  xi_mapped = eta;
974  eta_mapped = xi;
975  }
976 
977  else if (elem->point(3) == min_point)
978  if (elem->point(0) == std::min(elem->point(0), elem->point(2)))
979  {
980  // Case 3
981  xi_mapped = -eta;
982  eta_mapped = xi;
983  }
984  else
985  {
986  // Case 4
987  xi_mapped = xi;
988  eta_mapped = -eta;
989  }
990 
991  else if (elem->point(2) == min_point)
992  if (elem->point(3) == std::min(elem->point(3), elem->point(1)))
993  {
994  // Case 5
995  xi_mapped = -xi;
996  eta_mapped = -eta;
997  }
998  else
999  {
1000  // Case 6
1001  xi_mapped = -eta;
1002  eta_mapped = -xi;
1003  }
1004 
1005  else if (elem->point(1) == min_point)
1006  {
1007  if (elem->point(2) == std::min(elem->point(2), elem->point(0)))
1008  {
1009  // Case 7
1010  xi_mapped = eta;
1011  eta_mapped = -xi;
1012  }
1013  else
1014  {
1015  // Case 8
1016  xi_mapped = -xi;
1017  eta_mapped = eta;
1018  }
1019  }
1020  }
1021 
1022 
1023  // Face 1
1024  else if ((i1[i] == 0) && (i0[i] >= 2) && (i2[i] >= 2))
1025  {
1026  const Point min_point = std::min(elem->point(0),
1027  std::min(elem->point(1),
1028  std::min(elem->point(5),
1029  elem->point(4))));
1030  if (elem->point(0) == min_point)
1031  if (elem->point(1) == std::min(elem->point(1), elem->point(4)))
1032  {
1033  // Case 1
1034  xi_mapped = xi;
1035  zeta_mapped = zeta;
1036  }
1037  else
1038  {
1039  // Case 2
1040  xi_mapped = zeta;
1041  zeta_mapped = xi;
1042  }
1043 
1044  else if (elem->point(1) == min_point)
1045  if (elem->point(5) == std::min(elem->point(5), elem->point(0)))
1046  {
1047  // Case 3
1048  xi_mapped = zeta;
1049  zeta_mapped = -xi;
1050  }
1051  else
1052  {
1053  // Case 4
1054  xi_mapped = -xi;
1055  zeta_mapped = zeta;
1056  }
1057 
1058  else if (elem->point(5) == min_point)
1059  if (elem->point(4) == std::min(elem->point(4), elem->point(1)))
1060  {
1061  // Case 5
1062  xi_mapped = -xi;
1063  zeta_mapped = -zeta;
1064  }
1065  else
1066  {
1067  // Case 6
1068  xi_mapped = -zeta;
1069  zeta_mapped = -xi;
1070  }
1071 
1072  else if (elem->point(4) == min_point)
1073  {
1074  if (elem->point(0) == std::min(elem->point(0), elem->point(5)))
1075  {
1076  // Case 7
1077  xi_mapped = -xi;
1078  zeta_mapped = zeta;
1079  }
1080  else
1081  {
1082  // Case 8
1083  xi_mapped = xi;
1084  zeta_mapped = -zeta;
1085  }
1086  }
1087  }
1088 
1089 
1090  // Face 2
1091  else if ((i0[i] == 1) && (i1[i] >= 2) && (i2[i] >= 2))
1092  {
1093  const Point min_point = std::min(elem->point(1),
1094  std::min(elem->point(2),
1095  std::min(elem->point(6),
1096  elem->point(5))));
1097  if (elem->point(1) == min_point)
1098  if (elem->point(2) == std::min(elem->point(2), elem->point(5)))
1099  {
1100  // Case 1
1101  eta_mapped = eta;
1102  zeta_mapped = zeta;
1103  }
1104  else
1105  {
1106  // Case 2
1107  eta_mapped = zeta;
1108  zeta_mapped = eta;
1109  }
1110 
1111  else if (elem->point(2) == min_point)
1112  if (elem->point(6) == std::min(elem->point(6), elem->point(1)))
1113  {
1114  // Case 3
1115  eta_mapped = zeta;
1116  zeta_mapped = -eta;
1117  }
1118  else
1119  {
1120  // Case 4
1121  eta_mapped = -eta;
1122  zeta_mapped = zeta;
1123  }
1124 
1125  else if (elem->point(6) == min_point)
1126  if (elem->point(5) == std::min(elem->point(5), elem->point(2)))
1127  {
1128  // Case 5
1129  eta_mapped = -eta;
1130  zeta_mapped = -zeta;
1131  }
1132  else
1133  {
1134  // Case 6
1135  eta_mapped = -zeta;
1136  zeta_mapped = -eta;
1137  }
1138 
1139  else if (elem->point(5) == min_point)
1140  {
1141  if (elem->point(1) == std::min(elem->point(1), elem->point(6)))
1142  {
1143  // Case 7
1144  eta_mapped = -zeta;
1145  zeta_mapped = eta;
1146  }
1147  else
1148  {
1149  // Case 8
1150  eta_mapped = eta;
1151  zeta_mapped = -zeta;
1152  }
1153  }
1154  }
1155 
1156 
1157  // Face 3
1158  else if ((i1[i] == 1) && (i0[i] >= 2) && (i2[i] >= 2))
1159  {
1160  const Point min_point = std::min(elem->point(2),
1161  std::min(elem->point(3),
1162  std::min(elem->point(7),
1163  elem->point(6))));
1164  if (elem->point(3) == min_point)
1165  if (elem->point(2) == std::min(elem->point(2), elem->point(7)))
1166  {
1167  // Case 1
1168  xi_mapped = xi;
1169  zeta_mapped = zeta;
1170  }
1171  else
1172  {
1173  // Case 2
1174  xi_mapped = zeta;
1175  zeta_mapped = xi;
1176  }
1177 
1178  else if (elem->point(7) == min_point)
1179  if (elem->point(3) == std::min(elem->point(3), elem->point(6)))
1180  {
1181  // Case 3
1182  xi_mapped = -zeta;
1183  zeta_mapped = xi;
1184  }
1185  else
1186  {
1187  // Case 4
1188  xi_mapped = xi;
1189  zeta_mapped = -zeta;
1190  }
1191 
1192  else if (elem->point(6) == min_point)
1193  if (elem->point(7) == std::min(elem->point(7), elem->point(2)))
1194  {
1195  // Case 5
1196  xi_mapped = -xi;
1197  zeta_mapped = -zeta;
1198  }
1199  else
1200  {
1201  // Case 6
1202  xi_mapped = -zeta;
1203  zeta_mapped = -xi;
1204  }
1205 
1206  else if (elem->point(2) == min_point)
1207  {
1208  if (elem->point(6) == std::min(elem->point(3), elem->point(6)))
1209  {
1210  // Case 7
1211  xi_mapped = zeta;
1212  zeta_mapped = -xi;
1213  }
1214  else
1215  {
1216  // Case 8
1217  xi_mapped = -xi;
1218  zeta_mapped = zeta;
1219  }
1220  }
1221  }
1222 
1223 
1224  // Face 4
1225  else if ((i0[i] == 0) && (i1[i] >= 2) && (i2[i] >= 2))
1226  {
1227  const Point min_point = std::min(elem->point(3),
1228  std::min(elem->point(0),
1229  std::min(elem->point(4),
1230  elem->point(7))));
1231  if (elem->point(0) == min_point)
1232  if (elem->point(3) == std::min(elem->point(3), elem->point(4)))
1233  {
1234  // Case 1
1235  eta_mapped = eta;
1236  zeta_mapped = zeta;
1237  }
1238  else
1239  {
1240  // Case 2
1241  eta_mapped = zeta;
1242  zeta_mapped = eta;
1243  }
1244 
1245  else if (elem->point(4) == min_point)
1246  if (elem->point(0) == std::min(elem->point(0), elem->point(7)))
1247  {
1248  // Case 3
1249  eta_mapped = -zeta;
1250  zeta_mapped = eta;
1251  }
1252  else
1253  {
1254  // Case 4
1255  eta_mapped = eta;
1256  zeta_mapped = -zeta;
1257  }
1258 
1259  else if (elem->point(7) == min_point)
1260  if (elem->point(4) == std::min(elem->point(4), elem->point(3)))
1261  {
1262  // Case 5
1263  eta_mapped = -eta;
1264  zeta_mapped = -zeta;
1265  }
1266  else
1267  {
1268  // Case 6
1269  eta_mapped = -zeta;
1270  zeta_mapped = -eta;
1271  }
1272 
1273  else if (elem->point(3) == min_point)
1274  {
1275  if (elem->point(7) == std::min(elem->point(7), elem->point(0)))
1276  {
1277  // Case 7
1278  eta_mapped = zeta;
1279  zeta_mapped = -eta;
1280  }
1281  else
1282  {
1283  // Case 8
1284  eta_mapped = -eta;
1285  zeta_mapped = zeta;
1286  }
1287  }
1288  }
1289 
1290 
1291  // Face 5
1292  else if ((i2[i] == 1) && (i0[i] >= 2) && (i1[i] >= 2))
1293  {
1294  const Point min_point = std::min(elem->point(4),
1295  std::min(elem->point(5),
1296  std::min(elem->point(6),
1297  elem->point(7))));
1298  if (elem->point(4) == min_point)
1299  if (elem->point(5) == std::min(elem->point(5), elem->point(7)))
1300  {
1301  // Case 1
1302  xi_mapped = xi;
1303  eta_mapped = eta;
1304  }
1305  else
1306  {
1307  // Case 2
1308  xi_mapped = eta;
1309  eta_mapped = xi;
1310  }
1311 
1312  else if (elem->point(5) == min_point)
1313  if (elem->point(6) == std::min(elem->point(6), elem->point(4)))
1314  {
1315  // Case 3
1316  xi_mapped = eta;
1317  eta_mapped = -xi;
1318  }
1319  else
1320  {
1321  // Case 4
1322  xi_mapped = -xi;
1323  eta_mapped = eta;
1324  }
1325 
1326  else if (elem->point(6) == min_point)
1327  if (elem->point(7) == std::min(elem->point(7), elem->point(5)))
1328  {
1329  // Case 5
1330  xi_mapped = -xi;
1331  eta_mapped = -eta;
1332  }
1333  else
1334  {
1335  // Case 6
1336  xi_mapped = -eta;
1337  eta_mapped = -xi;
1338  }
1339 
1340  else if (elem->point(7) == min_point)
1341  {
1342  if (elem->point(4) == std::min(elem->point(4), elem->point(6)))
1343  {
1344  // Case 7
1345  xi_mapped = -eta;
1346  eta_mapped = xi;
1347  }
1348  else
1349  {
1350  // Case 8
1351  xi_mapped = xi;
1352  eta_mapped = eta;
1353  }
1354  }
1355  }
1356 
1357 
1358  }
1359 
1360 
1361  return (FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i0[i], xi_mapped)*
1362  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i1[i], eta_mapped)*
1363  FE<1,BERNSTEIN>::shape(EDGE3, totalorder, i2[i], zeta_mapped));
1364  }
1365 
1366 
1367  default:
1368  libmesh_error_msg("Invalid element type = " << type);
1369  }
1370  }
1371 
1372 
1373  default:
1374  libmesh_error_msg("Invalid totalorder = " << totalorder);
1375  }
1376 #else // LIBMESH_DIM != 3
1377  libmesh_ignore(elem, order, i, p, add_p_level);
1378  libmesh_not_implemented();
1379 #endif
1380 }

◆ shape() [29/125]

Real libMesh::FE< 3, RATIONAL_BERNSTEIN >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 49 of file fe_rational_shape_3D.C.

54 {
55  libmesh_assert(elem);
56 
57  const ElemType elem_type = elem->type();
58 
59  const Order totalorder = static_cast<Order>(order + add_p_level * elem->p_level());
60 
61  // FEType object to be passed to various FEInterface functions below.
62  FEType fe_type(totalorder, _underlying_fe_family);
63 
64  const unsigned int n_sf =
65  FEInterface::n_shape_functions(3, fe_type, elem_type);
66 
67  const unsigned int n_nodes = elem->n_nodes();
68  libmesh_assert_equal_to (n_sf, n_nodes);
69 
70  std::vector<Real> node_weights(n_nodes);
71 
72  const unsigned char datum_index = elem->mapping_data();
73  for (unsigned int n=0; n<n_nodes; n++)
74  node_weights[n] =
75  elem->node_ref(n).get_extra_datum<Real>(datum_index);
76 
77  Real weighted_shape_i = 0, weighted_sum = 0;
78 
79  for (unsigned int sf=0; sf<n_sf; sf++)
80  {
81  Real weighted_shape = node_weights[sf] *
82  FEInterface::shape(3, fe_type, elem, sf, p);
83  weighted_sum += weighted_shape;
84  if (sf == i)
85  weighted_shape_i = weighted_shape;
86  }
87 
88  return weighted_shape_i / weighted_sum;
89 }

◆ shape() [30/125]

Real libMesh::FE< 2, RATIONAL_BERNSTEIN >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 49 of file fe_rational_shape_2D.C.

54 {
55  libmesh_assert(elem);
56 
57  const ElemType elem_type = elem->type();
58 
59  const Order totalorder = static_cast<Order>(order + add_p_level * elem->p_level());
60 
61  // FEType object to be passed to various FEInterface functions below.
62  FEType fe_type(totalorder, _underlying_fe_family);
63 
64  const unsigned int n_sf =
65  FEInterface::n_shape_functions(2, fe_type, elem_type);
66 
67  const unsigned int n_nodes = elem->n_nodes();
68  libmesh_assert_equal_to (n_sf, n_nodes);
69 
70  std::vector<Real> node_weights(n_nodes);
71 
72  const unsigned char datum_index = elem->mapping_data();
73  for (unsigned int n=0; n<n_nodes; n++)
74  node_weights[n] =
75  elem->node_ref(n).get_extra_datum<Real>(datum_index);
76 
77  Real weighted_shape_i = 0, weighted_sum = 0;
78 
79  for (unsigned int sf=0; sf<n_sf; sf++)
80  {
81  Real weighted_shape = node_weights[sf] *
82  FEInterface::shape(2, fe_type, elem, sf, p);
83  weighted_sum += weighted_shape;
84  if (sf == i)
85  weighted_shape_i = weighted_shape;
86  }
87 
88  return weighted_shape_i / weighted_sum;
89 }

◆ shape() [31/125]

Real libMesh::FE< 1, RATIONAL_BERNSTEIN >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 51 of file fe_rational_shape_1D.C.

56 {
57  libmesh_assert(elem);
58 
59  const ElemType elem_type = elem->type();
60 
61  const Order totalorder = static_cast<Order>(order + add_p_level * elem->p_level());
62 
63  // FEType object to be passed to various FEInterface functions below.
64  FEType fe_type(totalorder, _underlying_fe_family);
65 
66  const unsigned int n_sf =
67  FEInterface::n_shape_functions(1, fe_type, elem_type);
68 
69  const unsigned int n_nodes = elem->n_nodes();
70  libmesh_assert_equal_to (n_sf, n_nodes);
71 
72  std::vector<Real> node_weights(n_nodes);
73 
74  const unsigned char datum_index = elem->mapping_data();
75  for (unsigned int n=0; n<n_nodes; n++)
76  node_weights[n] =
77  elem->node_ref(n).get_extra_datum<Real>(datum_index);
78 
79  Real weighted_shape_i = 0, weighted_sum = 0;
80 
81  for (unsigned int sf=0; sf<n_sf; sf++)
82  {
83  Real weighted_shape = node_weights[sf] *
84  FEInterface::shape(1, fe_type, elem, sf, p);
85  weighted_sum += weighted_shape;
86  if (sf == i)
87  weighted_shape_i = weighted_shape;
88  }
89 
90  return weighted_shape_i / weighted_sum;
91 }

◆ shape() [32/125]

Real libMesh::FE< 1, L2_LAGRANGE >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 61 of file fe_lagrange_shape_1D.C.

66 {
67  libmesh_assert(elem);
68 
69  return fe_lagrange_1D_shape(static_cast<Order>(order + add_p_level * elem->p_level()), i, p(0));
70 }

◆ shape() [33/125]

Real libMesh::FE< 2, SZABAB >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 65 of file fe_szabab_shape_2D.C.

70 {
71  libmesh_assert(elem);
72 
73  const ElemType type = elem->type();
74 
75  const Order totalorder = static_cast<Order>(order + add_p_level * elem->p_level());
76 
77  // Declare that we are using our own special power function
78  // from the Utility namespace. This saves typing later.
79  using Utility::pow;
80 
81  switch (totalorder)
82  {
83  // 1st & 2nd-order Szabo-Babuska.
84  case FIRST:
85  case SECOND:
86  {
87  switch (type)
88  {
89 
90  // Szabo-Babuska shape functions on the triangle.
91  case TRI3:
92  case TRI6:
93  {
94  const Real l1 = 1-p(0)-p(1);
95  const Real l2 = p(0);
96  const Real l3 = p(1);
97 
98  libmesh_assert_less (i, 6);
99 
100  switch (i)
101  {
102  case 0: return l1;
103  case 1: return l2;
104  case 2: return l3;
105 
106  case 3: return l1*l2*(-4.*sqrt6);
107  case 4: return l2*l3*(-4.*sqrt6);
108  case 5: return l3*l1*(-4.*sqrt6);
109 
110  default:
111  libmesh_error_msg("Invalid i = " << i);
112  }
113  }
114 
115 
116  // Szabo-Babuska shape functions on the quadrilateral.
117  case QUAD4:
118  case QUAD8:
119  case QUAD9:
120  {
121  // Compute quad shape functions as a tensor-product
122  const Real xi = p(0);
123  const Real eta = p(1);
124 
125  libmesh_assert_less (i, 9);
126 
127  // 0 1 2 3 4 5 6 7 8
128  static const unsigned int i0[] = {0, 1, 1, 0, 2, 1, 2, 0, 2};
129  static const unsigned int i1[] = {0, 0, 1, 1, 0, 2, 1, 2, 2};
130 
131  return (FE<1,SZABAB>::shape(EDGE3, totalorder, i0[i], xi)*
132  FE<1,SZABAB>::shape(EDGE3, totalorder, i1[i], eta));
133 
134  }
135 
136  default:
137  libmesh_error_msg("Invalid element type = " << type);
138  }
139  }
140 
141 
142  // 3rd-order Szabo-Babuska.
143  case THIRD:
144  {
145  switch (type)
146  {
147 
148  // Szabo-Babuska shape functions on the triangle.
149  case TRI6:
150  {
151  Real l1 = 1-p(0)-p(1);
152  Real l2 = p(0);
153  Real l3 = p(1);
154 
155  Real f=1;
156 
157  libmesh_assert_less (i, 10);
158 
159 
160  if (i==4 && (elem->point(0) > elem->point(1)))f=-1;
161  if (i==6 && (elem->point(1) > elem->point(2)))f=-1;
162  if (i==8 && (elem->point(2) > elem->point(0)))f=-1;
163 
164 
165  switch (i)
166  {
167  //nodal modes
168  case 0: return l1;
169  case 1: return l2;
170  case 2: return l3;
171 
172  //side modes
173  case 3: return l1*l2*(-4.*sqrt6);
174  case 4: return f*l1*l2*(-4.*sqrt10)*(l2-l1);
175 
176  case 5: return l2*l3*(-4.*sqrt6);
177  case 6: return f*l2*l3*(-4.*sqrt10)*(l3-l2);
178 
179  case 7: return l3*l1*(-4.*sqrt6);
180  case 8: return f*l3*l1*(-4.*sqrt10)*(l1-l3);
181 
182  //internal modes
183  case 9: return l1*l2*l3;
184 
185  default:
186  libmesh_error_msg("Invalid i = " << i);
187  }
188  }
189 
190 
191  // Szabo-Babuska shape functions on the quadrilateral.
192  case QUAD8:
193  case QUAD9:
194  {
195  // Compute quad shape functions as a tensor-product
196  const Real xi = p(0);
197  const Real eta = p(1);
198 
199  libmesh_assert_less (i, 16);
200 
201  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
202  static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 1, 1, 2, 3, 0, 0, 2, 3, 2, 3};
203  static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 2, 3, 1, 1, 2, 3, 2, 2, 3, 3};
204 
205  Real f=1.;
206 
207  // take care of edge orientation, this is needed at
208  // edge shapes with (y=0)-asymmetric 1D shapes, these have
209  // one 1D shape index being 0 or 1, the other one being odd and >=3
210 
211  switch(i)
212  {
213  case 5: // edge 0 points
214  if (elem->point(0) > elem->point(1))f = -1.;
215  break;
216  case 7: // edge 1 points
217  if (elem->point(1) > elem->point(2))f = -1.;
218  break;
219  case 9: // edge 2 points
220  if (elem->point(3) > elem->point(2))f = -1.;
221  break;
222  case 11: // edge 3 points
223  if (elem->point(0) > elem->point(3))f = -1.;
224  break;
225 
226  default:
227  // Everything else keeps f=1
228  break;
229  }
230 
231  return f*(FE<1,SZABAB>::shape(EDGE3, totalorder, i0[i], xi)*
232  FE<1,SZABAB>::shape(EDGE3, totalorder, i1[i], eta));
233  }
234 
235  default:
236  libmesh_error_msg("Invalid element type = " << type);
237  }
238  }
239 
240 
241 
242 
243  // 4th-order Szabo-Babuska.
244  case FOURTH:
245  {
246  switch (type)
247  {
248  // Szabo-Babuska shape functions on the triangle.
249  case TRI6:
250  {
251  Real l1 = 1-p(0)-p(1);
252  Real l2 = p(0);
253  Real l3 = p(1);
254 
255  Real f=1;
256 
257  libmesh_assert_less (i, 15);
258 
259 
260  if (i== 4 && (elem->point(0) > elem->point(1)))f=-1;
261  if (i== 7 && (elem->point(1) > elem->point(2)))f=-1;
262  if (i==10 && (elem->point(2) > elem->point(0)))f=-1;
263 
264 
265  switch (i)
266  {
267  //nodal modes
268  case 0: return l1;
269  case 1: return l2;
270  case 2: return l3;
271 
272  //side modes
273  case 3: return l1*l2*(-4.*sqrt6);
274  case 4: return f*l1*l2*(-4.*sqrt10)*(l2-l1);
275  case 5: return l1*l2*(-sqrt14)*(5.*pow<2>(l2-l1)-1);
276 
277  case 6: return l2*l3*(-4.*sqrt6);
278  case 7: return f*l2*l3*(-4.*sqrt10)*(l3-l2);
279  case 8: return l2*l3*(-sqrt14)*(5.*pow<2>(l3-l2)-1);
280 
281  case 9: return l3*l1*(-4.*sqrt6);
282  case 10: return f*l3*l1*(-4.*sqrt10)*(l1-l3);
283  case 11: return l3*l1*(-sqrt14)*(5.*pow<2>(l1-l3)-1);
284 
285  //internal modes
286  case 12: return l1*l2*l3;
287 
288  case 13: return l1*l2*l3*(l2-l1);
289  case 14: return l1*l2*l3*(2*l3-1);
290 
291  default:
292  libmesh_error_msg("Invalid i = " << i);
293  }
294  }
295 
296 
297  // Szabo-Babuska shape functions on the quadrilateral.
298  case QUAD8:
299  case QUAD9:
300  {
301  // Compute quad shape functions as a tensor-product
302  const Real xi = p(0);
303  const Real eta = p(1);
304 
305  libmesh_assert_less (i, 25);
306 
307  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
308  static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 4, 1, 1, 1, 2, 3, 4, 0, 0, 0, 2, 3, 4, 2, 3, 4, 2, 3, 4};
309  static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 0, 2, 3, 4, 1, 1, 1, 2, 3, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4};
310 
311  Real f=1.;
312 
313  switch(i)
314  {
315  case 5: // edge 0 points
316  if (elem->point(0) > elem->point(1))f = -1.;
317  break;
318  case 8: // edge 1 points
319  if (elem->point(1) > elem->point(2))f = -1.;
320  break;
321  case 11: // edge 2 points
322  if (elem->point(3) > elem->point(2))f = -1.;
323  break;
324  case 14: // edge 3 points
325  if (elem->point(0) > elem->point(3))f = -1.;
326  break;
327 
328  default:
329  // Everything else keeps f=1
330  break;
331  }
332 
333  return f*(FE<1,SZABAB>::shape(EDGE3, totalorder, i0[i], xi)*
334  FE<1,SZABAB>::shape(EDGE3, totalorder, i1[i], eta));
335  }
336 
337  default:
338  libmesh_error_msg("Invalid element type = " << type);
339  }
340  }
341 
342 
343 
344 
345  // 5th-order Szabo-Babuska.
346  case FIFTH:
347  {
348  switch (type)
349  {
350  // Szabo-Babuska shape functions on the triangle.
351  case TRI6:
352  {
353  Real l1 = 1-p(0)-p(1);
354  Real l2 = p(0);
355  Real l3 = p(1);
356 
357  const Real x=l2-l1;
358  const Real y=2.*l3-1;
359 
360  Real f=1;
361 
362  libmesh_assert_less (i, 21);
363 
364 
365  if ((i== 4||i== 6) && (elem->point(0) > elem->point(1)))f=-1;
366  if ((i== 8||i==10) && (elem->point(1) > elem->point(2)))f=-1;
367  if ((i==12||i==14) && (elem->point(2) > elem->point(0)))f=-1;
368 
369 
370  switch (i)
371  {
372  //nodal modes
373  case 0: return l1;
374  case 1: return l2;
375  case 2: return l3;
376 
377  //side modes
378  case 3: return l1*l2*(-4.*sqrt6);
379  case 4: return f*l1*l2*(-4.*sqrt10)*(l2-l1);
380  case 5: return -sqrt14*l1*l2*(5.0*l1*l1-1.0+(-10.0*l1+5.0*l2)*l2);
381  case 6: return f*(-sqrt2)*l1*l2*((9.-21.*l1*l1)*l1+(-9.+63.*l1*l1+(-63.*l1+21.*l2)*l2)*l2);
382 
383  case 7: return l2*l3*(-4.*sqrt6);
384  case 8: return f*l2*l3*(-4.*sqrt10)*(l3-l2);
385  case 9: return -sqrt14*l2*l3*(5.0*l3*l3-1.0+(-10.0*l3+5.0*l2)*l2);
386  case 10: return -f*sqrt2*l2*l3*((-9.0+21.0*l3*l3)*l3+(-63.0*l3*l3+9.0+(63.0*l3-21.0*l2)*l2)*l2);
387 
388  case 11: return l3*l1*(-4.*sqrt6);
389  case 12: return f*l3*l1*(-4.*sqrt10)*(l1-l3);
390  case 13: return -sqrt14*l3*l1*(5.0*l3*l3-1.0+(-10.0*l3+5.0*l1)*l1);
391  case 14: return f*(-sqrt2)*l3*l1*((9.0-21.0*l3*l3)*l3+(-9.0+63.0*l3*l3+(-63.0*l3+21.0*l1)*l1)*l1);
392 
393  //internal modes
394  case 15: return l1*l2*l3;
395 
396  case 16: return l1*l2*l3*x;
397  case 17: return l1*l2*l3*y;
398 
399  case 18: return l1*l2*l3*(1.5*l1*l1-.5+(-3.0*l1+1.5*l2)*l2);
400  case 19: return l1*l2*l3*x*y;
401  case 20: return l1*l2*l3*(1.0+(-6.0+6.0*l3)*l3);
402 
403  default:
404  libmesh_error_msg("Invalid i = " << i);
405  }
406  } // case TRI6
407 
408  // Szabo-Babuska shape functions on the quadrilateral.
409  case QUAD8:
410  case QUAD9:
411  {
412  // Compute quad shape functions as a tensor-product
413  const Real xi = p(0);
414  const Real eta = p(1);
415 
416  libmesh_assert_less (i, 36);
417 
418  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
419  static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 4, 5, 1, 1, 1, 1, 2, 3, 4, 5, 0, 0, 0, 0, 2, 3, 4, 5, 2, 3, 4, 5, 2, 3, 4, 5, 2, 3, 4, 5};
420  static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 0, 0, 2, 3, 4, 5, 1, 1, 1, 1, 2, 3, 4, 5, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5};
421 
422  Real f=1.;
423 
424  switch(i)
425  {
426  case 5: // edge 0 points
427  case 7:
428  if (elem->point(0) > elem->point(1))f = -1.;
429  break;
430  case 9: // edge 1 points
431  case 11:
432  if (elem->point(1) > elem->point(2))f = -1.;
433  break;
434  case 13: // edge 2 points
435  case 15:
436  if (elem->point(3) > elem->point(2))f = -1.;
437  break;
438  case 14: // edge 3 points
439  case 19:
440  if (elem->point(0) > elem->point(3))f = -1.;
441  break;
442 
443  default:
444  // Everything else keeps f=1
445  break;
446  }
447 
448  return f*(FE<1,SZABAB>::shape(EDGE3, totalorder, i0[i], xi)*
449  FE<1,SZABAB>::shape(EDGE3, totalorder, i1[i], eta));
450 
451  } // case QUAD8/QUAD9
452 
453  default:
454  libmesh_error_msg("Invalid element type = " << type);
455 
456  } // switch type
457 
458  } // case FIFTH
459 
460  // 6th-order Szabo-Babuska.
461  case SIXTH:
462  {
463  switch (type)
464  {
465  // Szabo-Babuska shape functions on the triangle.
466  case TRI6:
467  {
468  Real l1 = 1-p(0)-p(1);
469  Real l2 = p(0);
470  Real l3 = p(1);
471 
472  const Real x=l2-l1;
473  const Real y=2.*l3-1;
474 
475  Real f=1;
476 
477  libmesh_assert_less (i, 28);
478 
479 
480  if ((i== 4||i== 6) && (elem->point(0) > elem->point(1)))f=-1;
481  if ((i== 9||i==11) && (elem->point(1) > elem->point(2)))f=-1;
482  if ((i==14||i==16) && (elem->point(2) > elem->point(0)))f=-1;
483 
484 
485  switch (i)
486  {
487  //nodal modes
488  case 0: return l1;
489  case 1: return l2;
490  case 2: return l3;
491 
492  //side modes
493  case 3: return l1*l2*(-4.*sqrt6);
494  case 4: return f*l1*l2*(-4.*sqrt10)*(l2-l1);
495  case 5: return -sqrt14*l1*l2*(5.0*l1*l1-1.0+(-10.0*l1+5.0*l2)*l2);
496  case 6: return f*(-sqrt2)*l1*l2*((9.0-21.0*l1*l1)*l1+(-9.0+63.0*l1*l1+(-63.0*l1+21.0*l2)*l2)*l2);
497  case 7: return -sqrt22*l1*l2*(0.5+(-7.0+0.105E2*l1*l1)*l1*l1+((14.0-0.42E2*l1*l1)*l1+(-7.0+0.63E2*l1*l1+(-0.42E2*l1+0.105E2*l2)*l2)*l2)*l2);
498 
499  case 8: return l2*l3*(-4.*sqrt6);
500  case 9: return f*l2*l3*(-4.*sqrt10)*(l3-l2);
501  case 10: return -sqrt14*l2*l3*(5.0*l3*l3-1.0+(-10.0*l3+5.0*l2)*l2);
502  case 11: return f*(-sqrt2)*l2*l3*((-9.0+21.0*l3*l3)*l3+(-63.0*l3*l3+9.0+(63.0*l3-21.0*l2)*l2)*l2);
503  case 12: return -sqrt22*l2*l3*(0.5+(-7.0+0.105E2*l3*l3)*l3*l3+((14.0-0.42E2*l3*l3)*l3+(-7.0+0.63E2*l3*l3+(-0.42E2*l3+0.105E2*l2)*l2)*l2)*l2);
504 
505  case 13: return l3*l1*(-4.*sqrt6);
506  case 14: return f*l3*l1*(-4.*sqrt10)*(l1-l3);
507  case 15: return -sqrt14*l3*l1*(5.0*l3*l3-1.0+(-10.0*l3+5.0*l1)*l1);
508  case 16: return f*(-sqrt2)*l3*l1*((9.0-21.0*l3*l3)*l3+(-9.0+63.0*l3*l3+(-63.0*l3+21.0*l1)*l1)*l1);
509  case 17: return -sqrt22*l3*l1*(0.5+(-7.0+0.105E2*l3*l3)*l3*l3+((14.0-0.42E2*l3*l3)*l3+(-7.0+0.63E2*l3*l3+(-0.42E2*l3+0.105E2*l1)*l1)*l1)*l1);
510 
511 
512 
513  //internal modes
514  case 18: return l1*l2*l3;
515 
516  case 19: return l1*l2*l3*x;
517  case 20: return l1*l2*l3*y;
518 
519  case 21: return 0.5*l1*l2*l3*(3.0*l1*l1-1.0+(-6.0*l1+3.0*l2)*l2);
520  case 22: return l1*l2*l3*(l2-l1)*(2.0*l3-1.0);
521  case 23: return 0.5*l1*l2*l3*(2.0+(-12.0+12.0*l3)*l3);
522  case 24: return 0.5*l1*l2*l3*((3.0-5.0*l1*l1)*l1+(-3.0+15.0*l1*l1+(-15.0*l1+5.0*l2)*l2)*l2);
523  case 25: return 0.5*l1*l2*l3*(3.0*l1*l1-1.0+(-6.0*l1+3.0*l2)*l2)*(2.0*l3-1.0);
524  case 26: return 0.5*l1*l2*l3*(2.0+(-12.0+12.0*l3)*l3)*(l2-l1);
525  case 27: return 0.5*l1*l2*l3*(-2.0+(24.0+(-60.0+40.0*l3)*l3)*l3);
526 
527 
528  default:
529  libmesh_error_msg("Invalid i = " << i);
530  }
531  } // case TRI6
532 
533  // Szabo-Babuska shape functions on the quadrilateral.
534  case QUAD8:
535  case QUAD9:
536  {
537  // Compute quad shape functions as a tensor-product
538  const Real xi = p(0);
539  const Real eta = p(1);
540 
541  libmesh_assert_less (i, 49);
542 
543  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
544  static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6};
545  static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6};
546 
547  Real f=1.;
548 
549  switch(i)
550  {
551  case 5: // edge 0 points
552  case 7:
553  if (elem->point(0) > elem->point(1))f = -1.;
554  break;
555  case 10: // edge 1 points
556  case 12:
557  if (elem->point(1) > elem->point(2))f = -1.;
558  break;
559  case 15: // edge 2 points
560  case 17:
561  if (elem->point(3) > elem->point(2))f = -1.;
562  break;
563  case 20: // edge 3 points
564  case 22:
565  if (elem->point(0) > elem->point(3))f = -1.;
566  break;
567 
568  default:
569  // Everything else keeps f=1
570  break;
571  }
572 
573  return f*(FE<1,SZABAB>::shape(EDGE3, totalorder, i0[i], xi)*
574  FE<1,SZABAB>::shape(EDGE3, totalorder, i1[i], eta));
575 
576  } // case QUAD8/QUAD9
577 
578  default:
579  libmesh_error_msg("Invalid element type = " << type);
580 
581  } // switch type
582 
583  } // case SIXTH
584 
585 
586  // 7th-order Szabo-Babuska.
587  case SEVENTH:
588  {
589  switch (type)
590  {
591  // Szabo-Babuska shape functions on the triangle.
592  case TRI6:
593  {
594 
595  Real l1 = 1-p(0)-p(1);
596  Real l2 = p(0);
597  Real l3 = p(1);
598 
599  const Real x=l2-l1;
600  const Real y=2.*l3-1.;
601 
602  Real f=1;
603 
604  libmesh_assert_less (i, 36);
605 
606 
607  if ((i>= 4&&i<= 8) && (elem->point(0) > elem->point(1)))f=-1;
608  if ((i>=10&&i<=14) && (elem->point(1) > elem->point(2)))f=-1;
609  if ((i>=16&&i<=20) && (elem->point(2) > elem->point(0)))f=-1;
610 
611 
612  switch (i)
613  {
614  //nodal modes
615  case 0: return l1;
616  case 1: return l2;
617  case 2: return l3;
618 
619  //side modes
620  case 3: return l1*l2*(-4.*sqrt6);
621  case 4: return f*l1*l2*(-4.*sqrt10)*(l2-l1);
622 
623  case 5: return -sqrt14*l1*l2*(5.0*l1*l1-1.0+(-10.0*l1+5.0*l2)*l2);
624  case 6: return f*-sqrt2*l1*l2*((9.0-21.0*l1*l1)*l1+(-9.0+63.0*l1*l1+(-63.0*l1+21.0*l2)*l2)*l2);
625  case 7: return -sqrt22*l1*l2*(0.5+(-7.0+0.105E2*l1*l1)*l1*l1+((14.0-0.42E2*l1*l1)*l1+(-7.0+0.63E2*l1*l1+(-0.42E2*l1+0.105E2*l2)*l2)*l2)*l2);
626  case 8: return f*-sqrt26*l1*l2*((-0.25E1+(15.0-0.165E2*l1*l1)*l1*l1)*l1+(0.25E1+(-45.0+0.825E2*l1*l1)*l1*l1+((45.0-0.165E3*l1*l1)*l1+(-15.0+0.165E3*l1*l1+(-0.825E2*l1+0.165E2*l2)*l2)*l2)*l2)*l2);
627 
628  case 9: return l2*l3*(-4.*sqrt6);
629  case 10: return f*l2*l3*(-4.*sqrt10)*(l3-l2);
630 
631  case 11: return -sqrt14*l2*l3*(5.0*l3*l3-1.0+(-10.0*l3+5.0*l2)*l2);
632  case 12: return f*-sqrt2*l2*l3*((-9.0+21.0*l3*l3)*l3+(-63.0*l3*l3+9.0+(63.0*l3-21.0*l2)*l2)*l2);
633  case 13: return -sqrt22*l2*l3*(0.5+(-7.0+0.105E2*l3*l3)*l3*l3+((14.0-0.42E2*l3*l3)*l3+(-7.0+0.63E2*l3*l3+(-0.42E2*l3+0.105E2*l2)*l2)*l2)*l2);
634  case 14: return f*-sqrt26*l2*l3*((0.25E1+(-15.0+0.165E2*l3*l3)*l3*l3)*l3+(-0.25E1+(45.0-0.825E2*l3*l3)*l3*l3+((-45.0+0.165E3*l3*l3)*l3+(15.0-0.165E3*l3*l3+(0.825E2*l3-0.165E2*l2)*l2)*l2)*l2)*l2);
635 
636  case 15: return l3*l1*(-4.*sqrt6);
637  case 16: return f*l3*l1*(-4.*sqrt10)*(l1-l3);
638 
639  case 17: return -sqrt14*l3*l1*(5.0*l3*l3-1.0+(-10.0*l3+5.0*l1)*l1);
640  case 18: return -f*sqrt2*l3*l1*((9.-21.*l3*l3)*l3+(-9.+63.*l3*l3+(-63.*l3+21.*l1)*l1)*l1);
641  case 19: return -sqrt22*l3*l1*(0.5+(-7.0+0.105E2*l3*l3)*l3*l3+((14.0-0.42E2*l3*l3)*l3+(-7.0+0.63E2*l3*l3+(-0.42E2*l3+0.105E2*l1)*l1)*l1)*l1);
642  case 20: return f*-sqrt26*l3*l1*((-0.25E1+(15.0-0.165E2*l3*l3)*l3*l3)*l3+(0.25E1+(-45.0+0.825E2*l3*l3)*l3*l3+((45.0-0.165E3*l3*l3)*l3+(-15.0+0.165E3*l3*l3+(-0.825E2*l3+0.165E2*l1)*l1)*l1)*l1)*l1);
643 
644 
645  //internal modes
646  case 21: return l1*l2*l3;
647 
648  case 22: return l1*l2*l3*x;
649  case 23: return l1*l2*l3*y;
650 
651  case 24: return l1*l2*l3*0.5*(3.*pow<2>(x)-1.);
652  case 25: return l1*l2*l3*x*y;
653  case 26: return l1*l2*l3*0.5*(3.*pow<2>(y)-1.);
654 
655  case 27: return 0.5*l1*l2*l3*((3.0-5.0*l1*l1)*l1+(-3.0+15.0*l1*l1+(-15.0*l1+5.0*l2)*l2)*l2);
656  case 28: return 0.5*l1*l2*l3*(3.0*l1*l1-1.0+(-6.0*l1+3.0*l2)*l2)*(2.0*l3-1.0);
657  case 29: return 0.5*l1*l2*l3*(2.0+(-12.0+12.0*l3)*l3)*(l2-l1);
658  case 30: return 0.5*l1*l2*l3*(-2.0+(24.0+(-60.0+40.0*l3)*l3)*l3);
659  case 31: return 0.125*l1*l2*l3*((-15.0+(70.0-63.0*l1*l1)*l1*l1)*l1+(15.0+(-210.0+315.0*l1*l1)*l1*l1+((210.0-630.0*l1*l1)*l1+(-70.0+630.0*l1*l1+(-315.0*l1+63.0*l2)*l2)*l2)*l2)*l2);
660  case 32: return 0.5*l1*l2*l3*((3.0-5.0*l1*l1)*l1+(-3.0+15.0*l1*l1+(-15.0*l1+5.0*l2)*l2)*l2)*(2.0*l3-1.0);
661  case 33: return 0.25*l1*l2*l3*(3.0*l1*l1-1.0+(-6.0*l1+3.0*l2)*l2)*(2.0+(-12.0+12.0*l3)*l3);
662  case 34: return 0.5*l1*l2*l3*(-2.0+(24.0+(-60.0+40.0*l3)*l3)*l3)*(l2-l1);
663  case 35: return 0.125*l1*l2*l3*(-8.0+(240.0+(-1680.0+(4480.0+(-5040.0+2016.0*l3)*l3)*l3)*l3)*l3);
664 
665  default:
666  libmesh_error_msg("Invalid i = " << i);
667  }
668  } // case TRI6
669 
670  // Szabo-Babuska shape functions on the quadrilateral.
671  case QUAD8:
672  case QUAD9:
673  {
674  // Compute quad shape functions as a tensor-product
675  const Real xi = p(0);
676  const Real eta = p(1);
677 
678  libmesh_assert_less (i, 64);
679 
680  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
681  static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 4, 5, 6, 7, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7};
682  static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7};
683 
684  Real f=1.;
685 
686  switch(i)
687  {
688  case 5: // edge 0 points
689  case 7:
690  case 9:
691  if (elem->point(0) > elem->point(1))f = -1.;
692  break;
693  case 11: // edge 1 points
694  case 13:
695  case 15:
696  if (elem->point(1) > elem->point(2))f = -1.;
697  break;
698  case 17: // edge 2 points
699  case 19:
700  case 21:
701  if (elem->point(3) > elem->point(2))f = -1.;
702  break;
703  case 23: // edge 3 points
704  case 25:
705  case 27:
706  if (elem->point(0) > elem->point(3))f = -1.;
707  break;
708 
709  default:
710  // Everything else keeps f=1
711  break;
712  }
713 
714  return f*(FE<1,SZABAB>::shape(EDGE3, totalorder, i0[i], xi)*
715  FE<1,SZABAB>::shape(EDGE3, totalorder, i1[i], eta));
716 
717  } // case QUAD8/QUAD9
718 
719  default:
720  libmesh_error_msg("Invalid element type = " << type);
721 
722  } // switch type
723 
724  } // case SEVENTH
725 
726 
727  // by default throw an error
728  default:
729  libmesh_error_msg("ERROR: Unsupported polynomial order!");
730  } // switch order
731 }

◆ shape() [34/125]

Real libMesh::FE< 1, MONOMIAL >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 70 of file fe_monomial_shape_1D.C.

75 {
76  libmesh_assert(elem);
77 
78  return FE<1,MONOMIAL>::shape(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, p);
79 }

◆ shape() [35/125]

Real libMesh::FE< 1, SZABAB >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 79 of file fe_szabab_shape_1D.C.

84 {
85  libmesh_assert(elem);
86 
87  return FE<1,SZABAB>::shape(elem->type(), static_cast<Order>(order + add_p_level * add_p_level * elem->p_level()), i, p);
88 }

◆ shape() [36/125]

Real libMesh::FE< 3, LAGRANGE >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 80 of file fe_lagrange_shape_3D.C.

85 {
86  libmesh_assert(elem);
87 
88  // call the orientation-independent shape functions
89  return fe_lagrange_3D_shape(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, p);
90 }

◆ shape() [37/125]

Real libMesh::FE< 2, LAGRANGE >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 81 of file fe_lagrange_shape_2D.C.

86 {
87  libmesh_assert(elem);
88 
89  // call the orientation-independent shape functions
90  return fe_lagrange_2D_shape(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, p);
91 }

◆ shape() [38/125]

Real libMesh::FE< 1, HIERARCHIC >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 82 of file fe_hierarchic_shape_1D.C.

87 {
88  libmesh_assert(elem);
89 
90  return fe_hierarchic_1D_shape(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, p);
91 }

◆ shape() [39/125]

Real libMesh::FE< 2, HIERARCHIC >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 88 of file fe_hierarchic_shape_2D.C.

93 {
94  return fe_hierarchic_2D_shape(elem, order, i, p, add_p_level);
95 }

◆ shape() [40/125]

Real libMesh::FE< 3, L2_LAGRANGE >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 95 of file fe_lagrange_shape_3D.C.

100 {
101  libmesh_assert(elem);
102 
103  // call the orientation-independent shape functions
104  return fe_lagrange_3D_shape(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, p);
105 }

◆ shape() [41/125]

Real libMesh::FE< 1, L2_HIERARCHIC >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 96 of file fe_hierarchic_shape_1D.C.

101 {
102  libmesh_assert(elem);
103 
104  return fe_hierarchic_1D_shape(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, p);
105 }

◆ shape() [42/125]

Real libMesh::FE< 2, L2_LAGRANGE >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 96 of file fe_lagrange_shape_2D.C.

101 {
102  libmesh_assert(elem);
103 
104  // call the orientation-independent shape functions
105  return fe_lagrange_2D_shape(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, p);
106 }

◆ shape() [43/125]

Real libMesh::FE< 2, L2_HIERARCHIC >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 100 of file fe_hierarchic_shape_2D.C.

105 {
106  return fe_hierarchic_2D_shape(elem, order, i, p, add_p_level);
107 }

◆ shape() [44/125]

Real libMesh::FE< 2, MONOMIAL >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 120 of file fe_monomial_shape_2D.C.

125 {
126  libmesh_assert(elem);
127 
128  // by default call the orientation-independent shape functions
129  return FE<2,MONOMIAL>::shape(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, p);
130 }

◆ shape() [45/125]

Real libMesh::FE< 3, MONOMIAL >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 188 of file fe_monomial_shape_3D.C.

193 {
194  libmesh_assert(elem);
195 
196  // call the orientation-independent shape functions
197  return FE<3,MONOMIAL>::shape(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, p);
198 }

◆ shape() [46/125]

Real libMesh::FE< 1, BERNSTEIN >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 190 of file fe_bernstein_shape_1D.C.

195 {
196  libmesh_assert(elem);
197 
198  return FE<1,BERNSTEIN>::shape
199  (elem->type(),
200  static_cast<Order>(order + add_p_level*elem->p_level()), i, p);
201 }

◆ shape() [47/125]

Real libMesh::FE< 2, HERMITE >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 209 of file fe_hermite_shape_2D.C.

214 {
215  libmesh_assert(elem);
216 
217  std::vector<std::vector<Real>> dxdxi(2, std::vector<Real>(2, 0));
218 
219 #ifdef DEBUG
220  std::vector<Real> dxdeta(2), dydxi(2);
221 #endif
222 
223  hermite_compute_coefs(elem,dxdxi
224 #ifdef DEBUG
225  ,dxdeta,dydxi
226 #endif
227  );
228 
229  const ElemType type = elem->type();
230 
231  const Order totalorder =
232  static_cast<Order>(order + add_p_level * elem->p_level());
233 
234  switch (type)
235  {
236  case QUAD4:
237  case QUADSHELL4:
238  libmesh_assert_less (totalorder, 4);
239  libmesh_fallthrough();
240  case QUAD8:
241  case QUADSHELL8:
242  case QUAD9:
243  {
244  libmesh_assert_less (i, (totalorder+1u)*(totalorder+1u));
245 
246  std::vector<unsigned int> bases1D;
247 
248  Real coef = hermite_bases_2D(bases1D, dxdxi, totalorder, i);
249 
250  return coef * FEHermite<1>::hermite_raw_shape(bases1D[0],p(0)) *
251  FEHermite<1>::hermite_raw_shape(bases1D[1],p(1));
252  }
253  default:
254  libmesh_error_msg("ERROR: Unsupported element type = " << type);
255  }
256 }

◆ shape() [48/125]

Real libMesh::FE< 1, CLOUGH >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 239 of file fe_clough_shape_1D.C.

244 {
245  libmesh_assert(elem);
246 
247  clough_compute_coefs(elem);
248 
249  const ElemType type = elem->type();
250 
251  const Order totalorder =
252  static_cast<Order>(order + add_p_level * elem->p_level());
253 
254  switch (totalorder)
255  {
256  // 3rd-order C1 cubic element
257  case THIRD:
258  {
259  switch (type)
260  {
261  // C1 functions on the C1 cubic edge
262  case EDGE2:
263  case EDGE3:
264  {
265  libmesh_assert_less (i, 4);
266 
267  switch (i)
268  {
269  case 0:
270  return clough_raw_shape(0, p);
271  case 1:
272  return clough_raw_shape(1, p);
273  case 2:
274  return d1xd1x * clough_raw_shape(2, p);
275  case 3:
276  return d2xd2x * clough_raw_shape(3, p);
277  default:
278  libmesh_error_msg("Invalid shape function index i = " << i);
279  }
280  }
281  default:
282  libmesh_error_msg("ERROR: Unsupported element type = " << type);
283  }
284  }
285  // by default throw an error
286  default:
287  libmesh_error_msg("ERROR: Unsupported polynomial order = " << totalorder);
288  }
289 }

◆ shape() [49/125]

Real libMesh::FE< 3, HERMITE >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 395 of file fe_hermite_shape_3D.C.

400 {
401  libmesh_assert(elem);
402 
403  std::vector<std::vector<Real>> dxdxi(3, std::vector<Real>(2, 0));
404 
405 #ifdef DEBUG
406  std::vector<Real> dydxi(2), dzdeta(2), dxdzeta(2);
407  std::vector<Real> dzdxi(2), dxdeta(2), dydzeta(2);
408 #endif //DEBUG
409 
410  hermite_compute_coefs(elem, dxdxi
411 #ifdef DEBUG
412  , dydxi, dzdeta, dxdzeta, dzdxi, dxdeta, dydzeta
413 #endif
414  );
415 
416  const ElemType type = elem->type();
417 
418  const Order totalorder =
419  static_cast<Order>(order + add_p_level * elem->p_level());
420 
421  switch (totalorder)
422  {
423  // 3rd-order tricubic Hermite functions
424  case THIRD:
425  {
426  switch (type)
427  {
428  case HEX8:
429  case HEX20:
430  case HEX27:
431  {
432  libmesh_assert_less (i, 64);
433 
434  std::vector<unsigned int> bases1D;
435 
436  Real coef = hermite_bases_3D(bases1D, dxdxi, totalorder, i);
437 
438  return coef *
439  FEHermite<1>::hermite_raw_shape(bases1D[0],p(0)) *
440  FEHermite<1>::hermite_raw_shape(bases1D[1],p(1)) *
441  FEHermite<1>::hermite_raw_shape(bases1D[2],p(2));
442  }
443  default:
444  libmesh_error_msg("ERROR: Unsupported element type " << type);
445  }
446  }
447  // by default throw an error
448  default:
449  libmesh_error_msg("ERROR: Unsupported polynomial order " << totalorder);
450  }
451 }

◆ shape() [50/125]

RealVectorValue libMesh::FE< 0, MONOMIAL_VEC >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 409 of file fe_monomial_vec.C.

414 {
415  Real value =
416  FE<0, MONOMIAL>::shape(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, p);
418 }

◆ shape() [51/125]

RealVectorValue libMesh::FE< 1, MONOMIAL_VEC >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 454 of file fe_monomial_vec.C.

459 {
460  Real value =
461  FE<1, MONOMIAL>::shape(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, p);
463 }

◆ shape() [52/125]

RealVectorValue libMesh::FE< 2, MONOMIAL_VEC >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 498 of file fe_monomial_vec.C.

503 {
504  Real value =
505  FE<2, MONOMIAL>::shape(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i / 2, p);
506 
507  switch (i % 2)
508  {
509  case 0:
511 
512  case 1:
513  return libMesh::RealVectorValue(Real(0), value);
514 
515  default:
516  libmesh_error_msg("i%2 must be either 0 or 1!");
517  }
518 
519  // dummy
520  return libMesh::RealVectorValue();
521 }

◆ shape() [53/125]

Real libMesh::FE< 2, SUBDIVISION >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Subdivision finite elements.

Template specialization prototypes are needed for calling from inside FESubdivision::init_shape_functions

◆ shape() [54/125]

RealVectorValue libMesh::FE< 3, MONOMIAL_VEC >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 584 of file fe_monomial_vec.C.

589 {
590  Real value =
591  FE<3, MONOMIAL>::shape(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i / 3, p);
592 
593  switch (i % 3)
594  {
595  case 0:
597 
598  case 1:
599  return libMesh::RealVectorValue(Real(0), value);
600 
601  case 2:
602  return libMesh::RealVectorValue(Real(0), Real(0), value);
603 
604  default:
605  libmesh_error_msg("i%3 must be 0, 1, or 2!");
606  }
607 
608  // dummy
609  return libMesh::RealVectorValue();
610 }

◆ shape() [55/125]

Real libMesh::FE< 3, HIERARCHIC >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 696 of file fe_hierarchic_shape_3D.C.

701 {
702  return fe_hierarchic_3D_shape(elem, order, i, p, add_p_level);
703 }

◆ shape() [56/125]

Real libMesh::FE< 3, L2_HIERARCHIC >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 708 of file fe_hierarchic_shape_3D.C.

713 {
714  return fe_hierarchic_3D_shape(elem, order, i, p, add_p_level);
715 }

◆ shape() [57/125]

Real libMesh::FE< 2, SUBDIVISION >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 728 of file fe_subdivision_2D.C.

733 {
734  libmesh_assert(elem);
735  const Order totalorder =
736  static_cast<Order>(order+add_p_level*elem->p_level());
737  return FE<2,SUBDIVISION>::shape(elem->type(), totalorder, i, p);
738 }

◆ shape() [58/125]

RealGradient libMesh::FE< 0, LAGRANGE_VEC >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 736 of file fe_lagrange_vec.C.

739 {
740  Real value = FE<0,LAGRANGE>::shape( elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, p);
741  return libMesh::RealGradient( value );
742 }

◆ shape() [59/125]

RealGradient libMesh::FE< 1, LAGRANGE_VEC >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 766 of file fe_lagrange_vec.C.

769 {
770  Real value = FE<1,LAGRANGE>::shape( elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, p);
771  return libMesh::RealGradient( value );
772 }

◆ shape() [60/125]

RealGradient libMesh::FE< 2, LAGRANGE_VEC >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 795 of file fe_lagrange_vec.C.

798 {
799  Real value = FE<2,LAGRANGE>::shape( elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i/2, p );
800 
801  switch( i%2 )
802  {
803  case 0:
804  return libMesh::RealGradient( value );
805 
806  case 1:
807  return libMesh::RealGradient( Real(0), value );
808 
809  default:
810  libmesh_error_msg("i%2 must be either 0 or 1!");
811  }
812 
813  //dummy
814  return libMesh::RealGradient();
815 }

◆ shape() [61/125]

RealGradient libMesh::FE< 3, LAGRANGE_VEC >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 866 of file fe_lagrange_vec.C.

869 {
870  Real value = FE<3,LAGRANGE>::shape( elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i/3, p );
871 
872  switch( i%3 )
873  {
874  case 0:
875  return libMesh::RealGradient( value );
876 
877  case 1:
878  return libMesh::RealGradient( Real(0), value );
879 
880  case 2:
881  return libMesh::RealGradient( Real(0), Real(0), value );
882 
883  default:
884  libmesh_error_msg("i%3 must be 0, 1, or 2!");
885  }
886 
887  //dummy
888  return libMesh::RealGradient();
889 }

◆ shape() [62/125]

Real libMesh::FE< 2, CLOUGH >::shape ( const Elem elem,
const Order  order,
const unsigned int  i,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 1829 of file fe_clough_shape_2D.C.

1834 {
1835  libmesh_assert(elem);
1836 
1837  clough_compute_coefs(elem);
1838 
1839  const ElemType type = elem->type();
1840 
1841  const Order totalorder =
1842  static_cast<Order>(order + add_p_level * elem->p_level());
1843 
1844  switch (totalorder)
1845  {
1846  // 2nd-order restricted Clough-Tocher element
1847  case SECOND:
1848  {
1849  // There may be a bug in the 2nd order case; the 3rd order
1850  // Clough-Tocher elements are pretty uniformly better anyways
1851  // so use those instead.
1852  libmesh_experimental();
1853  switch (type)
1854  {
1855  // C1 functions on the Clough-Tocher triangle.
1856  case TRI6:
1857  {
1858  libmesh_assert_less (i, 9);
1859  // FIXME: it would be nice to calculate (and cache)
1860  // clough_raw_shape(j,p) only once per triangle, not 1-7
1861  // times
1862  switch (i)
1863  {
1864  // Note: these DoF numbers are "scrambled" because my
1865  // initial numbering conventions didn't match libMesh
1866  case 0:
1867  return clough_raw_shape(0, p)
1868  + d1d2n * clough_raw_shape(10, p)
1869  + d1d3n * clough_raw_shape(11, p);
1870  case 3:
1871  return clough_raw_shape(1, p)
1872  + d2d3n * clough_raw_shape(11, p)
1873  + d2d1n * clough_raw_shape(9, p);
1874  case 6:
1875  return clough_raw_shape(2, p)
1876  + d3d1n * clough_raw_shape(9, p)
1877  + d3d2n * clough_raw_shape(10, p);
1878  case 1:
1879  return d1xd1x * clough_raw_shape(3, p)
1880  + d1xd1y * clough_raw_shape(4, p)
1881  + d1xd2n * clough_raw_shape(10, p)
1882  + d1xd3n * clough_raw_shape(11, p)
1883  + 0.5 * N01x * d3nd3n * clough_raw_shape(11, p)
1884  + 0.5 * N02x * d2nd2n * clough_raw_shape(10, p);
1885  case 2:
1886  return d1yd1y * clough_raw_shape(4, p)
1887  + d1yd1x * clough_raw_shape(3, p)
1888  + d1yd2n * clough_raw_shape(10, p)
1889  + d1yd3n * clough_raw_shape(11, p)
1890  + 0.5 * N01y * d3nd3n * clough_raw_shape(11, p)
1891  + 0.5 * N02y * d2nd2n * clough_raw_shape(10, p);
1892  case 4:
1893  return d2xd2x * clough_raw_shape(5, p)
1894  + d2xd2y * clough_raw_shape(6, p)
1895  + d2xd3n * clough_raw_shape(11, p)
1896  + d2xd1n * clough_raw_shape(9, p)
1897  + 0.5 * N10x * d3nd3n * clough_raw_shape(11, p)
1898  + 0.5 * N12x * d1nd1n * clough_raw_shape(9, p);
1899  case 5:
1900  return d2yd2y * clough_raw_shape(6, p)
1901  + d2yd2x * clough_raw_shape(5, p)
1902  + d2yd3n * clough_raw_shape(11, p)
1903  + d2yd1n * clough_raw_shape(9, p)
1904  + 0.5 * N10y * d3nd3n * clough_raw_shape(11, p)
1905  + 0.5 * N12y * d1nd1n * clough_raw_shape(9, p);
1906  case 7:
1907  return d3xd3x * clough_raw_shape(7, p)
1908  + d3xd3y * clough_raw_shape(8, p)
1909  + d3xd1n * clough_raw_shape(9, p)
1910  + d3xd2n * clough_raw_shape(10, p)
1911  + 0.5 * N20x * d2nd2n * clough_raw_shape(10, p)
1912  + 0.5 * N21x * d1nd1n * clough_raw_shape(9, p);
1913  case 8:
1914  return d3yd3y * clough_raw_shape(8, p)
1915  + d3yd3x * clough_raw_shape(7, p)
1916  + d3yd1n * clough_raw_shape(9, p)
1917  + d3yd2n * clough_raw_shape(10, p)
1918  + 0.5 * N20y * d2nd2n * clough_raw_shape(10, p)
1919  + 0.5 * N21y * d1nd1n * clough_raw_shape(9, p);
1920  default:
1921  libmesh_error_msg("Invalid shape function index i = " << i);
1922  }
1923  }
1924  default:
1925  libmesh_error_msg("ERROR: Unsupported element type = " << type);
1926  }
1927  }
1928  // 3rd-order Clough-Tocher element
1929  case THIRD:
1930  {
1931  switch (type)
1932  {
1933  // C1 functions on the Clough-Tocher triangle.
1934  case TRI6:
1935  {
1936  libmesh_assert_less (i, 12);
1937 
1938  // FIXME: it would be nice to calculate (and cache)
1939  // clough_raw_shape(j,p) only once per triangle, not 1-7
1940  // times
1941  switch (i)
1942  {
1943  // Note: these DoF numbers are "scrambled" because my
1944  // initial numbering conventions didn't match libMesh
1945  case 0:
1946  return clough_raw_shape(0, p)
1947  + d1d2n * clough_raw_shape(10, p)
1948  + d1d3n * clough_raw_shape(11, p);
1949  case 3:
1950  return clough_raw_shape(1, p)
1951  + d2d3n * clough_raw_shape(11, p)
1952  + d2d1n * clough_raw_shape(9, p);
1953  case 6:
1954  return clough_raw_shape(2, p)
1955  + d3d1n * clough_raw_shape(9, p)
1956  + d3d2n * clough_raw_shape(10, p);
1957  case 1:
1958  return d1xd1x * clough_raw_shape(3, p)
1959  + d1xd1y * clough_raw_shape(4, p)
1960  + d1xd2n * clough_raw_shape(10, p)
1961  + d1xd3n * clough_raw_shape(11, p);
1962  case 2:
1963  return d1yd1y * clough_raw_shape(4, p)
1964  + d1yd1x * clough_raw_shape(3, p)
1965  + d1yd2n * clough_raw_shape(10, p)
1966  + d1yd3n * clough_raw_shape(11, p);
1967  case 4:
1968  return d2xd2x * clough_raw_shape(5, p)
1969  + d2xd2y * clough_raw_shape(6, p)
1970  + d2xd3n * clough_raw_shape(11, p)
1971  + d2xd1n * clough_raw_shape(9, p);
1972  case 5:
1973  return d2yd2y * clough_raw_shape(6, p)
1974  + d2yd2x * clough_raw_shape(5, p)
1975  + d2yd3n * clough_raw_shape(11, p)
1976  + d2yd1n * clough_raw_shape(9, p);
1977  case 7:
1978  return d3xd3x * clough_raw_shape(7, p)
1979  + d3xd3y * clough_raw_shape(8, p)
1980  + d3xd1n * clough_raw_shape(9, p)
1981  + d3xd2n * clough_raw_shape(10, p);
1982  case 8:
1983  return d3yd3y * clough_raw_shape(8, p)
1984  + d3yd3x * clough_raw_shape(7, p)
1985  + d3yd1n * clough_raw_shape(9, p)
1986  + d3yd2n * clough_raw_shape(10, p);
1987  case 10:
1988  return d1nd1n * clough_raw_shape(9, p);
1989  case 11:
1990  return d2nd2n * clough_raw_shape(10, p);
1991  case 9:
1992  return d3nd3n * clough_raw_shape(11, p);
1993 
1994  default:
1995  libmesh_error_msg("Invalid shape function index i = " << i);
1996  }
1997  }
1998  default:
1999  libmesh_error_msg("ERROR: Unsupported element type = " << type);
2000  }
2001  }
2002  // by default throw an error
2003  default:
2004  libmesh_error_msg("ERROR: Unsupported polynomial order = " << order);
2005  }
2006 }

◆ shape() [63/125]

Real libMesh::FE< 3, CLOUGH >::shape ( const Elem libmesh_dbg_varelem,
const  Order,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 45 of file fe_clough_shape_3D.C.

50 {
51  libmesh_assert(elem);
52 
53  libmesh_not_implemented();
54  return 0.;
55 }

◆ shape() [64/125]

Real libMesh::FE< 1, HIERARCHIC >::shape ( const ElemType  elem_type,
const Order  order,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 60 of file fe_hierarchic_shape_1D.C.

64 {
65  return fe_hierarchic_1D_shape(elem_type, order, i, p);
66 }

◆ shape() [65/125]

Real libMesh::FE< 1, L2_HIERARCHIC >::shape ( const ElemType  elem_type,
const Order  order,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 71 of file fe_hierarchic_shape_1D.C.

75 {
76  return fe_hierarchic_1D_shape(elem_type, order, i, p);
77 }

◆ shape() [66/125]

static OutputShape libMesh::FE< Dim, T >::shape ( const ElemType  t,
const Order  o,
const unsigned int  i,
const Point p 
)
staticinherited
Returns
The value of the \( i^{th} \) shape function at point p. This method allows you to specify the dimension, element type, and order directly. This allows the method to be static.

On a p-refined element, o should be the total order of the element.

◆ shape() [67/125]

Real libMesh::FE< 3, LAGRANGE >::shape ( const ElemType  type,
const Order  order,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 58 of file fe_lagrange_shape_3D.C.

62 {
63  return fe_lagrange_3D_shape(type, order, i, p);
64 }

◆ shape() [68/125]

Real libMesh::FE< 2, LAGRANGE >::shape ( const ElemType  type,
const Order  order,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 60 of file fe_lagrange_shape_2D.C.

64 {
65  return fe_lagrange_2D_shape(type, order, i, p);
66 }

◆ shape() [69/125]

Real libMesh::FE< 3, L2_LAGRANGE >::shape ( const ElemType  type,
const Order  order,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 69 of file fe_lagrange_shape_3D.C.

73 {
74  return fe_lagrange_3D_shape(type, order, i, p);
75 }

◆ shape() [70/125]

Real libMesh::FE< 2, L2_LAGRANGE >::shape ( const ElemType  type,
const Order  order,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 71 of file fe_lagrange_shape_2D.C.

75 {
76  return fe_lagrange_2D_shape(type, order, i, p);
77 }

◆ shape() [71/125]

RealVectorValue libMesh::FE< 0, MONOMIAL_VEC >::shape ( const ElemType  type,
const Order  order,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 164 of file fe_monomial_vec.C.

168 {
169  Real value = FE<0, MONOMIAL>::shape(type, order, i, p);
171 }

◆ shape() [72/125]

RealVectorValue libMesh::FE< 1, MONOMIAL_VEC >::shape ( const ElemType  type,
const Order  order,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 202 of file fe_monomial_vec.C.

206 {
207  Real value = FE<1, MONOMIAL>::shape(type, order, i, p);
209 }

◆ shape() [73/125]

RealVectorValue libMesh::FE< 2, MONOMIAL_VEC >::shape ( const ElemType  type,
const Order  order,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 239 of file fe_monomial_vec.C.

243 {
244  Real value = FE<2, MONOMIAL>::shape(type, order, i / 2, p);
245 
246  switch (i % 2)
247  {
248  case 0:
250 
251  case 1:
252  return libMesh::RealVectorValue(Real(0), value);
253 
254  default:
255  libmesh_error_msg("i%2 must be either 0 or 1!");
256  }
257 
258  // dummy
259  return libMesh::RealVectorValue();
260 }

◆ shape() [74/125]

RealVectorValue libMesh::FE< 3, MONOMIAL_VEC >::shape ( const ElemType  type,
const Order  order,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 319 of file fe_monomial_vec.C.

323 {
324  Real value = FE<3, MONOMIAL>::shape(type, order, i / 3, p);
325 
326  switch (i % 3)
327  {
328  case 0:
330 
331  case 1:
332  return libMesh::RealVectorValue(Real(0), value);
333 
334  case 2:
335  return libMesh::RealVectorValue(Real(0), Real(0), value);
336 
337  default:
338  libmesh_error_msg("i%3 must be 0, 1, or 2!");
339  }
340 
341  // dummy
342  return libMesh::RealVectorValue();
343 }

◆ shape() [75/125]

RealGradient libMesh::FE< 0, LAGRANGE_VEC >::shape ( const ElemType  type,
const Order  order,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 537 of file fe_lagrange_vec.C.

539 {
540  Real value = FE<0,LAGRANGE>::shape( type, order, i, p );
541  return libMesh::RealGradient( value );
542 }

◆ shape() [76/125]

RealGradient libMesh::FE< 1, LAGRANGE_VEC >::shape ( const ElemType  type,
const Order  order,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 563 of file fe_lagrange_vec.C.

565 {
566  Real value = FE<1,LAGRANGE>::shape( type, order, i, p );
567  return libMesh::RealGradient( value );
568 }

◆ shape() [77/125]

RealGradient libMesh::FE< 2, LAGRANGE_VEC >::shape ( const ElemType  type,
const Order  order,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 588 of file fe_lagrange_vec.C.

590 {
591  Real value = FE<2,LAGRANGE>::shape( type, order, i/2, p );
592 
593  switch( i%2 )
594  {
595  case 0:
596  return libMesh::RealGradient( value );
597 
598  case 1:
599  return libMesh::RealGradient( Real(0), value );
600 
601  default:
602  libmesh_error_msg("i%2 must be either 0 or 1!");
603  }
604 
605  //dummy
606  return libMesh::RealGradient();
607 }

◆ shape() [78/125]

RealGradient libMesh::FE< 3, LAGRANGE_VEC >::shape ( const ElemType  type,
const Order  order,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 657 of file fe_lagrange_vec.C.

659 {
660  Real value = FE<3,LAGRANGE>::shape( type, order, i/3, p );
661 
662  switch( i%3 )
663  {
664  case 0:
665  return libMesh::RealGradient( value );
666 
667  case 1:
668  return libMesh::RealGradient( Real(0), value );
669 
670  case 2:
671  return libMesh::RealGradient( Real(0), Real(0), value );
672 
673  default:
674  libmesh_error_msg("i%3 must be 0, 1, or 2!");
675  }
676 
677  //dummy
678  return libMesh::RealGradient();
679 }

◆ shape() [79/125]

Real libMesh::FE< 2, SUBDIVISION >::shape ( const ElemType  type,
const Order  order,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 702 of file fe_subdivision_2D.C.

706 {
707  switch (order)
708  {
709  case FOURTH:
710  {
711  switch (type)
712  {
713  case TRI3SUBDIVISION:
714  libmesh_assert_less(i, 12);
715  return FESubdivision::regular_shape(i,p(0),p(1));
716  default:
717  libmesh_error_msg("ERROR: Unsupported element type!");
718  }
719  }
720  default:
721  libmesh_error_msg("ERROR: Unsupported polynomial order!");
722  }
723 }

◆ shape() [80/125]

Real libMesh::FE< 1, MONOMIAL >::shape ( const  ElemType,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 32 of file fe_monomial_shape_1D.C.

36 {
37  const Real xi = p(0);
38 
39  libmesh_assert_less_equal (i, static_cast<unsigned int>(order));
40 
41  // monomials. since they are hierarchic we only need one case block.
42  switch (i)
43  {
44  case 0:
45  return 1.;
46 
47  case 1:
48  return xi;
49 
50  case 2:
51  return xi*xi;
52 
53  case 3:
54  return xi*xi*xi;
55 
56  case 4:
57  return xi*xi*xi*xi;
58 
59  default:
60  Real val = 1.;
61  for (unsigned int index = 0; index != i; ++index)
62  val *= xi;
63  return val;
64  }
65 }

◆ shape() [81/125]

Real libMesh::FE< 3, MONOMIAL >::shape ( const  ElemType,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 32 of file fe_monomial_shape_3D.C.

36 {
37 #if LIBMESH_DIM == 3
38 
39  const Real xi = p(0);
40  const Real eta = p(1);
41  const Real zeta = p(2);
42 
43  libmesh_assert_less (i, (static_cast<unsigned int>(order)+1)*
44  (static_cast<unsigned int>(order)+2)*
45  (static_cast<unsigned int>(order)+3)/6);
46 
47  // monomials. since they are hierarchic we only need one case block.
48  switch (i)
49  {
50  // constant
51  case 0:
52  return 1.;
53 
54  // linears
55  case 1:
56  return xi;
57 
58  case 2:
59  return eta;
60 
61  case 3:
62  return zeta;
63 
64  // quadratics
65  case 4:
66  return xi*xi;
67 
68  case 5:
69  return xi*eta;
70 
71  case 6:
72  return eta*eta;
73 
74  case 7:
75  return xi*zeta;
76 
77  case 8:
78  return zeta*eta;
79 
80  case 9:
81  return zeta*zeta;
82 
83  // cubics
84  case 10:
85  return xi*xi*xi;
86 
87  case 11:
88  return xi*xi*eta;
89 
90  case 12:
91  return xi*eta*eta;
92 
93  case 13:
94  return eta*eta*eta;
95 
96  case 14:
97  return xi*xi*zeta;
98 
99  case 15:
100  return xi*eta*zeta;
101 
102  case 16:
103  return eta*eta*zeta;
104 
105  case 17:
106  return xi*zeta*zeta;
107 
108  case 18:
109  return eta*zeta*zeta;
110 
111  case 19:
112  return zeta*zeta*zeta;
113 
114  // quartics
115  case 20:
116  return xi*xi*xi*xi;
117 
118  case 21:
119  return xi*xi*xi*eta;
120 
121  case 22:
122  return xi*xi*eta*eta;
123 
124  case 23:
125  return xi*eta*eta*eta;
126 
127  case 24:
128  return eta*eta*eta*eta;
129 
130  case 25:
131  return xi*xi*xi*zeta;
132 
133  case 26:
134  return xi*xi*eta*zeta;
135 
136  case 27:
137  return xi*eta*eta*zeta;
138 
139  case 28:
140  return eta*eta*eta*zeta;
141 
142  case 29:
143  return xi*xi*zeta*zeta;
144 
145  case 30:
146  return xi*eta*zeta*zeta;
147 
148  case 31:
149  return eta*eta*zeta*zeta;
150 
151  case 32:
152  return xi*zeta*zeta*zeta;
153 
154  case 33:
155  return eta*zeta*zeta*zeta;
156 
157  case 34:
158  return zeta*zeta*zeta*zeta;
159 
160  default:
161  unsigned int o = 0;
162  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
163  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
164  unsigned int block=o, nz = 0;
165  for (; block < i2; block += (o-nz+1)) { nz++; }
166  const unsigned int nx = block - i2;
167  const unsigned int ny = o - nx - nz;
168  Real val = 1.;
169  for (unsigned int index=0; index != nx; index++)
170  val *= xi;
171  for (unsigned int index=0; index != ny; index++)
172  val *= eta;
173  for (unsigned int index=0; index != nz; index++)
174  val *= zeta;
175  return val;
176  }
177 
178 #else // LIBMESH_DIM != 3
179  libmesh_assert(order);
180  libmesh_ignore(i, p);
181  libmesh_not_implemented();
182 #endif
183 }

◆ shape() [82/125]

Real libMesh::FE< 2, MONOMIAL >::shape ( const  ElemType,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 32 of file fe_monomial_shape_2D.C.

36 {
37 #if LIBMESH_DIM > 1
38 
39  libmesh_assert_less (i, (static_cast<unsigned int>(order)+1)*
40  (static_cast<unsigned int>(order)+2)/2);
41 
42  const Real xi = p(0);
43  const Real eta = p(1);
44 
45  switch (i)
46  {
47  // constant
48  case 0:
49  return 1.;
50 
51  // linear
52  case 1:
53  return xi;
54 
55  case 2:
56  return eta;
57 
58  // quadratics
59  case 3:
60  return xi*xi;
61 
62  case 4:
63  return xi*eta;
64 
65  case 5:
66  return eta*eta;
67 
68  // cubics
69  case 6:
70  return xi*xi*xi;
71 
72  case 7:
73  return xi*xi*eta;
74 
75  case 8:
76  return xi*eta*eta;
77 
78  case 9:
79  return eta*eta*eta;
80 
81  // quartics
82  case 10:
83  return xi*xi*xi*xi;
84 
85  case 11:
86  return xi*xi*xi*eta;
87 
88  case 12:
89  return xi*xi*eta*eta;
90 
91  case 13:
92  return xi*eta*eta*eta;
93 
94  case 14:
95  return eta*eta*eta*eta;
96 
97  default:
98  unsigned int o = 0;
99  for (; i >= (o+1)*(o+2)/2; o++) { }
100  unsigned int ny = i - (o*(o+1)/2);
101  unsigned int nx = o - ny;
102  Real val = 1.;
103  for (unsigned int index=0; index != nx; index++)
104  val *= xi;
105  for (unsigned int index=0; index != ny; index++)
106  val *= eta;
107  return val;
108  }
109 
110 #else // LIBMESH_DIM == 1
111  libmesh_ignore(i, p);
112  libmesh_assert(order);
113  libmesh_not_implemented();
114 #endif
115 }

◆ shape() [83/125]

Real libMesh::FE< 1, SZABAB >::shape ( const  ElemType,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 35 of file fe_szabab_shape_1D.C.

39 {
40  const Real xi = p(0);
41  const Real xi2 = xi*xi;
42 
43 
44  // Use this libmesh_assert rather than a switch with a single entry...
45  // It will go away in optimized mode, essentially has the same effect.
46  libmesh_assert_less_equal (order, SEVENTH);
47 
48  // switch (order)
49  // {
50  // case FIRST:
51  // case SECOND:
52  // case THIRD:
53  // case FOURTH:
54  // case FIFTH:
55  // case SIXTH:
56  // case SEVENTH:
57 
58  switch(i)
59  {
60  //nodal shape functions
61  case 0: return 1./2.-1./2.*xi;
62  case 1: return 1./2.+1./2.*xi;
63  case 2: return 1./4. *2.4494897427831780982*(xi2-1.);
64  case 3: return 1./4. *3.1622776601683793320*(xi2-1.)*xi;
65  case 4: return 1./16. *3.7416573867739413856*((5.*xi2-6.)*xi2+1.);
66  case 5: return 3./16. *1.4142135623730950488*(3.+(-10.+7.*xi2)*xi2)*xi;
67  case 6: return 1./32. *4.6904157598234295546*(-1.+(15.+(-35.+21.*xi2)*xi2)*xi2);
68  case 7: return 1./32. *5.0990195135927848300*(-5.+(35.+(-63.+33.*xi2)*xi2)*xi2)*xi;
69  case 8: return 1./256.*5.4772255750516611346*(5.+(-140.+(630.+(-924.+429.*xi2)*xi2)*xi2)*xi2);
70 
71  default:
72  libmesh_error_msg("Invalid shape function index!");
73  }
74 }

◆ shape() [84/125]

Real libMesh::FE< 1, LAGRANGE >::shape ( const  ElemType,
const Order  order,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 28 of file fe_lagrange_shape_1D.C.

32 {
33  return fe_lagrange_1D_shape(order, i, p(0));
34 }

◆ shape() [85/125]

Real libMesh::FE< 1, L2_LAGRANGE >::shape ( const  ElemType,
const Order  order,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 37 of file fe_lagrange_shape_1D.C.

41 {
42  return fe_lagrange_1D_shape(order, i, p(0));
43 }

◆ shape() [86/125]

Real libMesh::FE< 1, BERNSTEIN >::shape ( const  ElemType,
const Order  order,
const unsigned int  i,
const Point p 
)
inherited

Definition at line 38 of file fe_bernstein_shape_1D.C.

42 {
43  const Real xi = p(0);
44  using Utility::pow;
45 
46  switch (order)
47  {
48  case FIRST:
49 
50  switch(i)
51  {
52  case 0:
53  return (1.-xi)/2.;
54  case 1:
55  return (1.+xi)/2.;
56  default:
57  libmesh_error_msg("Invalid shape function index i = " << i);
58  }
59 
60  case SECOND:
61 
62  switch(i)
63  {
64  case 0:
65  return (1./4.)*pow<2>(1.-xi);
66  case 1:
67  return (1./4.)*pow<2>(1.+xi);
68  case 2:
69  return (1./2.)*(1.-xi)*(1.+xi);
70  default:
71  libmesh_error_msg("Invalid shape function index i = " << i);
72  }
73 
74  case THIRD:
75 
76  switch(i)
77  {
78  case 0:
79  return (1./8.)*pow<3>(1.-xi);
80  case 1:
81  return (1./8.)*pow<3>(1.+xi);
82  case 2:
83  return (3./8.)*(1.+xi)*pow<2>(1.-xi);
84  case 3:
85  return (3./8.)*pow<2>(1.+xi)*(1.-xi);
86  default:
87  libmesh_error_msg("Invalid shape function index i = " << i);
88  }
89 
90  case FOURTH:
91 
92  switch(i)
93  {
94  case 0:
95  return (1./16.)*pow<4>(1.-xi);
96  case 1:
97  return (1./16.)*pow<4>(1.+xi);
98  case 2:
99  return (1./ 4.)*(1.+xi)*pow<3>(1.-xi);
100  case 3:
101  return (3./ 8.)*pow<2>(1.+xi)*pow<2>(1.-xi);
102  case 4:
103  return (1./ 4.)*pow<3>(1.+xi)*(1.-xi);
104  default:
105  libmesh_error_msg("Invalid shape function index i = " << i);
106  }
107 
108 
109  case FIFTH:
110 
111  switch(i)
112  {
113  case 0:
114  return (1./32.)*pow<5>(1.-xi);
115  case 1:
116  return (1./32.)*pow<5>(1.+xi);
117  case 2:
118  return (5./32.)*(1.+xi)*pow<4>(1.-xi);
119  case 3:
120  return (5./16.)*pow<2>(1.+xi)*pow<3>(1.-xi);
121  case 4:
122  return (5./16.)*pow<3>(1.+xi)*pow<2>(1.-xi);
123  case 5:
124  return (5./32.)*pow<4>(1.+xi)*(1.-xi);
125  default:
126  libmesh_error_msg("Invalid shape function index i = " << i);
127  }
128 
129 
130  case SIXTH:
131 
132  switch (i)
133  {
134  case 0:
135  return ( 1./64.)*pow<6>(1.-xi);
136  case 1:
137  return ( 1./64.)*pow<6>(1.+xi);
138  case 2:
139  return ( 3./32.)*(1.+xi)*pow<5>(1.-xi);
140  case 3:
141  return (15./64.)*pow<2>(1.+xi)*pow<4>(1.-xi);
142  case 4:
143  return ( 5./16.)*pow<3>(1.+xi)*pow<3>(1.-xi);
144  case 5:
145  return (15./64.)*pow<4>(1.+xi)*pow<2>(1.-xi);
146  case 6:
147  return ( 3./32.)*pow<5>(1.+xi)*(1.-xi);
148  default:
149  libmesh_error_msg("Invalid shape function index i = " << i);
150  }
151 
152  default:
153  {
154  libmesh_assert (order>6);
155 
156  // Use this for arbitrary orders.
157  // Note that this implementation is less efficient.
158  const int p_order = static_cast<int>(order);
159  const int m = p_order-i+1;
160  const int n = (i-1);
161 
162  Real binomial_p_i = 1;
163 
164  // the binomial coefficient (p choose n)
165  // Using an unsigned long here will work for any of the orders we support.
166  // Explicitly construct a Real to prevent conversion warnings
167  if (i>1)
168  binomial_p_i = Real(Utility::binomial(static_cast<unsigned long>(p_order),
169  static_cast<unsigned long>(n)));
170 
171  switch(i)
172  {
173  case 0:
174  return binomial_p_i * std::pow((1-xi)/2, p_order);
175  case 1:
176  return binomial_p_i * std::pow((1+xi)/2, p_order);
177  default:
178  {
179  return binomial_p_i * std::pow((1+xi)/2,n)
180  * std::pow((1-xi)/2,m);
181  }
182  }
183  }
184  }
185 }

◆ shape() [87/125]

Real libMesh::FE< 0, LAGRANGE >::shape ( const  ElemType,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point  
)
inherited

Definition at line 27 of file fe_lagrange_shape_0D.C.

31 {
32  libmesh_assert_less (i, 1);
33  return 1.;
34 }

◆ shape() [88/125]

Real libMesh::FE< 0, HIERARCHIC >::shape ( const  ElemType,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point  
)
inherited

Definition at line 28 of file fe_hierarchic_shape_0D.C.

32 {
33  libmesh_assert_less (i, 1);
34  return 1.;
35 }

◆ shape() [89/125]

Real libMesh::FE< 0, MONOMIAL >::shape ( const  ElemType,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point  
)
inherited

Definition at line 32 of file fe_monomial_shape_0D.C.

36 {
37  libmesh_assert_less (i, 1);
38  return 1.;
39 }

◆ shape() [90/125]

Real libMesh::FE< 0, BERNSTEIN >::shape ( const  ElemType,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point  
)
inherited

Definition at line 32 of file fe_bernstein_shape_0D.C.

36 {
37  libmesh_assert_less (i, 1);
38  return 1.;
39 }

◆ shape() [91/125]

Real libMesh::FE< 0, SZABAB >::shape ( const  ElemType,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point  
)
inherited

Definition at line 32 of file fe_szabab_shape_0D.C.

36 {
37  libmesh_assert_less (i, 1);
38  return 1.;
39 }

◆ shape() [92/125]

Real libMesh::FE< 0, XYZ >::shape ( const  ElemType,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point  
)
inherited

Definition at line 32 of file fe_xyz_shape_0D.C.

36 {
37  libmesh_assert_less (i, 1);
38  return 1.;
39 }

◆ shape() [93/125]

Real libMesh::FE< 0, HERMITE >::shape ( const  ElemType,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point  
)
inherited

Definition at line 32 of file fe_hermite_shape_0D.C.

36 {
37  libmesh_assert_less (i, 1);
38  return 1.;
39 }

◆ shape() [94/125]

Real libMesh::FE< 0, RATIONAL_BERNSTEIN >::shape ( const  ElemType,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point  
)
inherited

Definition at line 32 of file fe_rational_shape_0D.C.

36 {
37  libmesh_assert_less (i, 1);
38  return 1.;
39 }

◆ shape() [95/125]

Real libMesh::FE< 0, CLOUGH >::shape ( const  ElemType,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point  
)
inherited

Definition at line 32 of file fe_clough_shape_0D.C.

36 {
37  libmesh_assert_less (i, 1);
38  return 1.;
39 }

◆ shape() [96/125]

Real libMesh::FE< 0, L2_LAGRANGE >::shape ( const  ElemType,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point  
)
inherited

Definition at line 52 of file fe_lagrange_shape_0D.C.

56 {
57  libmesh_assert_less (i, 1);
58  return 1.;
59 }

◆ shape() [97/125]

Real libMesh::FE< 0, L2_HIERARCHIC >::shape ( const  ElemType,
const  Order,
const unsigned int  libmesh_dbg_vari,
const Point  
)
inherited

Definition at line 53 of file fe_hierarchic_shape_0D.C.

57 {
58  libmesh_assert_less (i, 1);
59  return 1.;
60 }

◆ shape() [98/125]

RealGradient libMesh::FE< 2, NEDELEC_ONE >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 29 of file fe_nedelec_one_shape_2D.C.

33 {
34  libmesh_error_msg("Nedelec elements require the element type \nbecause edge orientation is needed.");
35  return RealGradient();
36 }

◆ shape() [99/125]

RealGradient libMesh::FE< 3, NEDELEC_ONE >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 29 of file fe_nedelec_one_shape_3D.C.

33 {
34  libmesh_error_msg("Nedelec elements require the element type \nbecause edge orientation is needed.");
35  return RealGradient();
36 }

◆ shape() [100/125]

Real libMesh::FE< 0, SCALAR >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 29 of file fe_scalar_shape_0D.C.

33 {
34  return 1.;
35 }

◆ shape() [101/125]

Real libMesh::FE< 1, SCALAR >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 29 of file fe_scalar_shape_1D.C.

33 {
34  return 1.;
35 }

◆ shape() [102/125]

Real libMesh::FE< 2, SCALAR >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 29 of file fe_scalar_shape_2D.C.

33 {
34  return 1.;
35 }

◆ shape() [103/125]

Real libMesh::FE< 3, SCALAR >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 29 of file fe_scalar_shape_3D.C.

33 {
34  return 1.;
35 }

◆ shape() [104/125]

Real libMesh::FE< 3, SZABAB >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 32 of file fe_szabab_shape_3D.C.

36 {
37  libmesh_error_msg("Szabo-Babuska polynomials are not defined in 3D");
38  return 0.;
39 }

◆ shape() [105/125]

Real libMesh::FE< 1, XYZ >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 32 of file fe_xyz_shape_1D.C.

36 {
37  libmesh_error_msg("XYZ polynomials require the element \n because the centroid is needed.");
38  return 0.;
39 }

◆ shape() [106/125]

Real libMesh::FE< 2, XYZ >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 32 of file fe_xyz_shape_2D.C.

36 {
37  libmesh_error_msg("XYZ polynomials require the element \nbecause the centroid is needed.");
38  return 0.;
39 }

◆ shape() [107/125]

Real libMesh::FE< 3, XYZ >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 32 of file fe_xyz_shape_3D.C.

36 {
37  libmesh_error_msg("XYZ polynomials require the element because the centroid is needed.");
38  return 0.;
39 }

◆ shape() [108/125]

Real libMesh::FE< 3, CLOUGH >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 33 of file fe_clough_shape_3D.C.

37 {
38  libmesh_error_msg("Clough-Tocher elements require the real element \nto construct gradient-based degrees of freedom.");
39  return 0.;
40 }

◆ shape() [109/125]

Real libMesh::FE< 2, BERNSTEIN >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 34 of file fe_bernstein_shape_2D.C.

38 {
39  libmesh_error_msg("Bernstein polynomials require the element type \nbecause edge orientation is needed.");
40  return 0.;
41 }

◆ shape() [110/125]

Real libMesh::FE< 3, BERNSTEIN >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 36 of file fe_bernstein_shape_3D.C.

40 {
41  libmesh_error_msg("Bernstein polynomials require the element type \nbecause edge and face orientation is needed.");
42  return 0.;
43 }

◆ shape() [111/125]

Real libMesh::FE< 2, RATIONAL_BERNSTEIN >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 37 of file fe_rational_shape_2D.C.

41 {
42  libmesh_error_msg("Rational bases require the real element \nto query nodal weighting.");
43  return 0.;
44 }

◆ shape() [112/125]

Real libMesh::FE< 3, RATIONAL_BERNSTEIN >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 37 of file fe_rational_shape_3D.C.

41 {
42  libmesh_error_msg("Rational bases require the real element \nto query nodal weighting.");
43  return 0.;
44 }

◆ shape() [113/125]

Real libMesh::FE< 1, RATIONAL_BERNSTEIN >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 39 of file fe_rational_shape_1D.C.

43 {
44  libmesh_error_msg("Rational bases require the real element \nto query nodal weighting.");
45  return 0.;
46 }

◆ shape() [114/125]

Real libMesh::FE< 2, SZABAB >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 53 of file fe_szabab_shape_2D.C.

57 {
58  libmesh_error_msg("Szabo-Babuska polynomials require the element type \nbecause edge orientation is needed.");
59  return 0.;
60 }

◆ shape() [115/125]

Real libMesh::FE< 2, HIERARCHIC >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 64 of file fe_hierarchic_shape_2D.C.

68 {
69  libmesh_error_msg("Hierarchic shape functions require an Elem for edge orientation.");
70  return 0.;
71 }

◆ shape() [116/125]

Real libMesh::FE< 2, L2_HIERARCHIC >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 76 of file fe_hierarchic_shape_2D.C.

80 {
81  libmesh_error_msg("Hierarchic shape functions require an Elem for edge orientation.");
82  return 0.;
83 }

◆ shape() [117/125]

Real libMesh::FE< 1, HERMITE >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 185 of file fe_hermite_shape_1D.C.

189 {
190  libmesh_error_msg("Hermite elements require the real element \nto construct gradient-based degrees of freedom.");
191  return 0.;
192 }

◆ shape() [118/125]

Real libMesh::FE< 2, HERMITE >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 197 of file fe_hermite_shape_2D.C.

201 {
202  libmesh_error_msg("Hermite elements require the real element \nto construct gradient-based degrees of freedom.");
203  return 0.;
204 }

◆ shape() [119/125]

Real libMesh::FE< 1, CLOUGH >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 227 of file fe_clough_shape_1D.C.

231 {
232  libmesh_error_msg("Clough-Tocher elements require the real element \nto construct gradient-based degrees of freedom.");
233  return 0.;
234 }

◆ shape() [120/125]

Real libMesh::FE< 3, HERMITE >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 383 of file fe_hermite_shape_3D.C.

387 {
388  libmesh_error_msg("Hermite elements require the real element \nto construct gradient-based degrees of freedom.");
389  return 0.;
390 }

◆ shape() [121/125]

RealGradient libMesh::FE< 0, NEDELEC_ONE >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 588 of file fe_nedelec_one.C.

589 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ shape() [122/125]

RealGradient libMesh::FE< 1, NEDELEC_ONE >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 615 of file fe_nedelec_one.C.

616 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ shape() [123/125]

Real libMesh::FE< 3, HIERARCHIC >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 672 of file fe_hierarchic_shape_3D.C.

676 {
677  libmesh_error_msg("Hierarchic shape functions require an Elem for edge/face orientation.");
678  return 0.;
679 }

◆ shape() [124/125]

Real libMesh::FE< 3, L2_HIERARCHIC >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 684 of file fe_hierarchic_shape_3D.C.

688 {
689  libmesh_error_msg("Hierarchic shape functions require an Elem for edge/face orientation.");
690  return 0.;
691 }

◆ shape() [125/125]

Real libMesh::FE< 2, CLOUGH >::shape ( const  ElemType,
const  Order,
const unsigned int  ,
const Point  
)
inherited

Definition at line 1817 of file fe_clough_shape_2D.C.

1821 {
1822  libmesh_error_msg("Clough-Tocher elements require the real element \nto construct gradient-based degrees of freedom.");
1823  return 0.;
1824 }

◆ shape_deriv() [1/125]

Real libMesh::FE< 1, SCALAR >::shape_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 58 of file fe_scalar_shape_1D.C.

64 {
65  return 0.;
66 }

◆ shape_deriv() [2/125]

Real libMesh::FE< 0, SCALAR >::shape_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 58 of file fe_scalar_shape_0D.C.

64 {
65  return 0.;
66 }

◆ shape_deriv() [3/125]

Real libMesh::FE< 3, SCALAR >::shape_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 58 of file fe_scalar_shape_3D.C.

64 {
65  return 0.;
66 }

◆ shape_deriv() [4/125]

Real libMesh::FE< 2, SCALAR >::shape_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 59 of file fe_scalar_shape_2D.C.

65 {
66  return 0.;
67 }

◆ shape_deriv() [5/125]

Real libMesh::FE< 3, SZABAB >::shape_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 69 of file fe_szabab_shape_3D.C.

75 {
76  libmesh_error_msg("Szabo-Babuska polynomials are not defined in 3D");
77  return 0.;
78 }

◆ shape_deriv() [6/125]

Real libMesh::FE< 0, BERNSTEIN >::shape_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 70 of file fe_bernstein_shape_0D.C.

76 {
77  libmesh_error_msg("No spatial derivatives in 0D!");
78  return 0.;
79 }

◆ shape_deriv() [7/125]

Real libMesh::FE< 0, CLOUGH >::shape_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 70 of file fe_clough_shape_0D.C.

76 {
77  libmesh_error_msg("No spatial derivatives in 0D!");
78  return 0.;
79 }

◆ shape_deriv() [8/125]

Real libMesh::FE< 0, HERMITE >::shape_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 70 of file fe_hermite_shape_0D.C.

76 {
77  libmesh_error_msg("No spatial derivatives in 0D!");
78  return 0.;
79 }

◆ shape_deriv() [9/125]

Real libMesh::FE< 0, RATIONAL_BERNSTEIN >::shape_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 70 of file fe_rational_shape_0D.C.

76 {
77  libmesh_error_msg("No spatial derivatives in 0D!");
78  return 0.;
79 }

◆ shape_deriv() [10/125]

Real libMesh::FE< 0, MONOMIAL >::shape_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 70 of file fe_monomial_shape_0D.C.

76 {
77  libmesh_error_msg("No spatial derivatives in 0D!");
78  return 0.;
79 }

◆ shape_deriv() [11/125]

Real libMesh::FE< 0, SZABAB >::shape_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 70 of file fe_szabab_shape_0D.C.

76 {
77  libmesh_error_msg("No spatial derivatives in 0D!");
78  return 0.;
79 }

◆ shape_deriv() [12/125]

Real libMesh::FE< 0, XYZ >::shape_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 70 of file fe_xyz_shape_0D.C.

76 {
77  libmesh_error_msg("No spatial derivatives in 0D!");
78  return 0.;
79 }

◆ shape_deriv() [13/125]

Real libMesh::FE< 0, LAGRANGE >::shape_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 90 of file fe_lagrange_shape_0D.C.

96 {
97  libmesh_error_msg("No spatial derivatives in 0D!");
98  return 0.;
99 }

◆ shape_deriv() [14/125]

Real libMesh::FE< 0, HIERARCHIC >::shape_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 91 of file fe_hierarchic_shape_0D.C.

97 {
98  libmesh_error_msg("No spatial derivatives in 0D!");
99  return 0.;
100 }

◆ shape_deriv() [15/125]

Real libMesh::FE< 0, L2_LAGRANGE >::shape_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 117 of file fe_lagrange_shape_0D.C.

123 {
124  libmesh_error_msg("No spatial derivatives in 0D!");
125  return 0.;
126 }

◆ shape_deriv() [16/125]

Real libMesh::FE< 0, L2_HIERARCHIC >::shape_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 118 of file fe_hierarchic_shape_0D.C.

124 {
125  libmesh_error_msg("No spatial derivatives in 0D!");
126  return 0.;
127 }

◆ shape_deriv() [17/125]

RealGradient libMesh::FE< 0, NEDELEC_ONE >::shape_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 598 of file fe_nedelec_one.C.

600 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ shape_deriv() [18/125]

RealGradient libMesh::FE< 1, NEDELEC_ONE >::shape_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 625 of file fe_nedelec_one.C.

627 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ shape_deriv() [19/125]

Real libMesh::FE< 2, XYZ >::shape_deriv ( const Elem elem,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const unsigned int  j,
const Point point_in,
const bool  libmesh_dbg_varadd_p_level 
)
inherited

Definition at line 168 of file fe_xyz_shape_2D.C.

174 {
175 #if LIBMESH_DIM > 1
176 
177 
178  libmesh_assert_less (j, 2);
179  libmesh_assert(elem);
180 
181  Point centroid = elem->centroid();
182  Point max_distance = Point(0.,0.,0.);
183  for (const Point & p : elem->node_ref_range())
184  for (unsigned int d = 0; d < 2; d++)
185  {
186  const Real distance = std::abs(centroid(d) - p(d));
187  max_distance(d) = std::max(distance, max_distance(d));
188  }
189 
190  const Real x = point_in(0);
191  const Real y = point_in(1);
192  const Real xc = centroid(0);
193  const Real yc = centroid(1);
194  const Real distx = max_distance(0);
195  const Real disty = max_distance(1);
196  const Real dx = (x - xc)/distx;
197  const Real dy = (y - yc)/disty;
198 
199 #ifndef NDEBUG
200  // totalorder is only used in the assertion below, so
201  // we avoid declaring it when asserts are not active.
202  const unsigned int totalorder = order + add_p_level * elem->p_level();
203 #endif
204  libmesh_assert_less (i, (totalorder+1)*(totalorder+2)/2);
205 
206  // monomials. since they are hierarchic we only need one case block.
207 
208  switch (j)
209  {
210  // d()/dx
211  case 0:
212  {
213  switch (i)
214  {
215  // constants
216  case 0:
217  return 0.;
218 
219  // linears
220  case 1:
221  return 1./distx;
222 
223  case 2:
224  return 0.;
225 
226  // quadratics
227  case 3:
228  return 2.*dx/distx;
229 
230  case 4:
231  return dy/distx;
232 
233  case 5:
234  return 0.;
235 
236  // cubics
237  case 6:
238  return 3.*dx*dx/distx;
239 
240  case 7:
241  return 2.*dx*dy/distx;
242 
243  case 8:
244  return dy*dy/distx;
245 
246  case 9:
247  return 0.;
248 
249  // quartics
250  case 10:
251  return 4.*dx*dx*dx/distx;
252 
253  case 11:
254  return 3.*dx*dx*dy/distx;
255 
256  case 12:
257  return 2.*dx*dy*dy/distx;
258 
259  case 13:
260  return dy*dy*dy/distx;
261 
262  case 14:
263  return 0.;
264 
265  default:
266  unsigned int o = 0;
267  for (; i >= (o+1)*(o+2)/2; o++) { }
268  unsigned int i2 = i - (o*(o+1)/2);
269  Real val = o - i2;
270  for (unsigned int index=i2+1; index < o; index++)
271  val *= dx;
272  for (unsigned int index=0; index != i2; index++)
273  val *= dy;
274  return val/distx;
275  }
276  }
277 
278 
279  // d()/dy
280  case 1:
281  {
282  switch (i)
283  {
284  // constants
285  case 0:
286  return 0.;
287 
288  // linears
289  case 1:
290  return 0.;
291 
292  case 2:
293  return 1./disty;
294 
295  // quadratics
296  case 3:
297  return 0.;
298 
299  case 4:
300  return dx/disty;
301 
302  case 5:
303  return 2.*dy/disty;
304 
305  // cubics
306  case 6:
307  return 0.;
308 
309  case 7:
310  return dx*dx/disty;
311 
312  case 8:
313  return 2.*dx*dy/disty;
314 
315  case 9:
316  return 3.*dy*dy/disty;
317 
318  // quartics
319  case 10:
320  return 0.;
321 
322  case 11:
323  return dx*dx*dx/disty;
324 
325  case 12:
326  return 2.*dx*dx*dy/disty;
327 
328  case 13:
329  return 3.*dx*dy*dy/disty;
330 
331  case 14:
332  return 4.*dy*dy*dy/disty;
333 
334  default:
335  unsigned int o = 0;
336  for (; i >= (o+1)*(o+2)/2; o++) { }
337  unsigned int i2 = i - (o*(o+1)/2);
338  Real val = i2;
339  for (unsigned int index=i2; index != o; index++)
340  val *= dx;
341  for (unsigned int index=1; index <= i2; index++)
342  val *= dy;
343  return val/disty;
344  }
345  }
346 
347 
348  default:
349  libmesh_error_msg("Invalid j = " << j);
350  }
351 
352 #else // LIBMESH_DIM <= 1
353  libmesh_assert(true || order || add_p_level);
354  libmesh_ignore(elem, i, j, point_in);
355  libmesh_not_implemented();
356 #endif
357 }

◆ shape_deriv() [20/125]

Real libMesh::FE< 3, XYZ >::shape_deriv ( const Elem elem,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const unsigned int  j,
const Point point_in,
const bool  libmesh_dbg_varadd_p_level 
)
inherited

Definition at line 237 of file fe_xyz_shape_3D.C.

243 {
244 #if LIBMESH_DIM == 3
245 
246  libmesh_assert(elem);
247  libmesh_assert_less (j, 3);
248 
249  Point centroid = elem->centroid();
250  Point max_distance = Point(0.,0.,0.);
251  for (unsigned int p = 0; p < elem->n_nodes(); p++)
252  for (unsigned int d = 0; d < 3; d++)
253  {
254  const Real distance = std::abs(centroid(d) - elem->point(p)(d));
255  max_distance(d) = std::max(distance, max_distance(d));
256  }
257 
258  const Real x = point_in(0);
259  const Real y = point_in(1);
260  const Real z = point_in(2);
261  const Real xc = centroid(0);
262  const Real yc = centroid(1);
263  const Real zc = centroid(2);
264  const Real distx = max_distance(0);
265  const Real disty = max_distance(1);
266  const Real distz = max_distance(2);
267  const Real dx = (x - xc)/distx;
268  const Real dy = (y - yc)/disty;
269  const Real dz = (z - zc)/distz;
270 
271 #ifndef NDEBUG
272  // totalorder is only used in the assertion below, so
273  // we avoid declaring it when asserts are not active.
274  const unsigned int totalorder = static_cast<Order>(order + add_p_level * elem->p_level());
275 #endif
276  libmesh_assert_less (i, (totalorder+1) * (totalorder+2) *
277  (totalorder+3)/6);
278 
279  switch (j)
280  {
281  // d()/dx
282  case 0:
283  {
284  switch (i)
285  {
286  // constant
287  case 0:
288  return 0.;
289 
290  // linear
291  case 1:
292  return 1./distx;
293 
294  case 2:
295  return 0.;
296 
297  case 3:
298  return 0.;
299 
300  // quadratic
301  case 4:
302  return 2.*dx/distx;
303 
304  case 5:
305  return dy/distx;
306 
307  case 6:
308  return 0.;
309 
310  case 7:
311  return dz/distx;
312 
313  case 8:
314  return 0.;
315 
316  case 9:
317  return 0.;
318 
319  // cubic
320  case 10:
321  return 3.*dx*dx/distx;
322 
323  case 11:
324  return 2.*dx*dy/distx;
325 
326  case 12:
327  return dy*dy/distx;
328 
329  case 13:
330  return 0.;
331 
332  case 14:
333  return 2.*dx*dz/distx;
334 
335  case 15:
336  return dy*dz/distx;
337 
338  case 16:
339  return 0.;
340 
341  case 17:
342  return dz*dz/distx;
343 
344  case 18:
345  return 0.;
346 
347  case 19:
348  return 0.;
349 
350  // quartics
351  case 20:
352  return 4.*dx*dx*dx/distx;
353 
354  case 21:
355  return 3.*dx*dx*dy/distx;
356 
357  case 22:
358  return 2.*dx*dy*dy/distx;
359 
360  case 23:
361  return dy*dy*dy/distx;
362 
363  case 24:
364  return 0.;
365 
366  case 25:
367  return 3.*dx*dx*dz/distx;
368 
369  case 26:
370  return 2.*dx*dy*dz/distx;
371 
372  case 27:
373  return dy*dy*dz/distx;
374 
375  case 28:
376  return 0.;
377 
378  case 29:
379  return 2.*dx*dz*dz/distx;
380 
381  case 30:
382  return dy*dz*dz/distx;
383 
384  case 31:
385  return 0.;
386 
387  case 32:
388  return dz*dz*dz/distx;
389 
390  case 33:
391  return 0.;
392 
393  case 34:
394  return 0.;
395 
396  default:
397  unsigned int o = 0;
398  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
399  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
400  unsigned int block=o, nz = 0;
401  for (; block < i2; block += (o-nz+1)) { nz++; }
402  const unsigned int nx = block - i2;
403  const unsigned int ny = o - nx - nz;
404  Real val = nx;
405  for (unsigned int index=1; index < nx; index++)
406  val *= dx;
407  for (unsigned int index=0; index != ny; index++)
408  val *= dy;
409  for (unsigned int index=0; index != nz; index++)
410  val *= dz;
411  return val/distx;
412  }
413  }
414 
415 
416  // d()/dy
417  case 1:
418  {
419  switch (i)
420  {
421  // constant
422  case 0:
423  return 0.;
424 
425  // linear
426  case 1:
427  return 0.;
428 
429  case 2:
430  return 1./disty;
431 
432  case 3:
433  return 0.;
434 
435  // quadratic
436  case 4:
437  return 0.;
438 
439  case 5:
440  return dx/disty;
441 
442  case 6:
443  return 2.*dy/disty;
444 
445  case 7:
446  return 0.;
447 
448  case 8:
449  return dz/disty;
450 
451  case 9:
452  return 0.;
453 
454  // cubic
455  case 10:
456  return 0.;
457 
458  case 11:
459  return dx*dx/disty;
460 
461  case 12:
462  return 2.*dx*dy/disty;
463 
464  case 13:
465  return 3.*dy*dy/disty;
466 
467  case 14:
468  return 0.;
469 
470  case 15:
471  return dx*dz/disty;
472 
473  case 16:
474  return 2.*dy*dz/disty;
475 
476  case 17:
477  return 0.;
478 
479  case 18:
480  return dz*dz/disty;
481 
482  case 19:
483  return 0.;
484 
485  // quartics
486  case 20:
487  return 0.;
488 
489  case 21:
490  return dx*dx*dx/disty;
491 
492  case 22:
493  return 2.*dx*dx*dy/disty;
494 
495  case 23:
496  return 3.*dx*dy*dy/disty;
497 
498  case 24:
499  return 4.*dy*dy*dy/disty;
500 
501  case 25:
502  return 0.;
503 
504  case 26:
505  return dx*dx*dz/disty;
506 
507  case 27:
508  return 2.*dx*dy*dz/disty;
509 
510  case 28:
511  return 3.*dy*dy*dz/disty;
512 
513  case 29:
514  return 0.;
515 
516  case 30:
517  return dx*dz*dz/disty;
518 
519  case 31:
520  return 2.*dy*dz*dz/disty;
521 
522  case 32:
523  return 0.;
524 
525  case 33:
526  return dz*dz*dz/disty;
527 
528  case 34:
529  return 0.;
530 
531  default:
532  unsigned int o = 0;
533  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
534  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
535  unsigned int block=o, nz = 0;
536  for (; block < i2; block += (o-nz+1)) { nz++; }
537  const unsigned int nx = block - i2;
538  const unsigned int ny = o - nx - nz;
539  Real val = ny;
540  for (unsigned int index=0; index != nx; index++)
541  val *= dx;
542  for (unsigned int index=1; index < ny; index++)
543  val *= dy;
544  for (unsigned int index=0; index != nz; index++)
545  val *= dz;
546  return val/disty;
547  }
548  }
549 
550 
551  // d()/dz
552  case 2:
553  {
554  switch (i)
555  {
556  // constant
557  case 0:
558  return 0.;
559 
560  // linear
561  case 1:
562  return 0.;
563 
564  case 2:
565  return 0.;
566 
567  case 3:
568  return 1./distz;
569 
570  // quadratic
571  case 4:
572  return 0.;
573 
574  case 5:
575  return 0.;
576 
577  case 6:
578  return 0.;
579 
580  case 7:
581  return dx/distz;
582 
583  case 8:
584  return dy/distz;
585 
586  case 9:
587  return 2.*dz/distz;
588 
589  // cubic
590  case 10:
591  return 0.;
592 
593  case 11:
594  return 0.;
595 
596  case 12:
597  return 0.;
598 
599  case 13:
600  return 0.;
601 
602  case 14:
603  return dx*dx/distz;
604 
605  case 15:
606  return dx*dy/distz;
607 
608  case 16:
609  return dy*dy/distz;
610 
611  case 17:
612  return 2.*dx*dz/distz;
613 
614  case 18:
615  return 2.*dy*dz/distz;
616 
617  case 19:
618  return 3.*dz*dz/distz;
619 
620  // quartics
621  case 20:
622  return 0.;
623 
624  case 21:
625  return 0.;
626 
627  case 22:
628  return 0.;
629 
630  case 23:
631  return 0.;
632 
633  case 24:
634  return 0.;
635 
636  case 25:
637  return dx*dx*dx/distz;
638 
639  case 26:
640  return dx*dx*dy/distz;
641 
642  case 27:
643  return dx*dy*dy/distz;
644 
645  case 28:
646  return dy*dy*dy/distz;
647 
648  case 29:
649  return 2.*dx*dx*dz/distz;
650 
651  case 30:
652  return 2.*dx*dy*dz/distz;
653 
654  case 31:
655  return 2.*dy*dy*dz/distz;
656 
657  case 32:
658  return 3.*dx*dz*dz/distz;
659 
660  case 33:
661  return 3.*dy*dz*dz/distz;
662 
663  case 34:
664  return 4.*dz*dz*dz/distz;
665 
666  default:
667  unsigned int o = 0;
668  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
669  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
670  unsigned int block=o, nz = 0;
671  for (; block < i2; block += (o-nz+1)) { nz++; }
672  const unsigned int nx = block - i2;
673  const unsigned int ny = o - nx - nz;
674  Real val = nz;
675  for (unsigned int index=0; index != nx; index++)
676  val *= dx;
677  for (unsigned int index=0; index != ny; index++)
678  val *= dy;
679  for (unsigned int index=1; index < nz; index++)
680  val *= dz;
681  return val/distz;
682  }
683  }
684 
685 
686  default:
687  libmesh_error_msg("Invalid j = " << j);
688  }
689 
690 #else // LIBMESH_DIM != 3
691  libmesh_assert(true || order || add_p_level);
692  libmesh_ignore(elem, i, j, point_in);
693  libmesh_not_implemented();
694 #endif
695 }

◆ shape_deriv() [21/125]

Real libMesh::FE< 1, XYZ >::shape_deriv ( const Elem elem,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const unsigned int  libmesh_dbg_varj,
const Point point_in,
const bool  libmesh_dbg_varadd_p_level 
)
inherited

Definition at line 107 of file fe_xyz_shape_1D.C.

113 {
114  libmesh_assert(elem);
115  libmesh_assert_less_equal (i, order + add_p_level * elem->p_level());
116 
117  // only d()/dxi in 1D!
118 
119  libmesh_assert_equal_to (j, 0);
120 
121  Point centroid = elem->centroid();
122  Real max_distance = 0.;
123  for (const Point & p : elem->node_ref_range())
124  {
125  const Real distance = std::abs(centroid(0) - p(0));
126  max_distance = std::max(distance, max_distance);
127  }
128 
129  const Real x = point_in(0);
130  const Real xc = centroid(0);
131  const Real dx = (x - xc)/max_distance;
132 
133  // monomials. since they are hierarchic we only need one case block.
134  switch (i)
135  {
136  case 0:
137  return 0.;
138 
139  case 1:
140  return 1./max_distance;
141 
142  case 2:
143  return 2.*dx/max_distance;
144 
145  case 3:
146  return 3.*dx*dx/max_distance;
147 
148  case 4:
149  return 4.*dx*dx*dx/max_distance;
150 
151  default:
152  Real val = i;
153  for (unsigned int index = 1; index != i; ++index)
154  val *= dx;
155  return val/max_distance;
156  }
157 }

◆ shape_deriv() [22/125]

Real libMesh::FE< 1, HERMITE >::shape_deriv ( const Elem elem,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const unsigned int  ,
const Point p,
const bool  libmesh_dbg_varadd_p_level 
)
inherited

Definition at line 262 of file fe_hermite_shape_1D.C.

268 {
269  libmesh_assert(elem);
270 
271  // Coefficient naming: d(1)d(2n) is the coefficient of the
272  // global shape function corresponding to value 1 in terms of the
273  // local shape function corresponding to normal derivative 2
274  Real d1xd1x, d2xd2x;
275 
276  hermite_compute_coefs(elem, d1xd1x, d2xd2x);
277 
278  const ElemType type = elem->type();
279 
280 #ifndef NDEBUG
281  const unsigned int totalorder =
282  order + add_p_level * elem->p_level();
283 #endif
284 
285  switch (type)
286  {
287  // C1 functions on the C1 cubic edge
288  case EDGE2:
289  case EDGE3:
290  {
291  libmesh_assert_less (i, totalorder+1);
292 
293  switch (i)
294  {
295  case 0:
297  case 1:
298  return d1xd1x * FEHermite<1>::hermite_raw_shape_deriv(2, p(0));
299  case 2:
301  case 3:
302  return d2xd2x * FEHermite<1>::hermite_raw_shape_deriv(3, p(0));
303  default:
305  }
306  }
307  default:
308  libmesh_error_msg("ERROR: Unsupported element type = " << type);
309  }
310 }

◆ shape_deriv() [23/125]

static OutputShape libMesh::FE< Dim, T >::shape_deriv ( const Elem elem,
const Order  o,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level = true 
)
staticinherited
Returns
The \( j^{th} \) derivative of the \( i^{th} \) shape function. You must specify element type, and order directly.

On a p-refined element, o should be the base order of the element if add_p_level is left true, or can be the base order of the element if add_p_level is set to false.

◆ shape_deriv() [24/125]

RealGradient libMesh::FE< 2, NEDELEC_ONE >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point ,
const bool  add_p_level 
)
inherited

Definition at line 180 of file fe_nedelec_one_shape_2D.C.

186 {
187 #if LIBMESH_DIM > 1
188  libmesh_assert(elem);
189  libmesh_assert_less (j, 2);
190 
191  const Order total_order = static_cast<Order>(order + add_p_level * elem->p_level());
192 
193  switch (total_order)
194  {
195  // linear Lagrange shape functions
196  case FIRST:
197  {
198  switch (elem->type())
199  {
200  case QUAD8:
201  case QUAD9:
202  {
203  libmesh_assert_less (i, 4);
204 
205  switch (j)
206  {
207  // d()/dxi
208  case 0:
209  {
210  switch(i)
211  {
212  case 0:
213  case 2:
214  return RealGradient();
215  case 1:
216  {
217  if (elem->point(1) > elem->point(2))
218  return RealGradient( 0.0, -0.25 );
219  else
220  return RealGradient( 0.0, 0.25 );
221  }
222  case 3:
223  {
224  if (elem->point(3) > elem->point(0))
225  return RealGradient( 0.0, -0.25 );
226  else
227  return RealGradient( 0.0, 0.25 );
228  }
229  default:
230  libmesh_error_msg("Invalid i = " << i);
231  }
232  } // j=0
233 
234  // d()/deta
235  case 1:
236  {
237  switch(i)
238  {
239  case 1:
240  case 3:
241  return RealGradient();
242  case 0:
243  {
244  if (elem->point(0) > elem->point(1))
245  return RealGradient( 0.25 );
246  else
247  return RealGradient( -0.25 );
248  }
249  case 2:
250  {
251  if (elem->point(2) > elem->point(3))
252  return RealGradient( 0.25 );
253  else
254  return RealGradient( -0.25 );
255  }
256  default:
257  libmesh_error_msg("Invalid i = " << i);
258  }
259  } // j=1
260 
261  default:
262  libmesh_error_msg("Invalid j = " << j);
263  }
264 
265  return RealGradient();
266  }
267 
268  case TRI6:
269  {
270  libmesh_assert_less (i, 3);
271 
272  // Account for edge flipping
273  Real f = 1.0;
274 
275  switch(i)
276  {
277  case 0:
278  {
279  if (elem->point(0) > elem->point(1))
280  f = -1.0;
281  break;
282  }
283  case 1:
284  {
285  if (elem->point(1) > elem->point(2))
286  f = -1.0;
287  break;
288  }
289  case 2:
290  {
291  if (elem->point(2) > elem->point(0))
292  f = -1.0;
293  break;
294  }
295  default:
296  libmesh_error_msg("Invalid i = " << i);
297  }
298 
299  switch (j)
300  {
301  // d()/dxi
302  case 0:
303  {
304  return RealGradient( 0.0, f*1.0);
305  }
306  // d()/deta
307  case 1:
308  {
309  return RealGradient( f*(-1.0) );
310  }
311  default:
312  libmesh_error_msg("Invalid j = " << j);
313  }
314  }
315 
316  default:
317  libmesh_error_msg("ERROR: Unsupported 2D element type!: " << elem->type());
318  }
319  }
320  // unsupported order
321  default:
322  libmesh_error_msg("ERROR: Unsupported 2D FE order!: " << total_order);
323  }
324 #else // LIBMESH_DIM > 1
325  libmesh_ignore(elem, order, i, j, add_p_level);
326  libmesh_not_implemented();
327 #endif
328 }

◆ shape_deriv() [25/125]

Real libMesh::FE< 1, LAGRANGE >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 99 of file fe_lagrange_shape_1D.C.

105 {
106  libmesh_assert(elem);
107 
108  return fe_lagrange_1D_shape_deriv(static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p(0));
109 }

◆ shape_deriv() [26/125]

Real libMesh::FE< 2, RATIONAL_BERNSTEIN >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 107 of file fe_rational_shape_2D.C.

113 {
114  libmesh_assert(elem);
115 
116  const ElemType elem_type = elem->type();
117 
118  const Order totalorder = static_cast<Order>(order + add_p_level * elem->p_level());
119 
120  // FEType object to be passed to various FEInterface functions below.
121  FEType fe_type(totalorder, _underlying_fe_family);
122 
123  const unsigned int n_sf =
124  FEInterface::n_shape_functions(2, fe_type, elem_type);
125 
126  const unsigned int n_nodes = elem->n_nodes();
127  libmesh_assert_equal_to (n_sf, n_nodes);
128 
129  std::vector<Real> node_weights(n_nodes);
130 
131  const unsigned char datum_index = elem->mapping_data();
132  for (unsigned int n=0; n<n_nodes; n++)
133  node_weights[n] =
134  elem->node_ref(n).get_extra_datum<Real>(datum_index);
135 
136  Real weighted_shape_i = 0, weighted_sum = 0,
137  weighted_grad_i = 0, weighted_grad_sum = 0;
138 
139  for (unsigned int sf=0; sf<n_sf; sf++)
140  {
141  Real weighted_shape = node_weights[sf] *
142  FEInterface::shape(2, fe_type, elem, sf, p);
143  Real weighted_grad = node_weights[sf] *
144  FEInterface::shape_deriv(2, fe_type, elem, sf, j, p);
145  weighted_sum += weighted_shape;
146  weighted_grad_sum += weighted_grad;
147  if (sf == i)
148  {
149  weighted_shape_i = weighted_shape;
150  weighted_grad_i = weighted_grad;
151  }
152  }
153 
154  return (weighted_sum * weighted_grad_i - weighted_shape_i * weighted_grad_sum) /
155  weighted_sum / weighted_sum;
156 }

◆ shape_deriv() [27/125]

Real libMesh::FE< 3, RATIONAL_BERNSTEIN >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 107 of file fe_rational_shape_3D.C.

113 {
114  libmesh_assert(elem);
115 
116  const ElemType elem_type = elem->type();
117 
118  const Order totalorder = static_cast<Order>(order + add_p_level * elem->p_level());
119 
120  // FEType object to be passed to various FEInterface functions below.
121  FEType fe_type(totalorder, _underlying_fe_family);
122 
123  const unsigned int n_sf =
124  FEInterface::n_shape_functions(3, fe_type, elem_type);
125 
126  const unsigned int n_nodes = elem->n_nodes();
127  libmesh_assert_equal_to (n_sf, n_nodes);
128 
129  std::vector<Real> node_weights(n_nodes);
130 
131  const unsigned char datum_index = elem->mapping_data();
132  for (unsigned int n=0; n<n_nodes; n++)
133  node_weights[n] =
134  elem->node_ref(n).get_extra_datum<Real>(datum_index);
135 
136  Real weighted_shape_i = 0, weighted_sum = 0,
137  weighted_grad_i = 0, weighted_grad_sum = 0;
138 
139  for (unsigned int sf=0; sf<n_sf; sf++)
140  {
141  Real weighted_shape = node_weights[sf] *
142  FEInterface::shape(3, fe_type, elem, sf, p);
143  Real weighted_grad = node_weights[sf] *
144  FEInterface::shape_deriv(3, fe_type, elem, sf, j, p);
145  weighted_sum += weighted_shape;
146  weighted_grad_sum += weighted_grad;
147  if (sf == i)
148  {
149  weighted_shape_i = weighted_shape;
150  weighted_grad_i = weighted_grad;
151  }
152  }
153 
154  return (weighted_sum * weighted_grad_i - weighted_shape_i * weighted_grad_sum) /
155  weighted_sum / weighted_sum;
156 }

◆ shape_deriv() [28/125]

Real libMesh::FE< 1, L2_LAGRANGE >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 114 of file fe_lagrange_shape_1D.C.

120 {
121  libmesh_assert(elem);
122 
123  return fe_lagrange_1D_shape_deriv(static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p(0));
124 }

◆ shape_deriv() [29/125]

Real libMesh::FE< 1, MONOMIAL >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 127 of file fe_monomial_shape_1D.C.

133 {
134  libmesh_assert(elem);
135 
136  return FE<1,MONOMIAL>::shape_deriv(elem->type(),
137  static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
138 }

◆ shape_deriv() [30/125]

Real libMesh::FE< 3, LAGRANGE >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 134 of file fe_lagrange_shape_3D.C.

140 {
141  libmesh_assert(elem);
142 
143  // call the orientation-independent shape function derivatives
144  return fe_lagrange_3D_shape_deriv(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
145 }

◆ shape_deriv() [31/125]

Real libMesh::FE< 1, HIERARCHIC >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 134 of file fe_hierarchic_shape_1D.C.

140 {
141  libmesh_assert(elem);
142 
143  return fe_hierarchic_1D_shape_deriv(elem->type(),
144  static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
145 }

◆ shape_deriv() [32/125]

Real libMesh::FE< 2, LAGRANGE >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 135 of file fe_lagrange_shape_2D.C.

141 {
142  libmesh_assert(elem);
143 
144  // call the orientation-independent shape functions
145  return fe_lagrange_2D_shape_deriv(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
146 }

◆ shape_deriv() [33/125]

Real libMesh::FE< 2, HIERARCHIC >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 138 of file fe_hierarchic_shape_2D.C.

144 {
145  return fe_hierarchic_2D_shape_deriv(elem, order, i, j, p, add_p_level);
146 }

◆ shape_deriv() [34/125]

Real libMesh::FE< 1, SZABAB >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 139 of file fe_szabab_shape_1D.C.

145 {
146  libmesh_assert(elem);
147 
148  return FE<1,SZABAB>::shape_deriv(elem->type(),
149  static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
150 }

◆ shape_deriv() [35/125]

Real libMesh::FE< 1, L2_HIERARCHIC >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 149 of file fe_hierarchic_shape_1D.C.

155 {
156  libmesh_assert(elem);
157 
158  return fe_hierarchic_1D_shape_deriv(elem->type(),
159  static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
160 }

◆ shape_deriv() [36/125]

Real libMesh::FE< 3, L2_LAGRANGE >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 149 of file fe_lagrange_shape_3D.C.

155 {
156  libmesh_assert(elem);
157 
158  // call the orientation-independent shape function derivatives
159  return fe_lagrange_3D_shape_deriv(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
160 }

◆ shape_deriv() [37/125]

Real libMesh::FE< 2, L2_HIERARCHIC >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 151 of file fe_hierarchic_shape_2D.C.

157 {
158  return fe_hierarchic_2D_shape_deriv(elem, order, i, j, p, add_p_level);
159 }

◆ shape_deriv() [38/125]

Real libMesh::FE< 2, L2_LAGRANGE >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 151 of file fe_lagrange_shape_2D.C.

157 {
158  libmesh_assert(elem);
159 
160 
161  // call the orientation-independent shape functions
162  return fe_lagrange_2D_shape_deriv(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
163 }

◆ shape_deriv() [39/125]

RealGradient libMesh::FE< 3, NEDELEC_ONE >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 207 of file fe_nedelec_one_shape_3D.C.

213 {
214 #if LIBMESH_DIM == 3
215  libmesh_assert(elem);
216  libmesh_assert_less (j, 3);
217 
218  const Order totalorder = static_cast<Order>(order + add_p_level * elem->p_level());
219 
220  switch (totalorder)
221  {
222  case FIRST:
223  {
224  switch (elem->type())
225  {
226  case HEX20:
227  case HEX27:
228  {
229  libmesh_assert_less (i, 12);
230 
231  const Real xi = p(0);
232  const Real eta = p(1);
233  const Real zeta = p(2);
234 
235  // Even with a loose inverse_map tolerance we ought to
236  // be nearly on the element interior in master
237  // coordinates
238  libmesh_assert_less_equal ( std::fabs(xi), 1.0+TOLERANCE );
239  libmesh_assert_less_equal ( std::fabs(eta), 1.0+TOLERANCE );
240  libmesh_assert_less_equal ( std::fabs(zeta), 1.0+TOLERANCE );
241 
242  switch (j)
243  {
244  // d()/dxi
245  case 0:
246  {
247  switch(i)
248  {
249  case 0:
250  case 2:
251  case 8:
252  case 10:
253  return RealGradient();
254  case 1:
255  {
256  if (elem->point(1) > elem->point(2))
257  return RealGradient( 0.0, -0.125*(1.0-zeta) );
258  else
259  return RealGradient( 0.0, 0.125*(1.0-zeta) );
260  }
261  case 3:
262  {
263  if (elem->point(3) > elem->point(0))
264  return RealGradient( 0.0, 0.125*(-1.0+zeta) );
265  else
266  return RealGradient( 0.0, -0.125*(-1.0+zeta) );
267  }
268  case 4:
269  {
270  if (elem->point(0) > elem->point(4))
271  return RealGradient( 0.0, 0.0, -0.125*(-1.0+eta) );
272  else
273  return RealGradient( 0.0, 0.0, 0.125*(-1.0+eta) );
274  }
275  case 5:
276  {
277  if (elem->point(1) > elem->point(5))
278  return RealGradient( 0.0, 0.0, -0.125*(1.0-eta) );
279  else
280  return RealGradient( 0.0, 0.0, 0.125*(1.0-eta) );
281  }
282  case 6:
283  {
284  if (elem->point(2) > elem->point(6))
285  return RealGradient( 0.0, 0.0, -0.125*(1.0+eta) );
286  else
287  return RealGradient( 0.0, 0.0, 0.125*(1.0+eta) );
288  }
289  case 7:
290  {
291  if (elem->point(3) > elem->point(7))
292  return RealGradient( 0.0, 0.0, -0.125*(-1.0-eta) );
293  else
294  return RealGradient( 0.0, 0.0, 0.125*(-1.0-eta) );
295  }
296  case 9:
297  {
298  if (elem->point(5) > elem->point(6))
299  return RealGradient( 0.0, -0.125*(1.0+zeta), 0.0 );
300  else
301  return RealGradient( 0.0, 0.125*(1.0+zeta), 0.0 );
302  }
303  case 11:
304  {
305  if (elem->point(4) > elem->point(7))
306  return RealGradient( 0.0, -0.125*(-1.0-zeta), 0.0 );
307  else
308  return RealGradient( 0.0, 0.125*(-1.0-zeta), 0.0 );
309  }
310  default:
311  libmesh_error_msg("Invalid i = " << i);
312  } // switch(i)
313 
314  } // j=0
315 
316  // d()/deta
317  case 1:
318  {
319  switch(i)
320  {
321  case 1:
322  case 3:
323  case 9:
324  case 11:
325  return RealGradient();
326  case 0:
327  {
328  if (elem->point(0) > elem->point(1))
329  return RealGradient( -0.125*(-1.0+zeta), 0.0, 0.0 );
330  else
331  return RealGradient( 0.125*(-1.0+zeta), 0.0, 0.0 );
332  }
333  case 2:
334  {
335  if (elem->point(2) > elem->point(3))
336  return RealGradient( 0.125*(1.0-zeta), 0.0, 0.0 );
337  else
338  return RealGradient( -0.125*(1.0-zeta), 0.0, 0.0 );
339  }
340  case 4:
341  {
342  if (elem->point(0) > elem->point(4))
343  return RealGradient( 0.0, 0.0, -0.125*(-1.0+xi) );
344  else
345  return RealGradient( 0.0, 0.0, 0.125*(-1.0+xi) );
346  }
347  case 5:
348  {
349  if (elem->point(1) > elem->point(5))
350  return RealGradient( 0.0, 0.0, -0.125*(-1.0-xi) );
351  else
352  return RealGradient( 0.0, 0.0, 0.125*(-1.0-xi) );
353  }
354  case 6:
355  {
356  if (elem->point(2) > elem->point(6))
357  return RealGradient( 0.0, 0.0, -0.125*(1.0+xi) );
358  else
359  return RealGradient( 0.0, 0.0, 0.125*(1.0+xi) );
360  }
361  case 7:
362  {
363  if (elem->point(3) > elem->point(7))
364  return RealGradient( 0.0, 0.0, -0.125*(1.0-xi) );
365  else
366  return RealGradient( 0.0, 0.0, 0.125*(1.0-xi) );
367  }
368  case 8:
369  {
370  if (elem->point(4) > elem->point(5))
371  return RealGradient( -0.125*(-1.0-zeta), 0.0, 0.0 );
372  else
373  return RealGradient( 0.125*(-1.0-zeta), 0.0, 0.0 );
374  }
375  case 10:
376  {
377  if (elem->point(7) > elem->point(6))
378  return RealGradient( -0.125*(1.0+zeta), 0.0, 0.0 );
379  else
380  return RealGradient( 0.125*(1.0+zeta), 0.0, 0.0 );
381  }
382  default:
383  libmesh_error_msg("Invalid i = " << i);
384  } // switch(i)
385 
386  } // j=1
387 
388  // d()/dzeta
389  case 2:
390  {
391  switch(i)
392  {
393  case 4:
394  case 5:
395  case 6:
396  case 7:
397  return RealGradient();
398 
399  case 0:
400  {
401  if (elem->point(0) > elem->point(1))
402  return RealGradient( -0.125*(-1.0+eta), 0.0, 0.0 );
403  else
404  return RealGradient( 0.125*(-1.0+eta), 0.0, 0.0 );
405  }
406  case 1:
407  {
408  if (elem->point(1) > elem->point(2))
409  return RealGradient( 0.0, -0.125*(-1.0-xi), 0.0 );
410  else
411  return RealGradient( 0.0, 0.125*(-1.0-xi), 0.0 );
412  }
413  case 2:
414  {
415  if (elem->point(2) > elem->point(3))
416  return RealGradient( 0.125*(-1.0-eta), 0.0, 0.0 );
417  else
418  return RealGradient( -0.125*(-1.0-eta), 0.0, 0.0 );
419  }
420  case 3:
421  {
422  if (elem->point(3) > elem->point(0))
423  return RealGradient( 0.0, 0.125*(-1.0+xi), 0.0 );
424  else
425  return RealGradient( 0.0, -0.125*(-1.0+xi), 0.0 );
426  }
427  case 8:
428  {
429  if (elem->point(4) > elem->point(5))
430  return RealGradient( -0.125*(1.0-eta), 0.0, 0.0 );
431  else
432  return RealGradient( 0.125*(1.0-eta), 0.0, 0.0 );
433  }
434  case 9:
435  {
436  if (elem->point(5) > elem->point(6))
437  return RealGradient( 0.0, -0.125*(1.0+xi), 0.0 );
438  else
439  return RealGradient( 0.0, 0.125*(1.0+xi), 0.0 );
440  }
441  case 10:
442  {
443  if (elem->point(7) > elem->point(6))
444  return RealGradient( -0.125*(1.0+eta), 0.0, 0.0 );
445  else
446  return RealGradient( 0.125*(1.0+eta), 0.0, 0.0 );
447  }
448  case 11:
449  {
450  if (elem->point(4) > elem->point(7))
451  return RealGradient( 0.0, -0.125*(1.0-xi), 0.0 );
452  else
453  return RealGradient( 0.0, 0.125*(1.0-xi), 0.0 );
454  }
455  default:
456  libmesh_error_msg("Invalid i = " << i);
457  } // switch(i)
458 
459  } // j = 2
460 
461  default:
462  libmesh_error_msg("Invalid j = " << j);
463  }
464 
465  return RealGradient();
466  }
467 
468  case TET10:
469  {
470  libmesh_assert_less (i, 6);
471 
472  libmesh_not_implemented();
473  return RealGradient();
474  }
475 
476  default:
477  libmesh_error_msg("ERROR: Unsupported 3D element type!: " << elem->type());
478  }
479  }
480 
481  // unsupported order
482  default:
483  libmesh_error_msg("ERROR: Unsupported 3D FE order!: " << totalorder);
484  }
485 
486 #else // LIBMESH_DIM != 3
487  libmesh_ignore(elem, order, i, j, p, add_p_level);
488  libmesh_not_implemented();
489 #endif
490 }

◆ shape_deriv() [40/125]

Real libMesh::FE< 2, HERMITE >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 274 of file fe_hermite_shape_2D.C.

280 {
281  libmesh_assert(elem);
282  libmesh_assert (j == 0 || j == 1);
283 
284  std::vector<std::vector<Real>> dxdxi(2, std::vector<Real>(2, 0));
285 
286 #ifdef DEBUG
287  std::vector<Real> dxdeta(2), dydxi(2);
288 #endif
289 
290  hermite_compute_coefs(elem,dxdxi
291 #ifdef DEBUG
292  ,dxdeta,dydxi
293 #endif
294  );
295 
296  const ElemType type = elem->type();
297 
298  const Order totalorder =
299  static_cast<Order>(order + add_p_level * elem->p_level());
300 
301  switch (type)
302  {
303  case QUAD4:
304  case QUADSHELL4:
305  libmesh_assert_less (totalorder, 4);
306  libmesh_fallthrough();
307  case QUAD8:
308  case QUADSHELL8:
309  case QUAD9:
310  {
311  libmesh_assert_less (i, (totalorder+1u)*(totalorder+1u));
312 
313  std::vector<unsigned int> bases1D;
314 
315  Real coef = hermite_bases_2D(bases1D, dxdxi, totalorder, i);
316 
317  switch (j)
318  {
319  case 0:
320  return coef *
321  FEHermite<1>::hermite_raw_shape_deriv(bases1D[0],p(0)) *
322  FEHermite<1>::hermite_raw_shape(bases1D[1],p(1));
323  case 1:
324  return coef *
325  FEHermite<1>::hermite_raw_shape(bases1D[0],p(0)) *
326  FEHermite<1>::hermite_raw_shape_deriv(bases1D[1],p(1));
327  default:
328  libmesh_error_msg("Invalid derivative index j = " << j);
329  }
330  }
331  default:
332  libmesh_error_msg("ERROR: Unsupported element type = " << type);
333  }
334 }

◆ shape_deriv() [41/125]

Real libMesh::FE< 1, CLOUGH >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 307 of file fe_clough_shape_1D.C.

313 {
314  libmesh_assert(elem);
315 
316  clough_compute_coefs(elem);
317 
318  const ElemType type = elem->type();
319 
320  const Order totalorder =
321  static_cast<Order>(order + add_p_level * elem->p_level());
322 
323  switch (totalorder)
324  {
325  // 3rd-order C1 cubic element
326  case THIRD:
327  {
328  switch (type)
329  {
330  // C1 functions on the C1 cubic edge
331  case EDGE2:
332  case EDGE3:
333  {
334  switch (i)
335  {
336  case 0:
337  return clough_raw_shape_deriv(0, j, p);
338  case 1:
339  return clough_raw_shape_deriv(1, j, p);
340  case 2:
341  return d1xd1x * clough_raw_shape_deriv(2, j, p);
342  case 3:
343  return d2xd2x * clough_raw_shape_deriv(3, j, p);
344  default:
345  libmesh_error_msg("Invalid shape function index i = " << i);
346  }
347  }
348  default:
349  libmesh_error_msg("ERROR: Unsupported element type = " << type);
350  }
351  }
352  // by default throw an error
353  default:
354  libmesh_error_msg("ERROR: Unsupported polynomial order = " << totalorder);
355  }
356 }

◆ shape_deriv() [42/125]

Real libMesh::FE< 2, MONOMIAL >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 309 of file fe_monomial_shape_2D.C.

315 {
316  libmesh_assert(elem);
317 
318  // by default call the orientation-independent shape functions
319  return FE<2,MONOMIAL>::shape_deriv(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
320 }

◆ shape_deriv() [43/125]

Real libMesh::FE< 1, BERNSTEIN >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 364 of file fe_bernstein_shape_1D.C.

370 {
371  libmesh_assert(elem);
372 
373  return FE<1,BERNSTEIN>::shape_deriv
374  (elem->type(),
375  static_cast<Order>(order + add_p_level*elem->p_level()), i, j, p);
376 }

◆ shape_deriv() [44/125]

Real libMesh::FE< 2, BERNSTEIN >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 401 of file fe_bernstein_shape_2D.C.

407 {
408  libmesh_assert(elem);
409 
410  const ElemType type = elem->type();
411 
412  const Order totalorder =
413  static_cast<Order>(order + add_p_level * elem->p_level());
414 
415  switch (type)
416  {
417  // Hierarchic shape functions on the quadrilateral.
418  case QUAD4:
419  case QUAD9:
420  {
421  // Compute quad shape functions as a tensor-product
422  const Real xi = p(0);
423  const Real eta = p(1);
424 
425  libmesh_assert_less (i, (totalorder+1u)*(totalorder+1u));
426 
427  unsigned int i0, i1;
428 
429  // Vertex DoFs
430  if (i == 0)
431  { i0 = 0; i1 = 0; }
432  else if (i == 1)
433  { i0 = 1; i1 = 0; }
434  else if (i == 2)
435  { i0 = 1; i1 = 1; }
436  else if (i == 3)
437  { i0 = 0; i1 = 1; }
438 
439 
440  // Edge DoFs
441  else if (i < totalorder + 3u)
442  { i0 = i - 2; i1 = 0; }
443  else if (i < 2u*totalorder + 2)
444  { i0 = 1; i1 = i - totalorder - 1; }
445  else if (i < 3u*totalorder + 1)
446  { i0 = i - 2u*totalorder; i1 = 1; }
447  else if (i < 4u*totalorder)
448  { i0 = 0; i1 = i - 3u*totalorder + 1; }
449  // Interior DoFs
450  else
451  {
452  unsigned int basisnum = i - 4*totalorder;
453  i0 = square_number_column[basisnum] + 2;
454  i1 = square_number_row[basisnum] + 2;
455  }
456 
457 
458  // Flip odd degree of freedom values if necessary
459  // to keep continuity on sides
460  if ((i>= 4 && i<= 4+ totalorder-2u) && elem->point(0) > elem->point(1)) i0=totalorder+2-i0;
461  else if ((i>= 4+ totalorder-1u && i<= 4+2*totalorder-3u) && elem->point(1) > elem->point(2)) i1=totalorder+2-i1;
462  else if ((i>= 4+2*totalorder-2u && i<= 4+3*totalorder-4u) && elem->point(3) > elem->point(2)) i0=totalorder+2-i0;
463  else if ((i>= 4+3*totalorder-3u && i<= 4+4*totalorder-5u) && elem->point(0) > elem->point(3)) i1=totalorder+2-i1;
464 
465  switch (j)
466  {
467  // d()/dxi
468  case 0:
469  return (FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i0, 0, xi)*
470  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1, eta));
471 
472  // d()/deta
473  case 1:
474  return (FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0, xi)*
475  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i1, 0, eta));
476 
477  default:
478  libmesh_error_msg("Invalid shape function derivative j = " << j);
479  }
480  }
481 
482  // Bernstein shape functions on the 8-noded quadrilateral
483  // is handled separately.
484  case QUAD8:
485  case QUADSHELL8:
486  {
487  libmesh_assert_less (totalorder, 3);
488 
489  const Real xi = p(0);
490  const Real eta = p(1);
491 
492  libmesh_assert_less (i, 8);
493 
494  // 0 1 2 3 4 5 6 7 8
495  static const unsigned int i0[] = {0, 1, 1, 0, 2, 1, 2, 0, 2};
496  static const unsigned int i1[] = {0, 0, 1, 1, 0, 2, 1, 2, 2};
497  static const Real scal[] = {-0.25, -0.25, -0.25, -0.25, 0.5, 0.5, 0.5, 0.5};
498  switch (j)
499  {
500  // d()/dxi
501  case 0:
502  return (FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i0[i], 0, xi)*
503  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[i], eta)
504  +scal[i]*
505  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i0[8], 0, xi)*
506  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[8], eta));
507 
508  // d()/deta
509  case 1:
510  return (FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[i], xi)*
511  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i1[i], 0, eta)
512  +scal[i]*
513  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[8], xi)*
514  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i1[8], 0, eta));
515 
516  default:
517  libmesh_error_msg("Invalid shape function derivative j = " << j);
518  }
519  }
520 
521  case TRI3:
522  case TRISHELL3:
523  libmesh_assert_less (totalorder, 2);
524  libmesh_fallthrough();
525  case TRI6:
526  {
527  // I have been lazy here and am using finite differences
528  // to compute the derivatives!
529  const Real eps = 1.e-6;
530 
531  switch (j)
532  {
533  // d()/dxi
534  case 0:
535  {
536  const Point pp(p(0)+eps, p(1));
537  const Point pm(p(0)-eps, p(1));
538 
539  return (FE<2,BERNSTEIN>::shape(elem, totalorder, i, pp) -
540  FE<2,BERNSTEIN>::shape(elem, totalorder, i, pm))/2./eps;
541  }
542 
543  // d()/deta
544  case 1:
545  {
546  const Point pp(p(0), p(1)+eps);
547  const Point pm(p(0), p(1)-eps);
548 
549  return (FE<2,BERNSTEIN>::shape(elem, totalorder, i, pp) -
550  FE<2,BERNSTEIN>::shape(elem, totalorder, i, pm))/2./eps;
551  }
552 
553 
554  default:
555  libmesh_error_msg("Invalid shape function derivative j = " << j);
556  }
557  }
558 
559  default:
560  libmesh_error_msg("ERROR: Unsupported element type = " << type);
561  }
562 }

◆ shape_deriv() [45/125]

RealVectorValue libMesh::FE< 0, MONOMIAL_VEC >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 421 of file fe_monomial_vec.C.

427 {
428  Real value = FE<0, MONOMIAL>::shape_deriv(
429  elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
431 }

◆ shape_deriv() [46/125]

RealVectorValue libMesh::FE< 1, MONOMIAL_VEC >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 466 of file fe_monomial_vec.C.

472 {
473  Real value = FE<1, MONOMIAL>::shape_deriv(
474  elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
476 }

◆ shape_deriv() [47/125]

Real libMesh::FE< 3, HERMITE >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 469 of file fe_hermite_shape_3D.C.

475 {
476  libmesh_assert(elem);
477  libmesh_assert (j == 0 || j == 1 || j == 2);
478 
479  std::vector<std::vector<Real>> dxdxi(3, std::vector<Real>(2, 0));
480 
481 #ifdef DEBUG
482  std::vector<Real> dydxi(2), dzdeta(2), dxdzeta(2);
483  std::vector<Real> dzdxi(2), dxdeta(2), dydzeta(2);
484 #endif //DEBUG
485 
486  hermite_compute_coefs(elem, dxdxi
487 #ifdef DEBUG
488  , dydxi, dzdeta, dxdzeta, dzdxi, dxdeta, dydzeta
489 #endif
490  );
491 
492  const ElemType type = elem->type();
493 
494  const Order totalorder =
495  static_cast<Order>(order + add_p_level * elem->p_level());
496 
497  switch (totalorder)
498  {
499  // 3rd-order tricubic Hermite functions
500  case THIRD:
501  {
502  switch (type)
503  {
504  case HEX8:
505  case HEX20:
506  case HEX27:
507  {
508  libmesh_assert_less (i, 64);
509 
510  std::vector<unsigned int> bases1D;
511 
512  Real coef = hermite_bases_3D(bases1D, dxdxi, totalorder, i);
513 
514  switch (j) // Derivative type
515  {
516  case 0:
517  return coef *
518  FEHermite<1>::hermite_raw_shape_deriv(bases1D[0],p(0)) *
519  FEHermite<1>::hermite_raw_shape(bases1D[1],p(1)) *
520  FEHermite<1>::hermite_raw_shape(bases1D[2],p(2));
521  break;
522  case 1:
523  return coef *
524  FEHermite<1>::hermite_raw_shape(bases1D[0],p(0)) *
525  FEHermite<1>::hermite_raw_shape_deriv(bases1D[1],p(1)) *
526  FEHermite<1>::hermite_raw_shape(bases1D[2],p(2));
527  break;
528  case 2:
529  return coef *
530  FEHermite<1>::hermite_raw_shape(bases1D[0],p(0)) *
531  FEHermite<1>::hermite_raw_shape(bases1D[1],p(1)) *
532  FEHermite<1>::hermite_raw_shape_deriv(bases1D[2],p(2));
533  break;
534  default:
535  libmesh_error_msg("Invalid shape function derivative j = " << j);
536  }
537 
538  }
539  default:
540  libmesh_error_msg("ERROR: Unsupported element type " << type);
541  }
542  }
543  // by default throw an error
544  default:
545  libmesh_error_msg("ERROR: Unsupported polynomial order " << totalorder);
546  }
547 }

◆ shape_deriv() [48/125]

RealVectorValue libMesh::FE< 2, MONOMIAL_VEC >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 524 of file fe_monomial_vec.C.

530 {
531  Real value = FE<2, MONOMIAL>::shape_deriv(
532  elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i / 2, j, p);
533 
534  switch (i % 2)
535  {
536  case 0:
538 
539  case 1:
540  return libMesh::RealVectorValue(Real(0), value);
541 
542  default:
543  libmesh_error_msg("i%2 must be either 0 or 1!");
544  }
545 
546  // dummy
547  return libMesh::RealVectorValue();
548 }

◆ shape_deriv() [49/125]

Real libMesh::FE< 2, SUBDIVISION >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

◆ shape_deriv() [50/125]

RealVectorValue libMesh::FE< 3, MONOMIAL_VEC >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 613 of file fe_monomial_vec.C.

619 {
620  Real value = FE<3, MONOMIAL>::shape_deriv(
621  elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i / 3, j, p);
622 
623  switch (i % 3)
624  {
625  case 0:
627 
628  case 1:
629  return libMesh::RealVectorValue(Real(0), value);
630 
631  case 2:
632  return libMesh::RealVectorValue(Real(0), Real(0), value);
633 
634  default:
635  libmesh_error_msg("i%3 must be 0, 1, or 2!");
636  }
637 
638  // dummy
639  return libMesh::RealVectorValue();
640 }

◆ shape_deriv() [51/125]

Real libMesh::FE< 3, MONOMIAL >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 643 of file fe_monomial_shape_3D.C.

649 {
650  libmesh_assert(elem);
651 
652  // call the orientation-independent shape function derivatives
653  return FE<3,MONOMIAL>::shape_deriv(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
654 }

◆ shape_deriv() [52/125]

RealGradient libMesh::FE< 0, LAGRANGE_VEC >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 743 of file fe_lagrange_vec.C.

747 {
748  Real value = FE<0,LAGRANGE>::shape_deriv( elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
749  return libMesh::RealGradient( value );
750 }

◆ shape_deriv() [53/125]

Real libMesh::FE< 3, HIERARCHIC >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 746 of file fe_hierarchic_shape_3D.C.

752 {
753  return fe_hierarchic_3D_shape_deriv(elem, order, i, j, p, add_p_level);
754 }

◆ shape_deriv() [54/125]

Real libMesh::FE< 2, SZABAB >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 751 of file fe_szabab_shape_2D.C.

757 {
758  libmesh_assert(elem);
759 
760  const ElemType type = elem->type();
761 
762  const Order totalorder = static_cast<Order>(order + add_p_level * elem->p_level());
763 
764  switch (totalorder)
765  {
766 
767  // 1st & 2nd-order Szabo-Babuska.
768  case FIRST:
769  case SECOND:
770  {
771  switch (type)
772  {
773 
774  // Szabo-Babuska shape functions on the triangle.
775  case TRI3:
776  case TRI6:
777  {
778  // Here we use finite differences to compute the derivatives!
779  const Real eps = 1.e-6;
780 
781  libmesh_assert_less (i, 6);
782  libmesh_assert_less (j, 2);
783 
784  switch (j)
785  {
786  // d()/dxi
787  case 0:
788  {
789  const Point pp(p(0)+eps, p(1));
790  const Point pm(p(0)-eps, p(1));
791 
792  return (FE<2,SZABAB>::shape(elem, order, i, pp) -
793  FE<2,SZABAB>::shape(elem, order, i, pm))/2./eps;
794  }
795 
796  // d()/deta
797  case 1:
798  {
799  const Point pp(p(0), p(1)+eps);
800  const Point pm(p(0), p(1)-eps);
801 
802  return (FE<2,SZABAB>::shape(elem, order, i, pp) -
803  FE<2,SZABAB>::shape(elem, order, i, pm))/2./eps;
804  }
805 
806  default:
807  libmesh_error_msg("Invalid j = " << j);
808  }
809  }
810 
811 
812 
813  // Szabo-Babuska shape functions on the quadrilateral.
814  case QUAD4:
815  case QUAD8:
816  case QUAD9:
817  {
818  // Compute quad shape functions as a tensor-product
819  const Real xi = p(0);
820  const Real eta = p(1);
821 
822  libmesh_assert_less (i, 9);
823 
824  // 0 1 2 3 4 5 6 7 8
825  static const unsigned int i0[] = {0, 1, 1, 0, 2, 1, 2, 0, 2};
826  static const unsigned int i1[] = {0, 0, 1, 1, 0, 2, 1, 2, 2};
827 
828  switch (j)
829  {
830  // d()/dxi
831  case 0:
832  return (FE<1,SZABAB>::shape_deriv(EDGE3, totalorder, i0[i], 0, xi)*
833  FE<1,SZABAB>::shape (EDGE3, totalorder, i1[i], eta));
834 
835  // d()/deta
836  case 1:
837  return (FE<1,SZABAB>::shape (EDGE3, totalorder, i0[i], xi)*
838  FE<1,SZABAB>::shape_deriv(EDGE3, totalorder, i1[i], 0, eta));
839 
840  default:
841  libmesh_error_msg("Invalid j = " << j);
842  }
843  }
844 
845  default:
846  libmesh_error_msg("Invalid element type = " << type);
847  }
848  }
849 
850 
851 
852  // 3rd-order Szabo-Babuska.
853  case THIRD:
854  {
855  switch (type)
856  {
857  // Szabo-Babuska shape functions on the triangle.
858  case TRI6:
859  {
860  // Here we use finite differences to compute the derivatives!
861  const Real eps = 1.e-6;
862 
863  libmesh_assert_less (i, 10);
864  libmesh_assert_less (j, 2);
865 
866  switch (j)
867  {
868  // d()/dxi
869  case 0:
870  {
871  const Point pp(p(0)+eps, p(1));
872  const Point pm(p(0)-eps, p(1));
873 
874  return (FE<2,SZABAB>::shape(elem, order, i, pp) -
875  FE<2,SZABAB>::shape(elem, order, i, pm))/2./eps;
876  }
877 
878  // d()/deta
879  case 1:
880  {
881  const Point pp(p(0), p(1)+eps);
882  const Point pm(p(0), p(1)-eps);
883 
884  return (FE<2,SZABAB>::shape(elem, order, i, pp) -
885  FE<2,SZABAB>::shape(elem, order, i, pm))/2./eps;
886  }
887 
888 
889  default:
890  libmesh_error_msg("Invalid j = " << j);
891  }
892  }
893 
894 
895  // Szabo-Babuska shape functions on the quadrilateral.
896  case QUAD8:
897  case QUAD9:
898  {
899  // Compute quad shape functions as a tensor-product
900  const Real xi = p(0);
901  const Real eta = p(1);
902 
903  libmesh_assert_less (i, 16);
904 
905  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
906  static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 1, 1, 2, 3, 0, 0, 2, 3, 2, 3};
907  static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 2, 3, 1, 1, 2, 3, 2, 2, 3, 3};
908 
909  Real f=1.;
910 
911  switch(i)
912  {
913  case 5: // edge 0 points
914  if (elem->point(0) > elem->point(1))f = -1.;
915  break;
916  case 7: // edge 1 points
917  if (elem->point(1) > elem->point(2))f = -1.;
918  break;
919  case 9: // edge 2 points
920  if (elem->point(3) > elem->point(2))f = -1.;
921  break;
922  case 11: // edge 3 points
923  if (elem->point(0) > elem->point(3))f = -1.;
924  break;
925 
926  default:
927  // Everything else keeps f=1
928  break;
929  }
930 
931 
932  switch (j)
933  {
934  // d()/dxi
935  case 0:
936  return f*(FE<1,SZABAB>::shape_deriv(EDGE3, totalorder, i0[i], 0, xi)*
937  FE<1,SZABAB>::shape (EDGE3, totalorder, i1[i], eta));
938 
939  // d()/deta
940  case 1:
941  return f*(FE<1,SZABAB>::shape (EDGE3, totalorder, i0[i], xi)*
942  FE<1,SZABAB>::shape_deriv(EDGE3, totalorder, i1[i], 0, eta));
943 
944  default:
945  libmesh_error_msg("Invalid j = " << j);
946  }
947  }
948 
949  default:
950  libmesh_error_msg("Invalid element type = " << type);
951  }
952  }
953 
954 
955 
956 
957  // 4th-order Szabo-Babuska.
958  case FOURTH:
959  {
960  switch (type)
961  {
962 
963  // Szabo-Babuska shape functions on the triangle.
964  case TRI6:
965  {
966  // Here we use finite differences to compute the derivatives!
967  const Real eps = 1.e-6;
968 
969  libmesh_assert_less (i, 15);
970  libmesh_assert_less (j, 2);
971 
972  switch (j)
973  {
974  // d()/dxi
975  case 0:
976  {
977  const Point pp(p(0)+eps, p(1));
978  const Point pm(p(0)-eps, p(1));
979 
980  return (FE<2,SZABAB>::shape(elem, order, i, pp) -
981  FE<2,SZABAB>::shape(elem, order, i, pm))/2./eps;
982  }
983 
984  // d()/deta
985  case 1:
986  {
987  const Point pp(p(0), p(1)+eps);
988  const Point pm(p(0), p(1)-eps);
989 
990  return (FE<2,SZABAB>::shape(elem, order, i, pp) -
991  FE<2,SZABAB>::shape(elem, order, i, pm))/2./eps;
992  }
993 
994 
995  default:
996  libmesh_error_msg("Invalid j = " << j);
997  }
998  }
999 
1000 
1001 
1002  // Szabo-Babuska shape functions on the quadrilateral.
1003  case QUAD8:
1004  case QUAD9:
1005  {
1006  // Compute quad shape functions as a tensor-product
1007  const Real xi = p(0);
1008  const Real eta = p(1);
1009 
1010  libmesh_assert_less (i, 25);
1011 
1012  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
1013  static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 4, 1, 1, 1, 2, 3, 4, 0, 0, 0, 2, 3, 4, 2, 3, 4, 2, 3, 4};
1014  static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 0, 2, 3, 4, 1, 1, 1, 2, 3, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4};
1015 
1016  Real f=1.;
1017 
1018  switch(i)
1019  {
1020  case 5: // edge 0 points
1021  if (elem->point(0) > elem->point(1))f = -1.;
1022  break;
1023  case 8: // edge 1 points
1024  if (elem->point(1) > elem->point(2))f = -1.;
1025  break;
1026  case 11: // edge 2 points
1027  if (elem->point(3) > elem->point(2))f = -1.;
1028  break;
1029  case 14: // edge 3 points
1030  if (elem->point(0) > elem->point(3))f = -1.;
1031  break;
1032 
1033  default:
1034  // Everything else keeps f=1
1035  break;
1036  }
1037 
1038 
1039  switch (j)
1040  {
1041  // d()/dxi
1042  case 0:
1043  return f*(FE<1,SZABAB>::shape_deriv(EDGE3, totalorder, i0[i], 0, xi)*
1044  FE<1,SZABAB>::shape (EDGE3, totalorder, i1[i], eta));
1045 
1046  // d()/deta
1047  case 1:
1048  return f*(FE<1,SZABAB>::shape (EDGE3, totalorder, i0[i], xi)*
1049  FE<1,SZABAB>::shape_deriv(EDGE3, totalorder, i1[i], 0, eta));
1050 
1051  default:
1052  libmesh_error_msg("Invalid j = " << j);
1053  }
1054  }
1055 
1056  default:
1057  libmesh_error_msg("Invalid element type = " << type);
1058  }
1059  }
1060 
1061 
1062 
1063 
1064  // 5th-order Szabo-Babuska.
1065  case FIFTH:
1066  {
1067  // Szabo-Babuska shape functions on the quadrilateral.
1068  switch (type)
1069  {
1070 
1071  // Szabo-Babuska shape functions on the triangle.
1072  case TRI6:
1073  {
1074  // Here we use finite differences to compute the derivatives!
1075  const Real eps = 1.e-6;
1076 
1077  libmesh_assert_less (i, 21);
1078  libmesh_assert_less (j, 2);
1079 
1080  switch (j)
1081  {
1082  // d()/dxi
1083  case 0:
1084  {
1085  const Point pp(p(0)+eps, p(1));
1086  const Point pm(p(0)-eps, p(1));
1087 
1088  return (FE<2,SZABAB>::shape(elem, order, i, pp) -
1089  FE<2,SZABAB>::shape(elem, order, i, pm))/2./eps;
1090  }
1091 
1092  // d()/deta
1093  case 1:
1094  {
1095  const Point pp(p(0), p(1)+eps);
1096  const Point pm(p(0), p(1)-eps);
1097 
1098  return (FE<2,SZABAB>::shape(elem, order, i, pp) -
1099  FE<2,SZABAB>::shape(elem, order, i, pm))/2./eps;
1100  }
1101 
1102  default:
1103  libmesh_error_msg("Invalid j = " << j);
1104  }
1105  }
1106 
1107 
1108 
1109  case QUAD8:
1110  case QUAD9:
1111  {
1112  // Compute quad shape functions as a tensor-product
1113  const Real xi = p(0);
1114  const Real eta = p(1);
1115 
1116  libmesh_assert_less (i, 36);
1117 
1118  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
1119  static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 4, 5, 1, 1, 1, 1, 2, 3, 4, 5, 0, 0, 0, 0, 2, 3, 4, 5, 2, 3, 4, 5, 2, 3, 4, 5, 2, 3, 4, 5};
1120  static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 0, 0, 2, 3, 4, 5, 1, 1, 1, 1, 2, 3, 4, 5, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5};
1121 
1122  Real f=1.;
1123 
1124  switch(i)
1125  {
1126  case 5: // edge 0 points
1127  case 7:
1128  if (elem->point(0) > elem->point(1))f = -1.;
1129  break;
1130  case 9: // edge 1 points
1131  case 11:
1132  if (elem->point(1) > elem->point(2))f = -1.;
1133  break;
1134  case 13: // edge 2 points
1135  case 15:
1136  if (elem->point(3) > elem->point(2))f = -1.;
1137  break;
1138  case 14: // edge 3 points
1139  case 19:
1140  if (elem->point(0) > elem->point(3))f = -1.;
1141  break;
1142 
1143  default:
1144  // Everything else keeps f=1
1145  break;
1146  }
1147 
1148 
1149  switch (j)
1150  {
1151  // d()/dxi
1152  case 0:
1153  return f*(FE<1,SZABAB>::shape_deriv(EDGE3, totalorder, i0[i], 0, xi)*
1154  FE<1,SZABAB>::shape (EDGE3, totalorder, i1[i], eta));
1155 
1156  // d()/deta
1157  case 1:
1158  return f*(FE<1,SZABAB>::shape (EDGE3, totalorder, i0[i], xi)*
1159  FE<1,SZABAB>::shape_deriv(EDGE3, totalorder, i1[i], 0, eta));
1160 
1161  default:
1162  libmesh_error_msg("Invalid j = " << j);
1163  }
1164  }
1165 
1166  default:
1167  libmesh_error_msg("Invalid element type = " << type);
1168  }
1169  }
1170 
1171 
1172  // 6th-order Szabo-Babuska.
1173  case SIXTH:
1174  {
1175  // Szabo-Babuska shape functions on the quadrilateral.
1176  switch (type)
1177  {
1178 
1179  // Szabo-Babuska shape functions on the triangle.
1180  case TRI6:
1181  {
1182  // Here we use finite differences to compute the derivatives!
1183  const Real eps = 1.e-6;
1184 
1185  libmesh_assert_less (i, 28);
1186  libmesh_assert_less (j, 2);
1187 
1188  switch (j)
1189  {
1190  // d()/dxi
1191  case 0:
1192  {
1193  const Point pp(p(0)+eps, p(1));
1194  const Point pm(p(0)-eps, p(1));
1195 
1196  return (FE<2,SZABAB>::shape(elem, order, i, pp) -
1197  FE<2,SZABAB>::shape(elem, order, i, pm))/2./eps;
1198  }
1199 
1200  // d()/deta
1201  case 1:
1202  {
1203  const Point pp(p(0), p(1)+eps);
1204  const Point pm(p(0), p(1)-eps);
1205 
1206  return (FE<2,SZABAB>::shape(elem, order, i, pp) -
1207  FE<2,SZABAB>::shape(elem, order, i, pm))/2./eps;
1208  }
1209 
1210  default:
1211  libmesh_error_msg("Invalid j = " << j);
1212  }
1213  }
1214 
1215 
1216 
1217  case QUAD8:
1218  case QUAD9:
1219  {
1220  // Compute quad shape functions as a tensor-product
1221  const Real xi = p(0);
1222  const Real eta = p(1);
1223 
1224  libmesh_assert_less (i, 49);
1225 
1226  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
1227  static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6};
1228  static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6};
1229 
1230  Real f=1.;
1231 
1232  switch(i)
1233  {
1234  case 5: // edge 0 points
1235  case 7:
1236  if (elem->point(0) > elem->point(1))f = -1.;
1237  break;
1238  case 10: // edge 1 points
1239  case 12:
1240  if (elem->point(1) > elem->point(2))f = -1.;
1241  break;
1242  case 15: // edge 2 points
1243  case 17:
1244  if (elem->point(3) > elem->point(2))f = -1.;
1245  break;
1246  case 20: // edge 3 points
1247  case 22:
1248  if (elem->point(0) > elem->point(3))f = -1.;
1249  break;
1250 
1251  default:
1252  // Everything else keeps f=1
1253  break;
1254  }
1255 
1256 
1257  switch (j)
1258  {
1259  // d()/dxi
1260  case 0:
1261  return f*(FE<1,SZABAB>::shape_deriv(EDGE3, totalorder, i0[i], 0, xi)*
1262  FE<1,SZABAB>::shape (EDGE3, totalorder, i1[i], eta));
1263 
1264  // d()/deta
1265  case 1:
1266  return f*(FE<1,SZABAB>::shape (EDGE3, totalorder, i0[i], xi)*
1267  FE<1,SZABAB>::shape_deriv(EDGE3, totalorder, i1[i], 0, eta));
1268 
1269  default:
1270  libmesh_error_msg("Invalid j = " << j);
1271  }
1272  }
1273 
1274  default:
1275  libmesh_error_msg("Invalid element type = " << type);
1276  }
1277  }
1278 
1279 
1280  // 7th-order Szabo-Babuska.
1281  case SEVENTH:
1282  {
1283  // Szabo-Babuska shape functions on the quadrilateral.
1284  switch (type)
1285  {
1286 
1287  // Szabo-Babuska shape functions on the triangle.
1288  case TRI6:
1289  {
1290  // Here we use finite differences to compute the derivatives!
1291  const Real eps = 1.e-6;
1292 
1293  libmesh_assert_less (i, 36);
1294  libmesh_assert_less (j, 2);
1295 
1296  switch (j)
1297  {
1298  // d()/dxi
1299  case 0:
1300  {
1301  const Point pp(p(0)+eps, p(1));
1302  const Point pm(p(0)-eps, p(1));
1303 
1304  return (FE<2,SZABAB>::shape(elem, order, i, pp) -
1305  FE<2,SZABAB>::shape(elem, order, i, pm))/2./eps;
1306  }
1307 
1308  // d()/deta
1309  case 1:
1310  {
1311  const Point pp(p(0), p(1)+eps);
1312  const Point pm(p(0), p(1)-eps);
1313 
1314  return (FE<2,SZABAB>::shape(elem, order, i, pp) -
1315  FE<2,SZABAB>::shape(elem, order, i, pm))/2./eps;
1316  }
1317 
1318  default:
1319  libmesh_error_msg("Invalid j = " << j);
1320  }
1321  }
1322 
1323 
1324 
1325  case QUAD8:
1326  case QUAD9:
1327  {
1328  // Compute quad shape functions as a tensor-product
1329  const Real xi = p(0);
1330  const Real eta = p(1);
1331 
1332  libmesh_assert_less (i, 64);
1333 
1334  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
1335  static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 4, 5, 6, 7, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7};
1336  static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7};
1337 
1338  Real f=1.;
1339 
1340  switch(i)
1341  {
1342  case 5: // edge 0 points
1343  case 7:
1344  case 9:
1345  if (elem->point(0) > elem->point(1))f = -1.;
1346  break;
1347  case 11: // edge 1 points
1348  case 13:
1349  case 15:
1350  if (elem->point(1) > elem->point(2))f = -1.;
1351  break;
1352  case 17: // edge 2 points
1353  case 19:
1354  case 21:
1355  if (elem->point(3) > elem->point(2))f = -1.;
1356  break;
1357  case 23: // edge 3 points
1358  case 25:
1359  case 27:
1360  if (elem->point(0) > elem->point(3))f = -1.;
1361  break;
1362 
1363  default:
1364  // Everything else keeps f=1
1365  break;
1366  }
1367 
1368 
1369  switch (j)
1370  {
1371  // d()/dxi
1372  case 0:
1373  return f*(FE<1,SZABAB>::shape_deriv(EDGE3, totalorder, i0[i], 0, xi)*
1374  FE<1,SZABAB>::shape (EDGE3, totalorder, i1[i], eta));
1375 
1376  // d()/deta
1377  case 1:
1378  return f*(FE<1,SZABAB>::shape (EDGE3, totalorder, i0[i], xi)*
1379  FE<1,SZABAB>::shape_deriv(EDGE3, totalorder, i1[i], 0, eta));
1380 
1381  default:
1382  libmesh_error_msg("Invalid j = " << j);
1383  }
1384  }
1385 
1386  default:
1387  libmesh_error_msg("Invalid element type = " << type);
1388  }
1389  }
1390 
1391 
1392 
1393  // by default throw an error;call the orientation-independent shape functions
1394  default:
1395  libmesh_error_msg("ERROR: Unsupported polynomial order!");
1396  }
1397 }

◆ shape_deriv() [55/125]

Real libMesh::FE< 3, L2_HIERARCHIC >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 758 of file fe_hierarchic_shape_3D.C.

764 {
765  return fe_hierarchic_3D_shape_deriv(elem, order, i, j, p, add_p_level);
766 }

◆ shape_deriv() [56/125]

Real libMesh::FE< 2, SUBDIVISION >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 770 of file fe_subdivision_2D.C.

776 {
777  libmesh_assert(elem);
778  const Order totalorder =
779  static_cast<Order>(order+add_p_level*elem->p_level());
780  return FE<2,SUBDIVISION>::shape_deriv(elem->type(), totalorder, i, j, p);
781 }

◆ shape_deriv() [57/125]

RealGradient libMesh::FE< 1, LAGRANGE_VEC >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 773 of file fe_lagrange_vec.C.

777 {
778  Real value = FE<1,LAGRANGE>::shape_deriv( elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
779  return libMesh::RealGradient( value );
780 }

◆ shape_deriv() [58/125]

RealGradient libMesh::FE< 2, LAGRANGE_VEC >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 816 of file fe_lagrange_vec.C.

820 {
821  Real value = FE<2,LAGRANGE>::shape_deriv( elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i/2, j, p );
822 
823  switch( i%2 )
824  {
825  case 0:
826  return libMesh::RealGradient( value );
827 
828  case 1:
829  return libMesh::RealGradient( Real(0), value );
830 
831  default:
832  libmesh_error_msg("i%2 must be either 0 or 1!");
833  }
834 
835  //dummy
836  return libMesh::RealGradient();
837 }

◆ shape_deriv() [59/125]

RealGradient libMesh::FE< 3, LAGRANGE_VEC >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 890 of file fe_lagrange_vec.C.

894 {
895  Real value = FE<3,LAGRANGE>::shape_deriv( elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i/3, j, p );
896 
897  switch( i%3 )
898  {
899  case 0:
900  return libMesh::RealGradient( value );
901 
902  case 1:
903  return libMesh::RealGradient( Real(0), value );
904 
905  case 2:
906  return libMesh::RealGradient( Real(0), Real(0), value );
907 
908  default:
909  libmesh_error_msg("i%3 must be 0, 1, or 2!");
910  }
911 
912  //dummy
913  return libMesh::RealGradient();
914 }

◆ shape_deriv() [60/125]

Real libMesh::FE< 3, BERNSTEIN >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 1399 of file fe_bernstein_shape_3D.C.

1405 {
1406 
1407 #if LIBMESH_DIM == 3
1408  libmesh_assert(elem);
1409  const ElemType type = elem->type();
1410 
1411  const Order totalorder =
1412  static_cast<Order>(order + add_p_level * elem->p_level());
1413 
1414  libmesh_assert_less (j, 3);
1415 
1416  switch (totalorder)
1417  {
1418  // 1st order Bernstein.
1419  case FIRST:
1420  {
1421  switch (type)
1422  {
1423  // Bernstein shape functions on the tetrahedron.
1424  case TET4:
1425  case TET10:
1426  {
1427  // I have been lazy here and am using finite differences
1428  // to compute the derivatives!
1429  const Real eps = 1.e-6;
1430 
1431  libmesh_assert_less (i, 4);
1432  libmesh_assert_less (j, 3);
1433 
1434 
1435  switch (j)
1436  {
1437  // d()/dxi
1438  case 0:
1439  {
1440  const Point pp(p(0)+eps, p(1), p(2));
1441  const Point pm(p(0)-eps, p(1), p(2));
1442 
1443  return (FE<3,BERNSTEIN>::shape(elem, order, i, pp) -
1444  FE<3,BERNSTEIN>::shape(elem, order, i, pm))/2./eps;
1445  }
1446 
1447  // d()/deta
1448  case 1:
1449  {
1450  const Point pp(p(0), p(1)+eps, p(2));
1451  const Point pm(p(0), p(1)-eps, p(2));
1452 
1453  return (FE<3,BERNSTEIN>::shape(elem, order, i, pp) -
1454  FE<3,BERNSTEIN>::shape(elem, order, i, pm))/2./eps;
1455  }
1456  // d()/dzeta
1457  case 2:
1458  {
1459  const Point pp(p(0), p(1), p(2)+eps);
1460  const Point pm(p(0), p(1), p(2)-eps);
1461 
1462  return (FE<3,BERNSTEIN>::shape(elem, order, i, pp) -
1463  FE<3,BERNSTEIN>::shape(elem, order, i, pm))/2./eps;
1464  }
1465  default:
1466  libmesh_error_msg("Invalid derivative index j = " << j);
1467  }
1468  }
1469 
1470 
1471 
1472 
1473  // Bernstein shape functions on the hexahedral.
1474  case HEX8:
1475  case HEX20:
1476  case HEX27:
1477  {
1478  libmesh_assert_less (i, 8);
1479 
1480  // Compute hex shape functions as a tensor-product
1481  const Real xi = p(0);
1482  const Real eta = p(1);
1483  const Real zeta = p(2);
1484 
1485  // The only way to make any sense of this
1486  // is to look at the mgflo/mg2/mgf documentation
1487  // and make the cut-out cube!
1488  // 0 1 2 3 4 5 6 7
1489  static const unsigned int i0[] = {0, 1, 1, 0, 0, 1, 1, 0};
1490  static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 1, 1};
1491  static const unsigned int i2[] = {0, 0, 0, 0, 1, 1, 1, 1};
1492 
1493  switch (j)
1494  {
1495  // d()/dxi
1496  case 0:
1497  return (FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i0[i], 0, xi)*
1498  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[i], eta)*
1499  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[i], zeta));
1500 
1501  // d()/deta
1502  case 1:
1503  return (FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[i], xi)*
1504  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i1[i], 0, eta)*
1505  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[i], zeta));
1506 
1507  // d()/dzeta
1508  case 2:
1509  return (FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[i], xi)*
1510  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[i], eta)*
1511  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i2[i], 0, zeta));
1512 
1513  default:
1514  libmesh_error_msg("Invalid derivative index j = " << j);
1515  }
1516  }
1517 
1518  default:
1519  libmesh_error_msg("Invalid element type = " << type);
1520  }
1521  }
1522 
1523 
1524 
1525 
1526  case SECOND:
1527  {
1528  switch (type)
1529  {
1530  // Bernstein shape functions on the tetrahedron.
1531  case TET10:
1532  {
1533  // I have been lazy here and am using finite differences
1534  // to compute the derivatives!
1535  const Real eps = 1.e-6;
1536 
1537  libmesh_assert_less (i, 10);
1538  libmesh_assert_less (j, 3);
1539 
1540 
1541  switch (j)
1542  {
1543  // d()/dxi
1544  case 0:
1545  {
1546  const Point pp(p(0)+eps, p(1), p(2));
1547  const Point pm(p(0)-eps, p(1), p(2));
1548 
1549  return (FE<3,BERNSTEIN>::shape(elem, order, i, pp) -
1550  FE<3,BERNSTEIN>::shape(elem, order, i, pm))/2./eps;
1551  }
1552 
1553  // d()/deta
1554  case 1:
1555  {
1556  const Point pp(p(0), p(1)+eps, p(2));
1557  const Point pm(p(0), p(1)-eps, p(2));
1558 
1559  return (FE<3,BERNSTEIN>::shape(elem, order, i, pp) -
1560  FE<3,BERNSTEIN>::shape(elem, order, i, pm))/2./eps;
1561  }
1562  // d()/dzeta
1563  case 2:
1564  {
1565  const Point pp(p(0), p(1), p(2)+eps);
1566  const Point pm(p(0), p(1), p(2)-eps);
1567 
1568  return (FE<3,BERNSTEIN>::shape(elem, order, i, pp) -
1569  FE<3,BERNSTEIN>::shape(elem, order, i, pm))/2./eps;
1570  }
1571  default:
1572  libmesh_error_msg("Invalid derivative index j = " << j);
1573  }
1574  }
1575 
1576  // Bernstein shape functions on the hexahedral.
1577  case HEX20:
1578  {
1579  libmesh_assert_less (i, 20);
1580 
1581  // Compute hex shape functions as a tensor-product
1582  const Real xi = p(0);
1583  const Real eta = p(1);
1584  const Real zeta = p(2);
1585 
1586  // The only way to make any sense of this
1587  // is to look at the mgflo/mg2/mgf documentation
1588  // and make the cut-out cube!
1589  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
1590  static const unsigned int i0[] = {0, 1, 1, 0, 0, 1, 1, 0, 2, 1, 2, 0, 0, 1, 1, 0, 2, 1, 2, 0, 2, 2, 1, 2, 0, 2, 2};
1591  static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 2, 1, 2, 0, 0, 1, 1, 0, 2, 1, 2, 2, 0, 2, 1, 2, 2, 2};
1592  static const unsigned int i2[] = {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 1, 1, 1, 1, 0, 2, 2, 2, 2, 1, 2};
1593  static const Real scal20[] = {-0.25, -0.25, -0.25, -0.25, 0, 0, 0, 0, 0.5, 0.5, 0.5, 0.5, 0, 0, 0, 0, 0, 0, 0, 0};
1594  static const Real scal21[] = {-0.25, -0.25, 0, 0, -0.25, -0.25, 0, 0, 0.5, 0, 0, 0, 0.5, 0.5, 0, 0, 0.5, 0, 0, 0};
1595  static const Real scal22[] = {0, -0.25, -0.25, 0, 0, -0.25, -0.25, 0, 0, 0.5, 0, 0, 0, 0.5, 0.5, 0, 0, 0.5, 0, 0};
1596  static const Real scal23[] = {0, 0, -0.25, -0.25, 0, 0, -0.25, -0.25, 0, 0, 0.5, 0, 0, 0, 0.5, 0.5, 0, 0, 0.5, 0};
1597  static const Real scal24[] = {-0.25, 0, 0, -0.25, -0.25, 0, 0, -0.25, 0, 0, 0, 0.5, 0.5, 0, 0, 0.5, 0, 0, 0, 0.5};
1598  static const Real scal25[] = {0, 0, 0, 0, -0.25, -0.25, -0.25, -0.25, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0.5, 0.5, 0.5};
1599  static const Real scal26[] = {-0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25};
1600 
1601  switch (j)
1602  {
1603  // d()/dxi
1604  case 0:
1605  return (FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i0[i], 0, xi)*
1606  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[i], eta)*
1607  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[i], zeta)
1608  +scal20[i]*
1609  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i0[20], 0, xi)*
1610  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[20], eta)*
1611  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[20], zeta)
1612  +scal21[i]*
1613  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i0[21], 0, xi)*
1614  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[21], eta)*
1615  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[21], zeta)
1616  +scal22[i]*
1617  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i0[22], 0, xi)*
1618  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[22], eta)*
1619  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[22], zeta)
1620  +scal23[i]*
1621  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i0[23], 0, xi)*
1622  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[23], eta)*
1623  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[23], zeta)
1624  +scal24[i]*
1625  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i0[24], 0, xi)*
1626  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[24], eta)*
1627  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[24], zeta)
1628  +scal25[i]*
1629  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i0[25], 0, xi)*
1630  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[25], eta)*
1631  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[25], zeta)
1632  +scal26[i]*
1633  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i0[26], 0, xi)*
1634  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[26], eta)*
1635  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[26], zeta));
1636 
1637  // d()/deta
1638  case 1:
1639  return (FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[i], xi)*
1640  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i1[i], 0, eta)*
1641  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[i], zeta)
1642  +scal20[i]*
1643  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[20], xi)*
1644  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i1[20], 0, eta)*
1645  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[20], zeta)
1646  +scal21[i]*
1647  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[21], xi)*
1648  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i1[21], 0, eta)*
1649  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[21], zeta)
1650  +scal22[i]*
1651  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[22], xi)*
1652  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i1[22], 0, eta)*
1653  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[22], zeta)
1654  +scal23[i]*
1655  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[23], xi)*
1656  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i1[23], 0, eta)*
1657  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[23], zeta)
1658  +scal24[i]*
1659  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[24], xi)*
1660  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i1[24], 0, eta)*
1661  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[24], zeta)
1662  +scal25[i]*
1663  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[25], xi)*
1664  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i1[25], 0, eta)*
1665  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[25], zeta)
1666  +scal26[i]*
1667  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[26], xi)*
1668  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i1[26], 0, eta)*
1669  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[26], zeta));
1670 
1671  // d()/dzeta
1672  case 2:
1673  return (FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[i], xi)*
1674  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[i], eta)*
1675  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i2[i], 0, zeta)
1676  +scal20[i]*
1677  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[20], xi)*
1678  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[20], eta)*
1679  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i2[20], 0, zeta)
1680  +scal21[i]*
1681  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[21], xi)*
1682  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[21], eta)*
1683  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i2[21], 0, zeta)
1684  +scal22[i]*
1685  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[22], xi)*
1686  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[22], eta)*
1687  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i2[22], 0, zeta)
1688  +scal23[i]*
1689  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[23], xi)*
1690  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[23], eta)*
1691  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i2[23], 0, zeta)
1692  +scal24[i]*
1693  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[24], xi)*
1694  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[24], eta)*
1695  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i2[24], 0, zeta)
1696  +scal25[i]*
1697  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[25], xi)*
1698  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[25], eta)*
1699  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i2[25], 0, zeta)
1700  +scal26[i]*
1701  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[26], xi)*
1702  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[26], eta)*
1703  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i2[26], 0, zeta));
1704 
1705  default:
1706  libmesh_error_msg("Invalid derivative index j = " << j);
1707  }
1708  }
1709 
1710  // Bernstein shape functions on the hexahedral.
1711  case HEX27:
1712  {
1713  libmesh_assert_less (i, 27);
1714 
1715  // Compute hex shape functions as a tensor-product
1716  const Real xi = p(0);
1717  const Real eta = p(1);
1718  const Real zeta = p(2);
1719 
1720  // The only way to make any sense of this
1721  // is to look at the mgflo/mg2/mgf documentation
1722  // and make the cut-out cube!
1723  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
1724  static const unsigned int i0[] = {0, 1, 1, 0, 0, 1, 1, 0, 2, 1, 2, 0, 0, 1, 1, 0, 2, 1, 2, 0, 2, 2, 1, 2, 0, 2, 2};
1725  static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 2, 1, 2, 0, 0, 1, 1, 0, 2, 1, 2, 2, 0, 2, 1, 2, 2, 2};
1726  static const unsigned int i2[] = {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 1, 1, 1, 1, 0, 2, 2, 2, 2, 1, 2};
1727 
1728  switch (j)
1729  {
1730  // d()/dxi
1731  case 0:
1732  return (FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i0[i], 0, xi)*
1733  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[i], eta)*
1734  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[i], zeta));
1735 
1736  // d()/deta
1737  case 1:
1738  return (FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[i], xi)*
1739  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i1[i], 0, eta)*
1740  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[i], zeta));
1741 
1742  // d()/dzeta
1743  case 2:
1744  return (FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[i], xi)*
1745  FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[i], eta)*
1746  FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i2[i], 0, zeta));
1747 
1748  default:
1749  libmesh_error_msg("Invalid derivative index j = " << j);
1750  }
1751  }
1752 
1753 
1754  default:
1755  libmesh_error_msg("Invalid element type = " << type);
1756  }
1757  }
1758 
1759 
1760 
1761  // 3rd-order Bernstein.
1762  case THIRD:
1763  {
1764  switch (type)
1765  {
1766 
1767  // // Bernstein shape functions derivatives.
1768  // case TET10:
1769  // {
1770  // // I have been lazy here and am using finite differences
1771  // // to compute the derivatives!
1772  // const Real eps = 1.e-6;
1773 
1774  // libmesh_assert_less (i, 20);
1775  // libmesh_assert_less (j, 3);
1776 
1777  // switch (j)
1778  // {
1779  // // d()/dxi
1780  // case 0:
1781  // {
1782  // const Point pp(p(0)+eps, p(1), p(2));
1783  // const Point pm(p(0)-eps, p(1), p(2));
1784 
1785  // return (FE<3,BERNSTEIN>::shape(elem, order, i, pp) -
1786  // FE<3,BERNSTEIN>::shape(elem, order, i, pm))/2./eps;
1787  // }
1788 
1789  // // d()/deta
1790  // case 1:
1791  // {
1792  // const Point pp(p(0), p(1)+eps, p(2));
1793  // const Point pm(p(0), p(1)-eps, p(2));
1794 
1795  // return (FE<3,BERNSTEIN>::shape(elem, order, i, pp) -
1796  // FE<3,BERNSTEIN>::shape(elem, order, i, pm))/2./eps;
1797  // }
1798  // // d()/dzeta
1799  // case 2:
1800  // {
1801  // const Point pp(p(0), p(1), p(2)+eps);
1802  // const Point pm(p(0), p(1), p(2)-eps);
1803 
1804  // return (FE<3,BERNSTEIN>::shape(elem, order, i, pp) -
1805  // FE<3,BERNSTEIN>::shape(elem, order, i, pm))/2./eps;
1806  // }
1807  // default:
1808  // libmesh_error_msg("Invalid derivative index j = " << j);
1809  // }
1810 
1811 
1812  // }
1813 
1814 
1815  // Bernstein shape functions on the hexahedral.
1816  case HEX27:
1817  {
1818  // I have been lazy here and am using finite differences
1819  // to compute the derivatives!
1820  const Real eps = 1.e-6;
1821 
1822  libmesh_assert_less (i, 64);
1823  libmesh_assert_less (j, 3);
1824 
1825  switch (j)
1826  {
1827  // d()/dxi
1828  case 0:
1829  {
1830  const Point pp(p(0)+eps, p(1), p(2));
1831  const Point pm(p(0)-eps, p(1), p(2));
1832 
1833  return (FE<3,BERNSTEIN>::shape(elem, order, i, pp) -
1834  FE<3,BERNSTEIN>::shape(elem, order, i, pm))/2./eps;
1835  }
1836 
1837  // d()/deta
1838  case 1:
1839  {
1840  const Point pp(p(0), p(1)+eps, p(2));
1841  const Point pm(p(0), p(1)-eps, p(2));
1842 
1843  return (FE<3,BERNSTEIN>::shape(elem, order, i, pp) -
1844  FE<3,BERNSTEIN>::shape(elem, order, i, pm))/2./eps;
1845  }
1846  // d()/dzeta
1847  case 2:
1848  {
1849  const Point pp(p(0), p(1), p(2)+eps);
1850  const Point pm(p(0), p(1), p(2)-eps);
1851 
1852  return (FE<3,BERNSTEIN>::shape(elem, order, i, pp) -
1853  FE<3,BERNSTEIN>::shape(elem, order, i, pm))/2./eps;
1854  }
1855  default:
1856  libmesh_error_msg("Invalid derivative index j = " << j);
1857  }
1858 
1859  }
1860 
1861  // // Compute hex shape functions as a tensor-product
1862  // const Real xi = p(0);
1863  // const Real eta = p(1);
1864  // const Real zeta = p(2);
1865  // Real xi_mapped = p(0);
1866  // Real eta_mapped = p(1);
1867  // Real zeta_mapped = p(2);
1868 
1869  // // The only way to make any sense of this
1870  // // is to look at the mgflo/mg2/mgf documentation
1871  // // and make the cut-out cube!
1872  // // Nodes 0 1 2 3 4 5 6 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 20 20 21 21 21 21 22 22 22 22 23 23 23 23 24 24 24 24 25 25 25 25 26 26 26 26 26 26 26 26
1873  // // DOFS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 18 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 60 62 63
1874  // static const unsigned int i0[] = {0, 1, 1, 0, 0, 1, 1, 0, 2, 3, 1, 1, 2, 3, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 2, 3, 1, 1, 2, 3, 0, 0, 2, 3, 2, 3, 2, 3, 2, 3, 1, 1, 1, 1, 2, 3, 2, 3, 0, 0, 0, 0, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3};
1875  // static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 2, 3, 1, 1, 2, 3, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 2, 3, 1, 1, 2, 3, 2, 2, 3, 3, 0, 0, 0, 0, 2, 3, 2, 3, 1, 1, 1, 1, 2, 3, 2, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3};
1876  // static const unsigned int i2[] = {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 2, 3, 2, 3, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3};
1877 
1878 
1879 
1880  // // handle the edge orientation
1881  // {
1882  // // Edge 0
1883  // if ((i1[i] == 0) && (i2[i] == 0))
1884  // {
1885  // if (elem->node_id(0) != std::min(elem->node_id(0), elem->node_id(1)))
1886  // xi_mapped = -xi;
1887  // }
1888  // // Edge 1
1889  // else if ((i0[i] == 1) && (i2[i] == 0))
1890  // {
1891  // if (elem->node_id(1) != std::min(elem->node_id(1), elem->node_id(2)))
1892  // eta_mapped = -eta;
1893  // }
1894  // // Edge 2
1895  // else if ((i1[i] == 1) && (i2[i] == 0))
1896  // {
1897  // if (elem->node_id(3) != std::min(elem->node_id(3), elem->node_id(2)))
1898  // xi_mapped = -xi;
1899  // }
1900  // // Edge 3
1901  // else if ((i0[i] == 0) && (i2[i] == 0))
1902  // {
1903  // if (elem->node_id(0) != std::min(elem->node_id(0), elem->node_id(3)))
1904  // eta_mapped = -eta;
1905  // }
1906  // // Edge 4
1907  // else if ((i0[i] == 0) && (i1[i] == 0))
1908  // {
1909  // if (elem->node_id(0) != std::min(elem->node_id(0), elem->node_id(4)))
1910  // zeta_mapped = -zeta;
1911  // }
1912  // // Edge 5
1913  // else if ((i0[i] == 1) && (i1[i] == 0))
1914  // {
1915  // if (elem->node_id(1) != std::min(elem->node_id(1), elem->node_id(5)))
1916  // zeta_mapped = -zeta;
1917  // }
1918  // // Edge 6
1919  // else if ((i0[i] == 1) && (i1[i] == 1))
1920  // {
1921  // if (elem->node_id(2) != std::min(elem->node_id(2), elem->node_id(6)))
1922  // zeta_mapped = -zeta;
1923  // }
1924  // // Edge 7
1925  // else if ((i0[i] == 0) && (i1[i] == 1))
1926  // {
1927  // if (elem->node_id(3) != std::min(elem->node_id(3), elem->node_id(7)))
1928  // zeta_mapped = -zeta;
1929  // }
1930  // // Edge 8
1931  // else if ((i1[i] == 0) && (i2[i] == 1))
1932  // {
1933  // if (elem->node_id(4) != std::min(elem->node_id(4), elem->node_id(5)))
1934  // xi_mapped = -xi;
1935  // }
1936  // // Edge 9
1937  // else if ((i0[i] == 1) && (i2[i] == 1))
1938  // {
1939  // if (elem->node_id(5) != std::min(elem->node_id(5), elem->node_id(6)))
1940  // eta_mapped = -eta;
1941  // }
1942  // // Edge 10
1943  // else if ((i1[i] == 1) && (i2[i] == 1))
1944  // {
1945  // if (elem->node_id(7) != std::min(elem->node_id(7), elem->node_id(6)))
1946  // xi_mapped = -xi;
1947  // }
1948  // // Edge 11
1949  // else if ((i0[i] == 0) && (i2[i] == 1))
1950  // {
1951  // if (elem->node_id(4) != std::min(elem->node_id(4), elem->node_id(7)))
1952  // eta_mapped = -eta;
1953  // }
1954  // }
1955 
1956 
1957  // // handle the face orientation
1958  // {
1959  // // Face 0
1960  // if ((i2[i] == 0) && (i0[i] >= 2) && (i1[i] >= 2))
1961  // {
1962  // const unsigned int min_node = std::min(elem->node_id(1),
1963  // std::min(elem->node_id(2),
1964  // std::min(elem->node_id(0),
1965  // elem->node_id(3))));
1966  // if (elem->node_id(0) == min_node)
1967  // if (elem->node_id(1) == std::min(elem->node_id(1), elem->node_id(3)))
1968  // {
1969  // // Case 1
1970  // xi_mapped = xi;
1971  // eta_mapped = eta;
1972  // }
1973  // else
1974  // {
1975  // // Case 2
1976  // xi_mapped = eta;
1977  // eta_mapped = xi;
1978  // }
1979 
1980  // else if (elem->node_id(3) == min_node)
1981  // if (elem->node_id(0) == std::min(elem->node_id(0), elem->node_id(2)))
1982  // {
1983  // // Case 3
1984  // xi_mapped = -eta;
1985  // eta_mapped = xi;
1986  // }
1987  // else
1988  // {
1989  // // Case 4
1990  // xi_mapped = xi;
1991  // eta_mapped = -eta;
1992  // }
1993 
1994  // else if (elem->node_id(2) == min_node)
1995  // if (elem->node_id(3) == std::min(elem->node_id(3), elem->node_id(1)))
1996  // {
1997  // // Case 5
1998  // xi_mapped = -xi;
1999  // eta_mapped = -eta;
2000  // }
2001  // else
2002  // {
2003  // // Case 6
2004  // xi_mapped = -eta;
2005  // eta_mapped = -xi;
2006  // }
2007 
2008  // else if (elem->node_id(1) == min_node)
2009  // if (elem->node_id(2) == std::min(elem->node_id(2), elem->node_id(0)))
2010  // {
2011  // // Case 7
2012  // xi_mapped = eta;
2013  // eta_mapped = -xi;
2014  // }
2015  // else
2016  // {
2017  // // Case 8
2018  // xi_mapped = -xi;
2019  // eta_mapped = eta;
2020  // }
2021  // }
2022 
2023 
2024  // // Face 1
2025  // else if ((i1[i] == 0) && (i0[i] >= 2) && (i2[i] >= 2))
2026  // {
2027  // const unsigned int min_node = std::min(elem->node_id(0),
2028  // std::min(elem->node_id(1),
2029  // std::min(elem->node_id(5),
2030  // elem->node_id(4))));
2031  // if (elem->node_id(0) == min_node)
2032  // if (elem->node_id(1) == std::min(elem->node_id(1), elem->node_id(4)))
2033  // {
2034  // // Case 1
2035  // xi_mapped = xi;
2036  // zeta_mapped = zeta;
2037  // }
2038  // else
2039  // {
2040  // // Case 2
2041  // xi_mapped = zeta;
2042  // zeta_mapped = xi;
2043  // }
2044 
2045  // else if (elem->node_id(1) == min_node)
2046  // if (elem->node_id(5) == std::min(elem->node_id(5), elem->node_id(0)))
2047  // {
2048  // // Case 3
2049  // xi_mapped = zeta;
2050  // zeta_mapped = -xi;
2051  // }
2052  // else
2053  // {
2054  // // Case 4
2055  // xi_mapped = -xi;
2056  // zeta_mapped = zeta;
2057  // }
2058 
2059  // else if (elem->node_id(5) == min_node)
2060  // if (elem->node_id(4) == std::min(elem->node_id(4), elem->node_id(1)))
2061  // {
2062  // // Case 5
2063  // xi_mapped = -xi;
2064  // zeta_mapped = -zeta;
2065  // }
2066  // else
2067  // {
2068  // // Case 6
2069  // xi_mapped = -zeta;
2070  // zeta_mapped = -xi;
2071  // }
2072 
2073  // else if (elem->node_id(4) == min_node)
2074  // if (elem->node_id(0) == std::min(elem->node_id(0), elem->node_id(5)))
2075  // {
2076  // // Case 7
2077  // xi_mapped = -xi;
2078  // zeta_mapped = zeta;
2079  // }
2080  // else
2081  // {
2082  // // Case 8
2083  // xi_mapped = xi;
2084  // zeta_mapped = -zeta;
2085  // }
2086  // }
2087 
2088 
2089  // // Face 2
2090  // else if ((i0[i] == 1) && (i1[i] >= 2) && (i2[i] >= 2))
2091  // {
2092  // const unsigned int min_node = std::min(elem->node_id(1),
2093  // std::min(elem->node_id(2),
2094  // std::min(elem->node_id(6),
2095  // elem->node_id(5))));
2096  // if (elem->node_id(1) == min_node)
2097  // if (elem->node_id(2) == std::min(elem->node_id(2), elem->node_id(5)))
2098  // {
2099  // // Case 1
2100  // eta_mapped = eta;
2101  // zeta_mapped = zeta;
2102  // }
2103  // else
2104  // {
2105  // // Case 2
2106  // eta_mapped = zeta;
2107  // zeta_mapped = eta;
2108  // }
2109 
2110  // else if (elem->node_id(2) == min_node)
2111  // if (elem->node_id(6) == std::min(elem->node_id(6), elem->node_id(1)))
2112  // {
2113  // // Case 3
2114  // eta_mapped = zeta;
2115  // zeta_mapped = -eta;
2116  // }
2117  // else
2118  // {
2119  // // Case 4
2120  // eta_mapped = -eta;
2121  // zeta_mapped = zeta;
2122  // }
2123 
2124  // else if (elem->node_id(6) == min_node)
2125  // if (elem->node_id(5) == std::min(elem->node_id(5), elem->node_id(2)))
2126  // {
2127  // // Case 5
2128  // eta_mapped = -eta;
2129  // zeta_mapped = -zeta;
2130  // }
2131  // else
2132  // {
2133  // // Case 6
2134  // eta_mapped = -zeta;
2135  // zeta_mapped = -eta;
2136  // }
2137 
2138  // else if (elem->node_id(5) == min_node)
2139  // if (elem->node_id(1) == std::min(elem->node_id(1), elem->node_id(6)))
2140  // {
2141  // // Case 7
2142  // eta_mapped = -zeta;
2143  // zeta_mapped = eta;
2144  // }
2145  // else
2146  // {
2147  // // Case 8
2148  // eta_mapped = eta;
2149  // zeta_mapped = -zeta;
2150  // }
2151  // }
2152 
2153 
2154  // // Face 3
2155  // else if ((i1[i] == 1) && (i0[i] >= 2) && (i2[i] >= 2))
2156  // {
2157  // const unsigned int min_node = std::min(elem->node_id(2),
2158  // std::min(elem->node_id(3),
2159  // std::min(elem->node_id(7),
2160  // elem->node_id(6))));
2161  // if (elem->node_id(3) == min_node)
2162  // if (elem->node_id(2) == std::min(elem->node_id(2), elem->node_id(7)))
2163  // {
2164  // // Case 1
2165  // xi_mapped = xi;
2166  // zeta_mapped = zeta;
2167  // }
2168  // else
2169  // {
2170  // // Case 2
2171  // xi_mapped = zeta;
2172  // zeta_mapped = xi;
2173  // }
2174 
2175  // else if (elem->node_id(7) == min_node)
2176  // if (elem->node_id(3) == std::min(elem->node_id(3), elem->node_id(6)))
2177  // {
2178  // // Case 3
2179  // xi_mapped = -zeta;
2180  // zeta_mapped = xi;
2181  // }
2182  // else
2183  // {
2184  // // Case 4
2185  // xi_mapped = xi;
2186  // zeta_mapped = -zeta;
2187  // }
2188 
2189  // else if (elem->node_id(6) == min_node)
2190  // if (elem->node_id(7) == std::min(elem->node_id(7), elem->node_id(2)))
2191  // {
2192  // // Case 5
2193  // xi_mapped = -xi;
2194  // zeta_mapped = -zeta;
2195  // }
2196  // else
2197  // {
2198  // // Case 6
2199  // xi_mapped = -zeta;
2200  // zeta_mapped = -xi;
2201  // }
2202 
2203  // else if (elem->node_id(2) == min_node)
2204  // if (elem->node_id(6) == std::min(elem->node_id(3), elem->node_id(6)))
2205  // {
2206  // // Case 7
2207  // xi_mapped = zeta;
2208  // zeta_mapped = -xi;
2209  // }
2210  // else
2211  // {
2212  // // Case 8
2213  // xi_mapped = -xi;
2214  // zeta_mapped = zeta;
2215  // }
2216  // }
2217 
2218 
2219  // // Face 4
2220  // else if ((i0[i] == 0) && (i1[i] >= 2) && (i2[i] >= 2))
2221  // {
2222  // const unsigned int min_node = std::min(elem->node_id(3),
2223  // std::min(elem->node_id(0),
2224  // std::min(elem->node_id(4),
2225  // elem->node_id(7))));
2226  // if (elem->node_id(0) == min_node)
2227  // if (elem->node_id(3) == std::min(elem->node_id(3), elem->node_id(4)))
2228  // {
2229  // // Case 1
2230  // eta_mapped = eta;
2231  // zeta_mapped = zeta;
2232  // }
2233  // else
2234  // {
2235  // // Case 2
2236  // eta_mapped = zeta;
2237  // zeta_mapped = eta;
2238  // }
2239 
2240  // else if (elem->node_id(4) == min_node)
2241  // if (elem->node_id(0) == std::min(elem->node_id(0), elem->node_id(7)))
2242  // {
2243  // // Case 3
2244  // eta_mapped = -zeta;
2245  // zeta_mapped = eta;
2246  // }
2247  // else
2248  // {
2249  // // Case 4
2250  // eta_mapped = eta;
2251  // zeta_mapped = -zeta;
2252  // }
2253 
2254  // else if (elem->node_id(7) == min_node)
2255  // if (elem->node_id(4) == std::min(elem->node_id(4), elem->node_id(3)))
2256  // {
2257  // // Case 5
2258  // eta_mapped = -eta;
2259  // zeta_mapped = -zeta;
2260  // }
2261  // else
2262  // {
2263  // // Case 6
2264  // eta_mapped = -zeta;
2265  // zeta_mapped = -eta;
2266  // }
2267 
2268  // else if (elem->node_id(3) == min_node)
2269  // if (elem->node_id(7) == std::min(elem->node_id(7), elem->node_id(0)))
2270  // {
2271  // // Case 7
2272  // eta_mapped = zeta;
2273  // zeta_mapped = -eta;
2274  // }
2275  // else
2276  // {
2277  // // Case 8
2278  // eta_mapped = -eta;
2279  // zeta_mapped = zeta;
2280  // }
2281  // }
2282 
2283 
2284  // // Face 5
2285  // else if ((i2[i] == 1) && (i0[i] >= 2) && (i1[i] >= 2))
2286  // {
2287  // const unsigned int min_node = std::min(elem->node_id(4),
2288  // std::min(elem->node_id(5),
2289  // std::min(elem->node_id(6),
2290  // elem->node_id(7))));
2291  // if (elem->node_id(4) == min_node)
2292  // if (elem->node_id(5) == std::min(elem->node_id(5), elem->node_id(7)))
2293  // {
2294  // // Case 1
2295  // xi_mapped = xi;
2296  // eta_mapped = eta;
2297  // }
2298  // else
2299  // {
2300  // // Case 2
2301  // xi_mapped = eta;
2302  // eta_mapped = xi;
2303  // }
2304 
2305  // else if (elem->node_id(5) == min_node)
2306  // if (elem->node_id(6) == std::min(elem->node_id(6), elem->node_id(4)))
2307  // {
2308  // // Case 3
2309  // xi_mapped = eta;
2310  // eta_mapped = -xi;
2311  // }
2312  // else
2313  // {
2314  // // Case 4
2315  // xi_mapped = -xi;
2316  // eta_mapped = eta;
2317  // }
2318 
2319  // else if (elem->node_id(6) == min_node)
2320  // if (elem->node_id(7) == std::min(elem->node_id(7), elem->node_id(5)))
2321  // {
2322  // // Case 5
2323  // xi_mapped = -xi;
2324  // eta_mapped = -eta;
2325  // }
2326  // else
2327  // {
2328  // // Case 6
2329  // xi_mapped = -eta;
2330  // eta_mapped = -xi;
2331  // }
2332 
2333  // else if (elem->node_id(7) == min_node)
2334  // if (elem->node_id(4) == std::min(elem->node_id(4), elem->node_id(6)))
2335  // {
2336  // // Case 7
2337  // xi_mapped = -eta;
2338  // eta_mapped = xi;
2339  // }
2340  // else
2341  // {
2342  // // Case 8
2343  // xi_mapped = xi;
2344  // eta_mapped = eta;
2345  // }
2346  // }
2347 
2348 
2349  // }
2350 
2351 
2352 
2353  // libmesh_assert_less (j, 3);
2354 
2355  // switch (j)
2356  // {
2357  // // d()/dxi
2358  // case 0:
2359  // return (FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i0[i], 0, xi_mapped)*
2360  // FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[i], eta_mapped)*
2361  // FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[i], zeta_mapped));
2362 
2363  // // d()/deta
2364  // case 1:
2365  // return (FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[i], xi_mapped)*
2366  // FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i1[i], 0, eta_mapped)*
2367  // FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[i], zeta_mapped));
2368 
2369  // // d()/dzeta
2370  // case 2:
2371  // return (FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[i], xi_mapped)*
2372  // FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[i], eta_mapped)*
2373  // FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i2[i], 0, zeta_mapped));
2374 
2375  // default:
2376  // libmesh_error_msg("Invalid derivative index j = " << j);
2377  // }
2378  // }
2379 
2380 
2381  default:
2382  libmesh_error_msg("Invalid element type = " << type);
2383  }
2384  }
2385 
2386  // 4th-order Bernstein.
2387  case FOURTH:
2388  {
2389  switch (type)
2390  {
2391 
2392  // Bernstein shape functions derivatives on the hexahedral.
2393  case HEX27:
2394  {
2395  const Real eps = 1.e-6;
2396 
2397  libmesh_assert_less (i, 125);
2398  libmesh_assert_less (j, 3);
2399 
2400  switch (j)
2401  {
2402  // d()/dxi
2403  case 0:
2404  {
2405  const Point pp(p(0)+eps, p(1), p(2));
2406  const Point pm(p(0)-eps, p(1), p(2));
2407 
2408  return (FE<3,BERNSTEIN>::shape(elem, order, i, pp) -
2409  FE<3,BERNSTEIN>::shape(elem, order, i, pm))/2./eps;
2410  }
2411 
2412  // d()/deta
2413  case 1:
2414  {
2415  const Point pp(p(0), p(1)+eps, p(2));
2416  const Point pm(p(0), p(1)-eps, p(2));
2417 
2418  return (FE<3,BERNSTEIN>::shape(elem, order, i, pp) -
2419  FE<3,BERNSTEIN>::shape(elem, order, i, pm))/2./eps;
2420  }
2421  // d()/dzeta
2422  case 2:
2423  {
2424  const Point pp(p(0), p(1), p(2)+eps);
2425  const Point pm(p(0), p(1), p(2)-eps);
2426 
2427  return (FE<3,BERNSTEIN>::shape(elem, order, i, pp) -
2428  FE<3,BERNSTEIN>::shape(elem, order, i, pm))/2./eps;
2429  }
2430  default:
2431  libmesh_error_msg("Invalid derivative index j = " << j);
2432  }
2433  }
2434 
2435  // // Compute hex shape functions as a tensor-product
2436  // const Real xi = p(0);
2437  // const Real eta = p(1);
2438  // const Real zeta = p(2);
2439  // Real xi_mapped = p(0);
2440  // Real eta_mapped = p(1);
2441  // Real zeta_mapped = p(2);
2442 
2443  // // The only way to make any sense of this
2444  // // is to look at the mgflo/mg2/mgf documentation
2445  // // and make the cut-out cube!
2446  // // Nodes 0 1 2 3 4 5 6 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 20 20 21 21 21 21 22 22 22 22 23 23 23 23 24 24 24 24 25 25 25 25 26 26 26 26 26 26 26 26
2447  // // DOFS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 18 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
2448  // static const unsigned int i0[] = {0, 1, 1, 0, 0, 1, 1, 0, 2, 3, 4, 1, 1, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 3, 4, 1, 1, 1, 2, 3, 4, 0, 0, 0, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 2, 3, 4, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4};
2449  // static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 2, 3, 4, 1, 1, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 3, 4, 1, 1, 1, 2, 3, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 2, 3, 4, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4};
2450  // static const unsigned int i2[] = {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 3, 3, 3, 4, 4, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4};
2451 
2452 
2453 
2454  // // handle the edge orientation
2455  // {
2456  // // Edge 0
2457  // if ((i1[i] == 0) && (i2[i] == 0))
2458  // {
2459  // if (elem->node_id(0) != std::min(elem->node_id(0), elem->node_id(1)))
2460  // xi_mapped = -xi;
2461  // }
2462  // // Edge 1
2463  // else if ((i0[i] == 1) && (i2[i] == 0))
2464  // {
2465  // if (elem->node_id(1) != std::min(elem->node_id(1), elem->node_id(2)))
2466  // eta_mapped = -eta;
2467  // }
2468  // // Edge 2
2469  // else if ((i1[i] == 1) && (i2[i] == 0))
2470  // {
2471  // if (elem->node_id(3) != std::min(elem->node_id(3), elem->node_id(2)))
2472  // xi_mapped = -xi;
2473  // }
2474  // // Edge 3
2475  // else if ((i0[i] == 0) && (i2[i] == 0))
2476  // {
2477  // if (elem->node_id(0) != std::min(elem->node_id(0), elem->node_id(3)))
2478  // eta_mapped = -eta;
2479  // }
2480  // // Edge 4
2481  // else if ((i0[i] == 0) && (i1[i] == 0))
2482  // {
2483  // if (elem->node_id(0) != std::min(elem->node_id(0), elem->node_id(4)))
2484  // zeta_mapped = -zeta;
2485  // }
2486  // // Edge 5
2487  // else if ((i0[i] == 1) && (i1[i] == 0))
2488  // {
2489  // if (elem->node_id(1) != std::min(elem->node_id(1), elem->node_id(5)))
2490  // zeta_mapped = -zeta;
2491  // }
2492  // // Edge 6
2493  // else if ((i0[i] == 1) && (i1[i] == 1))
2494  // {
2495  // if (elem->node_id(2) != std::min(elem->node_id(2), elem->node_id(6)))
2496  // zeta_mapped = -zeta;
2497  // }
2498  // // Edge 7
2499  // else if ((i0[i] == 0) && (i1[i] == 1))
2500  // {
2501  // if (elem->node_id(3) != std::min(elem->node_id(3), elem->node_id(7)))
2502  // zeta_mapped = -zeta;
2503  // }
2504  // // Edge 8
2505  // else if ((i1[i] == 0) && (i2[i] == 1))
2506  // {
2507  // if (elem->node_id(4) != std::min(elem->node_id(4), elem->node_id(5)))
2508  // xi_mapped = -xi;
2509  // }
2510  // // Edge 9
2511  // else if ((i0[i] == 1) && (i2[i] == 1))
2512  // {
2513  // if (elem->node_id(5) != std::min(elem->node_id(5), elem->node_id(6)))
2514  // eta_mapped = -eta;
2515  // }
2516  // // Edge 10
2517  // else if ((i1[i] == 1) && (i2[i] == 1))
2518  // {
2519  // if (elem->node_id(7) != std::min(elem->node_id(7), elem->node_id(6)))
2520  // xi_mapped = -xi;
2521  // }
2522  // // Edge 11
2523  // else if ((i0[i] == 0) && (i2[i] == 1))
2524  // {
2525  // if (elem->node_id(4) != std::min(elem->node_id(4), elem->node_id(7)))
2526  // eta_mapped = -eta;
2527  // }
2528  // }
2529 
2530 
2531  // // handle the face orientation
2532  // {
2533  // // Face 0
2534  // if ((i2[i] == 0) && (i0[i] >= 2) && (i1[i] >= 2))
2535  // {
2536  // const unsigned int min_node = std::min(elem->node_id(1),
2537  // std::min(elem->node_id(2),
2538  // std::min(elem->node_id(0),
2539  // elem->node_id(3))));
2540  // if (elem->node_id(0) == min_node)
2541  // if (elem->node_id(1) == std::min(elem->node_id(1), elem->node_id(3)))
2542  // {
2543  // // Case 1
2544  // xi_mapped = xi;
2545  // eta_mapped = eta;
2546  // }
2547  // else
2548  // {
2549  // // Case 2
2550  // xi_mapped = eta;
2551  // eta_mapped = xi;
2552  // }
2553 
2554  // else if (elem->node_id(3) == min_node)
2555  // if (elem->node_id(0) == std::min(elem->node_id(0), elem->node_id(2)))
2556  // {
2557  // // Case 3
2558  // xi_mapped = -eta;
2559  // eta_mapped = xi;
2560  // }
2561  // else
2562  // {
2563  // // Case 4
2564  // xi_mapped = xi;
2565  // eta_mapped = -eta;
2566  // }
2567 
2568  // else if (elem->node_id(2) == min_node)
2569  // if (elem->node_id(3) == std::min(elem->node_id(3), elem->node_id(1)))
2570  // {
2571  // // Case 5
2572  // xi_mapped = -xi;
2573  // eta_mapped = -eta;
2574  // }
2575  // else
2576  // {
2577  // // Case 6
2578  // xi_mapped = -eta;
2579  // eta_mapped = -xi;
2580  // }
2581 
2582  // else if (elem->node_id(1) == min_node)
2583  // if (elem->node_id(2) == std::min(elem->node_id(2), elem->node_id(0)))
2584  // {
2585  // // Case 7
2586  // xi_mapped = eta;
2587  // eta_mapped = -xi;
2588  // }
2589  // else
2590  // {
2591  // // Case 8
2592  // xi_mapped = -xi;
2593  // eta_mapped = eta;
2594  // }
2595  // }
2596 
2597 
2598  // // Face 1
2599  // else if ((i1[i] == 0) && (i0[i] >= 2) && (i2[i] >= 2))
2600  // {
2601  // const unsigned int min_node = std::min(elem->node_id(0),
2602  // std::min(elem->node_id(1),
2603  // std::min(elem->node_id(5),
2604  // elem->node_id(4))));
2605  // if (elem->node_id(0) == min_node)
2606  // if (elem->node_id(1) == std::min(elem->node_id(1), elem->node_id(4)))
2607  // {
2608  // // Case 1
2609  // xi_mapped = xi;
2610  // zeta_mapped = zeta;
2611  // }
2612  // else
2613  // {
2614  // // Case 2
2615  // xi_mapped = zeta;
2616  // zeta_mapped = xi;
2617  // }
2618 
2619  // else if (elem->node_id(1) == min_node)
2620  // if (elem->node_id(5) == std::min(elem->node_id(5), elem->node_id(0)))
2621  // {
2622  // // Case 3
2623  // xi_mapped = zeta;
2624  // zeta_mapped = -xi;
2625  // }
2626  // else
2627  // {
2628  // // Case 4
2629  // xi_mapped = -xi;
2630  // zeta_mapped = zeta;
2631  // }
2632 
2633  // else if (elem->node_id(5) == min_node)
2634  // if (elem->node_id(4) == std::min(elem->node_id(4), elem->node_id(1)))
2635  // {
2636  // // Case 5
2637  // xi_mapped = -xi;
2638  // zeta_mapped = -zeta;
2639  // }
2640  // else
2641  // {
2642  // // Case 6
2643  // xi_mapped = -zeta;
2644  // zeta_mapped = -xi;
2645  // }
2646 
2647  // else if (elem->node_id(4) == min_node)
2648  // if (elem->node_id(0) == std::min(elem->node_id(0), elem->node_id(5)))
2649  // {
2650  // // Case 7
2651  // xi_mapped = -xi;
2652  // zeta_mapped = zeta;
2653  // }
2654  // else
2655  // {
2656  // // Case 8
2657  // xi_mapped = xi;
2658  // zeta_mapped = -zeta;
2659  // }
2660  // }
2661 
2662 
2663  // // Face 2
2664  // else if ((i0[i] == 1) && (i1[i] >= 2) && (i2[i] >= 2))
2665  // {
2666  // const unsigned int min_node = std::min(elem->node_id(1),
2667  // std::min(elem->node_id(2),
2668  // std::min(elem->node_id(6),
2669  // elem->node_id(5))));
2670  // if (elem->node_id(1) == min_node)
2671  // if (elem->node_id(2) == std::min(elem->node_id(2), elem->node_id(5)))
2672  // {
2673  // // Case 1
2674  // eta_mapped = eta;
2675  // zeta_mapped = zeta;
2676  // }
2677  // else
2678  // {
2679  // // Case 2
2680  // eta_mapped = zeta;
2681  // zeta_mapped = eta;
2682  // }
2683 
2684  // else if (elem->node_id(2) == min_node)
2685  // if (elem->node_id(6) == std::min(elem->node_id(6), elem->node_id(1)))
2686  // {
2687  // // Case 3
2688  // eta_mapped = zeta;
2689  // zeta_mapped = -eta;
2690  // }
2691  // else
2692  // {
2693  // // Case 4
2694  // eta_mapped = -eta;
2695  // zeta_mapped = zeta;
2696  // }
2697 
2698  // else if (elem->node_id(6) == min_node)
2699  // if (elem->node_id(5) == std::min(elem->node_id(5), elem->node_id(2)))
2700  // {
2701  // // Case 5
2702  // eta_mapped = -eta;
2703  // zeta_mapped = -zeta;
2704  // }
2705  // else
2706  // {
2707  // // Case 6
2708  // eta_mapped = -zeta;
2709  // zeta_mapped = -eta;
2710  // }
2711 
2712  // else if (elem->node_id(5) == min_node)
2713  // if (elem->node_id(1) == std::min(elem->node_id(1), elem->node_id(6)))
2714  // {
2715  // // Case 7
2716  // eta_mapped = -zeta;
2717  // zeta_mapped = eta;
2718  // }
2719  // else
2720  // {
2721  // // Case 8
2722  // eta_mapped = eta;
2723  // zeta_mapped = -zeta;
2724  // }
2725  // }
2726 
2727 
2728  // // Face 3
2729  // else if ((i1[i] == 1) && (i0[i] >= 2) && (i2[i] >= 2))
2730  // {
2731  // const unsigned int min_node = std::min(elem->node_id(2),
2732  // std::min(elem->node_id(3),
2733  // std::min(elem->node_id(7),
2734  // elem->node_id(6))));
2735  // if (elem->node_id(3) == min_node)
2736  // if (elem->node_id(2) == std::min(elem->node_id(2), elem->node_id(7)))
2737  // {
2738  // // Case 1
2739  // xi_mapped = xi;
2740  // zeta_mapped = zeta;
2741  // }
2742  // else
2743  // {
2744  // // Case 2
2745  // xi_mapped = zeta;
2746  // zeta_mapped = xi;
2747  // }
2748 
2749  // else if (elem->node_id(7) == min_node)
2750  // if (elem->node_id(3) == std::min(elem->node_id(3), elem->node_id(6)))
2751  // {
2752  // // Case 3
2753  // xi_mapped = -zeta;
2754  // zeta_mapped = xi;
2755  // }
2756  // else
2757  // {
2758  // // Case 4
2759  // xi_mapped = xi;
2760  // zeta_mapped = -zeta;
2761  // }
2762 
2763  // else if (elem->node_id(6) == min_node)
2764  // if (elem->node_id(7) == std::min(elem->node_id(7), elem->node_id(2)))
2765  // {
2766  // // Case 5
2767  // xi_mapped = -xi;
2768  // zeta_mapped = -zeta;
2769  // }
2770  // else
2771  // {
2772  // // Case 6
2773  // xi_mapped = -zeta;
2774  // zeta_mapped = -xi;
2775  // }
2776 
2777  // else if (elem->node_id(2) == min_node)
2778  // if (elem->node_id(6) == std::min(elem->node_id(3), elem->node_id(6)))
2779  // {
2780  // // Case 7
2781  // xi_mapped = zeta;
2782  // zeta_mapped = -xi;
2783  // }
2784  // else
2785  // {
2786  // // Case 8
2787  // xi_mapped = -xi;
2788  // zeta_mapped = zeta;
2789  // }
2790  // }
2791 
2792 
2793  // // Face 4
2794  // else if ((i0[i] == 0) && (i1[i] >= 2) && (i2[i] >= 2))
2795  // {
2796  // const unsigned int min_node = std::min(elem->node_id(3),
2797  // std::min(elem->node_id(0),
2798  // std::min(elem->node_id(4),
2799  // elem->node_id(7))));
2800  // if (elem->node_id(0) == min_node)
2801  // if (elem->node_id(3) == std::min(elem->node_id(3), elem->node_id(4)))
2802  // {
2803  // // Case 1
2804  // eta_mapped = eta;
2805  // zeta_mapped = zeta;
2806  // }
2807  // else
2808  // {
2809  // // Case 2
2810  // eta_mapped = zeta;
2811  // zeta_mapped = eta;
2812  // }
2813 
2814  // else if (elem->node_id(4) == min_node)
2815  // if (elem->node_id(0) == std::min(elem->node_id(0), elem->node_id(7)))
2816  // {
2817  // // Case 3
2818  // eta_mapped = -zeta;
2819  // zeta_mapped = eta;
2820  // }
2821  // else
2822  // {
2823  // // Case 4
2824  // eta_mapped = eta;
2825  // zeta_mapped = -zeta;
2826  // }
2827 
2828  // else if (elem->node_id(7) == min_node)
2829  // if (elem->node_id(4) == std::min(elem->node_id(4), elem->node_id(3)))
2830  // {
2831  // // Case 5
2832  // eta_mapped = -eta;
2833  // zeta_mapped = -zeta;
2834  // }
2835  // else
2836  // {
2837  // // Case 6
2838  // eta_mapped = -zeta;
2839  // zeta_mapped = -eta;
2840  // }
2841 
2842  // else if (elem->node_id(3) == min_node)
2843  // if (elem->node_id(7) == std::min(elem->node_id(7), elem->node_id(0)))
2844  // {
2845  // // Case 7
2846  // eta_mapped = zeta;
2847  // zeta_mapped = -eta;
2848  // }
2849  // else
2850  // {
2851  // // Case 8
2852  // eta_mapped = -eta;
2853  // zeta_mapped = zeta;
2854  // }
2855  // }
2856 
2857 
2858  // // Face 5
2859  // else if ((i2[i] == 1) && (i0[i] >= 2) && (i1[i] >= 2))
2860  // {
2861  // const unsigned int min_node = std::min(elem->node_id(4),
2862  // std::min(elem->node_id(5),
2863  // std::min(elem->node_id(6),
2864  // elem->node_id(7))));
2865  // if (elem->node_id(4) == min_node)
2866  // if (elem->node_id(5) == std::min(elem->node_id(5), elem->node_id(7)))
2867  // {
2868  // // Case 1
2869  // xi_mapped = xi;
2870  // eta_mapped = eta;
2871  // }
2872  // else
2873  // {
2874  // // Case 2
2875  // xi_mapped = eta;
2876  // eta_mapped = xi;
2877  // }
2878 
2879  // else if (elem->node_id(5) == min_node)
2880  // if (elem->node_id(6) == std::min(elem->node_id(6), elem->node_id(4)))
2881  // {
2882  // // Case 3
2883  // xi_mapped = eta;
2884  // eta_mapped = -xi;
2885  // }
2886  // else
2887  // {
2888  // // Case 4
2889  // xi_mapped = -xi;
2890  // eta_mapped = eta;
2891  // }
2892 
2893  // else if (elem->node_id(6) == min_node)
2894  // if (elem->node_id(7) == std::min(elem->node_id(7), elem->node_id(5)))
2895  // {
2896  // // Case 5
2897  // xi_mapped = -xi;
2898  // eta_mapped = -eta;
2899  // }
2900  // else
2901  // {
2902  // // Case 6
2903  // xi_mapped = -eta;
2904  // eta_mapped = -xi;
2905  // }
2906 
2907  // else if (elem->node_id(7) == min_node)
2908  // if (elem->node_id(4) == std::min(elem->node_id(4), elem->node_id(6)))
2909  // {
2910  // // Case 7
2911  // xi_mapped = -eta;
2912  // eta_mapped = xi;
2913  // }
2914  // else
2915  // {
2916  // // Case 8
2917  // xi_mapped = xi;
2918  // eta_mapped = eta;
2919  // }
2920  // }
2921 
2922 
2923  // }
2924 
2925 
2926 
2927  // libmesh_assert_less (j, 3);
2928 
2929  // switch (j)
2930  // {
2931  // // d()/dxi
2932  // case 0:
2933  // return (FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i0[i], 0, xi_mapped)*
2934  // FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[i], eta_mapped)*
2935  // FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[i], zeta_mapped));
2936 
2937  // // d()/deta
2938  // case 1:
2939  // return (FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[i], xi_mapped)*
2940  // FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i1[i], 0, eta_mapped)*
2941  // FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i2[i], zeta_mapped));
2942 
2943  // // d()/dzeta
2944  // case 2:
2945  // return (FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i0[i], xi_mapped)*
2946  // FE<1,BERNSTEIN>::shape (EDGE3, totalorder, i1[i], eta_mapped)*
2947  // FE<1,BERNSTEIN>::shape_deriv(EDGE3, totalorder, i2[i], 0, zeta_mapped));
2948 
2949  // default:
2950  // libmesh_error_msg("Invalid derivative index j = " << j);
2951  // }
2952  // }
2953 
2954 
2955  default:
2956  libmesh_error_msg("Invalid element type = " << type);
2957  }
2958  }
2959 
2960 
2961  default:
2962  libmesh_error_msg("Invalid totalorder = " << totalorder);
2963  }
2964 
2965 #else // LIBMESH_DIM != 3
2966  libmesh_ignore(elem, order, i, j, p, add_p_level);
2967  libmesh_not_implemented();
2968 #endif
2969 }

◆ shape_deriv() [61/125]

Real libMesh::FE< 2, CLOUGH >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 2024 of file fe_clough_shape_2D.C.

2030 {
2031  libmesh_assert(elem);
2032 
2033  clough_compute_coefs(elem);
2034 
2035  const ElemType type = elem->type();
2036 
2037  const Order totalorder =
2038  static_cast<Order>(order + add_p_level * elem->p_level());
2039 
2040  switch (totalorder)
2041  {
2042  // 2nd-order restricted Clough-Tocher element
2043  case SECOND:
2044  {
2045  // There may be a bug in the 2nd order case; the 3rd order
2046  // Clough-Tocher elements are pretty uniformly better anyways
2047  // so use those instead.
2048  libmesh_experimental();
2049  switch (type)
2050  {
2051  // C1 functions on the Clough-Tocher triangle.
2052  case TRI6:
2053  {
2054  libmesh_assert_less (i, 9);
2055  // FIXME: it would be nice to calculate (and cache)
2056  // clough_raw_shape(j,p) only once per triangle, not 1-7
2057  // times
2058  switch (i)
2059  {
2060  // Note: these DoF numbers are "scrambled" because my
2061  // initial numbering conventions didn't match libMesh
2062  case 0:
2063  return clough_raw_shape_deriv(0, j, p)
2064  + d1d2n * clough_raw_shape_deriv(10, j, p)
2065  + d1d3n * clough_raw_shape_deriv(11, j, p);
2066  case 3:
2067  return clough_raw_shape_deriv(1, j, p)
2068  + d2d3n * clough_raw_shape_deriv(11, j, p)
2069  + d2d1n * clough_raw_shape_deriv(9, j, p);
2070  case 6:
2071  return clough_raw_shape_deriv(2, j, p)
2072  + d3d1n * clough_raw_shape_deriv(9, j, p)
2073  + d3d2n * clough_raw_shape_deriv(10, j, p);
2074  case 1:
2075  return d1xd1x * clough_raw_shape_deriv(3, j, p)
2076  + d1xd1y * clough_raw_shape_deriv(4, j, p)
2077  + d1xd2n * clough_raw_shape_deriv(10, j, p)
2078  + d1xd3n * clough_raw_shape_deriv(11, j, p)
2079  + 0.5 * N01x * d3nd3n * clough_raw_shape_deriv(11, j, p)
2080  + 0.5 * N02x * d2nd2n * clough_raw_shape_deriv(10, j, p);
2081  case 2:
2082  return d1yd1y * clough_raw_shape_deriv(4, j, p)
2083  + d1yd1x * clough_raw_shape_deriv(3, j, p)
2084  + d1yd2n * clough_raw_shape_deriv(10, j, p)
2085  + d1yd3n * clough_raw_shape_deriv(11, j, p)
2086  + 0.5 * N01y * d3nd3n * clough_raw_shape_deriv(11, j, p)
2087  + 0.5 * N02y * d2nd2n * clough_raw_shape_deriv(10, j, p);
2088  case 4:
2089  return d2xd2x * clough_raw_shape_deriv(5, j, p)
2090  + d2xd2y * clough_raw_shape_deriv(6, j, p)
2091  + d2xd3n * clough_raw_shape_deriv(11, j, p)
2092  + d2xd1n * clough_raw_shape_deriv(9, j, p)
2093  + 0.5 * N10x * d3nd3n * clough_raw_shape_deriv(11, j, p)
2094  + 0.5 * N12x * d1nd1n * clough_raw_shape_deriv(9, j, p);
2095  case 5:
2096  return d2yd2y * clough_raw_shape_deriv(6, j, p)
2097  + d2yd2x * clough_raw_shape_deriv(5, j, p)
2098  + d2yd3n * clough_raw_shape_deriv(11, j, p)
2099  + d2yd1n * clough_raw_shape_deriv(9, j, p)
2100  + 0.5 * N10y * d3nd3n * clough_raw_shape_deriv(11, j, p)
2101  + 0.5 * N12y * d1nd1n * clough_raw_shape_deriv(9, j, p);
2102  case 7:
2103  return d3xd3x * clough_raw_shape_deriv(7, j, p)
2104  + d3xd3y * clough_raw_shape_deriv(8, j, p)
2105  + d3xd1n * clough_raw_shape_deriv(9, j, p)
2106  + d3xd2n * clough_raw_shape_deriv(10, j, p)
2107  + 0.5 * N20x * d2nd2n * clough_raw_shape_deriv(10, j, p)
2108  + 0.5 * N21x * d1nd1n * clough_raw_shape_deriv(9, j, p);
2109  case 8:
2110  return d3yd3y * clough_raw_shape_deriv(8, j, p)
2111  + d3yd3x * clough_raw_shape_deriv(7, j, p)
2112  + d3yd1n * clough_raw_shape_deriv(9, j, p)
2113  + d3yd2n * clough_raw_shape_deriv(10, j, p)
2114  + 0.5 * N20y * d2nd2n * clough_raw_shape_deriv(10, j, p)
2115  + 0.5 * N21y * d1nd1n * clough_raw_shape_deriv(9, j, p);
2116  default:
2117  libmesh_error_msg("Invalid shape function index i = " << i);
2118  }
2119  }
2120  default:
2121  libmesh_error_msg("ERROR: Unsupported element type = " << type);
2122  }
2123  }
2124  // 3rd-order Clough-Tocher element
2125  case THIRD:
2126  {
2127  switch (type)
2128  {
2129  // C1 functions on the Clough-Tocher triangle.
2130  case TRI6:
2131  {
2132  libmesh_assert_less (i, 12);
2133 
2134  // FIXME: it would be nice to calculate (and cache)
2135  // clough_raw_shape(j,p) only once per triangle, not 1-7
2136  // times
2137  switch (i)
2138  {
2139  // Note: these DoF numbers are "scrambled" because my
2140  // initial numbering conventions didn't match libMesh
2141  case 0:
2142  return clough_raw_shape_deriv(0, j, p)
2143  + d1d2n * clough_raw_shape_deriv(10, j, p)
2144  + d1d3n * clough_raw_shape_deriv(11, j, p);
2145  case 3:
2146  return clough_raw_shape_deriv(1, j, p)
2147  + d2d3n * clough_raw_shape_deriv(11, j, p)
2148  + d2d1n * clough_raw_shape_deriv(9, j, p);
2149  case 6:
2150  return clough_raw_shape_deriv(2, j, p)
2151  + d3d1n * clough_raw_shape_deriv(9, j, p)
2152  + d3d2n * clough_raw_shape_deriv(10, j, p);
2153  case 1:
2154  return d1xd1x * clough_raw_shape_deriv(3, j, p)
2155  + d1xd1y * clough_raw_shape_deriv(4, j, p)
2156  + d1xd2n * clough_raw_shape_deriv(10, j, p)
2157  + d1xd3n * clough_raw_shape_deriv(11, j, p);
2158  case 2:
2159  return d1yd1y * clough_raw_shape_deriv(4, j, p)
2160  + d1yd1x * clough_raw_shape_deriv(3, j, p)
2161  + d1yd2n * clough_raw_shape_deriv(10, j, p)
2162  + d1yd3n * clough_raw_shape_deriv(11, j, p);
2163  case 4:
2164  return d2xd2x * clough_raw_shape_deriv(5, j, p)
2165  + d2xd2y * clough_raw_shape_deriv(6, j, p)
2166  + d2xd3n * clough_raw_shape_deriv(11, j, p)
2167  + d2xd1n * clough_raw_shape_deriv(9, j, p);
2168  case 5:
2169  return d2yd2y * clough_raw_shape_deriv(6, j, p)
2170  + d2yd2x * clough_raw_shape_deriv(5, j, p)
2171  + d2yd3n * clough_raw_shape_deriv(11, j, p)
2172  + d2yd1n * clough_raw_shape_deriv(9, j, p);
2173  case 7:
2174  return d3xd3x * clough_raw_shape_deriv(7, j, p)
2175  + d3xd3y * clough_raw_shape_deriv(8, j, p)
2176  + d3xd1n * clough_raw_shape_deriv(9, j, p)
2177  + d3xd2n * clough_raw_shape_deriv(10, j, p);
2178  case 8:
2179  return d3yd3y * clough_raw_shape_deriv(8, j, p)
2180  + d3yd3x * clough_raw_shape_deriv(7, j, p)
2181  + d3yd1n * clough_raw_shape_deriv(9, j, p)
2182  + d3yd2n * clough_raw_shape_deriv(10, j, p);
2183  case 10:
2184  return d1nd1n * clough_raw_shape_deriv(9, j, p);
2185  case 11:
2186  return d2nd2n * clough_raw_shape_deriv(10, j, p);
2187  case 9:
2188  return d3nd3n * clough_raw_shape_deriv(11, j, p);
2189 
2190  default:
2191  libmesh_error_msg("Invalid shape function index i = " << i);
2192  }
2193  }
2194  default:
2195  libmesh_error_msg("ERROR: Unsupported element type = " << type);
2196  }
2197  }
2198  // by default throw an error
2199  default:
2200  libmesh_error_msg("ERROR: Unsupported polynomial order = " << order);
2201  }
2202 }

◆ shape_deriv() [62/125]

Real libMesh::FE< 1, RATIONAL_BERNSTEIN >::shape_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  libmesh_dbg_varj,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 109 of file fe_rational_shape_1D.C.

115 {
116  // only d()/dxi in 1D!
117  libmesh_assert_equal_to (j, 0);
118 
119  libmesh_assert(elem);
120 
121  const ElemType elem_type = elem->type();
122 
123  const Order totalorder = static_cast<Order>(order + add_p_level * elem->p_level());
124 
125  // FEType object to be passed to various FEInterface functions below.
126  FEType fe_type(totalorder, _underlying_fe_family);
127 
128  const unsigned int n_sf =
129  FEInterface::n_shape_functions(1, fe_type, elem_type);
130 
131  const unsigned int n_nodes = elem->n_nodes();
132  libmesh_assert_equal_to (n_sf, n_nodes);
133 
134  std::vector<Real> node_weights(n_nodes);
135 
136  const unsigned char datum_index = elem->mapping_data();
137  for (unsigned int n=0; n<n_nodes; n++)
138  node_weights[n] =
139  elem->node_ref(n).get_extra_datum<Real>(datum_index);
140 
141  Real weighted_shape_i = 0, weighted_sum = 0,
142  weighted_grad_i = 0, weighted_grad_sum = 0;
143 
144  for (unsigned int sf=0; sf<n_sf; sf++)
145  {
146  Real weighted_shape = node_weights[sf] *
147  FEInterface::shape(1, fe_type, elem, sf, p);
148  Real weighted_grad = node_weights[sf] *
149  FEInterface::shape_deriv(1, fe_type, elem, sf, 0, p);
150  weighted_sum += weighted_shape;
151  weighted_grad_sum += weighted_grad;
152  if (sf == i)
153  {
154  weighted_shape_i = weighted_shape;
155  weighted_grad_i = weighted_grad;
156  }
157  }
158 
159  return (weighted_sum * weighted_grad_i - weighted_shape_i * weighted_grad_sum) /
160  weighted_sum / weighted_sum;
161 }

◆ shape_deriv() [63/125]

Real libMesh::FE< 3, CLOUGH >::shape_deriv ( const Elem libmesh_dbg_varelem,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 73 of file fe_clough_shape_3D.C.

79 {
80  libmesh_assert(elem);
81  libmesh_not_implemented();
82  return 0.;
83 }

◆ shape_deriv() [64/125]

Real libMesh::FE< 1, HIERARCHIC >::shape_deriv ( const ElemType  elem_type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 110 of file fe_hierarchic_shape_1D.C.

115 {
116  return fe_hierarchic_1D_shape_deriv(elem_type, order, i, j, p);
117 }

◆ shape_deriv() [65/125]

Real libMesh::FE< 1, L2_HIERARCHIC >::shape_deriv ( const ElemType  elem_type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 122 of file fe_hierarchic_shape_1D.C.

127 {
128  return fe_hierarchic_1D_shape_deriv(elem_type, order, i, j, p);
129 }

◆ shape_deriv() [66/125]

static OutputShape libMesh::FE< Dim, T >::shape_deriv ( const ElemType  t,
const Order  o,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
staticinherited
Returns
The \( j^{th} \) derivative of the \( i^{th} \) shape function at point p. This method allows you to specify the dimension, element type, and order directly.

On a p-refined element, o should be the total order of the element.

◆ shape_deriv() [67/125]

Real libMesh::FE< 3, LAGRANGE >::shape_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 110 of file fe_lagrange_shape_3D.C.

115 {
116  return fe_lagrange_3D_shape_deriv(type, order, i, j, p);
117 }

◆ shape_deriv() [68/125]

Real libMesh::FE< 2, LAGRANGE >::shape_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 111 of file fe_lagrange_shape_2D.C.

116 {
117  return fe_lagrange_2D_shape_deriv(type, order, i, j, p);
118 }

◆ shape_deriv() [69/125]

Real libMesh::FE< 3, L2_LAGRANGE >::shape_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 122 of file fe_lagrange_shape_3D.C.

127 {
128  return fe_lagrange_3D_shape_deriv(type, order, i, j, p);
129 }

◆ shape_deriv() [70/125]

Real libMesh::FE< 2, L2_LAGRANGE >::shape_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 123 of file fe_lagrange_shape_2D.C.

128 {
129  return fe_lagrange_2D_shape_deriv(type, order, i, j, p);
130 }

◆ shape_deriv() [71/125]

RealVectorValue libMesh::FE< 0, MONOMIAL_VEC >::shape_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 174 of file fe_monomial_vec.C.

179 {
180  Real value = FE<0, MONOMIAL>::shape_deriv(type, order, i, j, p);
182 }

◆ shape_deriv() [72/125]

RealVectorValue libMesh::FE< 1, MONOMIAL_VEC >::shape_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 212 of file fe_monomial_vec.C.

217 {
218  Real value = FE<1, MONOMIAL>::shape_deriv(type, order, i, j, p);
220 }

◆ shape_deriv() [73/125]

RealVectorValue libMesh::FE< 2, MONOMIAL_VEC >::shape_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 263 of file fe_monomial_vec.C.

268 {
269  Real value = FE<2, MONOMIAL>::shape_deriv(type, order, i / 2, j, p);
270 
271  switch (i % 2)
272  {
273  case 0:
275 
276  case 1:
277  return libMesh::RealVectorValue(Real(0), value);
278 
279  default:
280  libmesh_error_msg("i%2 must be either 0 or 1!");
281  }
282 
283  // dummy
284  return libMesh::RealVectorValue();
285 }

◆ shape_deriv() [74/125]

RealVectorValue libMesh::FE< 3, MONOMIAL_VEC >::shape_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 346 of file fe_monomial_vec.C.

351 {
352  Real value = FE<3, MONOMIAL>::shape_deriv(type, order, i / 3, j, p);
353 
354  switch (i % 3)
355  {
356  case 0:
358 
359  case 1:
360  return libMesh::RealVectorValue(Real(0), value);
361 
362  case 2:
363  return libMesh::RealVectorValue(Real(0), Real(0), value);
364 
365  default:
366  libmesh_error_msg("i%3 must be 0, 1, or 2!");
367  }
368 
369  // dummy
370  return libMesh::RealVectorValue();
371 }

◆ shape_deriv() [75/125]

RealGradient libMesh::FE< 0, LAGRANGE_VEC >::shape_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 543 of file fe_lagrange_vec.C.

546 {
547  Real value = FE<0,LAGRANGE>::shape_deriv( type, order, i, j, p );
548  return libMesh::RealGradient( value );
549 }

◆ shape_deriv() [76/125]

RealGradient libMesh::FE< 1, LAGRANGE_VEC >::shape_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 569 of file fe_lagrange_vec.C.

572 {
573  Real value = FE<1,LAGRANGE>::shape_deriv( type, order, i, j, p );
574  return libMesh::RealGradient( value );
575 }

◆ shape_deriv() [77/125]

RealGradient libMesh::FE< 2, LAGRANGE_VEC >::shape_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 608 of file fe_lagrange_vec.C.

611 {
612  Real value = FE<2,LAGRANGE>::shape_deriv( type, order, i/2, j, p );
613 
614  switch( i%2 )
615  {
616  case 0:
617  return libMesh::RealGradient( value );
618 
619  case 1:
620  return libMesh::RealGradient( Real(0), value );
621 
622  default:
623  libmesh_error_msg("i%2 must be either 0 or 1!");
624  }
625 
626  //dummy
627  return libMesh::RealGradient();
628 }

◆ shape_deriv() [78/125]

RealGradient libMesh::FE< 3, LAGRANGE_VEC >::shape_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 680 of file fe_lagrange_vec.C.

683 {
684  Real value = FE<3,LAGRANGE>::shape_deriv( type, order, i/3, j, p );
685 
686  switch( i%3 )
687  {
688  case 0:
689  return libMesh::RealGradient( value );
690 
691  case 1:
692  return libMesh::RealGradient( Real(0), value );
693 
694  case 2:
695  return libMesh::RealGradient( Real(0), Real(0), value );
696 
697  default:
698  libmesh_error_msg("i%3 must be 0, 1, or 2!");
699  }
700 
701  //dummy
702  return libMesh::RealGradient();
703 }

◆ shape_deriv() [79/125]

Real libMesh::FE< 2, SUBDIVISION >::shape_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 743 of file fe_subdivision_2D.C.

748 {
749  switch (order)
750  {
751  case FOURTH:
752  {
753  switch (type)
754  {
755  case TRI3SUBDIVISION:
756  libmesh_assert_less(i, 12);
757  return FESubdivision::regular_shape_deriv(i,j,p(0),p(1));
758  default:
759  libmesh_error_msg("ERROR: Unsupported element type!");
760  }
761  }
762  default:
763  libmesh_error_msg("ERROR: Unsupported polynomial order!");
764  }
765 }

◆ shape_deriv() [80/125]

Real libMesh::FE< 2, MONOMIAL >::shape_deriv ( const  ElemType,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 135 of file fe_monomial_shape_2D.C.

140 {
141 #if LIBMESH_DIM > 1
142 
143 
144  libmesh_assert_less (j, 2);
145 
146  libmesh_assert_less (i, (static_cast<unsigned int>(order)+1)*
147  (static_cast<unsigned int>(order)+2)/2);
148 
149  const Real xi = p(0);
150  const Real eta = p(1);
151 
152  // monomials. since they are hierarchic we only need one case block.
153 
154  switch (j)
155  {
156  // d()/dxi
157  case 0:
158  {
159  switch (i)
160  {
161  // constants
162  case 0:
163  return 0.;
164 
165  // linears
166  case 1:
167  return 1.;
168 
169  case 2:
170  return 0.;
171 
172  // quadratics
173  case 3:
174  return 2.*xi;
175 
176  case 4:
177  return eta;
178 
179  case 5:
180  return 0.;
181 
182  // cubics
183  case 6:
184  return 3.*xi*xi;
185 
186  case 7:
187  return 2.*xi*eta;
188 
189  case 8:
190  return eta*eta;
191 
192  case 9:
193  return 0.;
194 
195  // quartics
196  case 10:
197  return 4.*xi*xi*xi;
198 
199  case 11:
200  return 3.*xi*xi*eta;
201 
202  case 12:
203  return 2.*xi*eta*eta;
204 
205  case 13:
206  return eta*eta*eta;
207 
208  case 14:
209  return 0.;
210 
211  default:
212  unsigned int o = 0;
213  for (; i >= (o+1)*(o+2)/2; o++) { }
214  unsigned int ny = i - (o*(o+1)/2);
215  unsigned int nx = o - ny;
216  Real val = nx;
217  for (unsigned int index=1; index < nx; index++)
218  val *= xi;
219  for (unsigned int index=0; index != ny; index++)
220  val *= eta;
221  return val;
222  }
223  }
224 
225 
226  // d()/deta
227  case 1:
228  {
229  switch (i)
230  {
231  // constants
232  case 0:
233  return 0.;
234 
235  // linears
236  case 1:
237  return 0.;
238 
239  case 2:
240  return 1.;
241 
242  // quadratics
243  case 3:
244  return 0.;
245 
246  case 4:
247  return xi;
248 
249  case 5:
250  return 2.*eta;
251 
252  // cubics
253  case 6:
254  return 0.;
255 
256  case 7:
257  return xi*xi;
258 
259  case 8:
260  return 2.*xi*eta;
261 
262  case 9:
263  return 3.*eta*eta;
264 
265  // quartics
266  case 10:
267  return 0.;
268 
269  case 11:
270  return xi*xi*xi;
271 
272  case 12:
273  return 2.*xi*xi*eta;
274 
275  case 13:
276  return 3.*xi*eta*eta;
277 
278  case 14:
279  return 4.*eta*eta*eta;
280 
281  default:
282  unsigned int o = 0;
283  for (; i >= (o+1)*(o+2)/2; o++) { }
284  unsigned int ny = i - (o*(o+1)/2);
285  unsigned int nx = o - ny;
286  Real val = ny;
287  for (unsigned int index=0; index != nx; index++)
288  val *= xi;
289  for (unsigned int index=1; index < ny; index++)
290  val *= eta;
291  return val;
292  }
293  }
294 
295  default:
296  libmesh_error_msg("Invalid shape function derivative j = " << j);
297  }
298 
299 #else // LIBMESH_DIM == 1
300  libmesh_ignore(i, j, p);
301  libmesh_assert(order);
302  libmesh_not_implemented();
303 #endif
304 }

◆ shape_deriv() [81/125]

Real libMesh::FE< 3, MONOMIAL >::shape_deriv ( const  ElemType,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 203 of file fe_monomial_shape_3D.C.

208 {
209 #if LIBMESH_DIM == 3
210 
211  libmesh_assert_less (j, 3);
212 
213  libmesh_assert_less (i, (static_cast<unsigned int>(order)+1)*
214  (static_cast<unsigned int>(order)+2)*
215  (static_cast<unsigned int>(order)+3)/6);
216 
217 
218  const Real xi = p(0);
219  const Real eta = p(1);
220  const Real zeta = p(2);
221 
222  // monomials. since they are hierarchic we only need one case block.
223  switch (j)
224  {
225  // d()/dxi
226  case 0:
227  {
228  switch (i)
229  {
230  // constant
231  case 0:
232  return 0.;
233 
234  // linear
235  case 1:
236  return 1.;
237 
238  case 2:
239  return 0.;
240 
241  case 3:
242  return 0.;
243 
244  // quadratic
245  case 4:
246  return 2.*xi;
247 
248  case 5:
249  return eta;
250 
251  case 6:
252  return 0.;
253 
254  case 7:
255  return zeta;
256 
257  case 8:
258  return 0.;
259 
260  case 9:
261  return 0.;
262 
263  // cubic
264  case 10:
265  return 3.*xi*xi;
266 
267  case 11:
268  return 2.*xi*eta;
269 
270  case 12:
271  return eta*eta;
272 
273  case 13:
274  return 0.;
275 
276  case 14:
277  return 2.*xi*zeta;
278 
279  case 15:
280  return eta*zeta;
281 
282  case 16:
283  return 0.;
284 
285  case 17:
286  return zeta*zeta;
287 
288  case 18:
289  return 0.;
290 
291  case 19:
292  return 0.;
293 
294  // quartics
295  case 20:
296  return 4.*xi*xi*xi;
297 
298  case 21:
299  return 3.*xi*xi*eta;
300 
301  case 22:
302  return 2.*xi*eta*eta;
303 
304  case 23:
305  return eta*eta*eta;
306 
307  case 24:
308  return 0.;
309 
310  case 25:
311  return 3.*xi*xi*zeta;
312 
313  case 26:
314  return 2.*xi*eta*zeta;
315 
316  case 27:
317  return eta*eta*zeta;
318 
319  case 28:
320  return 0.;
321 
322  case 29:
323  return 2.*xi*zeta*zeta;
324 
325  case 30:
326  return eta*zeta*zeta;
327 
328  case 31:
329  return 0.;
330 
331  case 32:
332  return zeta*zeta*zeta;
333 
334  case 33:
335  return 0.;
336 
337  case 34:
338  return 0.;
339 
340  default:
341  unsigned int o = 0;
342  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
343  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
344  unsigned int block=o, nz = 0;
345  for (; block < i2; block += (o-nz+1)) { nz++; }
346  const unsigned int nx = block - i2;
347  const unsigned int ny = o - nx - nz;
348  Real val = nx;
349  for (unsigned int index=1; index < nx; index++)
350  val *= xi;
351  for (unsigned int index=0; index != ny; index++)
352  val *= eta;
353  for (unsigned int index=0; index != nz; index++)
354  val *= zeta;
355  return val;
356  }
357  }
358 
359 
360  // d()/deta
361  case 1:
362  {
363  switch (i)
364  {
365  // constant
366  case 0:
367  return 0.;
368 
369  // linear
370  case 1:
371  return 0.;
372 
373  case 2:
374  return 1.;
375 
376  case 3:
377  return 0.;
378 
379  // quadratic
380  case 4:
381  return 0.;
382 
383  case 5:
384  return xi;
385 
386  case 6:
387  return 2.*eta;
388 
389  case 7:
390  return 0.;
391 
392  case 8:
393  return zeta;
394 
395  case 9:
396  return 0.;
397 
398  // cubic
399  case 10:
400  return 0.;
401 
402  case 11:
403  return xi*xi;
404 
405  case 12:
406  return 2.*xi*eta;
407 
408  case 13:
409  return 3.*eta*eta;
410 
411  case 14:
412  return 0.;
413 
414  case 15:
415  return xi*zeta;
416 
417  case 16:
418  return 2.*eta*zeta;
419 
420  case 17:
421  return 0.;
422 
423  case 18:
424  return zeta*zeta;
425 
426  case 19:
427  return 0.;
428 
429  // quartics
430  case 20:
431  return 0.;
432 
433  case 21:
434  return xi*xi*xi;
435 
436  case 22:
437  return 2.*xi*xi*eta;
438 
439  case 23:
440  return 3.*xi*eta*eta;
441 
442  case 24:
443  return 4.*eta*eta*eta;
444 
445  case 25:
446  return 0.;
447 
448  case 26:
449  return xi*xi*zeta;
450 
451  case 27:
452  return 2.*xi*eta*zeta;
453 
454  case 28:
455  return 3.*eta*eta*zeta;
456 
457  case 29:
458  return 0.;
459 
460  case 30:
461  return xi*zeta*zeta;
462 
463  case 31:
464  return 2.*eta*zeta*zeta;
465 
466  case 32:
467  return 0.;
468 
469  case 33:
470  return zeta*zeta*zeta;
471 
472  case 34:
473  return 0.;
474 
475  default:
476  unsigned int o = 0;
477  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
478  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
479  unsigned int block=o, nz = 0;
480  for (; block < i2; block += (o-nz+1)) { nz++; }
481  const unsigned int nx = block - i2;
482  const unsigned int ny = o - nx - nz;
483  Real val = ny;
484  for (unsigned int index=0; index != nx; index++)
485  val *= xi;
486  for (unsigned int index=1; index < ny; index++)
487  val *= eta;
488  for (unsigned int index=0; index != nz; index++)
489  val *= zeta;
490  return val;
491  }
492  }
493 
494 
495  // d()/dzeta
496  case 2:
497  {
498  switch (i)
499  {
500  // constant
501  case 0:
502  return 0.;
503 
504  // linear
505  case 1:
506  return 0.;
507 
508  case 2:
509  return 0.;
510 
511  case 3:
512  return 1.;
513 
514  // quadratic
515  case 4:
516  return 0.;
517 
518  case 5:
519  return 0.;
520 
521  case 6:
522  return 0.;
523 
524  case 7:
525  return xi;
526 
527  case 8:
528  return eta;
529 
530  case 9:
531  return 2.*zeta;
532 
533  // cubic
534  case 10:
535  return 0.;
536 
537  case 11:
538  return 0.;
539 
540  case 12:
541  return 0.;
542 
543  case 13:
544  return 0.;
545 
546  case 14:
547  return xi*xi;
548 
549  case 15:
550  return xi*eta;
551 
552  case 16:
553  return eta*eta;
554 
555  case 17:
556  return 2.*xi*zeta;
557 
558  case 18:
559  return 2.*eta*zeta;
560 
561  case 19:
562  return 3.*zeta*zeta;
563 
564  // quartics
565  case 20:
566  return 0.;
567 
568  case 21:
569  return 0.;
570 
571  case 22:
572  return 0.;
573 
574  case 23:
575  return 0.;
576 
577  case 24:
578  return 0.;
579 
580  case 25:
581  return xi*xi*xi;
582 
583  case 26:
584  return xi*xi*eta;
585 
586  case 27:
587  return xi*eta*eta;
588 
589  case 28:
590  return eta*eta*eta;
591 
592  case 29:
593  return 2.*xi*xi*zeta;
594 
595  case 30:
596  return 2.*xi*eta*zeta;
597 
598  case 31:
599  return 2.*eta*eta*zeta;
600 
601  case 32:
602  return 3.*xi*zeta*zeta;
603 
604  case 33:
605  return 3.*eta*zeta*zeta;
606 
607  case 34:
608  return 4.*zeta*zeta*zeta;
609 
610  default:
611  unsigned int o = 0;
612  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
613  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
614  unsigned int block=o, nz = 0;
615  for (; block < i2; block += (o-nz+1)) { nz++; }
616  const unsigned int nx = block - i2;
617  const unsigned int ny = o - nx - nz;
618  Real val = nz;
619  for (unsigned int index=0; index != nx; index++)
620  val *= xi;
621  for (unsigned int index=0; index != ny; index++)
622  val *= eta;
623  for (unsigned int index=1; index < nz; index++)
624  val *= zeta;
625  return val;
626  }
627  }
628 
629  default:
630  libmesh_error_msg("Invalid shape function derivative j = " << j);
631  }
632 
633 #else // LIBMESH_DIM != 3
634  libmesh_assert(order);
635  libmesh_ignore(i, j, p);
636  libmesh_not_implemented();
637 #endif
638 }

◆ shape_deriv() [82/125]

Real libMesh::FE< 1, MONOMIAL >::shape_deriv ( const  ElemType,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const unsigned int  libmesh_dbg_varj,
const Point p 
)
inherited

Definition at line 84 of file fe_monomial_shape_1D.C.

89 {
90  // only d()/dxi in 1D!
91 
92  libmesh_assert_equal_to (j, 0);
93 
94  const Real xi = p(0);
95 
96  libmesh_assert_less_equal (i, static_cast<unsigned int>(order));
97 
98  // monomials. since they are hierarchic we only need one case block.
99  switch (i)
100  {
101  case 0:
102  return 0.;
103 
104  case 1:
105  return 1.;
106 
107  case 2:
108  return 2.*xi;
109 
110  case 3:
111  return 3.*xi*xi;
112 
113  case 4:
114  return 4.*xi*xi*xi;
115 
116  default:
117  Real val = i;
118  for (unsigned int index = 1; index != i; ++index)
119  val *= xi;
120  return val;
121  }
122 }

◆ shape_deriv() [83/125]

Real libMesh::FE< 1, SZABAB >::shape_deriv ( const  ElemType,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const unsigned int  libmesh_dbg_varj,
const Point p 
)
inherited

Definition at line 93 of file fe_szabab_shape_1D.C.

98 {
99  // only d()/dxi in 1D!
100  libmesh_assert_equal_to (j, 0);
101 
102  const Real xi = p(0);
103  const Real xi2 = xi*xi;
104 
105  // Use this libmesh_assert rather than a switch with a single entry...
106  // It will go away in optimized mode, essentially has the same effect.
107  libmesh_assert_less_equal (order, SEVENTH);
108 
109  // switch (order)
110  // {
111  // case FIRST:
112  // case SECOND:
113  // case THIRD:
114  // case FOURTH:
115  // case FIFTH:
116  // case SIXTH:
117  // case SEVENTH:
118 
119  switch(i)
120  {
121  case 0:return -1./2.;
122  case 1:return 1./2.;
123  case 2:return 1./2.*2.4494897427831780982*xi;
124  case 3:return -1./4.*3.1622776601683793320+3./4.*3.1622776601683793320*xi2;
125  case 4:return 1./16.*3.7416573867739413856*(-12.+20*xi2)*xi;
126  case 5:return 9./16.*1.4142135623730950488+(-45./8.*1.4142135623730950488+105./16.*1.4142135623730950488*xi2)*xi2;
127  case 6:return 1./32.*4.6904157598234295546*(30.+(-140.+126.*xi2)*xi2)*xi;
128  case 7:return -5./32.*5.0990195135927848300+(105./32.*5.0990195135927848300+(-315./32.*5.0990195135927848300+231./32.*5.0990195135927848300*xi2)*xi2)*xi2;
129  case 8:return 1./256.*5.4772255750516611346*(-280.+(2520.+(-5544.+3432.*xi2)*xi2)*xi2)*xi;
130 
131  default:
132  libmesh_error_msg("Invalid shape function index!");
133  }
134 }

◆ shape_deriv() [84/125]

Real libMesh::FE< 1, LAGRANGE >::shape_deriv ( const  ElemType,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 75 of file fe_lagrange_shape_1D.C.

80 {
81  return fe_lagrange_1D_shape_deriv(order, i, j, p(0));
82 }

◆ shape_deriv() [85/125]

Real libMesh::FE< 1, L2_LAGRANGE >::shape_deriv ( const  ElemType,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 87 of file fe_lagrange_shape_1D.C.

92 {
93  return fe_lagrange_1D_shape_deriv(order, i, j, p(0));
94 }

◆ shape_deriv() [86/125]

Real libMesh::FE< 1, BERNSTEIN >::shape_deriv ( const  ElemType,
const Order  order,
const unsigned int  i,
const unsigned int  libmesh_dbg_varj,
const Point p 
)
inherited

Definition at line 206 of file fe_bernstein_shape_1D.C.

211 {
212  // only d()/dxi in 1D!
213 
214  libmesh_assert_equal_to (j, 0);
215 
216  const Real xi = p(0);
217 
218  using Utility::pow;
219 
220  switch (order)
221  {
222  case FIRST:
223 
224  switch(i)
225  {
226  case 0:
227  return -.5;
228  case 1:
229  return .5;
230  default:
231  libmesh_error_msg("Invalid shape function index i = " << i);
232  }
233 
234  case SECOND:
235 
236  switch(i)
237  {
238  case 0:
239  return (xi-1.)*.5;
240  case 1:
241  return (xi+1.)*.5;
242  case 2:
243  return -xi;
244  default:
245  libmesh_error_msg("Invalid shape function index i = " << i);
246  }
247 
248  case THIRD:
249 
250  switch(i)
251  {
252  case 0:
253  return -0.375*pow<2>(1.-xi);
254  case 1:
255  return 0.375*pow<2>(1.+xi);
256  case 2:
257  return -0.375 -.75*xi +1.125*pow<2>(xi);
258  case 3:
259  return 0.375 -.75*xi -1.125*pow<2>(xi);
260  default:
261  libmesh_error_msg("Invalid shape function index i = " << i);
262  }
263 
264  case FOURTH:
265 
266  switch(i)
267  {
268  case 0:
269  return -0.25*pow<3>(1.-xi);
270  case 1:
271  return 0.25*pow<3>(1.+xi);
272  case 2:
273  return -0.5 +1.5*pow<2>(xi)-pow<3>(xi);
274  case 3:
275  return 1.5*(pow<3>(xi)-xi);
276  case 4:
277  return 0.5 -1.5*pow<2>(xi)-pow<3>(xi);
278  default:
279  libmesh_error_msg("Invalid shape function index i = " << i);
280  }
281 
282  case FIFTH:
283 
284  switch(i)
285  {
286  case 0:
287  return -(5./32.)*pow<4>(xi-1.);
288  case 1:
289  return (5./32.)*pow<4>(xi+1.);
290  case 2:
291  return (5./32.)*pow<4>(1.-xi) -(5./8.)*(1.+xi)*pow<3>(1.-xi);
292  case 3:
293  return (5./ 8.)*(1.+xi)*pow<3>(1.-xi) -(15./16.)*pow<2>(1.+xi)*pow<2>(1.-xi);
294  case 4:
295  return -(5./ 8.)*pow<3>(1.+xi)*(1.-xi) +(15./16.)*pow<2>(1.+xi)*pow<2>(1.-xi);
296  case 5:
297  return (5./ 8.)*pow<3>(1.+xi)*(1.-xi) -(5./32.)*pow<4>(1.+xi);
298  default:
299  libmesh_error_msg("Invalid shape function index i = " << i);
300  }
301 
302  case SIXTH:
303 
304  switch(i)
305  {
306  case 0:
307  return -( 3./32.)*pow<5>(1.-xi);
308  case 1:
309  return ( 3./32.)*pow<5>(1.+xi);
310  case 2:
311  return ( 3./32.)*pow<5>(1.-xi)-(15./32.)*(1.+xi)*pow<4>(1.-xi);
312  case 3:
313  return (15./32.)*(1.+xi)*pow<4>(1.-xi)-(15./16.)*pow<2>(1.+xi)*pow<3>(1.-xi);
314  case 4:
315  return -(15./ 8.)*xi +(15./4.)*pow<3>(xi)-(15./8.)*pow<5>(xi);
316  case 5:
317  return -(15./32.)*(1.-xi)*pow<4>(1.+xi)+(15./16.)*pow<2>(1.-xi)*pow<3>(1.+xi);
318  case 6:
319  return (15./32.)*pow<4>(1.+xi)*(1.-xi)-(3./32.)*pow<5>(1.+xi);
320  default:
321  libmesh_error_msg("Invalid shape function index i = " << i);
322  }
323 
324 
325  default:
326  {
327  libmesh_assert (order>6);
328 
329  // Use this for arbitrary orders
330  const int p_order = static_cast<int>(order);
331  const int m = p_order-(i-1);
332  const int n = (i-1);
333 
334  Real binomial_p_i = 1;
335 
336  // the binomial coefficient (p choose n)
337  // Using an unsigned long here will work for any of the orders we support.
338  // Explicitly construct a Real to prevent conversion warnings
339  if (i>1)
340  binomial_p_i = Real(Utility::binomial(static_cast<unsigned long>(p_order),
341  static_cast<unsigned long>(n)));
342 
343  switch(i)
344  {
345  case 0:
346  return binomial_p_i * (-1./2.) * p_order * std::pow((1-xi)/2, p_order-1);
347  case 1:
348  return binomial_p_i * ( 1./2.) * p_order * std::pow((1+xi)/2, p_order-1);
349 
350  default:
351  {
352  return binomial_p_i * (1./2. * n * std::pow((1+xi)/2,n-1) * std::pow((1-xi)/2,m)
353  - 1./2. * m * std::pow((1+xi)/2,n) * std::pow((1-xi)/2,m-1));
354  }
355  }
356  }
357 
358  }
359 }

◆ shape_deriv() [87/125]

Real libMesh::FE< 1, SCALAR >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 48 of file fe_scalar_shape_1D.C.

53 {
54  return 0.;
55 }

◆ shape_deriv() [88/125]

Real libMesh::FE< 3, SCALAR >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 48 of file fe_scalar_shape_3D.C.

53 {
54  return 0.;
55 }

◆ shape_deriv() [89/125]

Real libMesh::FE< 0, SCALAR >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 48 of file fe_scalar_shape_0D.C.

53 {
54  return 0.;
55 }

◆ shape_deriv() [90/125]

Real libMesh::FE< 2, SCALAR >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 49 of file fe_scalar_shape_2D.C.

54 {
55  return 0.;
56 }

◆ shape_deriv() [91/125]

Real libMesh::FE< 3, SZABAB >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 56 of file fe_szabab_shape_3D.C.

61 {
62  libmesh_error_msg("Szabo-Babuska polynomials are not defined in 3D");
63  return 0.;
64 }

◆ shape_deriv() [92/125]

Real libMesh::FE< 0, BERNSTEIN >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 57 of file fe_bernstein_shape_0D.C.

62 {
63  libmesh_error_msg("No spatial derivatives in 0D!");
64  return 0.;
65 }

◆ shape_deriv() [93/125]

Real libMesh::FE< 0, CLOUGH >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 57 of file fe_clough_shape_0D.C.

62 {
63  libmesh_error_msg("No spatial derivatives in 0D!");
64  return 0.;
65 }

◆ shape_deriv() [94/125]

Real libMesh::FE< 0, HERMITE >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 57 of file fe_hermite_shape_0D.C.

62 {
63  libmesh_error_msg("No spatial derivatives in 0D!");
64  return 0.;
65 }

◆ shape_deriv() [95/125]

Real libMesh::FE< 0, RATIONAL_BERNSTEIN >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 57 of file fe_rational_shape_0D.C.

62 {
63  libmesh_error_msg("No spatial derivatives in 0D!");
64  return 0.;
65 }

◆ shape_deriv() [96/125]

Real libMesh::FE< 0, MONOMIAL >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 57 of file fe_monomial_shape_0D.C.

62 {
63  libmesh_error_msg("No spatial derivatives in 0D!");
64  return 0.;
65 }

◆ shape_deriv() [97/125]

Real libMesh::FE< 0, XYZ >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 57 of file fe_xyz_shape_0D.C.

62 {
63  libmesh_error_msg("No spatial derivatives in 0D!");
64  return 0.;
65 }

◆ shape_deriv() [98/125]

Real libMesh::FE< 0, SZABAB >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 57 of file fe_szabab_shape_0D.C.

62 {
63  libmesh_error_msg("No spatial derivatives in 0D!");
64  return 0.;
65 }

◆ shape_deriv() [99/125]

Real libMesh::FE< 3, CLOUGH >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 60 of file fe_clough_shape_3D.C.

65 {
66  libmesh_error_msg("Clough-Tocher elements require the real element \nto construct gradient-based degrees of freedom.");
67  return 0.;
68 }

◆ shape_deriv() [100/125]

Real libMesh::FE< 0, LAGRANGE >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 77 of file fe_lagrange_shape_0D.C.

82 {
83  libmesh_error_msg("No spatial derivatives in 0D!");
84  return 0.;
85 }

◆ shape_deriv() [101/125]

Real libMesh::FE< 0, HIERARCHIC >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 78 of file fe_hierarchic_shape_0D.C.

83 {
84  libmesh_error_msg("No spatial derivatives in 0D!");
85  return 0.;
86 }

◆ shape_deriv() [102/125]

Real libMesh::FE< 2, RATIONAL_BERNSTEIN >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 94 of file fe_rational_shape_2D.C.

99 {
100  libmesh_error_msg("Rational bases require the real element \nto query nodal weighting.");
101  return 0.;
102 }

◆ shape_deriv() [103/125]

Real libMesh::FE< 3, RATIONAL_BERNSTEIN >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 94 of file fe_rational_shape_3D.C.

99 {
100  libmesh_error_msg("Rational bases require the real element \nto query nodal weighting.");
101  return 0.;
102 }

◆ shape_deriv() [104/125]

Real libMesh::FE< 1, XYZ >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 94 of file fe_xyz_shape_1D.C.

99 {
100  libmesh_error_msg("XYZ polynomials require the element \nbecause the centroid is needed.");
101  return 0.;
102 }

◆ shape_deriv() [105/125]

Real libMesh::FE< 1, RATIONAL_BERNSTEIN >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 96 of file fe_rational_shape_1D.C.

101 {
102  libmesh_error_msg("Rational bases require the real element \nto query nodal weighting.");
103  return 0.;
104 }

◆ shape_deriv() [106/125]

Real libMesh::FE< 0, L2_LAGRANGE >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 104 of file fe_lagrange_shape_0D.C.

109 {
110  libmesh_error_msg("No spatial derivatives in 0D!");
111  return 0.;
112 }

◆ shape_deriv() [107/125]

Real libMesh::FE< 0, L2_HIERARCHIC >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 105 of file fe_hierarchic_shape_0D.C.

110 {
111  libmesh_error_msg("No spatial derivatives in 0D!");
112  return 0.;
113 }

◆ shape_deriv() [108/125]

Real libMesh::FE< 2, HIERARCHIC >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 112 of file fe_hierarchic_shape_2D.C.

117 {
118  libmesh_error_msg("Hierarchic shape functions require an Elem for edge orientation.");
119  return 0.;
120 }

◆ shape_deriv() [109/125]

Real libMesh::FE< 2, L2_HIERARCHIC >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 125 of file fe_hierarchic_shape_2D.C.

130 {
131  libmesh_error_msg("Hierarchic shape functions require an Elem for edge orientation.");
132  return 0.;
133 }

◆ shape_deriv() [110/125]

Real libMesh::FE< 2, XYZ >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 155 of file fe_xyz_shape_2D.C.

160 {
161  libmesh_error_msg("XYZ polynomials require the element \nbecause the centroid is needed.");
162  return 0.;
163 }

◆ shape_deriv() [111/125]

RealGradient libMesh::FE< 2, NEDELEC_ONE >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 167 of file fe_nedelec_one_shape_2D.C.

172 {
173  libmesh_error_msg("Nedelec elements require the element type \nbecause edge orientation is needed.");
174  return RealGradient();
175 }

◆ shape_deriv() [112/125]

RealGradient libMesh::FE< 3, NEDELEC_ONE >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 196 of file fe_nedelec_one_shape_3D.C.

201 {
202  libmesh_error_msg("Nedelec elements require the element type \nbecause edge orientation is needed.");
203  return RealGradient();
204 }

◆ shape_deriv() [113/125]

Real libMesh::FE< 3, XYZ >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 224 of file fe_xyz_shape_3D.C.

229 {
230  libmesh_error_msg("XYZ polynomials require the element \nbecause the centroid is needed.");
231  return 0.;
232 }

◆ shape_deriv() [114/125]

Real libMesh::FE< 1, HERMITE >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 249 of file fe_hermite_shape_1D.C.

254 {
255  libmesh_error_msg("Hermite elements require the real element \nto construct gradient-based degrees of freedom.");
256  return 0.;
257 }

◆ shape_deriv() [115/125]

Real libMesh::FE< 2, HERMITE >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 261 of file fe_hermite_shape_2D.C.

266 {
267  libmesh_error_msg("Hermite elements require the real element \nto construct gradient-based degrees of freedom.");
268  return 0.;
269 }

◆ shape_deriv() [116/125]

Real libMesh::FE< 1, CLOUGH >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 294 of file fe_clough_shape_1D.C.

299 {
300  libmesh_error_msg("Clough-Tocher elements require the real element \nto construct gradient-based degrees of freedom.");
301  return 0.;
302 }

◆ shape_deriv() [117/125]

Real libMesh::FE< 2, BERNSTEIN >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 388 of file fe_bernstein_shape_2D.C.

393 {
394  libmesh_error_msg("Bernstein polynomials require the element type \nbecause edge orientation is needed.");
395  return 0.;
396 }

◆ shape_deriv() [118/125]

Real libMesh::FE< 3, HERMITE >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 456 of file fe_hermite_shape_3D.C.

461 {
462  libmesh_error_msg("Hermite elements require the real element \nto construct gradient-based degrees of freedom.");
463  return 0.;
464 }

◆ shape_deriv() [119/125]

RealGradient libMesh::FE< 0, NEDELEC_ONE >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 594 of file fe_nedelec_one.C.

596 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ shape_deriv() [120/125]

RealGradient libMesh::FE< 1, NEDELEC_ONE >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 621 of file fe_nedelec_one.C.

623 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ shape_deriv() [121/125]

Real libMesh::FE< 3, HIERARCHIC >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 720 of file fe_hierarchic_shape_3D.C.

725 {
726  libmesh_error_msg("Hierarchic shape functions require an Elem for edge/face orientation.");
727  return 0.;
728 }

◆ shape_deriv() [122/125]

Real libMesh::FE< 3, L2_HIERARCHIC >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 733 of file fe_hierarchic_shape_3D.C.

738 {
739  libmesh_error_msg("Hierarchic shape functions require an Elem for edge/face orientation.");
740  return 0.;
741 }

◆ shape_deriv() [123/125]

Real libMesh::FE< 2, SZABAB >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 738 of file fe_szabab_shape_2D.C.

743 {
744  libmesh_error_msg("Szabo-Babuska polynomials require the element type \nbecause edge orientation is needed.");
745  return 0.;
746 }

◆ shape_deriv() [124/125]

Real libMesh::FE< 3, BERNSTEIN >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 1386 of file fe_bernstein_shape_3D.C.

1391 {
1392  libmesh_error_msg("Bernstein polynomials require the element type \nbecause edge and face orientation is needed.");
1393  return 0.;
1394 }

◆ shape_deriv() [125/125]

Real libMesh::FE< 2, CLOUGH >::shape_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 2011 of file fe_clough_shape_2D.C.

2016 {
2017  libmesh_error_msg("Clough-Tocher elements require the real element \nto construct gradient-based degrees of freedom.");
2018  return 0.;
2019 }

◆ shape_second_deriv() [1/125]

Real libMesh::FE< 0, SCALAR >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 81 of file fe_scalar_shape_0D.C.

87 {
88  return 0.;
89 }

◆ shape_second_deriv() [2/125]

Real libMesh::FE< 3, SCALAR >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 81 of file fe_scalar_shape_3D.C.

87 {
88  return 0.;
89 }

◆ shape_second_deriv() [3/125]

Real libMesh::FE< 1, SCALAR >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 82 of file fe_scalar_shape_1D.C.

88 {
89  return 0.;
90 }

◆ shape_second_deriv() [4/125]

Real libMesh::FE< 2, SCALAR >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 82 of file fe_scalar_shape_2D.C.

88 {
89  return 0.;
90 }

◆ shape_second_deriv() [5/125]

Real libMesh::FE< 3, SZABAB >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 97 of file fe_szabab_shape_3D.C.

103 {
104  libmesh_error_msg("Szabo-Babuska polynomials are not defined in 3D");
105  return 0.;
106 }

◆ shape_second_deriv() [6/125]

Real libMesh::FE< 0, CLOUGH >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 99 of file fe_clough_shape_0D.C.

105 {
106  libmesh_error_msg("No spatial derivatives in 0D!");
107  return 0.;
108 }

◆ shape_second_deriv() [7/125]

Real libMesh::FE< 0, HERMITE >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 99 of file fe_hermite_shape_0D.C.

105 {
106  libmesh_error_msg("No spatial derivatives in 0D!");
107  return 0.;
108 }

◆ shape_second_deriv() [8/125]

Real libMesh::FE< 0, BERNSTEIN >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 99 of file fe_bernstein_shape_0D.C.

105 {
106  libmesh_error_msg("No spatial derivatives in 0D!");
107  return 0.;
108 }

◆ shape_second_deriv() [9/125]

Real libMesh::FE< 0, MONOMIAL >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 99 of file fe_monomial_shape_0D.C.

105 {
106  libmesh_error_msg("No spatial derivatives in 0D!");
107  return 0.;
108 }

◆ shape_second_deriv() [10/125]

Real libMesh::FE< 0, RATIONAL_BERNSTEIN >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 99 of file fe_rational_shape_0D.C.

105 {
106  libmesh_error_msg("No spatial derivatives in 0D!");
107  return 0.;
108 }

◆ shape_second_deriv() [11/125]

Real libMesh::FE< 0, XYZ >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 99 of file fe_xyz_shape_0D.C.

105 {
106  libmesh_error_msg("No spatial derivatives in 0D!");
107  return 0.;
108 }

◆ shape_second_deriv() [12/125]

Real libMesh::FE< 0, SZABAB >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 99 of file fe_szabab_shape_0D.C.

105 {
106  libmesh_error_msg("No spatial derivatives in 0D!");
107  return 0.;
108 }

◆ shape_second_deriv() [13/125]

Real libMesh::FE< 0, LAGRANGE >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 147 of file fe_lagrange_shape_0D.C.

153 {
154  libmesh_error_msg("No spatial derivatives in 0D!");
155  return 0.;
156 }

◆ shape_second_deriv() [14/125]

Real libMesh::FE< 0, HIERARCHIC >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 147 of file fe_hierarchic_shape_0D.C.

153 {
154  libmesh_error_msg("No spatial derivatives in 0D!");
155  return 0.;
156 }

◆ shape_second_deriv() [15/125]

Real libMesh::FE< 0, L2_HIERARCHIC >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 172 of file fe_hierarchic_shape_0D.C.

178 {
179  libmesh_error_msg("No spatial derivatives in 0D!");
180  return 0.;
181 }

◆ shape_second_deriv() [16/125]

Real libMesh::FE< 0, L2_LAGRANGE >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 172 of file fe_lagrange_shape_0D.C.

178 {
179  libmesh_error_msg("No spatial derivatives in 0D!");
180  return 0.;
181 }

◆ shape_second_deriv() [17/125]

Real libMesh::FE< 1, SZABAB >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 176 of file fe_szabab_shape_1D.C.

182 {
183  static bool warning_given = false;
184 
185  if (!warning_given)
186  libMesh::err << "Second derivatives for Szabab elements "
187  << " are not yet implemented!"
188  << std::endl;
189 
190  warning_given = true;
191  return 0.;
192 }

◆ shape_second_deriv() [18/125]

Real libMesh::FE< 1, BERNSTEIN >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 403 of file fe_bernstein_shape_1D.C.

409 {
410  static bool warning_given = false;
411 
412  if (!warning_given)
413  libMesh::err << "Second derivatives for Bernstein elements "
414  << "are not yet implemented!"
415  << std::endl;
416 
417  warning_given = true;
418  return 0.;
419 }

◆ shape_second_deriv() [19/125]

Real libMesh::FE< 2, BERNSTEIN >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 588 of file fe_bernstein_shape_2D.C.

594 {
595  static bool warning_given = false;
596 
597  if (!warning_given)
598  libMesh::err << "Second derivatives for Bernstein elements "
599  << "are not yet implemented!"
600  << std::endl;
601 
602  warning_given = true;
603  return 0.;
604 }

◆ shape_second_deriv() [20/125]

RealGradient libMesh::FE< 0, NEDELEC_ONE >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 608 of file fe_nedelec_one.C.

610 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ shape_second_deriv() [21/125]

RealGradient libMesh::FE< 1, NEDELEC_ONE >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 635 of file fe_nedelec_one.C.

637 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ shape_second_deriv() [22/125]

Real libMesh::FE< 2, SZABAB >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 1423 of file fe_szabab_shape_2D.C.

1429 {
1430  static bool warning_given = false;
1431 
1432  if (!warning_given)
1433  libMesh::err << "Second derivatives for Szabab elements "
1434  << " are not yet implemented!"
1435  << std::endl;
1436 
1437  warning_given = true;
1438  return 0.;
1439 }

◆ shape_second_deriv() [23/125]

Real libMesh::FE< 3, BERNSTEIN >::shape_second_deriv ( const Elem ,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 2995 of file fe_bernstein_shape_3D.C.

3001 {
3002  static bool warning_given = false;
3003 
3004  if (!warning_given)
3005  libMesh::err << "Second derivatives for Bernstein elements "
3006  << "are not yet implemented!"
3007  << std::endl;
3008 
3009  warning_given = true;
3010  return 0.;
3011 }

◆ shape_second_deriv() [24/125]

Real libMesh::FE< 2, XYZ >::shape_second_deriv ( const Elem elem,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const unsigned int  j,
const Point point_in,
const bool  libmesh_dbg_varadd_p_level 
)
inherited

Definition at line 376 of file fe_xyz_shape_2D.C.

382 {
383 #if LIBMESH_DIM > 1
384 
385  libmesh_assert_less_equal (j, 2);
386  libmesh_assert(elem);
387 
388  Point centroid = elem->centroid();
389  Point max_distance = Point(0.,0.,0.);
390  for (unsigned int p = 0; p < elem->n_nodes(); p++)
391  for (unsigned int d = 0; d < 2; d++)
392  {
393  const Real distance = std::abs(centroid(d) - elem->point(p)(d));
394  max_distance(d) = std::max(distance, max_distance(d));
395  }
396 
397  const Real x = point_in(0);
398  const Real y = point_in(1);
399  const Real xc = centroid(0);
400  const Real yc = centroid(1);
401  const Real distx = max_distance(0);
402  const Real disty = max_distance(1);
403  const Real dx = (x - xc)/distx;
404  const Real dy = (y - yc)/disty;
405  const Real dist2x = pow(distx,2.);
406  const Real dist2y = pow(disty,2.);
407  const Real distxy = distx * disty;
408 
409 #ifndef NDEBUG
410  // totalorder is only used in the assertion below, so
411  // we avoid declaring it when asserts are not active.
412  const unsigned int totalorder = order + add_p_level * elem->p_level();
413 #endif
414  libmesh_assert_less (i, (totalorder+1)*(totalorder+2)/2);
415 
416  // monomials. since they are hierarchic we only need one case block.
417 
418  switch (j)
419  {
420  // d^2()/dx^2
421  case 0:
422  {
423  switch (i)
424  {
425  // constants
426  case 0:
427  // linears
428  case 1:
429  case 2:
430  return 0.;
431 
432  // quadratics
433  case 3:
434  return 2./dist2x;
435 
436  case 4:
437  case 5:
438  return 0.;
439 
440  // cubics
441  case 6:
442  return 6.*dx/dist2x;
443 
444  case 7:
445  return 2.*dy/dist2x;
446 
447  case 8:
448  case 9:
449  return 0.;
450 
451  // quartics
452  case 10:
453  return 12.*dx*dx/dist2x;
454 
455  case 11:
456  return 6.*dx*dy/dist2x;
457 
458  case 12:
459  return 2.*dy*dy/dist2x;
460 
461  case 13:
462  case 14:
463  return 0.;
464 
465  default:
466  unsigned int o = 0;
467  for (; i >= (o+1)*(o+2)/2; o++) { }
468  unsigned int i2 = i - (o*(o+1)/2);
469  Real val = (o - i2) * (o - i2 - 1);
470  for (unsigned int index=i2+2; index < o; index++)
471  val *= dx;
472  for (unsigned int index=0; index != i2; index++)
473  val *= dy;
474  return val/dist2x;
475  }
476  }
477 
478  // d^2()/dxdy
479  case 1:
480  {
481  switch (i)
482  {
483  // constants
484  case 0:
485 
486  // linears
487  case 1:
488  case 2:
489  return 0.;
490 
491  // quadratics
492  case 3:
493  return 0.;
494 
495  case 4:
496  return 1./distxy;
497 
498  case 5:
499  return 0.;
500 
501  // cubics
502  case 6:
503  return 0.;
504  case 7:
505  return 2.*dx/distxy;
506 
507  case 8:
508  return 2.*dy/distxy;
509 
510  case 9:
511  return 0.;
512 
513  // quartics
514  case 10:
515  return 0.;
516 
517  case 11:
518  return 3.*dx*dx/distxy;
519 
520  case 12:
521  return 4.*dx*dy/distxy;
522 
523  case 13:
524  return 3.*dy*dy/distxy;
525 
526  case 14:
527  return 0.;
528 
529  default:
530  unsigned int o = 0;
531  for (; i >= (o+1)*(o+2)/2; o++) { }
532  unsigned int i2 = i - (o*(o+1)/2);
533  Real val = (o - i2) * i2;
534  for (unsigned int index=i2+1; index < o; index++)
535  val *= dx;
536  for (unsigned int index=1; index < i2; index++)
537  val *= dy;
538  return val/distxy;
539  }
540  }
541 
542  // d^2()/dy^2
543  case 2:
544  {
545  switch (i)
546  {
547  // constants
548  case 0:
549 
550  // linears
551  case 1:
552  case 2:
553  return 0.;
554 
555  // quadratics
556  case 3:
557  case 4:
558  return 0.;
559 
560  case 5:
561  return 2./dist2y;
562 
563  // cubics
564  case 6:
565  return 0.;
566 
567  case 7:
568  return 0.;
569 
570  case 8:
571  return 2.*dx/dist2y;
572 
573  case 9:
574  return 6.*dy/dist2y;
575 
576  // quartics
577  case 10:
578  case 11:
579  return 0.;
580 
581  case 12:
582  return 2.*dx*dx/dist2y;
583 
584  case 13:
585  return 6.*dx*dy/dist2y;
586 
587  case 14:
588  return 12.*dy*dy/dist2y;
589 
590  default:
591  unsigned int o = 0;
592  for (; i >= (o+1)*(o+2)/2; o++) { }
593  unsigned int i2 = i - (o*(o+1)/2);
594  Real val = i2 * (i2 - 1);
595  for (unsigned int index=i2; index != o; index++)
596  val *= dx;
597  for (unsigned int index=2; index < i2; index++)
598  val *= dy;
599  return val/dist2y;
600  }
601  }
602 
603  default:
604  libmesh_error_msg("Invalid shape function derivative j = " << j);
605  }
606 
607 #else // LIBMESH_DIM <= 1
608  libmesh_assert(true || order || add_p_level);
609  libmesh_ignore(elem, i, j, point_in);
610  libmesh_not_implemented();
611 #endif
612 }

◆ shape_second_deriv() [25/125]

Real libMesh::FE< 3, XYZ >::shape_second_deriv ( const Elem elem,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const unsigned int  j,
const Point point_in,
const bool  libmesh_dbg_varadd_p_level 
)
inherited

Definition at line 714 of file fe_xyz_shape_3D.C.

720 {
721 #if LIBMESH_DIM == 3
722 
723  libmesh_assert(elem);
724  libmesh_assert_less (j, 6);
725 
726  Point centroid = elem->centroid();
727  Point max_distance = Point(0.,0.,0.);
728  for (const Point & p : elem->node_ref_range())
729  for (unsigned int d = 0; d < 3; d++)
730  {
731  const Real distance = std::abs(centroid(d) - p(d));
732  max_distance(d) = std::max(distance, max_distance(d));
733  }
734 
735  const Real x = point_in(0);
736  const Real y = point_in(1);
737  const Real z = point_in(2);
738  const Real xc = centroid(0);
739  const Real yc = centroid(1);
740  const Real zc = centroid(2);
741  const Real distx = max_distance(0);
742  const Real disty = max_distance(1);
743  const Real distz = max_distance(2);
744  const Real dx = (x - xc)/distx;
745  const Real dy = (y - yc)/disty;
746  const Real dz = (z - zc)/distz;
747  const Real dist2x = pow(distx,2.);
748  const Real dist2y = pow(disty,2.);
749  const Real dist2z = pow(distz,2.);
750  const Real distxy = distx * disty;
751  const Real distxz = distx * distz;
752  const Real distyz = disty * distz;
753 
754 #ifndef NDEBUG
755  // totalorder is only used in the assertion below, so
756  // we avoid declaring it when asserts are not active.
757  const unsigned int totalorder = static_cast<Order>(order + add_p_level * elem->p_level());
758 #endif
759  libmesh_assert_less (i, (totalorder+1) * (totalorder+2) *
760  (totalorder+3)/6);
761 
762  // monomials. since they are hierarchic we only need one case block.
763  switch (j)
764  {
765  // d^2()/dx^2
766  case 0:
767  {
768  switch (i)
769  {
770  // constant
771  case 0:
772 
773  // linear
774  case 1:
775  case 2:
776  case 3:
777  return 0.;
778 
779  // quadratic
780  case 4:
781  return 2./dist2x;
782 
783  case 5:
784  case 6:
785  case 7:
786  case 8:
787  case 9:
788  return 0.;
789 
790  // cubic
791  case 10:
792  return 6.*dx/dist2x;
793 
794  case 11:
795  return 2.*dy/dist2x;
796 
797  case 12:
798  case 13:
799  return 0.;
800 
801  case 14:
802  return 2.*dz/dist2x;
803 
804  case 15:
805  case 16:
806  case 17:
807  case 18:
808  case 19:
809  return 0.;
810 
811  // quartics
812  case 20:
813  return 12.*dx*dx/dist2x;
814 
815  case 21:
816  return 6.*dx*dy/dist2x;
817 
818  case 22:
819  return 2.*dy*dy/dist2x;
820 
821  case 23:
822  case 24:
823  return 0.;
824 
825  case 25:
826  return 6.*dx*dz/dist2x;
827 
828  case 26:
829  return 2.*dy*dz/dist2x;
830 
831  case 27:
832  case 28:
833  return 0.;
834 
835  case 29:
836  return 2.*dz*dz/dist2x;
837 
838  case 30:
839  case 31:
840  case 32:
841  case 33:
842  case 34:
843  return 0.;
844 
845  default:
846  unsigned int o = 0;
847  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
848  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
849  unsigned int block=o, nz = 0;
850  for (; block < i2; block += (o-nz+1)) { nz++; }
851  const unsigned int nx = block - i2;
852  const unsigned int ny = o - nx - nz;
853  Real val = nx * (nx - 1);
854  for (unsigned int index=2; index < nx; index++)
855  val *= dx;
856  for (unsigned int index=0; index != ny; index++)
857  val *= dy;
858  for (unsigned int index=0; index != nz; index++)
859  val *= dz;
860  return val/dist2x;
861  }
862  }
863 
864 
865  // d^2()/dxdy
866  case 1:
867  {
868  switch (i)
869  {
870  // constant
871  case 0:
872 
873  // linear
874  case 1:
875  case 2:
876  case 3:
877  return 0.;
878 
879  // quadratic
880  case 4:
881  return 0.;
882 
883  case 5:
884  return 1./distxy;
885 
886  case 6:
887  case 7:
888  case 8:
889  case 9:
890  return 0.;
891 
892  // cubic
893  case 10:
894  return 0.;
895 
896  case 11:
897  return 2.*dx/distxy;
898 
899  case 12:
900  return 2.*dy/distxy;
901 
902  case 13:
903  case 14:
904  return 0.;
905 
906  case 15:
907  return dz/distxy;
908 
909  case 16:
910  case 17:
911  case 18:
912  case 19:
913  return 0.;
914 
915  // quartics
916  case 20:
917  return 0.;
918 
919  case 21:
920  return 3.*dx*dx/distxy;
921 
922  case 22:
923  return 4.*dx*dy/distxy;
924 
925  case 23:
926  return 3.*dy*dy/distxy;
927 
928  case 24:
929  case 25:
930  return 0.;
931 
932  case 26:
933  return 2.*dx*dz/distxy;
934 
935  case 27:
936  return 2.*dy*dz/distxy;
937 
938  case 28:
939  case 29:
940  return 0.;
941 
942  case 30:
943  return dz*dz/distxy;
944 
945  case 31:
946  case 32:
947  case 33:
948  case 34:
949  return 0.;
950 
951  default:
952  unsigned int o = 0;
953  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
954  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
955  unsigned int block=o, nz = 0;
956  for (; block < i2; block += (o-nz+1)) { nz++; }
957  const unsigned int nx = block - i2;
958  const unsigned int ny = o - nx - nz;
959  Real val = nx * ny;
960  for (unsigned int index=1; index < nx; index++)
961  val *= dx;
962  for (unsigned int index=1; index < ny; index++)
963  val *= dy;
964  for (unsigned int index=0; index != nz; index++)
965  val *= dz;
966  return val/distxy;
967  }
968  }
969 
970 
971  // d^2()/dy^2
972  case 2:
973  {
974  switch (i)
975  {
976  // constant
977  case 0:
978 
979  // linear
980  case 1:
981  case 2:
982  case 3:
983  return 0.;
984 
985  // quadratic
986  case 4:
987  case 5:
988  return 0.;
989 
990  case 6:
991  return 2./dist2y;
992 
993  case 7:
994  case 8:
995  case 9:
996  return 0.;
997 
998  // cubic
999  case 10:
1000  case 11:
1001  return 0.;
1002 
1003  case 12:
1004  return 2.*dx/dist2y;
1005  case 13:
1006  return 6.*dy/dist2y;
1007 
1008  case 14:
1009  case 15:
1010  return 0.;
1011 
1012  case 16:
1013  return 2.*dz/dist2y;
1014 
1015  case 17:
1016  case 18:
1017  case 19:
1018  return 0.;
1019 
1020  // quartics
1021  case 20:
1022  case 21:
1023  return 0.;
1024 
1025  case 22:
1026  return 2.*dx*dx/dist2y;
1027 
1028  case 23:
1029  return 6.*dx*dy/dist2y;
1030 
1031  case 24:
1032  return 12.*dy*dy/dist2y;
1033 
1034  case 25:
1035  case 26:
1036  return 0.;
1037 
1038  case 27:
1039  return 2.*dx*dz/dist2y;
1040 
1041  case 28:
1042  return 6.*dy*dz/dist2y;
1043 
1044  case 29:
1045  case 30:
1046  return 0.;
1047 
1048  case 31:
1049  return 2.*dz*dz/dist2y;
1050 
1051  case 32:
1052  case 33:
1053  case 34:
1054  return 0.;
1055 
1056  default:
1057  unsigned int o = 0;
1058  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
1059  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
1060  unsigned int block=o, nz = 0;
1061  for (; block < i2; block += (o-nz+1)) { nz++; }
1062  const unsigned int nx = block - i2;
1063  const unsigned int ny = o - nx - nz;
1064  Real val = ny * (ny - 1);
1065  for (unsigned int index=0; index != nx; index++)
1066  val *= dx;
1067  for (unsigned int index=2; index < ny; index++)
1068  val *= dy;
1069  for (unsigned int index=0; index != nz; index++)
1070  val *= dz;
1071  return val/dist2y;
1072  }
1073  }
1074 
1075 
1076  // d^2()/dxdz
1077  case 3:
1078  {
1079  switch (i)
1080  {
1081  // constant
1082  case 0:
1083 
1084  // linear
1085  case 1:
1086  case 2:
1087  case 3:
1088  return 0.;
1089 
1090  // quadratic
1091  case 4:
1092  case 5:
1093  case 6:
1094  return 0.;
1095 
1096  case 7:
1097  return 1./distxz;
1098 
1099  case 8:
1100  case 9:
1101  return 0.;
1102 
1103  // cubic
1104  case 10:
1105  case 11:
1106  case 12:
1107  case 13:
1108  return 0.;
1109 
1110  case 14:
1111  return 2.*dx/distxz;
1112 
1113  case 15:
1114  return dy/distxz;
1115 
1116  case 16:
1117  return 0.;
1118 
1119  case 17:
1120  return 2.*dz/distxz;
1121 
1122  case 18:
1123  case 19:
1124  return 0.;
1125 
1126  // quartics
1127  case 20:
1128  case 21:
1129  case 22:
1130  case 23:
1131  case 24:
1132  return 0.;
1133 
1134  case 25:
1135  return 3.*dx*dx/distxz;
1136 
1137  case 26:
1138  return 2.*dx*dy/distxz;
1139 
1140  case 27:
1141  return dy*dy/distxz;
1142 
1143  case 28:
1144  return 0.;
1145 
1146  case 29:
1147  return 4.*dx*dz/distxz;
1148 
1149  case 30:
1150  return 2.*dy*dz/distxz;
1151 
1152  case 31:
1153  return 0.;
1154 
1155  case 32:
1156  return 3.*dz*dz/distxz;
1157 
1158  case 33:
1159  case 34:
1160  return 0.;
1161 
1162  default:
1163  unsigned int o = 0;
1164  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
1165  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
1166  unsigned int block=o, nz = 0;
1167  for (; block < i2; block += (o-nz+1)) { nz++; }
1168  const unsigned int nx = block - i2;
1169  const unsigned int ny = o - nx - nz;
1170  Real val = nx * nz;
1171  for (unsigned int index=1; index < nx; index++)
1172  val *= dx;
1173  for (unsigned int index=0; index != ny; index++)
1174  val *= dy;
1175  for (unsigned int index=1; index < nz; index++)
1176  val *= dz;
1177  return val/distxz;
1178  }
1179  }
1180 
1181  // d^2()/dydz
1182  case 4:
1183  {
1184  switch (i)
1185  {
1186  // constant
1187  case 0:
1188 
1189  // linear
1190  case 1:
1191  case 2:
1192  case 3:
1193  return 0.;
1194 
1195  // quadratic
1196  case 4:
1197  case 5:
1198  case 6:
1199  case 7:
1200  return 0.;
1201 
1202  case 8:
1203  return 1./distyz;
1204 
1205  case 9:
1206  return 0.;
1207 
1208  // cubic
1209  case 10:
1210  case 11:
1211  case 12:
1212  case 13:
1213  case 14:
1214  return 0.;
1215 
1216  case 15:
1217  return dx/distyz;
1218 
1219  case 16:
1220  return 2.*dy/distyz;
1221 
1222  case 17:
1223  return 0.;
1224 
1225  case 18:
1226  return 2.*dz/distyz;
1227 
1228  case 19:
1229  return 0.;
1230 
1231  // quartics
1232  case 20:
1233  case 21:
1234  case 22:
1235  case 23:
1236  case 24:
1237  case 25:
1238  return 0.;
1239 
1240  case 26:
1241  return dx*dx/distyz;
1242 
1243  case 27:
1244  return 2.*dx*dy/distyz;
1245 
1246  case 28:
1247  return 3.*dy*dy/distyz;
1248 
1249  case 29:
1250  return 0.;
1251 
1252  case 30:
1253  return 2.*dx*dz/distyz;
1254 
1255  case 31:
1256  return 4.*dy*dz/distyz;
1257 
1258  case 32:
1259  return 0.;
1260 
1261  case 33:
1262  return 3.*dz*dz/distyz;
1263 
1264  case 34:
1265  return 0.;
1266 
1267  default:
1268  unsigned int o = 0;
1269  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
1270  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
1271  unsigned int block=o, nz = 0;
1272  for (; block < i2; block += (o-nz+1)) { nz++; }
1273  const unsigned int nx = block - i2;
1274  const unsigned int ny = o - nx - nz;
1275  Real val = ny * nz;
1276  for (unsigned int index=0; index != nx; index++)
1277  val *= dx;
1278  for (unsigned int index=1; index < ny; index++)
1279  val *= dy;
1280  for (unsigned int index=1; index < nz; index++)
1281  val *= dz;
1282  return val/distyz;
1283  }
1284  }
1285 
1286 
1287  // d^2()/dz^2
1288  case 5:
1289  {
1290  switch (i)
1291  {
1292  // constant
1293  case 0:
1294 
1295  // linear
1296  case 1:
1297  case 2:
1298  case 3:
1299  return 0.;
1300 
1301  // quadratic
1302  case 4:
1303  case 5:
1304  case 6:
1305  case 7:
1306  case 8:
1307  return 0.;
1308 
1309  case 9:
1310  return 2./dist2z;
1311 
1312  // cubic
1313  case 10:
1314  case 11:
1315  case 12:
1316  case 13:
1317  case 14:
1318  case 15:
1319  case 16:
1320  return 0.;
1321 
1322  case 17:
1323  return 2.*dx/dist2z;
1324 
1325  case 18:
1326  return 2.*dy/dist2z;
1327 
1328  case 19:
1329  return 6.*dz/dist2z;
1330 
1331  // quartics
1332  case 20:
1333  case 21:
1334  case 22:
1335  case 23:
1336  case 24:
1337  case 25:
1338  case 26:
1339  case 27:
1340  case 28:
1341  return 0.;
1342 
1343  case 29:
1344  return 2.*dx*dx/dist2z;
1345 
1346  case 30:
1347  return 2.*dx*dy/dist2z;
1348 
1349  case 31:
1350  return 2.*dy*dy/dist2z;
1351 
1352  case 32:
1353  return 6.*dx*dz/dist2z;
1354 
1355  case 33:
1356  return 6.*dy*dz/dist2z;
1357 
1358  case 34:
1359  return 12.*dz*dz/dist2z;
1360 
1361  default:
1362  unsigned int o = 0;
1363  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
1364  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
1365  unsigned int block=o, nz = 0;
1366  for (; block < i2; block += (o-nz+1)) { nz++; }
1367  const unsigned int nx = block - i2;
1368  const unsigned int ny = o - nx - nz;
1369  Real val = nz * (nz - 1);
1370  for (unsigned int index=0; index != nx; index++)
1371  val *= dx;
1372  for (unsigned int index=0; index != ny; index++)
1373  val *= dy;
1374  for (unsigned int index=2; index < nz; index++)
1375  val *= dz;
1376  return val/dist2z;
1377  }
1378  }
1379 
1380 
1381  default:
1382  libmesh_error_msg("Invalid j = " << j);
1383  }
1384 
1385 #else // LIBMESH_DIM != 3
1386  libmesh_assert(true || order || add_p_level);
1387  libmesh_ignore(elem, i, j, point_in);
1388  libmesh_not_implemented();
1389 #endif
1390 }

◆ shape_second_deriv() [26/125]

Real libMesh::FE< 1, XYZ >::shape_second_deriv ( const Elem elem,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const unsigned int  libmesh_dbg_varj,
const Point point_in,
const bool  libmesh_dbg_varadd_p_level 
)
inherited

Definition at line 176 of file fe_xyz_shape_1D.C.

182 {
183  libmesh_assert(elem);
184  libmesh_assert_less_equal (i, order + add_p_level * elem->p_level());
185 
186  // only d2()/dxi2 in 1D!
187 
188  libmesh_assert_equal_to (j, 0);
189 
190  Point centroid = elem->centroid();
191  Real max_distance = 0.;
192  for (const Point & p : elem->node_ref_range())
193  {
194  const Real distance = std::abs(centroid(0) - p(0));
195  max_distance = std::max(distance, max_distance);
196  }
197 
198  const Real x = point_in(0);
199  const Real xc = centroid(0);
200  const Real dx = (x - xc)/max_distance;
201  const Real dist2 = pow(max_distance,2.);
202 
203  // monomials. since they are hierarchic we only need one case block.
204  switch (i)
205  {
206  case 0:
207  case 1:
208  return 0.;
209 
210  case 2:
211  return 2./dist2;
212 
213  case 3:
214  return 6.*dx/dist2;
215 
216  case 4:
217  return 12.*dx*dx/dist2;
218 
219  default:
220  Real val = 2.;
221  for (unsigned int index = 2; index != i; ++index)
222  val *= (index+1) * dx;
223  return val/dist2;
224  }
225 }

◆ shape_second_deriv() [27/125]

Real libMesh::FE< 1, HERMITE >::shape_second_deriv ( const Elem elem,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const unsigned int  ,
const Point p,
const bool  libmesh_dbg_varadd_p_level 
)
inherited

Definition at line 328 of file fe_hermite_shape_1D.C.

334 {
335  libmesh_assert(elem);
336 
337  // Coefficient naming: d(1)d(2n) is the coefficient of the
338  // global shape function corresponding to value 1 in terms of the
339  // local shape function corresponding to normal derivative 2
340  Real d1xd1x, d2xd2x;
341 
342  hermite_compute_coefs(elem, d1xd1x, d2xd2x);
343 
344  const ElemType type = elem->type();
345 
346 #ifndef NDEBUG
347  const unsigned int totalorder =
348  order + add_p_level * elem->p_level();
349 #endif
350 
351  switch (type)
352  {
353  // C1 functions on the C1 cubic edge
354  case EDGE2:
355  case EDGE3:
356  {
357  libmesh_assert_less (i, totalorder+1);
358 
359  switch (i)
360  {
361  case 0:
363  case 1:
364  return d1xd1x * FEHermite<1>::hermite_raw_shape_second_deriv(2, p(0));
365  case 2:
367  case 3:
368  return d2xd2x * FEHermite<1>::hermite_raw_shape_second_deriv(3, p(0));
369  default:
371  }
372  }
373  default:
374  libmesh_error_msg("ERROR: Unsupported element type = " << type);
375  }
376 }

◆ shape_second_deriv() [28/125]

static OutputShape libMesh::FE< Dim, T >::shape_second_deriv ( const Elem elem,
const Order  o,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level = true 
)
staticinherited
Returns
The second \( j^{th} \) derivative of the \( i^{th} \) shape function at the point p.
Note
Cross-derivatives are indexed according to: j = 0 ==> d^2 phi / dxi^2 j = 1 ==> d^2 phi / dxi deta j = 2 ==> d^2 phi / deta^2 j = 3 ==> d^2 phi / dxi dzeta j = 4 ==> d^2 phi / deta dzeta j = 5 ==> d^2 phi / dzeta^2
Computing second derivatives is not currently supported for all element types: \( C^1 \) (Clough, Hermite and Subdivision), Lagrange, Hierarchic, L2_Hierarchic, and Monomial are supported. All other element types return an error when asked for second derivatives.

On a p-refined element, o should be the base order of the element if add_p_level is left true, or can be the base order of the element if add_p_level is set to false.

◆ shape_second_deriv() [29/125]

RealGradient libMesh::FE< 3, NEDELEC_ONE >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point libmesh_dbg_varp,
const bool  add_p_level 
)
inherited

Definition at line 509 of file fe_nedelec_one_shape_3D.C.

515 {
516 #if LIBMESH_DIM == 3
517 
518  libmesh_assert(elem);
519 
520  // j = 0 ==> d^2 phi / dxi^2
521  // j = 1 ==> d^2 phi / dxi deta
522  // j = 2 ==> d^2 phi / deta^2
523  // j = 3 ==> d^2 phi / dxi dzeta
524  // j = 4 ==> d^2 phi / deta dzeta
525  // j = 5 ==> d^2 phi / dzeta^2
526  libmesh_assert_less (j, 6);
527 
528  const Order totalorder = static_cast<Order>(order + add_p_level * elem->p_level());
529 
530  switch (totalorder)
531  {
532  // linear Lagrange shape functions
533  case FIRST:
534  {
535  switch (elem->type())
536  {
537  case HEX20:
538  case HEX27:
539  {
540  libmesh_assert_less (i, 12);
541 
542 #ifndef NDEBUG
543  const Real xi = p(0);
544  const Real eta = p(1);
545  const Real zeta = p(2);
546 #endif
547 
548  libmesh_assert_less_equal ( std::fabs(xi), 1.0+TOLERANCE );
549  libmesh_assert_less_equal ( std::fabs(eta), 1.0+TOLERANCE );
550  libmesh_assert_less_equal ( std::fabs(zeta), 1.0+TOLERANCE );
551 
552  switch (j)
553  {
554  // d^2()/dxi^2
555  case 0:
556  {
557  // All d^2()/dxi^2 derivatives for linear hexes are zero.
558  return RealGradient();
559  } // j=0
560 
561  // d^2()/dxideta
562  case 1:
563  {
564  switch(i)
565  {
566  case 0:
567  case 1:
568  case 2:
569  case 3:
570  case 8:
571  case 9:
572  case 10:
573  case 11:
574  return RealGradient();
575  case 4:
576  {
577  if (elem->point(0) > elem->point(4))
578  return RealGradient( 0.0, 0.0, -0.125 );
579  else
580  return RealGradient( 0.0, 0.0, 0.125 );
581  }
582  case 5:
583  {
584  if (elem->point(1) > elem->point(5))
585  return RealGradient( 0.0, 0.0, 0.125 );
586  else
587  return RealGradient( 0.0, 0.0, -0.125 );
588  }
589  case 6:
590  {
591  if (elem->point(2) > elem->point(6))
592  return RealGradient( 0.0, 0.0, -0.125 );
593  else
594  return RealGradient( 0.0, 0.0, 0.125 );
595  }
596  case 7:
597  {
598  if (elem->point(3) > elem->point(7))
599  return RealGradient( 0.0, 0.0, 0.125 );
600  else
601  return RealGradient( 0.0, 0.0, -0.125 );
602  }
603  default:
604  libmesh_error_msg("Invalid i = " << i);
605  } // switch(i)
606 
607  } // j=1
608 
609  // d^2()/deta^2
610  case 2:
611  {
612  // All d^2()/deta^2 derivatives for linear hexes are zero.
613  return RealGradient();
614  } // j = 2
615 
616  // d^2()/dxidzeta
617  case 3:
618  {
619  switch(i)
620  {
621  case 0:
622  case 2:
623  case 4:
624  case 5:
625  case 6:
626  case 7:
627  case 8:
628  case 10:
629  return RealGradient();
630 
631  case 1:
632  {
633  if (elem->point(1) > elem->point(2))
634  return RealGradient( 0.0, 0.125 );
635  else
636  return RealGradient( 0.0, -0.125 );
637  }
638  case 3:
639  {
640  if (elem->point(3) > elem->point(0))
641  return RealGradient( 0.0, -0.125 );
642  else
643  return RealGradient( 0.0, 0.125 );
644  }
645  case 9:
646  {
647  if (elem->point(5) > elem->point(6))
648  return RealGradient( 0.0, -0.125, 0.0 );
649  else
650  return RealGradient( 0.0, 0.125, 0.0 );
651  }
652  case 11:
653  {
654  if (elem->point(4) > elem->point(7))
655  return RealGradient( 0.0, 0.125, 0.0 );
656  else
657  return RealGradient( 0.0, -0.125, 0.0 );
658  }
659  default:
660  libmesh_error_msg("Invalid i = " << i);
661  } // switch(i)
662 
663  } // j = 3
664 
665  // d^2()/detadzeta
666  case 4:
667  {
668  switch(i)
669  {
670  case 1:
671  case 3:
672  case 4:
673  case 5:
674  case 6:
675  case 7:
676  case 9:
677  case 11:
678  return RealGradient();
679 
680  case 0:
681  {
682  if (elem->point(0) > elem->point(1))
683  return RealGradient( -0.125, 0.0, 0.0 );
684  else
685  return RealGradient( 0.125, 0.0, 0.0 );
686  }
687  case 2:
688  {
689  if (elem->point(2) > elem->point(3))
690  return RealGradient( 0.125, 0.0, 0.0 );
691  else
692  return RealGradient( -0.125, 0.0, 0.0 );
693  }
694  case 8:
695  {
696  if (elem->point(4) > elem->point(5))
697  return RealGradient( 0.125, 0.0, 0.0 );
698  else
699  return RealGradient( -0.125, 0.0, 0.0 );
700  }
701  case 10:
702  {
703  if (elem->point(7) > elem->point(6))
704  return RealGradient( -0.125, 0.0, 0.0 );
705  else
706  return RealGradient( 0.125, 0.0, 0.0 );
707  }
708  default:
709  libmesh_error_msg("Invalid i = " << i);
710  } // switch(i)
711 
712  } // j = 4
713 
714  // d^2()/dzeta^2
715  case 5:
716  {
717  // All d^2()/dzeta^2 derivatives for linear hexes are zero.
718  return RealGradient();
719  } // j = 5
720 
721  default:
722  libmesh_error_msg("Invalid j = " << j);
723  }
724 
725  return RealGradient();
726  }
727 
728  case TET10:
729  {
730  libmesh_assert_less (i, 6);
731 
732  libmesh_not_implemented();
733  return RealGradient();
734  }
735 
736  default:
737  libmesh_error_msg("ERROR: Unsupported 3D element type!: " << elem->type());
738 
739  } //switch(type)
740 
741  } // case FIRST:
742  // unsupported order
743  default:
744  libmesh_error_msg("ERROR: Unsupported 3D FE order!: " << totalorder);
745  }
746 
747 #else // LIBMESH_DIM != 3
748  libmesh_assert(true || p(0));
749  libmesh_ignore(elem, order, i, j, add_p_level);
750  libmesh_not_implemented();
751 #endif
752 }

◆ shape_second_deriv() [30/125]

Real libMesh::FE< 1, LAGRANGE >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 155 of file fe_lagrange_shape_1D.C.

161 {
162  libmesh_assert(elem);
163 
164  return fe_lagrange_1D_shape_second_deriv(static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p(0));
165 }

◆ shape_second_deriv() [31/125]

Real libMesh::FE< 1, L2_LAGRANGE >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 170 of file fe_lagrange_shape_1D.C.

176 {
177  libmesh_assert(elem);
178 
179  return fe_lagrange_1D_shape_second_deriv(static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p(0));
180 }

◆ shape_second_deriv() [32/125]

Real libMesh::FE< 2, RATIONAL_BERNSTEIN >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 175 of file fe_rational_shape_2D.C.

181 {
182  unsigned int j1, j2;
183  switch (j)
184  {
185  case 0:
186  // j = 0 ==> d^2 phi / dxi^2
187  j1 = j2 = 0;
188  break;
189  case 1:
190  // j = 1 ==> d^2 phi / dxi deta
191  j1 = 0;
192  j2 = 1;
193  break;
194  case 2:
195  // j = 2 ==> d^2 phi / deta^2
196  j1 = j2 = 1;
197  break;
198  default:
199  libmesh_error();
200  }
201 
202  libmesh_assert(elem);
203 
204  const ElemType elem_type = elem->type();
205 
206  const Order totalorder = static_cast<Order>(order + add_p_level * elem->p_level());
207 
208  // FEType object to be passed to various FEInterface functions below.
209  FEType fe_type(totalorder, _underlying_fe_family);
210 
211  const unsigned int n_sf =
212  FEInterface::n_shape_functions(2, fe_type, elem_type);
213 
214  const unsigned int n_nodes = elem->n_nodes();
215  libmesh_assert_equal_to (n_sf, n_nodes);
216 
217  std::vector<Real> node_weights(n_nodes);
218 
219  for (unsigned int n=0; n<n_nodes; n++)
220  node_weights[n] = elem->node_ref(n).get_extra_datum<Real>(0);
221 
222  Real weighted_shape_i = 0, weighted_sum = 0,
223  weighted_grada_i = 0, weighted_grada_sum = 0,
224  weighted_gradb_i = 0, weighted_gradb_sum = 0,
225  weighted_hess_i = 0, weighted_hess_sum = 0;
226 
227  for (unsigned int sf=0; sf<n_sf; sf++)
228  {
229  Real weighted_shape = node_weights[sf] *
230  FEInterface::shape(2, fe_type, elem, sf, p);
231  Real weighted_grada = node_weights[sf] *
232  FEInterface::shape_deriv(2, fe_type, elem, sf, j1, p);
233  Real weighted_hess = node_weights[sf] *
234  FEInterface::shape_second_deriv(2, fe_type, elem, sf, j, p);
235  weighted_sum += weighted_shape;
236  weighted_grada_sum += weighted_grada;
237  Real weighted_gradb = weighted_grada;
238  if (j1 != j2)
239  {
240  weighted_gradb = (j1 == j2) ? weighted_grada :
241  node_weights[sf] *
242  FEInterface::shape_deriv(2, fe_type, elem, sf, j2, p);
243  weighted_grada_sum += weighted_grada;
244  }
245  weighted_hess_sum += weighted_hess;
246  if (sf == i)
247  {
248  weighted_shape_i = weighted_shape;
249  weighted_grada_i = weighted_grada;
250  weighted_gradb_i = weighted_gradb;
251  weighted_hess_i = weighted_hess;
252  }
253  }
254 
255  if (j1 == j2)
256  weighted_gradb_sum = weighted_grada_sum;
257 
258  return (weighted_sum * weighted_hess_i - weighted_grada_i * weighted_gradb_sum -
259  weighted_shape_i * weighted_hess_sum - weighted_gradb_i * weighted_grada_sum +
260  2 * weighted_grada_sum * weighted_shape_i * weighted_gradb_sum / weighted_sum) /
261  weighted_sum / weighted_sum;
262 }

◆ shape_second_deriv() [33/125]

Real libMesh::FE< 3, RATIONAL_BERNSTEIN >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 175 of file fe_rational_shape_3D.C.

181 {
182  unsigned int j1, j2;
183  switch (j)
184  {
185  case 0:
186  // j = 0 ==> d^2 phi / dxi^2
187  j1 = j2 = 0;
188  break;
189  case 1:
190  // j = 1 ==> d^2 phi / dxi deta
191  j1 = 0;
192  j2 = 1;
193  break;
194  case 2:
195  // j = 2 ==> d^2 phi / deta^2
196  j1 = j2 = 1;
197  break;
198  case 3:
199  // j = 3 ==> d^2 phi / dxi dzeta
200  j1 = 0;
201  j2 = 2;
202  break;
203  case 4:
204  // j = 4 ==> d^2 phi / deta dzeta
205  j1 = 1;
206  j2 = 2;
207  break;
208  case 5:
209  // j = 5 ==> d^2 phi / dzeta^2
210  j1 = j2 = 2;
211  break;
212  default:
213  libmesh_error();
214  }
215 
216  libmesh_assert(elem);
217 
218  const ElemType elem_type = elem->type();
219 
220  const Order totalorder = static_cast<Order>(order + add_p_level * elem->p_level());
221 
222  // FEType object to be passed to various FEInterface functions below.
223  FEType fe_type(totalorder, _underlying_fe_family);
224 
225  const unsigned int n_sf =
226  FEInterface::n_shape_functions(3, fe_type, elem_type);
227 
228  const unsigned int n_nodes = elem->n_nodes();
229  libmesh_assert_equal_to (n_sf, n_nodes);
230 
231  std::vector<Real> node_weights(n_nodes);
232 
233  const unsigned char datum_index = elem->mapping_data();
234  for (unsigned int n=0; n<n_nodes; n++)
235  node_weights[n] =
236  elem->node_ref(n).get_extra_datum<Real>(datum_index);
237 
238  Real weighted_shape_i = 0, weighted_sum = 0,
239  weighted_grada_i = 0, weighted_grada_sum = 0,
240  weighted_gradb_i = 0, weighted_gradb_sum = 0,
241  weighted_hess_i = 0, weighted_hess_sum = 0;
242 
243  for (unsigned int sf=0; sf<n_sf; sf++)
244  {
245  Real weighted_shape = node_weights[sf] *
246  FEInterface::shape(3, fe_type, elem, sf, p);
247  Real weighted_grada = node_weights[sf] *
248  FEInterface::shape_deriv(3, fe_type, elem, sf, j1, p);
249  Real weighted_hess = node_weights[sf] *
250  FEInterface::shape_second_deriv(3, fe_type, elem, sf, j, p);
251  weighted_sum += weighted_shape;
252  weighted_grada_sum += weighted_grada;
253  Real weighted_gradb = weighted_grada;
254  if (j1 != j2)
255  {
256  weighted_gradb = (j1 == j2) ? weighted_grada :
257  node_weights[sf] *
258  FEInterface::shape_deriv(3, fe_type, elem, sf, j2, p);
259  weighted_grada_sum += weighted_grada;
260  }
261  weighted_hess_sum += weighted_hess;
262  if (sf == i)
263  {
264  weighted_shape_i = weighted_shape;
265  weighted_grada_i = weighted_grada;
266  weighted_gradb_i = weighted_gradb;
267  weighted_hess_i = weighted_hess;
268  }
269  }
270 
271  if (j1 == j2)
272  weighted_gradb_sum = weighted_grada_sum;
273 
274  return (weighted_sum * weighted_hess_i - weighted_grada_i * weighted_gradb_sum -
275  weighted_shape_i * weighted_hess_sum - weighted_gradb_i * weighted_grada_sum +
276  2 * weighted_grada_sum * weighted_shape_i * weighted_gradb_sum / weighted_sum) /
277  weighted_sum / weighted_sum;
278 }

◆ shape_second_deriv() [34/125]

Real libMesh::FE< 1, MONOMIAL >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 184 of file fe_monomial_shape_1D.C.

190 {
191  libmesh_assert(elem);
192 
193  return FE<1,MONOMIAL>::shape_second_deriv(elem->type(),
194  static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
195 }

◆ shape_second_deriv() [35/125]

Real libMesh::FE< 1, HIERARCHIC >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 191 of file fe_hierarchic_shape_1D.C.

197 {
198  libmesh_assert(elem);
199 
200  return fe_hierarchic_1D_shape_second_deriv(elem->type(),
201  static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
202 }

◆ shape_second_deriv() [36/125]

Real libMesh::FE< 3, LAGRANGE >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 191 of file fe_lagrange_shape_3D.C.

197 {
198  libmesh_assert(elem);
199 
200  // call the orientation-independent shape function derivatives
201  return fe_lagrange_3D_shape_second_deriv
202  (elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
203 }

◆ shape_second_deriv() [37/125]

Real libMesh::FE< 2, HIERARCHIC >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 192 of file fe_hierarchic_shape_2D.C.

198 {
199  return fe_hierarchic_2D_shape_second_deriv(elem, order, i, j, p, add_p_level);
200 }

◆ shape_second_deriv() [38/125]

Real libMesh::FE< 2, LAGRANGE >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 194 of file fe_lagrange_shape_2D.C.

200 {
201  libmesh_assert(elem);
202 
203  // call the orientation-independent shape functions
204  return fe_lagrange_2D_shape_second_deriv(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
205 }

◆ shape_second_deriv() [39/125]

Real libMesh::FE< 2, L2_HIERARCHIC >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 205 of file fe_hierarchic_shape_2D.C.

211 {
212  return fe_hierarchic_2D_shape_second_deriv(elem, order, i, j, p, add_p_level);
213 }

◆ shape_second_deriv() [40/125]

Real libMesh::FE< 1, L2_HIERARCHIC >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 207 of file fe_hierarchic_shape_1D.C.

213 {
214  libmesh_assert(elem);
215 
216  return fe_hierarchic_1D_shape_second_deriv(elem->type(),
217  static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
218 }

◆ shape_second_deriv() [41/125]

Real libMesh::FE< 3, L2_LAGRANGE >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 208 of file fe_lagrange_shape_3D.C.

214 {
215  libmesh_assert(elem);
216 
217  // call the orientation-independent shape function derivatives
218  return fe_lagrange_3D_shape_second_deriv
219  (elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
220 }

◆ shape_second_deriv() [42/125]

Real libMesh::FE< 2, L2_LAGRANGE >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 210 of file fe_lagrange_shape_2D.C.

216 {
217  libmesh_assert(elem);
218 
219  // call the orientation-independent shape functions
220  return fe_lagrange_2D_shape_second_deriv(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
221 }

◆ shape_second_deriv() [43/125]

Real libMesh::FE< 2, HERMITE >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 353 of file fe_hermite_shape_2D.C.

359 {
360  libmesh_assert(elem);
361  libmesh_assert (j == 0 || j == 1 || j == 2);
362 
363  std::vector<std::vector<Real>> dxdxi(2, std::vector<Real>(2, 0));
364 
365 #ifdef DEBUG
366  std::vector<Real> dxdeta(2), dydxi(2);
367 #endif
368 
369  hermite_compute_coefs(elem,dxdxi
370 #ifdef DEBUG
371  ,dxdeta,dydxi
372 #endif
373  );
374 
375  const ElemType type = elem->type();
376 
377  const Order totalorder =
378  static_cast<Order>(order + add_p_level * elem->p_level());
379 
380  switch (type)
381  {
382  case QUAD4:
383  case QUADSHELL4:
384  libmesh_assert_less (totalorder, 4);
385  libmesh_fallthrough();
386  case QUAD8:
387  case QUADSHELL8:
388  case QUAD9:
389  {
390  libmesh_assert_less (i, (totalorder+1u)*(totalorder+1u));
391 
392  std::vector<unsigned int> bases1D;
393 
394  Real coef = hermite_bases_2D(bases1D, dxdxi, totalorder, i);
395 
396  switch (j)
397  {
398  case 0:
399  return coef *
401  FEHermite<1>::hermite_raw_shape(bases1D[1],p(1));
402  case 1:
403  return coef *
404  FEHermite<1>::hermite_raw_shape_deriv(bases1D[0],p(0)) *
405  FEHermite<1>::hermite_raw_shape_deriv(bases1D[1],p(1));
406  case 2:
407  return coef *
408  FEHermite<1>::hermite_raw_shape(bases1D[0],p(0)) *
410  default:
411  libmesh_error_msg("Invalid derivative index j = " << j);
412  }
413  }
414  default:
415  libmesh_error_msg("ERROR: Unsupported element type = " << type);
416  }
417 }

◆ shape_second_deriv() [44/125]

Real libMesh::FE< 1, CLOUGH >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 375 of file fe_clough_shape_1D.C.

381 {
382  libmesh_assert(elem);
383 
384  clough_compute_coefs(elem);
385 
386  const ElemType type = elem->type();
387 
388  const Order totalorder =
389  static_cast<Order>(order + add_p_level * elem->p_level());
390 
391  switch (totalorder)
392  {
393  // 3rd-order C1 cubic element
394  case THIRD:
395  {
396  switch (type)
397  {
398  // C1 functions on the C1 cubic edge
399  case EDGE2:
400  case EDGE3:
401  {
402  switch (i)
403  {
404  case 0:
405  return clough_raw_shape_second_deriv(0, j, p);
406  case 1:
407  return clough_raw_shape_second_deriv(1, j, p);
408  case 2:
409  return d1xd1x * clough_raw_shape_second_deriv(2, j, p);
410  case 3:
411  return d2xd2x * clough_raw_shape_second_deriv(3, j, p);
412  default:
413  libmesh_error_msg("Invalid shape function index i = " << i);
414  }
415  }
416  default:
417  libmesh_error_msg("ERROR: Unsupported element type = " << type);
418  }
419  }
420  // by default throw an error
421  default:
422  libmesh_error_msg("ERROR: Unsupported polynomial order = " << totalorder);
423  }
424 }

◆ shape_second_deriv() [45/125]

RealVectorValue libMesh::FE< 0, MONOMIAL_VEC >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 437 of file fe_monomial_vec.C.

443 {
444  Real value = FE<0, MONOMIAL>::shape_second_deriv(
445  elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
447 }

◆ shape_second_deriv() [46/125]

RealVectorValue libMesh::FE< 1, MONOMIAL_VEC >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 481 of file fe_monomial_vec.C.

487 {
488  Real value = FE<1, MONOMIAL>::shape_second_deriv(
489  elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
491 }

◆ shape_second_deriv() [47/125]

Real libMesh::FE< 2, MONOMIAL >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 547 of file fe_monomial_shape_2D.C.

553 {
554  libmesh_assert(elem);
555 
556  // by default call the orientation-independent shape functions
557  return FE<2,MONOMIAL>::shape_second_deriv(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
558 }

◆ shape_second_deriv() [48/125]

RealVectorValue libMesh::FE< 2, MONOMIAL_VEC >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 553 of file fe_monomial_vec.C.

559 {
560  Real value = FE<2, MONOMIAL>::shape_second_deriv(
561  elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i / 2, j, p);
562 
563  switch (i % 2)
564  {
565  case 0:
567 
568  case 1:
569  return libMesh::RealVectorValue(Real(0), value);
570 
571  default:
572  libmesh_error_msg("i%2 must be either 0 or 1!");
573  }
574 
575  // dummy
576  return libMesh::RealVectorValue();
577 }

◆ shape_second_deriv() [49/125]

Real libMesh::FE< 3, HERMITE >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 565 of file fe_hermite_shape_3D.C.

571 {
572  libmesh_assert(elem);
573 
574  std::vector<std::vector<Real>> dxdxi(3, std::vector<Real>(2, 0));
575 
576 #ifdef DEBUG
577  std::vector<Real> dydxi(2), dzdeta(2), dxdzeta(2);
578  std::vector<Real> dzdxi(2), dxdeta(2), dydzeta(2);
579 #endif //DEBUG
580 
581  hermite_compute_coefs(elem, dxdxi
582 #ifdef DEBUG
583  , dydxi, dzdeta, dxdzeta, dzdxi, dxdeta, dydzeta
584 #endif
585  );
586 
587  const ElemType type = elem->type();
588 
589  const Order totalorder =
590  static_cast<Order>(order + add_p_level * elem->p_level());
591 
592  switch (totalorder)
593  {
594  // 3rd-order tricubic Hermite functions
595  case THIRD:
596  {
597  switch (type)
598  {
599  case HEX8:
600  case HEX20:
601  case HEX27:
602  {
603  libmesh_assert_less (i, 64);
604 
605  std::vector<unsigned int> bases1D;
606 
607  Real coef = hermite_bases_3D(bases1D, dxdxi, totalorder, i);
608 
609  switch (j) // Derivative type
610  {
611  case 0:
612  return coef *
614  FEHermite<1>::hermite_raw_shape(bases1D[1],p(1)) *
615  FEHermite<1>::hermite_raw_shape(bases1D[2],p(2));
616  break;
617  case 1:
618  return coef *
619  FEHermite<1>::hermite_raw_shape_deriv(bases1D[0],p(0)) *
620  FEHermite<1>::hermite_raw_shape_deriv(bases1D[1],p(1)) *
621  FEHermite<1>::hermite_raw_shape(bases1D[2],p(2));
622  break;
623  case 2:
624  return coef *
625  FEHermite<1>::hermite_raw_shape(bases1D[0],p(0)) *
627  FEHermite<1>::hermite_raw_shape(bases1D[2],p(2));
628  break;
629  case 3:
630  return coef *
631  FEHermite<1>::hermite_raw_shape_deriv(bases1D[0],p(0)) *
632  FEHermite<1>::hermite_raw_shape(bases1D[1],p(1)) *
633  FEHermite<1>::hermite_raw_shape_deriv(bases1D[2],p(2));
634  break;
635  case 4:
636  return coef *
637  FEHermite<1>::hermite_raw_shape(bases1D[0],p(0)) *
638  FEHermite<1>::hermite_raw_shape_deriv(bases1D[1],p(1)) *
639  FEHermite<1>::hermite_raw_shape_deriv(bases1D[2],p(2));
640  break;
641  case 5:
642  return coef *
643  FEHermite<1>::hermite_raw_shape(bases1D[0],p(0)) *
644  FEHermite<1>::hermite_raw_shape(bases1D[1],p(1)) *
646  break;
647  default:
648  libmesh_error_msg("Invalid shape function derivative j = " << j);
649  }
650 
651  }
652  default:
653  libmesh_error_msg("ERROR: Unsupported element type " << type);
654  }
655  }
656  // by default throw an error
657  default:
658  libmesh_error_msg("ERROR: Unsupported polynomial order " << totalorder);
659  }
660 }

◆ shape_second_deriv() [50/125]

Real libMesh::FE< 2, SUBDIVISION >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

◆ shape_second_deriv() [51/125]

RealVectorValue libMesh::FE< 3, MONOMIAL_VEC >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 646 of file fe_monomial_vec.C.

652 {
653  Real value = FE<3, MONOMIAL>::shape_second_deriv(
654  elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i / 3, j, p);
655 
656  switch (i % 3)
657  {
658  case 0:
660 
661  case 1:
662  return libMesh::RealVectorValue(Real(0), value);
663 
664  case 2:
665  return libMesh::RealVectorValue(Real(0), Real(0), value);
666 
667  default:
668  libmesh_error_msg("i%3 must be 0, 1, or 2!");
669  }
670 
671  // dummy
672  return libMesh::RealVectorValue();
673 }

◆ shape_second_deriv() [52/125]

RealGradient libMesh::FE< 0, LAGRANGE_VEC >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 754 of file fe_lagrange_vec.C.

758 {
759  Real value = FE<0,LAGRANGE>::shape_second_deriv( elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
760  return libMesh::RealGradient( value );
761 }

◆ shape_second_deriv() [53/125]

RealGradient libMesh::FE< 1, LAGRANGE_VEC >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 783 of file fe_lagrange_vec.C.

787 {
788  Real value = FE<1,LAGRANGE>::shape_second_deriv( elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
789  return libMesh::RealGradient( value );
790 }

◆ shape_second_deriv() [54/125]

Real libMesh::FE< 3, HIERARCHIC >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 799 of file fe_hierarchic_shape_3D.C.

805 {
806  return fe_hierarchic_3D_shape_second_deriv(elem, order, i, j, p, add_p_level);
807 }

◆ shape_second_deriv() [55/125]

Real libMesh::FE< 3, L2_HIERARCHIC >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 812 of file fe_hierarchic_shape_3D.C.

818 {
819  return fe_hierarchic_3D_shape_second_deriv(elem, order, i, j, p, add_p_level);
820 }

◆ shape_second_deriv() [56/125]

Real libMesh::FE< 2, SUBDIVISION >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 814 of file fe_subdivision_2D.C.

820 {
821  libmesh_assert(elem);
822  const Order totalorder =
823  static_cast<Order>(order+add_p_level*elem->p_level());
824  return FE<2,SUBDIVISION>::shape_second_deriv(elem->type(), totalorder, i, j, p);
825 }

◆ shape_second_deriv() [57/125]

RealGradient libMesh::FE< 2, LAGRANGE_VEC >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 840 of file fe_lagrange_vec.C.

844 {
845  Real value = FE<2,LAGRANGE>::shape_second_deriv( elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i/2, j, p );
846 
847  switch( i%2 )
848  {
849  case 0:
850  return libMesh::RealGradient( value );
851 
852  case 1:
853  return libMesh::RealGradient( Real(0), value );
854 
855  default:
856  libmesh_error_msg("i%2 must be either 0 or 1!");
857  }
858 
859  //dummy
860  return libMesh::RealGradient();
861 }

◆ shape_second_deriv() [58/125]

RealGradient libMesh::FE< 3, LAGRANGE_VEC >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 918 of file fe_lagrange_vec.C.

922 {
923  Real value = FE<3,LAGRANGE>::shape_second_deriv( elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i/3, j, p );
924 
925  switch( i%3 )
926  {
927  case 0:
928  return libMesh::RealGradient( value );
929 
930  case 1:
931  return libMesh::RealGradient( Real(0), value );
932 
933  case 2:
934  return libMesh::RealGradient( Real(0), Real(0), value );
935 
936  default:
937  libmesh_error_msg("i%3 must be 0, 1, or 2!");
938  }
939 
940  //dummy
941  return libMesh::RealGradient();
942 }

◆ shape_second_deriv() [59/125]

Real libMesh::FE< 3, MONOMIAL >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 1310 of file fe_monomial_shape_3D.C.

1316 {
1317  libmesh_assert(elem);
1318 
1319  // call the orientation-independent shape function derivatives
1320  return FE<3,MONOMIAL>::shape_second_deriv(elem->type(), static_cast<Order>(order + add_p_level * elem->p_level()), i, j, p);
1321 }

◆ shape_second_deriv() [60/125]

Real libMesh::FE< 2, CLOUGH >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 2221 of file fe_clough_shape_2D.C.

2227 {
2228  libmesh_assert(elem);
2229 
2230  clough_compute_coefs(elem);
2231 
2232  const ElemType type = elem->type();
2233 
2234  const Order totalorder =
2235  static_cast<Order>(order + add_p_level * elem->p_level());
2236 
2237  switch (totalorder)
2238  {
2239  // 2nd-order restricted Clough-Tocher element
2240  case SECOND:
2241  {
2242  switch (type)
2243  {
2244  // C1 functions on the Clough-Tocher triangle.
2245  case TRI6:
2246  {
2247  libmesh_assert_less (i, 9);
2248  // FIXME: it would be nice to calculate (and cache)
2249  // clough_raw_shape(j,p) only once per triangle, not 1-7
2250  // times
2251  switch (i)
2252  {
2253  // Note: these DoF numbers are "scrambled" because my
2254  // initial numbering conventions didn't match libMesh
2255  case 0:
2256  return clough_raw_shape_second_deriv(0, j, p)
2257  + d1d2n * clough_raw_shape_second_deriv(10, j, p)
2258  + d1d3n * clough_raw_shape_second_deriv(11, j, p);
2259  case 3:
2260  return clough_raw_shape_second_deriv(1, j, p)
2261  + d2d3n * clough_raw_shape_second_deriv(11, j, p)
2262  + d2d1n * clough_raw_shape_second_deriv(9, j, p);
2263  case 6:
2264  return clough_raw_shape_second_deriv(2, j, p)
2265  + d3d1n * clough_raw_shape_second_deriv(9, j, p)
2266  + d3d2n * clough_raw_shape_second_deriv(10, j, p);
2267  case 1:
2268  return d1xd1x * clough_raw_shape_second_deriv(3, j, p)
2269  + d1xd1y * clough_raw_shape_second_deriv(4, j, p)
2270  + d1xd2n * clough_raw_shape_second_deriv(10, j, p)
2271  + d1xd3n * clough_raw_shape_second_deriv(11, j, p)
2272  + 0.5 * N01x * d3nd3n * clough_raw_shape_second_deriv(11, j, p)
2273  + 0.5 * N02x * d2nd2n * clough_raw_shape_second_deriv(10, j, p);
2274  case 2:
2275  return d1yd1y * clough_raw_shape_second_deriv(4, j, p)
2276  + d1yd1x * clough_raw_shape_second_deriv(3, j, p)
2277  + d1yd2n * clough_raw_shape_second_deriv(10, j, p)
2278  + d1yd3n * clough_raw_shape_second_deriv(11, j, p)
2279  + 0.5 * N01y * d3nd3n * clough_raw_shape_second_deriv(11, j, p)
2280  + 0.5 * N02y * d2nd2n * clough_raw_shape_second_deriv(10, j, p);
2281  case 4:
2282  return d2xd2x * clough_raw_shape_second_deriv(5, j, p)
2283  + d2xd2y * clough_raw_shape_second_deriv(6, j, p)
2284  + d2xd3n * clough_raw_shape_second_deriv(11, j, p)
2285  + d2xd1n * clough_raw_shape_second_deriv(9, j, p)
2286  + 0.5 * N10x * d3nd3n * clough_raw_shape_second_deriv(11, j, p)
2287  + 0.5 * N12x * d1nd1n * clough_raw_shape_second_deriv(9, j, p);
2288  case 5:
2289  return d2yd2y * clough_raw_shape_second_deriv(6, j, p)
2290  + d2yd2x * clough_raw_shape_second_deriv(5, j, p)
2291  + d2yd3n * clough_raw_shape_second_deriv(11, j, p)
2292  + d2yd1n * clough_raw_shape_second_deriv(9, j, p)
2293  + 0.5 * N10y * d3nd3n * clough_raw_shape_second_deriv(11, j, p)
2294  + 0.5 * N12y * d1nd1n * clough_raw_shape_second_deriv(9, j, p);
2295  case 7:
2296  return d3xd3x * clough_raw_shape_second_deriv(7, j, p)
2297  + d3xd3y * clough_raw_shape_second_deriv(8, j, p)
2298  + d3xd1n * clough_raw_shape_second_deriv(9, j, p)
2299  + d3xd2n * clough_raw_shape_second_deriv(10, j, p)
2300  + 0.5 * N20x * d2nd2n * clough_raw_shape_second_deriv(10, j, p)
2301  + 0.5 * N21x * d1nd1n * clough_raw_shape_second_deriv(9, j, p);
2302  case 8:
2303  return d3yd3y * clough_raw_shape_second_deriv(8, j, p)
2304  + d3yd3x * clough_raw_shape_second_deriv(7, j, p)
2305  + d3yd1n * clough_raw_shape_second_deriv(9, j, p)
2306  + d3yd2n * clough_raw_shape_second_deriv(10, j, p)
2307  + 0.5 * N20y * d2nd2n * clough_raw_shape_second_deriv(10, j, p)
2308  + 0.5 * N21y * d1nd1n * clough_raw_shape_second_deriv(9, j, p);
2309  default:
2310  libmesh_error_msg("Invalid shape function index i = " << i);
2311  }
2312  }
2313  default:
2314  libmesh_error_msg("ERROR: Unsupported element type = " << type);
2315  }
2316  }
2317  // 3rd-order Clough-Tocher element
2318  case THIRD:
2319  {
2320  switch (type)
2321  {
2322  // C1 functions on the Clough-Tocher triangle.
2323  case TRI6:
2324  {
2325  libmesh_assert_less (i, 12);
2326 
2327  // FIXME: it would be nice to calculate (and cache)
2328  // clough_raw_shape(j,p) only once per triangle, not 1-7
2329  // times
2330  switch (i)
2331  {
2332  // Note: these DoF numbers are "scrambled" because my
2333  // initial numbering conventions didn't match libMesh
2334  case 0:
2335  return clough_raw_shape_second_deriv(0, j, p)
2336  + d1d2n * clough_raw_shape_second_deriv(10, j, p)
2337  + d1d3n * clough_raw_shape_second_deriv(11, j, p);
2338  case 3:
2339  return clough_raw_shape_second_deriv(1, j, p)
2340  + d2d3n * clough_raw_shape_second_deriv(11, j, p)
2341  + d2d1n * clough_raw_shape_second_deriv(9, j, p);
2342  case 6:
2343  return clough_raw_shape_second_deriv(2, j, p)
2344  + d3d1n * clough_raw_shape_second_deriv(9, j, p)
2345  + d3d2n * clough_raw_shape_second_deriv(10, j, p);
2346  case 1:
2347  return d1xd1x * clough_raw_shape_second_deriv(3, j, p)
2348  + d1xd1y * clough_raw_shape_second_deriv(4, j, p)
2349  + d1xd2n * clough_raw_shape_second_deriv(10, j, p)
2350  + d1xd3n * clough_raw_shape_second_deriv(11, j, p);
2351  case 2:
2352  return d1yd1y * clough_raw_shape_second_deriv(4, j, p)
2353  + d1yd1x * clough_raw_shape_second_deriv(3, j, p)
2354  + d1yd2n * clough_raw_shape_second_deriv(10, j, p)
2355  + d1yd3n * clough_raw_shape_second_deriv(11, j, p);
2356  case 4:
2357  return d2xd2x * clough_raw_shape_second_deriv(5, j, p)
2358  + d2xd2y * clough_raw_shape_second_deriv(6, j, p)
2359  + d2xd3n * clough_raw_shape_second_deriv(11, j, p)
2360  + d2xd1n * clough_raw_shape_second_deriv(9, j, p);
2361  case 5:
2362  return d2yd2y * clough_raw_shape_second_deriv(6, j, p)
2363  + d2yd2x * clough_raw_shape_second_deriv(5, j, p)
2364  + d2yd3n * clough_raw_shape_second_deriv(11, j, p)
2365  + d2yd1n * clough_raw_shape_second_deriv(9, j, p);
2366  case 7:
2367  return d3xd3x * clough_raw_shape_second_deriv(7, j, p)
2368  + d3xd3y * clough_raw_shape_second_deriv(8, j, p)
2369  + d3xd1n * clough_raw_shape_second_deriv(9, j, p)
2370  + d3xd2n * clough_raw_shape_second_deriv(10, j, p);
2371  case 8:
2372  return d3yd3y * clough_raw_shape_second_deriv(8, j, p)
2373  + d3yd3x * clough_raw_shape_second_deriv(7, j, p)
2374  + d3yd1n * clough_raw_shape_second_deriv(9, j, p)
2375  + d3yd2n * clough_raw_shape_second_deriv(10, j, p);
2376  case 10:
2377  return d1nd1n * clough_raw_shape_second_deriv(9, j, p);
2378  case 11:
2379  return d2nd2n * clough_raw_shape_second_deriv(10, j, p);
2380  case 9:
2381  return d3nd3n * clough_raw_shape_second_deriv(11, j, p);
2382 
2383  default:
2384  libmesh_error_msg("Invalid shape function index i = " << i);
2385  }
2386  }
2387  default:
2388  libmesh_error_msg("ERROR: Unsupported element type = " << type);
2389  }
2390  }
2391  // by default throw an error
2392  default:
2393  libmesh_error_msg("ERROR: Unsupported polynomial order = " << order);
2394  }
2395 }

◆ shape_second_deriv() [61/125]

Real libMesh::FE< 1, RATIONAL_BERNSTEIN >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  i,
const unsigned int  libmesh_dbg_varj,
const Point p,
const bool  add_p_level 
)
inherited

Definition at line 181 of file fe_rational_shape_1D.C.

187 {
188  // Don't need to switch on j. 1D shape functions
189  // depend on xi only!
190  libmesh_assert_equal_to (j, 0);
191 
192  libmesh_assert(elem);
193 
194  const ElemType elem_type = elem->type();
195 
196  const Order totalorder = static_cast<Order>(order + add_p_level * elem->p_level());
197 
198  // FEType object to be passed to various FEInterface functions below.
199  FEType fe_type(totalorder, _underlying_fe_family);
200 
201  const unsigned int n_sf =
202  FEInterface::n_shape_functions(1, fe_type, elem_type);
203 
204  const unsigned int n_nodes = elem->n_nodes();
205  libmesh_assert_equal_to (n_sf, n_nodes);
206 
207  std::vector<Real> node_weights(n_nodes);
208 
209  const unsigned char datum_index = elem->mapping_data();
210  for (unsigned int n=0; n<n_nodes; n++)
211  node_weights[n] =
212  elem->node_ref(n).get_extra_datum<Real>(datum_index);
213 
214  Real weighted_shape_i = 0, weighted_sum = 0,
215  weighted_grad_i = 0, weighted_grad_sum = 0,
216  weighted_hess_i = 0, weighted_hess_sum = 0;
217 
218  for (unsigned int sf=0; sf<n_sf; sf++)
219  {
220  Real weighted_shape = node_weights[sf] *
221  FEInterface::shape(1, fe_type, elem, sf, p);
222  Real weighted_grad = node_weights[sf] *
223  FEInterface::shape_deriv(1, fe_type, elem, sf, 0, p);
224  Real weighted_hess = node_weights[sf] *
225  FEInterface::shape_second_deriv(1, fe_type, elem, sf, 0, p);
226  weighted_sum += weighted_shape;
227  weighted_grad_sum += weighted_grad;
228  weighted_hess_sum += weighted_hess;
229  if (sf == i)
230  {
231  weighted_shape_i = weighted_shape;
232  weighted_grad_i = weighted_grad;
233  weighted_hess_i = weighted_hess;
234  }
235  }
236 
237  return (weighted_sum * weighted_sum *
238  (weighted_sum * weighted_hess_i - weighted_shape_i * weighted_hess_sum) -
239  (weighted_sum * weighted_grad_i - weighted_shape_i * weighted_grad_sum) *
240  2 * weighted_sum * weighted_grad_sum) /
241  (weighted_sum * weighted_sum * weighted_sum * weighted_sum);
242 }

◆ shape_second_deriv() [62/125]

RealGradient libMesh::FE< 2, NEDELEC_ONE >::shape_second_deriv ( const Elem elem,
const Order  order,
const unsigned int  libmesh_dbg_vari,
const unsigned int  libmesh_dbg_varj,
const Point ,
const bool  add_p_level 
)
inherited

Definition at line 348 of file fe_nedelec_one_shape_2D.C.

354 {
355 #if LIBMESH_DIM > 1
356  libmesh_assert(elem);
357 
358  // j = 0 ==> d^2 phi / dxi^2
359  // j = 1 ==> d^2 phi / dxi deta
360  // j = 2 ==> d^2 phi / deta^2
361  libmesh_assert_less (j, 3);
362 
363  const Order total_order = static_cast<Order>(order + add_p_level * elem->p_level());
364 
365  switch (total_order)
366  {
367  // linear Lagrange shape functions
368  case FIRST:
369  {
370  switch (elem->type())
371  {
372  case QUAD8:
373  case QUAD9:
374  {
375  libmesh_assert_less (i, 4);
376  // All second derivatives for linear quads are zero.
377  return RealGradient();
378  }
379 
380  case TRI6:
381  {
382  libmesh_assert_less (i, 3);
383  // All second derivatives for linear triangles are zero.
384  return RealGradient();
385  }
386 
387  default:
388  libmesh_error_msg("ERROR: Unsupported 2D element type!: " << elem->type());
389 
390  } // end switch (type)
391  } // end case FIRST
392 
393  // unsupported order
394  default:
395  libmesh_error_msg("ERROR: Unsupported 2D FE order!: " << total_order);
396 
397  } // end switch (order)
398 
399 #else // LIBMESH_DIM > 1
400  libmesh_assert(true || i || j);
401  libmesh_ignore(elem, order, add_p_level);
402  libmesh_not_implemented();
403 #endif
404 }

◆ shape_second_deriv() [63/125]

Real libMesh::FE< 3, CLOUGH >::shape_second_deriv ( const Elem libmesh_dbg_varelem,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point ,
const bool   
)
inherited

Definition at line 102 of file fe_clough_shape_3D.C.

108 {
109  libmesh_assert(elem);
110  libmesh_not_implemented();
111  return 0.;
112 }

◆ shape_second_deriv() [64/125]

Real libMesh::FE< 1, HIERARCHIC >::shape_second_deriv ( const ElemType  elem_type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 167 of file fe_hierarchic_shape_1D.C.

172 {
173  return fe_hierarchic_1D_shape_second_deriv(elem_type, order, i, j, p);
174 }

◆ shape_second_deriv() [65/125]

Real libMesh::FE< 1, L2_HIERARCHIC >::shape_second_deriv ( const ElemType  elem_type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 180 of file fe_hierarchic_shape_1D.C.

185 {
186  return fe_hierarchic_1D_shape_second_deriv(elem_type, order, i, j, p);
187 }

◆ shape_second_deriv() [66/125]

static OutputShape libMesh::FE< Dim, T >::shape_second_deriv ( const ElemType  t,
const Order  o,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
staticinherited
Returns
The second \( j^{th} \) derivative of the \( i^{th} \) shape function at the point p.
Note
Cross-derivatives are indexed according to: j = 0 ==> d^2 phi / dxi^2 j = 1 ==> d^2 phi / dxi deta j = 2 ==> d^2 phi / deta^2 j = 3 ==> d^2 phi / dxi dzeta j = 4 ==> d^2 phi / deta dzeta j = 5 ==> d^2 phi / dzeta^2
Computing second derivatives is not currently supported for all element types: \( C^1 \) (Clough, Hermite and Subdivision), Lagrange, Hierarchic, L2_Hierarchic, and Monomial are supported. All other element types return an error when asked for second derivatives.

On a p-refined element, o should be the total order of the element.

◆ shape_second_deriv() [67/125]

Real libMesh::FE< 3, LAGRANGE >::shape_second_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 167 of file fe_lagrange_shape_3D.C.

172 {
173  return fe_lagrange_3D_shape_second_deriv(type, order, i, j, p);
174 }

◆ shape_second_deriv() [68/125]

Real libMesh::FE< 2, LAGRANGE >::shape_second_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 170 of file fe_lagrange_shape_2D.C.

175 {
176  return fe_lagrange_2D_shape_second_deriv(type, order, i, j, p);
177 }

◆ shape_second_deriv() [69/125]

Real libMesh::FE< 3, L2_LAGRANGE >::shape_second_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 179 of file fe_lagrange_shape_3D.C.

184 {
185  return fe_lagrange_3D_shape_second_deriv(type, order, i, j, p);
186 }

◆ shape_second_deriv() [70/125]

Real libMesh::FE< 2, L2_LAGRANGE >::shape_second_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 182 of file fe_lagrange_shape_2D.C.

187 {
188  return fe_lagrange_2D_shape_second_deriv(type, order, i, j, p);
189 }

◆ shape_second_deriv() [71/125]

RealVectorValue libMesh::FE< 0, MONOMIAL_VEC >::shape_second_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 188 of file fe_monomial_vec.C.

193 {
194  Real value = FE<0, MONOMIAL>::shape_second_deriv(type, order, i, j, p);
196 }

◆ shape_second_deriv() [72/125]

RealVectorValue libMesh::FE< 1, MONOMIAL_VEC >::shape_second_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 224 of file fe_monomial_vec.C.

229 {
230  Real value = FE<1, MONOMIAL>::shape_second_deriv(type, order, i, j, p);
232 }

◆ shape_second_deriv() [73/125]

RealVectorValue libMesh::FE< 2, MONOMIAL_VEC >::shape_second_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 290 of file fe_monomial_vec.C.

295 {
296  Real value = FE<2, MONOMIAL>::shape_second_deriv(type, order, i / 2, j, p);
297 
298  switch (i % 2)
299  {
300  case 0:
302 
303  case 1:
304  return libMesh::RealVectorValue(Real(0), value);
305 
306  default:
307  libmesh_error_msg("i%2 must be either 0 or 1!");
308  }
309 
310  // dummy
311  return libMesh::RealVectorValue();
312 }

◆ shape_second_deriv() [74/125]

RealVectorValue libMesh::FE< 3, MONOMIAL_VEC >::shape_second_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 377 of file fe_monomial_vec.C.

382 {
383  Real value = FE<3, MONOMIAL>::shape_second_deriv(type, order, i / 3, j, p);
384 
385  switch (i % 3)
386  {
387  case 0:
389 
390  case 1:
391  return libMesh::RealVectorValue(Real(0), value);
392 
393  case 2:
394  return libMesh::RealVectorValue(Real(0), Real(0), value);
395 
396  default:
397  libmesh_error_msg("i%3 must be 0, 1, or 2!");
398  }
399 
400  // dummy
401  return libMesh::RealVectorValue();
402 }

◆ shape_second_deriv() [75/125]

RealGradient libMesh::FE< 0, LAGRANGE_VEC >::shape_second_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 553 of file fe_lagrange_vec.C.

556 {
557  Real value = FE<0,LAGRANGE>::shape_second_deriv( type, order, i, j, p );
558  return libMesh::RealGradient( value );
559 }

◆ shape_second_deriv() [76/125]

RealGradient libMesh::FE< 1, LAGRANGE_VEC >::shape_second_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 577 of file fe_lagrange_vec.C.

580 {
581  Real value = FE<1,LAGRANGE>::shape_second_deriv( type, order, i, j, p );
582  return libMesh::RealGradient( value );
583 }

◆ shape_second_deriv() [77/125]

RealGradient libMesh::FE< 2, LAGRANGE_VEC >::shape_second_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 631 of file fe_lagrange_vec.C.

634 {
635  Real value = FE<2,LAGRANGE>::shape_second_deriv( type, order, i/2, j, p );
636 
637  switch( i%2 )
638  {
639  case 0:
640  return libMesh::RealGradient( value );
641 
642  case 1:
643  return libMesh::RealGradient( Real(0), value );
644 
645  default:
646  libmesh_error_msg("i%2 must be either 0 or 1!");
647  }
648 
649  //dummy
650  return libMesh::RealGradient();
651 }

◆ shape_second_deriv() [78/125]

RealGradient libMesh::FE< 3, LAGRANGE_VEC >::shape_second_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 707 of file fe_lagrange_vec.C.

710 {
711  Real value = FE<3,LAGRANGE>::shape_second_deriv( type, order, i/3, j, p );
712 
713  switch( i%3 )
714  {
715  case 0:
716  return libMesh::RealGradient( value );
717 
718  case 1:
719  return libMesh::RealGradient( Real(0), value );
720 
721  case 2:
722  return libMesh::RealGradient( Real(0), Real(0), value );
723 
724  default:
725  libmesh_error_msg("i%3 must be 0, 1, or 2!");
726  }
727 
728  //dummy
729  return libMesh::RealGradient();
730 }

◆ shape_second_deriv() [79/125]

Real libMesh::FE< 2, SUBDIVISION >::shape_second_deriv ( const ElemType  type,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 787 of file fe_subdivision_2D.C.

792 {
793  switch (order)
794  {
795  case FOURTH:
796  {
797  switch (type)
798  {
799  case TRI3SUBDIVISION:
800  libmesh_assert_less(i, 12);
801  return FESubdivision::regular_shape_second_deriv(i,j,p(0),p(1));
802  default:
803  libmesh_error_msg("ERROR: Unsupported element type!");
804  }
805  }
806  default:
807  libmesh_error_msg("ERROR: Unsupported polynomial order!");
808  }
809 }

◆ shape_second_deriv() [80/125]

Real libMesh::FE< 2, MONOMIAL >::shape_second_deriv ( const  ElemType,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 326 of file fe_monomial_shape_2D.C.

331 {
332 #if LIBMESH_DIM > 1
333 
334 
335  libmesh_assert_less_equal (j, 2);
336 
337  libmesh_assert_less (i, (static_cast<unsigned int>(order)+1)*
338  (static_cast<unsigned int>(order)+2)/2);
339 
340  const Real xi = p(0);
341  const Real eta = p(1);
342 
343  // monomials. since they are hierarchic we only need one case block.
344 
345  switch (j)
346  {
347  // d^2()/dxi^2
348  case 0:
349  {
350  switch (i)
351  {
352  // constants
353  case 0:
354  // linears
355  case 1:
356  case 2:
357  return 0.;
358 
359  // quadratics
360  case 3:
361  return 2.;
362 
363  case 4:
364  case 5:
365  return 0.;
366 
367  // cubics
368  case 6:
369  return 6.*xi;
370 
371  case 7:
372  return 2.*eta;
373 
374  case 8:
375  case 9:
376  return 0.;
377 
378  // quartics
379  case 10:
380  return 12.*xi*xi;
381 
382  case 11:
383  return 6.*xi*eta;
384 
385  case 12:
386  return 2.*eta*eta;
387 
388  case 13:
389  case 14:
390  return 0.;
391 
392  default:
393  unsigned int o = 0;
394  for (; i >= (o+1)*(o+2)/2; o++) { }
395  unsigned int ny = i - (o*(o+1)/2);
396  unsigned int nx = o - ny;
397  Real val = nx * (nx - 1);
398  for (unsigned int index=2; index < nx; index++)
399  val *= xi;
400  for (unsigned int index=0; index != ny; index++)
401  val *= eta;
402  return val;
403  }
404  }
405 
406  // d^2()/dxideta
407  case 1:
408  {
409  switch (i)
410  {
411  // constants
412  case 0:
413 
414  // linears
415  case 1:
416  case 2:
417  return 0.;
418 
419  // quadratics
420  case 3:
421  return 0.;
422 
423  case 4:
424  return 1.;
425 
426  case 5:
427  return 0.;
428 
429  // cubics
430  case 6:
431  return 0.;
432  case 7:
433  return 2.*xi;
434 
435  case 8:
436  return 2.*eta;
437 
438  case 9:
439  return 0.;
440 
441  // quartics
442  case 10:
443  return 0.;
444 
445  case 11:
446  return 3.*xi*xi;
447 
448  case 12:
449  return 4.*xi*eta;
450 
451  case 13:
452  return 3.*eta*eta;
453 
454  case 14:
455  return 0.;
456 
457  default:
458  unsigned int o = 0;
459  for (; i >= (o+1)*(o+2)/2; o++) { }
460  unsigned int ny = i - (o*(o+1)/2);
461  unsigned int nx = o - ny;
462  Real val = nx * ny;
463  for (unsigned int index=1; index < nx; index++)
464  val *= xi;
465  for (unsigned int index=1; index < ny; index++)
466  val *= eta;
467  return val;
468  }
469  }
470 
471  // d^2()/deta^2
472  case 2:
473  {
474  switch (i)
475  {
476  // constants
477  case 0:
478 
479  // linears
480  case 1:
481  case 2:
482  return 0.;
483 
484  // quadratics
485  case 3:
486  case 4:
487  return 0.;
488 
489  case 5:
490  return 2.;
491 
492  // cubics
493  case 6:
494  return 0.;
495 
496  case 7:
497  return 0.;
498 
499  case 8:
500  return 2.*xi;
501 
502  case 9:
503  return 6.*eta;
504 
505  // quartics
506  case 10:
507  case 11:
508  return 0.;
509 
510  case 12:
511  return 2.*xi*xi;
512 
513  case 13:
514  return 6.*xi*eta;
515 
516  case 14:
517  return 12.*eta*eta;
518 
519  default:
520  unsigned int o = 0;
521  for (; i >= (o+1)*(o+2)/2; o++) { }
522  unsigned int ny = i - (o*(o+1)/2);
523  unsigned int nx = o - ny;
524  Real val = ny * (ny - 1);
525  for (unsigned int index=0; index != nx; index++)
526  val *= xi;
527  for (unsigned int index=2; index < ny; index++)
528  val *= eta;
529  return val;
530  }
531  }
532 
533  default:
534  libmesh_error_msg("Invalid shape function derivative j = " << j);
535  }
536 
537 #else // LIBMESH_DIM == 1
538  libmesh_assert(order);
539  libmesh_ignore(i, j, p);
540  libmesh_not_implemented();
541 #endif
542 }

◆ shape_second_deriv() [81/125]

Real libMesh::FE< 3, MONOMIAL >::shape_second_deriv ( const  ElemType,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 660 of file fe_monomial_shape_3D.C.

665 {
666 #if LIBMESH_DIM == 3
667 
668  libmesh_assert_less (j, 6);
669 
670  libmesh_assert_less (i, (static_cast<unsigned int>(order)+1)*
671  (static_cast<unsigned int>(order)+2)*
672  (static_cast<unsigned int>(order)+3)/6);
673 
674  const Real xi = p(0);
675  const Real eta = p(1);
676  const Real zeta = p(2);
677 
678  // monomials. since they are hierarchic we only need one case block.
679  switch (j)
680  {
681  // d^2()/dxi^2
682  case 0:
683  {
684  switch (i)
685  {
686  // constant
687  case 0:
688 
689  // linear
690  case 1:
691  case 2:
692  case 3:
693  return 0.;
694 
695  // quadratic
696  case 4:
697  return 2.;
698 
699  case 5:
700  case 6:
701  case 7:
702  case 8:
703  case 9:
704  return 0.;
705 
706  // cubic
707  case 10:
708  return 6.*xi;
709 
710  case 11:
711  return 2.*eta;
712 
713  case 12:
714  case 13:
715  return 0.;
716 
717  case 14:
718  return 2.*zeta;
719 
720  case 15:
721  case 16:
722  case 17:
723  case 18:
724  case 19:
725  return 0.;
726 
727  // quartics
728  case 20:
729  return 12.*xi*xi;
730 
731  case 21:
732  return 6.*xi*eta;
733 
734  case 22:
735  return 2.*eta*eta;
736 
737  case 23:
738  case 24:
739  return 0.;
740 
741  case 25:
742  return 6.*xi*zeta;
743 
744  case 26:
745  return 2.*eta*zeta;
746 
747  case 27:
748  case 28:
749  return 0.;
750 
751  case 29:
752  return 2.*zeta*zeta;
753 
754  case 30:
755  case 31:
756  case 32:
757  case 33:
758  case 34:
759  return 0.;
760 
761  default:
762  unsigned int o = 0;
763  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
764  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
765  unsigned int block=o, nz = 0;
766  for (; block < i2; block += (o-nz+1)) { nz++; }
767  const unsigned int nx = block - i2;
768  const unsigned int ny = o - nx - nz;
769  Real val = nx * (nx - 1);
770  for (unsigned int index=2; index < nx; index++)
771  val *= xi;
772  for (unsigned int index=0; index != ny; index++)
773  val *= eta;
774  for (unsigned int index=0; index != nz; index++)
775  val *= zeta;
776  return val;
777  }
778  }
779 
780 
781  // d^2()/dxideta
782  case 1:
783  {
784  switch (i)
785  {
786  // constant
787  case 0:
788 
789  // linear
790  case 1:
791  case 2:
792  case 3:
793  return 0.;
794 
795  // quadratic
796  case 4:
797  return 0.;
798 
799  case 5:
800  return 1.;
801 
802  case 6:
803  case 7:
804  case 8:
805  case 9:
806  return 0.;
807 
808  // cubic
809  case 10:
810  return 0.;
811 
812  case 11:
813  return 2.*xi;
814 
815  case 12:
816  return 2.*eta;
817 
818  case 13:
819  case 14:
820  return 0.;
821 
822  case 15:
823  return zeta;
824 
825  case 16:
826  case 17:
827  case 18:
828  case 19:
829  return 0.;
830 
831  // quartics
832  case 20:
833  return 0.;
834 
835  case 21:
836  return 3.*xi*xi;
837 
838  case 22:
839  return 4.*xi*eta;
840 
841  case 23:
842  return 3.*eta*eta;
843 
844  case 24:
845  case 25:
846  return 0.;
847 
848  case 26:
849  return 2.*xi*zeta;
850 
851  case 27:
852  return 2.*eta*zeta;
853 
854  case 28:
855  case 29:
856  return 0.;
857 
858  case 30:
859  return zeta*zeta;
860 
861  case 31:
862  case 32:
863  case 33:
864  case 34:
865  return 0.;
866 
867  default:
868  unsigned int o = 0;
869  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
870  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
871  unsigned int block=o, nz = 0;
872  for (; block < i2; block += (o-nz+1)) { nz++; }
873  const unsigned int nx = block - i2;
874  const unsigned int ny = o - nx - nz;
875  Real val = nx * ny;
876  for (unsigned int index=1; index < nx; index++)
877  val *= xi;
878  for (unsigned int index=1; index < ny; index++)
879  val *= eta;
880  for (unsigned int index=0; index != nz; index++)
881  val *= zeta;
882  return val;
883  }
884  }
885 
886 
887  // d^2()/deta^2
888  case 2:
889  {
890  switch (i)
891  {
892  // constant
893  case 0:
894 
895  // linear
896  case 1:
897  case 2:
898  case 3:
899  return 0.;
900 
901  // quadratic
902  case 4:
903  case 5:
904  return 0.;
905 
906  case 6:
907  return 2.;
908 
909  case 7:
910  case 8:
911  case 9:
912  return 0.;
913 
914  // cubic
915  case 10:
916  case 11:
917  return 0.;
918 
919  case 12:
920  return 2.*xi;
921  case 13:
922  return 6.*eta;
923 
924  case 14:
925  case 15:
926  return 0.;
927 
928  case 16:
929  return 2.*zeta;
930 
931  case 17:
932  case 18:
933  case 19:
934  return 0.;
935 
936  // quartics
937  case 20:
938  case 21:
939  return 0.;
940 
941  case 22:
942  return 2.*xi*xi;
943 
944  case 23:
945  return 6.*xi*eta;
946 
947  case 24:
948  return 12.*eta*eta;
949 
950  case 25:
951  case 26:
952  return 0.;
953 
954  case 27:
955  return 2.*xi*zeta;
956 
957  case 28:
958  return 6.*eta*zeta;
959 
960  case 29:
961  case 30:
962  return 0.;
963 
964  case 31:
965  return 2.*zeta*zeta;
966 
967  case 32:
968  case 33:
969  case 34:
970  return 0.;
971 
972  default:
973  unsigned int o = 0;
974  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
975  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
976  unsigned int block=o, nz = 0;
977  for (; block < i2; block += (o-nz+1)) { nz++; }
978  const unsigned int nx = block - i2;
979  const unsigned int ny = o - nx - nz;
980  Real val = ny * (ny - 1);
981  for (unsigned int index=0; index != nx; index++)
982  val *= xi;
983  for (unsigned int index=2; index < ny; index++)
984  val *= eta;
985  for (unsigned int index=0; index != nz; index++)
986  val *= zeta;
987  return val;
988  }
989  }
990 
991 
992  // d^2()/dxidzeta
993  case 3:
994  {
995  switch (i)
996  {
997  // constant
998  case 0:
999 
1000  // linear
1001  case 1:
1002  case 2:
1003  case 3:
1004  return 0.;
1005 
1006  // quadratic
1007  case 4:
1008  case 5:
1009  case 6:
1010  return 0.;
1011 
1012  case 7:
1013  return 1.;
1014 
1015  case 8:
1016  case 9:
1017  return 0.;
1018 
1019  // cubic
1020  case 10:
1021  case 11:
1022  case 12:
1023  case 13:
1024  return 0.;
1025 
1026  case 14:
1027  return 2.*xi;
1028 
1029  case 15:
1030  return eta;
1031 
1032  case 16:
1033  return 0.;
1034 
1035  case 17:
1036  return 2.*zeta;
1037 
1038  case 18:
1039  case 19:
1040  return 0.;
1041 
1042  // quartics
1043  case 20:
1044  case 21:
1045  case 22:
1046  case 23:
1047  case 24:
1048  return 0.;
1049 
1050  case 25:
1051  return 3.*xi*xi;
1052 
1053  case 26:
1054  return 2.*xi*eta;
1055 
1056  case 27:
1057  return eta*eta;
1058 
1059  case 28:
1060  return 0.;
1061 
1062  case 29:
1063  return 4.*xi*zeta;
1064 
1065  case 30:
1066  return 2.*eta*zeta;
1067 
1068  case 31:
1069  return 0.;
1070 
1071  case 32:
1072  return 3.*zeta*zeta;
1073 
1074  case 33:
1075  case 34:
1076  return 0.;
1077 
1078  default:
1079  unsigned int o = 0;
1080  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
1081  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
1082  unsigned int block=o, nz = 0;
1083  for (; block < i2; block += (o-nz+1)) { nz++; }
1084  const unsigned int nx = block - i2;
1085  const unsigned int ny = o - nx - nz;
1086  Real val = nx * nz;
1087  for (unsigned int index=1; index < nx; index++)
1088  val *= xi;
1089  for (unsigned int index=0; index != ny; index++)
1090  val *= eta;
1091  for (unsigned int index=1; index < nz; index++)
1092  val *= zeta;
1093  return val;
1094  }
1095  }
1096 
1097  // d^2()/detadzeta
1098  case 4:
1099  {
1100  switch (i)
1101  {
1102  // constant
1103  case 0:
1104 
1105  // linear
1106  case 1:
1107  case 2:
1108  case 3:
1109  return 0.;
1110 
1111  // quadratic
1112  case 4:
1113  case 5:
1114  case 6:
1115  case 7:
1116  return 0.;
1117 
1118  case 8:
1119  return 1.;
1120 
1121  case 9:
1122  return 0.;
1123 
1124  // cubic
1125  case 10:
1126  case 11:
1127  case 12:
1128  case 13:
1129  case 14:
1130  return 0.;
1131 
1132  case 15:
1133  return xi;
1134 
1135  case 16:
1136  return 2.*eta;
1137 
1138  case 17:
1139  return 0.;
1140 
1141  case 18:
1142  return 2.*zeta;
1143 
1144  case 19:
1145  return 0.;
1146 
1147  // quartics
1148  case 20:
1149  case 21:
1150  case 22:
1151  case 23:
1152  case 24:
1153  case 25:
1154  return 0.;
1155 
1156  case 26:
1157  return xi*xi;
1158 
1159  case 27:
1160  return 2.*xi*eta;
1161 
1162  case 28:
1163  return 3.*eta*eta;
1164 
1165  case 29:
1166  return 0.;
1167 
1168  case 30:
1169  return 2.*xi*zeta;
1170 
1171  case 31:
1172  return 4.*eta*zeta;
1173 
1174  case 32:
1175  return 0.;
1176 
1177  case 33:
1178  return 3.*zeta*zeta;
1179 
1180  case 34:
1181  return 0.;
1182 
1183  default:
1184  unsigned int o = 0;
1185  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
1186  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
1187  unsigned int block=o, nz = 0;
1188  for (; block < i2; block += (o-nz+1)) { nz++; }
1189  const unsigned int nx = block - i2;
1190  const unsigned int ny = o - nx - nz;
1191  Real val = ny * nz;
1192  for (unsigned int index=0; index != nx; index++)
1193  val *= xi;
1194  for (unsigned int index=1; index < ny; index++)
1195  val *= eta;
1196  for (unsigned int index=1; index < nz; index++)
1197  val *= zeta;
1198  return val;
1199  }
1200  }
1201 
1202 
1203  // d^2()/dzeta^2
1204  case 5:
1205  {
1206  switch (i)
1207  {
1208  // constant
1209  case 0:
1210 
1211  // linear
1212  case 1:
1213  case 2:
1214  case 3:
1215  return 0.;
1216 
1217  // quadratic
1218  case 4:
1219  case 5:
1220  case 6:
1221  case 7:
1222  case 8:
1223  return 0.;
1224 
1225  case 9:
1226  return 2.;
1227 
1228  // cubic
1229  case 10:
1230  case 11:
1231  case 12:
1232  case 13:
1233  case 14:
1234  case 15:
1235  case 16:
1236  return 0.;
1237 
1238  case 17:
1239  return 2.*xi;
1240 
1241  case 18:
1242  return 2.*eta;
1243 
1244  case 19:
1245  return 6.*zeta;
1246 
1247  // quartics
1248  case 20:
1249  case 21:
1250  case 22:
1251  case 23:
1252  case 24:
1253  case 25:
1254  case 26:
1255  case 27:
1256  case 28:
1257  return 0.;
1258 
1259  case 29:
1260  return 2.*xi*xi;
1261 
1262  case 30:
1263  return 2.*xi*eta;
1264 
1265  case 31:
1266  return 2.*eta*eta;
1267 
1268  case 32:
1269  return 6.*xi*zeta;
1270 
1271  case 33:
1272  return 6.*eta*zeta;
1273 
1274  case 34:
1275  return 12.*zeta*zeta;
1276 
1277  default:
1278  unsigned int o = 0;
1279  for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
1280  unsigned int i2 = i - (o*(o+1)*(o+2)/6);
1281  unsigned int block=o, nz = 0;
1282  for (; block < i2; block += (o-nz+1)) { nz++; }
1283  const unsigned int nx = block - i2;
1284  const unsigned int ny = o - nx - nz;
1285  Real val = nz * (nz - 1);
1286  for (unsigned int index=0; index != nx; index++)
1287  val *= xi;
1288  for (unsigned int index=0; index != ny; index++)
1289  val *= eta;
1290  for (unsigned int index=2; index < nz; index++)
1291  val *= zeta;
1292  return val;
1293  }
1294  }
1295 
1296  default:
1297  libmesh_error_msg("Invalid j = " << j);
1298  }
1299 
1300 #else // LIBMESH_DIM != 3
1301  libmesh_assert(order);
1302  libmesh_ignore(i, j, p);
1303  libmesh_not_implemented();
1304 #endif
1305 }

◆ shape_second_deriv() [82/125]

Real libMesh::FE< 1, MONOMIAL >::shape_second_deriv ( const  ElemType,
const Order  libmesh_dbg_varorder,
const unsigned int  i,
const unsigned int  libmesh_dbg_varj,
const Point p 
)
inherited

Definition at line 144 of file fe_monomial_shape_1D.C.

149 {
150  // only d()/dxi in 1D!
151 
152  libmesh_assert_equal_to (j, 0);
153 
154  const Real xi = p(0);
155 
156  libmesh_assert_less_equal (i, static_cast<unsigned int>(order));
157 
158  switch (i)
159  {
160  case 0:
161  case 1:
162  return 0.;
163 
164  case 2:
165  return 2.;
166 
167  case 3:
168  return 6.*xi;
169 
170  case 4:
171  return 12.*xi*xi;
172 
173  default:
174  Real val = 2.;
175  for (unsigned int index = 2; index != i; ++index)
176  val *= (index+1) * xi;
177  return val;
178  }
179 }

◆ shape_second_deriv() [83/125]

Real libMesh::FE< 1, LAGRANGE >::shape_second_deriv ( const  ElemType,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 131 of file fe_lagrange_shape_1D.C.

136 {
137  return fe_lagrange_1D_shape_second_deriv(order, i, j, p(0));
138 }

◆ shape_second_deriv() [84/125]

Real libMesh::FE< 1, L2_LAGRANGE >::shape_second_deriv ( const  ElemType,
const Order  order,
const unsigned int  i,
const unsigned int  j,
const Point p 
)
inherited

Definition at line 143 of file fe_lagrange_shape_1D.C.

148 {
149  return fe_lagrange_1D_shape_second_deriv(order, i, j, p(0));
150 }

◆ shape_second_deriv() [85/125]

Real libMesh::FE< 0, SCALAR >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 71 of file fe_scalar_shape_0D.C.

76 {
77  return 0.;
78 }

◆ shape_second_deriv() [86/125]

Real libMesh::FE< 3, SCALAR >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 71 of file fe_scalar_shape_3D.C.

76 {
77  return 0.;
78 }

◆ shape_second_deriv() [87/125]

Real libMesh::FE< 2, SCALAR >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 72 of file fe_scalar_shape_2D.C.

77 {
78  return 0.;
79 }

◆ shape_second_deriv() [88/125]

Real libMesh::FE< 1, SCALAR >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 72 of file fe_scalar_shape_1D.C.

77 {
78  return 0.;
79 }

◆ shape_second_deriv() [89/125]

Real libMesh::FE< 3, SZABAB >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 84 of file fe_szabab_shape_3D.C.

89 {
90  libmesh_error_msg("Szabo-Babuska polynomials are not defined in 3D");
91  return 0.;
92 }

◆ shape_second_deriv() [90/125]

Real libMesh::FE< 0, HERMITE >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 86 of file fe_hermite_shape_0D.C.

91 {
92  libmesh_error_msg("No spatial derivatives in 0D!");
93  return 0.;
94 }

◆ shape_second_deriv() [91/125]

Real libMesh::FE< 0, XYZ >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 86 of file fe_xyz_shape_0D.C.

91 {
92  libmesh_error_msg("No spatial derivatives in 0D!");
93  return 0.;
94 }

◆ shape_second_deriv() [92/125]

Real libMesh::FE< 0, SZABAB >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 86 of file fe_szabab_shape_0D.C.

91 {
92  libmesh_error_msg("No spatial derivatives in 0D!");
93  return 0.;
94 }

◆ shape_second_deriv() [93/125]

Real libMesh::FE< 0, RATIONAL_BERNSTEIN >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 86 of file fe_rational_shape_0D.C.

91 {
92  libmesh_error_msg("No spatial derivatives in 0D!");
93  return 0.;
94 }

◆ shape_second_deriv() [94/125]

Real libMesh::FE< 0, CLOUGH >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 86 of file fe_clough_shape_0D.C.

91 {
92  libmesh_error_msg("No spatial derivatives in 0D!");
93  return 0.;
94 }

◆ shape_second_deriv() [95/125]

Real libMesh::FE< 0, BERNSTEIN >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 86 of file fe_bernstein_shape_0D.C.

91 {
92  libmesh_error_msg("No spatial derivatives in 0D!");
93  return 0.;
94 }

◆ shape_second_deriv() [96/125]

Real libMesh::FE< 0, MONOMIAL >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 86 of file fe_monomial_shape_0D.C.

91 {
92  libmesh_error_msg("No spatial derivatives in 0D!");
93  return 0.;
94 }

◆ shape_second_deriv() [97/125]

Real libMesh::FE< 3, CLOUGH >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 90 of file fe_clough_shape_3D.C.

95 {
96  libmesh_error_msg("Clough-Tocher elements require the real element \nto construct gradient-based degrees of freedom.");
97  return 0.;
98 }

◆ shape_second_deriv() [98/125]

Real libMesh::FE< 0, LAGRANGE >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 134 of file fe_lagrange_shape_0D.C.

139 {
140  libmesh_error_msg("No spatial derivatives in 0D!");
141  return 0.;
142 }

◆ shape_second_deriv() [99/125]

Real libMesh::FE< 0, HIERARCHIC >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 134 of file fe_hierarchic_shape_0D.C.

139 {
140  libmesh_error_msg("No spatial derivatives in 0D!");
141  return 0.;
142 }

◆ shape_second_deriv() [100/125]

Real libMesh::FE< 1, SZABAB >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 156 of file fe_szabab_shape_1D.C.

161 {
162  static bool warning_given = false;
163 
164  if (!warning_given)
165  libMesh::err << "Second derivatives for Szabab elements "
166  << " are not yet implemented!"
167  << std::endl;
168 
169  warning_given = true;
170  return 0.;
171 }

◆ shape_second_deriv() [101/125]

Real libMesh::FE< 0, L2_HIERARCHIC >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 159 of file fe_hierarchic_shape_0D.C.

164 {
165  libmesh_error_msg("No spatial derivatives in 0D!");
166  return 0.;
167 }

◆ shape_second_deriv() [102/125]

Real libMesh::FE< 0, L2_LAGRANGE >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 159 of file fe_lagrange_shape_0D.C.

164 {
165  libmesh_error_msg("No spatial derivatives in 0D!");
166  return 0.;
167 }

◆ shape_second_deriv() [103/125]

Real libMesh::FE< 2, RATIONAL_BERNSTEIN >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 162 of file fe_rational_shape_2D.C.

167 {
168  libmesh_error_msg("Rational bases require the real element \nto query nodal weighting.");
169  return 0.;
170 }

◆ shape_second_deriv() [104/125]

Real libMesh::FE< 3, RATIONAL_BERNSTEIN >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 162 of file fe_rational_shape_3D.C.

167 {
168  libmesh_error_msg("Rational bases require the real element \nto query nodal weighting.");
169  return 0.;
170 }

◆ shape_second_deriv() [105/125]

Real libMesh::FE< 1, XYZ >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 163 of file fe_xyz_shape_1D.C.

168 {
169  libmesh_error_msg("XYZ polynomials require the element \nbecause the centroid is needed.");
170  return 0.;
171 }

◆ shape_second_deriv() [106/125]

Real libMesh::FE< 2, HIERARCHIC >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 166 of file fe_hierarchic_shape_2D.C.

171 {
172  libmesh_error_msg("Hierarchic shape functions require an Elem for edge orientation.");
173  return 0.;
174 }

◆ shape_second_deriv() [107/125]

Real libMesh::FE< 1, RATIONAL_BERNSTEIN >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 167 of file fe_rational_shape_1D.C.

172 {
173  libmesh_error_msg("Rational bases require the real element \nto query nodal weighting.");
174  return 0.;
175 }

◆ shape_second_deriv() [108/125]

Real libMesh::FE< 2, L2_HIERARCHIC >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 179 of file fe_hierarchic_shape_2D.C.

184 {
185  libmesh_error_msg("Hierarchic shape functions require an Elem for edge orientation.");
186  return 0.;
187 }

◆ shape_second_deriv() [109/125]

Real libMesh::FE< 1, HERMITE >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 316 of file fe_hermite_shape_1D.C.

321 {
322  libmesh_error_msg("Hermite elements require the real element \nto construct gradient-based degrees of freedom.");
323  return 0.;
324 }

◆ shape_second_deriv() [110/125]

RealGradient libMesh::FE< 2, NEDELEC_ONE >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 335 of file fe_nedelec_one_shape_2D.C.

340 {
341  libmesh_error_msg("Nedelec elements require the element type \nbecause edge orientation is needed.");
342  return RealGradient();
343 }

◆ shape_second_deriv() [111/125]

Real libMesh::FE< 2, HERMITE >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 340 of file fe_hermite_shape_2D.C.

345 {
346  libmesh_error_msg("Hermite elements require the real element \nto construct gradient-based degrees of freedom.");
347  return 0.;
348 }

◆ shape_second_deriv() [112/125]

Real libMesh::FE< 1, CLOUGH >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 362 of file fe_clough_shape_1D.C.

367 {
368  libmesh_error_msg("Clough-Tocher elements require the real element \nto construct gradient-based degrees of freedom.");
369  return 0.;
370 }

◆ shape_second_deriv() [113/125]

Real libMesh::FE< 2, XYZ >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 363 of file fe_xyz_shape_2D.C.

368 {
369  libmesh_error_msg("XYZ polynomials require the element \nbecause the centroid is needed.");
370  return 0.;
371 }

◆ shape_second_deriv() [114/125]

Real libMesh::FE< 1, BERNSTEIN >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 382 of file fe_bernstein_shape_1D.C.

387 {
388  static bool warning_given = false;
389 
390  if (!warning_given)
391  libMesh::err << "Second derivatives for Bernstein elements "
392  << "are not yet implemented!"
393  << std::endl;
394 
395  warning_given = true;
396  return 0.;
397 }

◆ shape_second_deriv() [115/125]

RealGradient libMesh::FE< 3, NEDELEC_ONE >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 496 of file fe_nedelec_one_shape_3D.C.

501 {
502  libmesh_error_msg("Nedelec elements require the element type \nbecause edge orientation is needed.");
503  return RealGradient();
504 }

◆ shape_second_deriv() [116/125]

Real libMesh::FE< 3, HERMITE >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 553 of file fe_hermite_shape_3D.C.

558 {
559  libmesh_error_msg("Hermite elements require the real element \nto construct gradient-based degrees of freedom.");
560  return 0.;
561 }

◆ shape_second_deriv() [117/125]

Real libMesh::FE< 2, BERNSTEIN >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 568 of file fe_bernstein_shape_2D.C.

573 {
574  static bool warning_given = false;
575 
576  if (!warning_given)
577  libMesh::err << "Second derivatives for Bernstein elements "
578  << "are not yet implemented!"
579  << std::endl;
580 
581  warning_given = true;
582  return 0.;
583 }

◆ shape_second_deriv() [118/125]

RealGradient libMesh::FE< 0, NEDELEC_ONE >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 604 of file fe_nedelec_one.C.

606 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ shape_second_deriv() [119/125]

RealGradient libMesh::FE< 1, NEDELEC_ONE >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 631 of file fe_nedelec_one.C.

633 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ shape_second_deriv() [120/125]

Real libMesh::FE< 3, XYZ >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 701 of file fe_xyz_shape_3D.C.

706 {
707  libmesh_error_msg("XYZ polynomials require the element \nbecause the centroid is needed.");
708  return 0.;
709 }

◆ shape_second_deriv() [121/125]

Real libMesh::FE< 3, HIERARCHIC >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 773 of file fe_hierarchic_shape_3D.C.

778 {
779  libmesh_error_msg("Hierarchic shape functions require an Elem for edge/face orientation.");
780  return 0.;
781 }

◆ shape_second_deriv() [122/125]

Real libMesh::FE< 3, L2_HIERARCHIC >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 786 of file fe_hierarchic_shape_3D.C.

791 {
792  libmesh_error_msg("Hierarchic shape functions require an Elem for edge/face orientation.");
793  return 0.;
794 }

◆ shape_second_deriv() [123/125]

Real libMesh::FE< 2, SZABAB >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 1403 of file fe_szabab_shape_2D.C.

1408 {
1409  static bool warning_given = false;
1410 
1411  if (!warning_given)
1412  libMesh::err << "Second derivatives for Szabab elements "
1413  << " are not yet implemented!"
1414  << std::endl;
1415 
1416  warning_given = true;
1417  return 0.;
1418 }

◆ shape_second_deriv() [124/125]

Real libMesh::FE< 2, CLOUGH >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 2209 of file fe_clough_shape_2D.C.

2214 {
2215  libmesh_error_msg("Clough-Tocher elements require the real element \nto construct gradient-based degrees of freedom.");
2216  return 0.;
2217 }

◆ shape_second_deriv() [125/125]

Real libMesh::FE< 3, BERNSTEIN >::shape_second_deriv ( const  ElemType,
const  Order,
const unsigned int  ,
const unsigned int  ,
const Point  
)
inherited

Definition at line 2975 of file fe_bernstein_shape_3D.C.

2980 {
2981  static bool warning_given = false;
2982 
2983  if (!warning_given)
2984  libMesh::err << "Second derivatives for Bernstein elements "
2985  << "are not yet implemented!"
2986  << std::endl;
2987 
2988  warning_given = true;
2989  return 0.;
2990 }

◆ shapes_need_reinit() [1/62]

bool libMesh::FE< 0, SCALAR >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 137 of file fe_scalar.C.

137 { return false; }

◆ shapes_need_reinit() [2/62]

bool libMesh::FE< 1, SCALAR >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 138 of file fe_scalar.C.

138 { return false; }

◆ shapes_need_reinit() [3/62]

bool libMesh::FE< 2, SCALAR >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 139 of file fe_scalar.C.

139 { return false; }

◆ shapes_need_reinit() [4/62]

bool libMesh::FE< 3, SCALAR >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 140 of file fe_scalar.C.

140 { return false; }

◆ shapes_need_reinit() [5/62]

bool libMesh::FE< 0, RATIONAL_BERNSTEIN >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 197 of file fe_rational.C.

197 { return false; }

◆ shapes_need_reinit() [6/62]

bool libMesh::FE< 1, RATIONAL_BERNSTEIN >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 198 of file fe_rational.C.

198 { return false; }

◆ shapes_need_reinit() [7/62]

bool libMesh::FE< 2, RATIONAL_BERNSTEIN >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 199 of file fe_rational.C.

199 { return false; }

◆ shapes_need_reinit() [8/62]

bool libMesh::FE< 3, RATIONAL_BERNSTEIN >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 200 of file fe_rational.C.

200 { return false; }

◆ shapes_need_reinit() [9/62]

bool libMesh::FE< 0, L2_HIERARCHIC >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 222 of file fe_l2_hierarchic.C.

222 { return true; }

◆ shapes_need_reinit() [10/62]

bool libMesh::FE< 1, L2_HIERARCHIC >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 223 of file fe_l2_hierarchic.C.

223 { return true; }

◆ shapes_need_reinit() [11/62]

bool libMesh::FE< 2, L2_HIERARCHIC >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 224 of file fe_l2_hierarchic.C.

224 { return true; }

◆ shapes_need_reinit() [12/62]

bool libMesh::FE< 3, L2_HIERARCHIC >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 225 of file fe_l2_hierarchic.C.

225 { return true; }

◆ shapes_need_reinit() [13/62]

bool libMesh::FE< 0, CLOUGH >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 318 of file fe_clough.C.

318 { return true; }

◆ shapes_need_reinit() [14/62]

bool libMesh::FE< 1, CLOUGH >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 319 of file fe_clough.C.

319 { return true; }

◆ shapes_need_reinit() [15/62]

bool libMesh::FE< 2, CLOUGH >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 320 of file fe_clough.C.

320 { return true; }

◆ shapes_need_reinit() [16/62]

bool libMesh::FE< 3, CLOUGH >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 321 of file fe_clough.C.

321 { return true; }

◆ shapes_need_reinit() [17/62]

bool libMesh::FE< 0, HERMITE >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 370 of file fe_hermite.C.

370 { return true; }

◆ shapes_need_reinit() [18/62]

bool libMesh::FE< 1, HERMITE >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 371 of file fe_hermite.C.

371 { return true; }

◆ shapes_need_reinit() [19/62]

bool libMesh::FE< 2, HERMITE >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 372 of file fe_hermite.C.

372 { return true; }

◆ shapes_need_reinit() [20/62]

bool libMesh::FE< 3, HERMITE >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 373 of file fe_hermite.C.

373 { return true; }

◆ shapes_need_reinit() [21/62]

bool libMesh::FE< 0, HIERARCHIC >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 399 of file fe_hierarchic.C.

399 { return true; }

◆ shapes_need_reinit() [22/62]

bool libMesh::FE< 1, HIERARCHIC >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 400 of file fe_hierarchic.C.

400 { return true; }

◆ shapes_need_reinit() [23/62]

bool libMesh::FE< 2, HIERARCHIC >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 401 of file fe_hierarchic.C.

401 { return true; }

◆ shapes_need_reinit() [24/62]

bool libMesh::FE< 3, HIERARCHIC >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 402 of file fe_hierarchic.C.

402 { return true; }

◆ shapes_need_reinit() [25/62]

bool libMesh::FE< 0, MONOMIAL >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 421 of file fe_monomial.C.

421 { return false; }

◆ shapes_need_reinit() [26/62]

bool libMesh::FE< 1, MONOMIAL >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 422 of file fe_monomial.C.

422 { return false; }

◆ shapes_need_reinit() [27/62]

bool libMesh::FE< 2, MONOMIAL >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 423 of file fe_monomial.C.

423 { return false; }

◆ shapes_need_reinit() [28/62]

bool libMesh::FE< 3, MONOMIAL >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 424 of file fe_monomial.C.

424 { return false; }

◆ shapes_need_reinit() [29/62]

bool libMesh::FE< 0, BERNSTEIN >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 467 of file fe_bernstein.C.

467 { return true; }

◆ shapes_need_reinit() [30/62]

bool libMesh::FE< 1, BERNSTEIN >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 468 of file fe_bernstein.C.

468 { return true; }

◆ shapes_need_reinit() [31/62]

bool libMesh::FE< 2, BERNSTEIN >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 469 of file fe_bernstein.C.

469 { return true; }

◆ shapes_need_reinit() [32/62]

bool libMesh::FE< 3, BERNSTEIN >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 470 of file fe_bernstein.C.

470 { return true; }

◆ shapes_need_reinit() [33/62]

bool libMesh::FE< 0, L2_LAGRANGE >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 491 of file fe_l2_lagrange.C.

491 { return false; }

◆ shapes_need_reinit() [34/62]

bool libMesh::FE< 1, L2_LAGRANGE >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 492 of file fe_l2_lagrange.C.

492 { return false; }

◆ shapes_need_reinit() [35/62]

bool libMesh::FE< 2, L2_LAGRANGE >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 493 of file fe_l2_lagrange.C.

493 { return false; }

◆ shapes_need_reinit() [36/62]

bool libMesh::FE< 3, L2_LAGRANGE >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 494 of file fe_l2_lagrange.C.

494 { return false; }

◆ shapes_need_reinit() [37/62]

bool libMesh::FE< 0, NEDELEC_ONE >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 551 of file fe_nedelec_one.C.

551 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ shapes_need_reinit() [38/62]

bool libMesh::FE< 1, NEDELEC_ONE >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 552 of file fe_nedelec_one.C.

552 { NEDELEC_LOW_D_ERROR_MESSAGE }

◆ shapes_need_reinit() [39/62]

bool libMesh::FE< 2, NEDELEC_ONE >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 553 of file fe_nedelec_one.C.

553 { return true; }

◆ shapes_need_reinit() [40/62]

bool libMesh::FE< 3, NEDELEC_ONE >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 554 of file fe_nedelec_one.C.

554 { return true; }

◆ shapes_need_reinit() [41/62]

bool libMesh::FE< 0, MONOMIAL_VEC >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 810 of file fe_monomial_vec.C.

811 {
812  return false;
813 }

◆ shapes_need_reinit() [42/62]

bool libMesh::FE< 1, MONOMIAL_VEC >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 816 of file fe_monomial_vec.C.

817 {
818  return false;
819 }

◆ shapes_need_reinit() [43/62]

bool libMesh::FE< 2, MONOMIAL_VEC >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 822 of file fe_monomial_vec.C.

823 {
824  return false;
825 }

◆ shapes_need_reinit() [44/62]

bool libMesh::FE< 3, MONOMIAL_VEC >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 828 of file fe_monomial_vec.C.

829 {
830  return false;
831 }

◆ shapes_need_reinit() [45/62]

bool libMesh::FE< 0, LAGRANGE >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 885 of file fe_lagrange.C.

885 { return false; }

◆ shapes_need_reinit() [46/62]

bool libMesh::FE< 1, LAGRANGE >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 886 of file fe_lagrange.C.

886 { return false; }

◆ shapes_need_reinit() [47/62]

bool libMesh::FE< 2, LAGRANGE >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 887 of file fe_lagrange.C.

887 { return false; }

◆ shapes_need_reinit() [48/62]

bool libMesh::FE< 3, LAGRANGE >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 888 of file fe_lagrange.C.

888 { return false; }

◆ shapes_need_reinit() [49/62]

bool libMesh::FE< 2, SUBDIVISION >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 928 of file fe_subdivision_2D.C.

928 { return true; }

◆ shapes_need_reinit() [50/62]

bool libMesh::FE< 0, XYZ >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 948 of file fe_xyz.C.

948 { return true; }

◆ shapes_need_reinit() [51/62]

bool libMesh::FE< 1, XYZ >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 949 of file fe_xyz.C.

949 { return true; }

◆ shapes_need_reinit() [52/62]

bool libMesh::FE< 2, XYZ >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 950 of file fe_xyz.C.

950 { return true; }

◆ shapes_need_reinit() [53/62]

bool libMesh::FE< 3, XYZ >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 951 of file fe_xyz.C.

951 { return true; }

◆ shapes_need_reinit() [54/62]

bool libMesh::FE< 0, LAGRANGE_VEC >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 983 of file fe_lagrange_vec.C.

983 { return false; }

◆ shapes_need_reinit() [55/62]

bool libMesh::FE< 1, LAGRANGE_VEC >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 984 of file fe_lagrange_vec.C.

984 { return false; }

◆ shapes_need_reinit() [56/62]

bool libMesh::FE< 2, LAGRANGE_VEC >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 985 of file fe_lagrange_vec.C.

985 { return false; }

◆ shapes_need_reinit() [57/62]

bool libMesh::FE< 3, LAGRANGE_VEC >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 986 of file fe_lagrange_vec.C.

986 { return false; }

◆ shapes_need_reinit() [58/62]

bool libMesh::FE< 0, SZABAB >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 1303 of file fe_szabab.C.

1303 { return true; }

◆ shapes_need_reinit() [59/62]

bool libMesh::FE< 1, SZABAB >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 1304 of file fe_szabab.C.

1304 { return true; }

◆ shapes_need_reinit() [60/62]

bool libMesh::FE< 2, SZABAB >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 1305 of file fe_szabab.C.

1305 { return true; }

◆ shapes_need_reinit() [61/62]

bool libMesh::FE< 3, SZABAB >::shapes_need_reinit ( ) const
virtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

Definition at line 1306 of file fe_szabab.C.

1306 { return true; }

◆ shapes_need_reinit() [62/62]

virtual bool libMesh::FE< Dim, T >::shapes_need_reinit ( ) const
overridevirtualinherited
Returns
true when the shape functions (for this FEFamily) depend on the particular element, and therefore needs to be re-initialized for each new element. false otherwise.

Implements libMesh::FEAbstract.

◆ side_map() [1/2]

void libMesh::FE< 2, SUBDIVISION >::side_map ( const Elem ,
const Elem ,
const unsigned int  ,
const std::vector< Point > &  ,
std::vector< Point > &   
)
virtualinherited

Computes the reference space quadrature points on the side of an element based on the side quadrature points.

Implements libMesh::FEAbstract.

Definition at line 868 of file fe_subdivision_2D.C.

873 {
874  libmesh_not_implemented();
875 }

◆ side_map() [2/2]

void libMesh::FE< Dim, T >::side_map ( const Elem elem,
const Elem side,
const unsigned int  s,
const std::vector< Point > &  reference_side_points,
std::vector< Point > &  reference_points 
)
overridevirtualinherited

Computes the reference space quadrature points on the side of an element based on the side quadrature points.

Implements libMesh::FEAbstract.

Definition at line 325 of file fe_boundary.C.

330 {
331  // We're calculating mappings - we need at least first order info
332  this->calculate_phi = true;
333  this->determine_calculations();
334 
335  unsigned int side_p_level = elem->p_level();
336  if (elem->neighbor_ptr(s) != nullptr)
337  side_p_level = std::max(side_p_level, elem->neighbor_ptr(s)->p_level());
338 
339  if (side->type() != last_side ||
340  side_p_level != this->_p_level ||
341  !this->shapes_on_quadrature)
342  {
343  // Set the element type
344  this->elem_type = elem->type();
345  this->_p_level = side_p_level;
346 
347  // Set the last_side
348  last_side = side->type();
349 
350  // Initialize the face shape functions
351  this->_fe_map->template init_face_shape_functions<Dim>(reference_side_points, side);
352  }
353 
354  const unsigned int n_points =
355  cast_int<unsigned int>(reference_side_points.size());
356  reference_points.resize(n_points);
357  for (unsigned int i = 0; i < n_points; i++)
358  reference_points[i].zero();
359 
360  std::vector<unsigned int> elem_nodes_map;
361  elem_nodes_map.resize(side->n_nodes());
362  for (auto j : side->node_index_range())
363  for (auto i : elem->node_index_range())
364  if (side->node_id(j) == elem->node_id(i))
365  elem_nodes_map[j] = i;
366  std::vector<Point> refspace_nodes;
367  this->get_refspace_nodes(elem->type(), refspace_nodes);
368 
369  const std::vector<std::vector<Real>> & psi_map = this->_fe_map->get_psi();
370 
371  // sum over the nodes
372  for (auto i : index_range(psi_map))
373  {
374  const Point & side_node = refspace_nodes[elem_nodes_map[i]];
375  for (unsigned int p=0; p<n_points; p++)
376  reference_points[p].add_scaled (side_node, psi_map[i][p]);
377  }
378 }

Member Data Documentation

◆ _counts

ReferenceCounter::Counts libMesh::ReferenceCounter::_counts
staticprotectedinherited

◆ _enable_print_counter

bool libMesh::ReferenceCounter::_enable_print_counter = true
staticprotectedinherited

Flag to control whether reference count information is printed when print_info is called.

Definition at line 141 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::disable_print_counter_info(), libMesh::ReferenceCounter::enable_print_counter_info(), and libMesh::ReferenceCounter::print_info().

◆ _fe_map

std::unique_ptr<FEMap> libMesh::FEAbstract::_fe_map
protectedinherited

◆ _fe_trans

std::unique_ptr<FETransformationBase<FEOutputType< T >::type > > libMesh::FEGenericBase< FEOutputType< T >::type >::_fe_trans
protectedinherited

Object that handles computing shape function values, gradients, etc in the physical domain.

Definition at line 492 of file fe_base.h.

◆ _mutex

Threads::spin_mutex libMesh::ReferenceCounter::_mutex
staticprotectedinherited

Mutual exclusion object to enable thread-safe reference counting.

Definition at line 135 of file reference_counter.h.

◆ _n_objects

Threads::atomic< unsigned int > libMesh::ReferenceCounter::_n_objects
staticprotectedinherited

The number of objects.

Print the reference count information when the number returns to 0.

Definition at line 130 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::n_objects(), libMesh::ReferenceCounter::ReferenceCounter(), and libMesh::ReferenceCounter::~ReferenceCounter().

◆ _p_level

unsigned int libMesh::FEAbstract::_p_level
protectedinherited

The p refinement level the current data structures are set up for.

Definition at line 597 of file fe_abstract.h.

Referenced by libMesh::FEAbstract::get_order(), and libMesh::FEAbstract::get_p_level().

◆ cached_nodes

std::vector<Point> libMesh::FE< Dim, T >::cached_nodes
protectedinherited

An array of the node locations on the last element we computed on.

Definition at line 476 of file fe.h.

◆ calculate_curl_phi

bool libMesh::FEAbstract::calculate_curl_phi
mutableprotectedinherited

Should we calculate shape function curls?

Definition at line 567 of file fe_abstract.h.

Referenced by libMesh::FEGenericBase< FEOutputType< T >::type >::get_curl_phi().

◆ calculate_d2phi [1/2]

bool libMesh::FEAbstract::calculate_d2phi
mutableprotectedinherited

◆ calculate_d2phi [2/2]

const bool libMesh::FEAbstract::calculate_d2phi =false
protectedinherited

Definition at line 560 of file fe_abstract.h.

◆ calculate_div_phi

bool libMesh::FEAbstract::calculate_div_phi
mutableprotectedinherited

Should we calculate shape function divergences?

Definition at line 572 of file fe_abstract.h.

Referenced by libMesh::FEGenericBase< FEOutputType< T >::type >::get_div_phi().

◆ calculate_dphi

bool libMesh::FEAbstract::calculate_dphi
mutableprotectedinherited

◆ calculate_dphiref

bool libMesh::FEAbstract::calculate_dphiref
mutableprotectedinherited

Should we calculate reference shape function gradients?

Definition at line 577 of file fe_abstract.h.

Referenced by libMesh::FEGenericBase< FEOutputType< T >::type >::get_curl_phi(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phi(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phideta2(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidetadzeta(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidx2(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidxdy(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidxdz(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidxi2(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidxideta(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidxidzeta(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidy2(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidydz(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidz2(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidzeta2(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_div_phi(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphi(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphideta(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphidx(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphidxi(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphidy(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphidz(), and libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphidzeta().

◆ calculate_map

bool libMesh::FEAbstract::calculate_map
mutableprotectedinherited

◆ calculate_phi

bool libMesh::FEAbstract::calculate_phi
mutableprotectedinherited

Should we calculate shape functions?

Definition at line 546 of file fe_abstract.h.

Referenced by libMesh::FEGenericBase< FEOutputType< T >::type >::get_phi().

◆ calculations_started

bool libMesh::FEAbstract::calculations_started
mutableprotectedinherited

Have calculations with this object already been started? Then all get_* functions should already have been called.

Definition at line 536 of file fe_abstract.h.

Referenced by libMesh::FEGenericBase< FEOutputType< T >::type >::get_curl_phi(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phi(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phideta2(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidetadzeta(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidx2(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidxdy(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidxdz(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidxi2(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidxideta(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidxidzeta(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidy2(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidydz(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidz2(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_d2phidzeta2(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_div_phi(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphi(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphideta(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphidx(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphidxi(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphidy(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphidz(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_dphidzeta(), libMesh::FEGenericBase< FEOutputType< T >::type >::get_phi(), and libMesh::FESubdivision::init_shape_functions().

◆ curl_phi

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::curl_phi
protectedinherited

Shape function curl values.

Only defined for vector types.

Definition at line 507 of file fe_base.h.

◆ d2phi

std::vector<std::vector<OutputTensor> > libMesh::FEGenericBase< FEOutputType< T >::type >::d2phi
protectedinherited

Shape function second derivative values.

Definition at line 550 of file fe_base.h.

◆ d2phideta2

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::d2phideta2
protectedinherited

Shape function second derivatives in the eta direction.

Definition at line 570 of file fe_base.h.

◆ d2phidetadzeta

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidetadzeta
protectedinherited

Shape function second derivatives in the eta-zeta direction.

Definition at line 575 of file fe_base.h.

◆ d2phidx2

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidx2
protectedinherited

Shape function second derivatives in the x direction.

Definition at line 585 of file fe_base.h.

◆ d2phidxdy

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidxdy
protectedinherited

Shape function second derivatives in the x-y direction.

Definition at line 590 of file fe_base.h.

◆ d2phidxdz

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidxdz
protectedinherited

Shape function second derivatives in the x-z direction.

Definition at line 595 of file fe_base.h.

◆ d2phidxi2

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidxi2
protectedinherited

Shape function second derivatives in the xi direction.

Definition at line 555 of file fe_base.h.

◆ d2phidxideta

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidxideta
protectedinherited

Shape function second derivatives in the xi-eta direction.

Definition at line 560 of file fe_base.h.

◆ d2phidxidzeta

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidxidzeta
protectedinherited

Shape function second derivatives in the xi-zeta direction.

Definition at line 565 of file fe_base.h.

◆ d2phidy2

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidy2
protectedinherited

Shape function second derivatives in the y direction.

Definition at line 600 of file fe_base.h.

◆ d2phidydz

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidydz
protectedinherited

Shape function second derivatives in the y-z direction.

Definition at line 605 of file fe_base.h.

◆ d2phidz2

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidz2
protectedinherited

Shape function second derivatives in the z direction.

Definition at line 610 of file fe_base.h.

◆ d2phidzeta2

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidzeta2
protectedinherited

Shape function second derivatives in the zeta direction.

Definition at line 580 of file fe_base.h.

◆ dim

const unsigned int libMesh::FEAbstract::dim
protectedinherited

The dimensionality of the object.

Definition at line 530 of file fe_abstract.h.

Referenced by libMesh::FEAbstract::build(), and libMesh::FEAbstract::get_dim().

◆ div_phi

std::vector<std::vector<OutputDivergence> > libMesh::FEGenericBase< FEOutputType< T >::type >::div_phi
protectedinherited

Shape function divergence values.

Only defined for vector types.

Definition at line 512 of file fe_base.h.

◆ dphase

std::vector<OutputGradient> libMesh::FEGenericBase< FEOutputType< T >::type >::dphase
protectedinherited

Used for certain infinite element families: the first derivatives of the phase term in global coordinates, over all quadrature points.

Definition at line 628 of file fe_base.h.

◆ dphi

std::vector<std::vector<OutputGradient> > libMesh::FEGenericBase< FEOutputType< T >::type >::dphi
protectedinherited

Shape function derivative values.

Definition at line 502 of file fe_base.h.

◆ dphideta

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::dphideta
protectedinherited

Shape function derivatives in the eta direction.

Definition at line 522 of file fe_base.h.

◆ dphidx

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::dphidx
protectedinherited

Shape function derivatives in the x direction.

Definition at line 532 of file fe_base.h.

◆ dphidxi

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::dphidxi
protectedinherited

Shape function derivatives in the xi direction.

Definition at line 517 of file fe_base.h.

◆ dphidy

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::dphidy
protectedinherited

Shape function derivatives in the y direction.

Definition at line 537 of file fe_base.h.

◆ dphidz

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::dphidz
protectedinherited

Shape function derivatives in the z direction.

Definition at line 542 of file fe_base.h.

◆ dphidzeta

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::dphidzeta
protectedinherited

Shape function derivatives in the zeta direction.

Definition at line 527 of file fe_base.h.

◆ dweight

std::vector<RealGradient> libMesh::FEGenericBase< FEOutputType< T >::type >::dweight
protectedinherited

Used for certain infinite element families: the global derivative of the additional radial weight \( 1/{r^2} \), over all quadrature points.

Definition at line 635 of file fe_base.h.

◆ elem_type

ElemType libMesh::FEAbstract::elem_type
protectedinherited

The element type the current data structures are set up for.

Definition at line 591 of file fe_abstract.h.

Referenced by libMesh::FESubdivision::attach_quadrature_rule(), and libMesh::FEAbstract::get_type().

◆ fe_type

FEType libMesh::FEAbstract::fe_type
protectedinherited

◆ last_edge

unsigned int libMesh::FE< Dim, T >::last_edge
protectedinherited

Definition at line 483 of file fe.h.

◆ last_side

ElemType libMesh::FE< Dim, T >::last_side
protectedinherited

The last side and last edge we did a reinit on.

Definition at line 481 of file fe.h.

◆ phi

std::vector<std::vector<OutputShape> > libMesh::FEGenericBase< FEOutputType< T >::type >::phi
protectedinherited

Shape function values.

Definition at line 497 of file fe_base.h.

◆ qrule

QBase* libMesh::FEAbstract::qrule
protectedinherited

A pointer to the quadrature rule employed.

Definition at line 602 of file fe_abstract.h.

Referenced by libMesh::FESubdivision::attach_quadrature_rule().

◆ shapes_on_quadrature

bool libMesh::FEAbstract::shapes_on_quadrature
protectedinherited

A flag indicating if current data structures correspond to quadrature rule points.

Definition at line 608 of file fe_abstract.h.

◆ weight

std::vector<Real> libMesh::FEGenericBase< FEOutputType< T >::type >::weight
protectedinherited

Used for certain infinite element families: the additional radial weight \( 1/{r^2} \) in local coordinates, over all quadrature points.

Definition at line 642 of file fe_base.h.


The documentation for this class was generated from the following file:
libMesh::FE< 2, SUBDIVISION >::shape_second_deriv
static OutputShape shape_second_deriv(const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
libMesh::C_ONE
Definition: enum_fe_family.h:80
libMesh::FEType::inf_map
InfMapType inf_map
The coordinate mapping type of the infinite element.
Definition: fe_type.h:257
libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidxdz
std::vector< std::vector< OutputShape > > d2phidxdz
Shape function second derivatives in the x-z direction.
Definition: fe_base.h:595
libMesh::HEX20
Definition: enum_elem_type.h:48
libMesh::dof_id_type
uint8_t dof_id_type
Definition: id_types.h:67
libMesh::Number
Real Number
Definition: libmesh_common.h:195
libMesh::PRISM6
Definition: enum_elem_type.h:50
libMesh::fe_lagrange_1D_shape_second_deriv
Real fe_lagrange_1D_shape_second_deriv(const Order order, const unsigned int i, const unsigned int j, const Real xi)
Definition: fe_lagrange_shape_1D.h:294
libMesh::FEAbstract::get_order
Order get_order() const
Definition: fe_abstract.h:432
libMesh::BoundaryInfo::boundary_ids
std::vector< boundary_id_type > boundary_ids(const Node *node) const
Definition: boundary_info.C:985
libMesh::Elem::child_ptr
const Elem * child_ptr(unsigned int i) const
Definition: elem.h:2567
libMesh::FEType::radial_family
FEFamily radial_family
The type of approximation in radial direction.
Definition: fe_type.h:249
libMesh::PeriodicBoundaryBase::has_transformation_matrix
bool has_transformation_matrix() const
Definition: periodic_boundary_base.C:76
libMesh::Elem::is_node_on_side
virtual bool is_node_on_side(const unsigned int n, const unsigned int s) const =0
libMesh::Elem::n_edges
virtual unsigned int n_edges() const =0
libMesh::OrderWrapper::get_order
int get_order() const
Explicitly request the order as an int.
Definition: fe_type.h:77
libMesh::invalid_uint
const unsigned int invalid_uint
A number which is used quite often to represent an invalid or uninitialized value.
Definition: libmesh.h:249
libMesh::PeriodicBoundaryBase::get_corresponding_pos
virtual Point get_corresponding_pos(const Point &pt) const =0
This function should be overridden by derived classes to define how one finds corresponding nodes on ...
libMesh::FEGenericBase< FEOutputType< T >::type >::_fe_trans
std::unique_ptr< FETransformationBase< FEOutputType< T >::type > > _fe_trans
Object that handles computing shape function values, gradients, etc in the physical domain.
Definition: fe_base.h:492
libMesh::FEAbstract::calculate_dphi
bool calculate_dphi
Should we calculate shape function gradients?
Definition: fe_abstract.h:551
libMesh::CLOUGH
Definition: enum_fe_family.h:53
libMesh::FEGenericBase< FEOutputType< T >::type >::d2phideta2
std::vector< std::vector< OutputShape > > d2phideta2
Shape function second derivatives in the eta direction.
Definition: fe_base.h:570
libMesh::MeshBase::get_boundary_info
const BoundaryInfo & get_boundary_info() const
The information about boundary ids on the mesh.
Definition: mesh_base.h:132
libMesh::FEType::family
FEFamily family
The type of finite element.
Definition: fe_type.h:203
libMesh::QGauss
This class implements specific orders of Gauss quadrature.
Definition: quadrature_gauss.h:39
libMesh::DofMap::dof_indices
void dof_indices(const Elem *const elem, std::vector< dof_id_type > &di) const
Fills the vector di with the global degree of freedom indices for the element.
Definition: dof_map.C:1967
libMesh::FEGenericBase< FEOutputType< T >::type >::curl_phi
std::vector< std::vector< OutputShape > > curl_phi
Shape function curl values.
Definition: fe_base.h:507
libMesh::FE< Dim, L2_HIERARCHIC >::n_shape_functions
virtual unsigned int n_shape_functions() const override
Definition: fe.C:50
libMesh::Elem::level
unsigned int level() const
Definition: elem.h:2478
libMesh::L2_HIERARCHIC
Definition: enum_fe_family.h:40
libMesh::Utility::binomial
T binomial(T n, T k)
Definition: utility.h:272
libMesh::FEGenericBase< FEOutputType< T >::type >::dphidzeta
std::vector< std::vector< OutputShape > > dphidzeta
Shape function derivatives in the zeta direction.
Definition: fe_base.h:527
libMesh::FEGenericBase< FEOutputType< T >::type >::dphideta
std::vector< std::vector< OutputShape > > dphideta
Shape function derivatives in the eta direction.
Definition: fe_base.h:522
libMesh::Elem::n_nodes
virtual unsigned int n_nodes() const =0
libMesh::HEX8
Definition: enum_elem_type.h:47
libMesh::FEAbstract::print_xyz
void print_xyz(std::ostream &os) const
Prints the spatial location of each quadrature point (on the physical element).
Definition: fe_abstract.C:812
libMesh::INFINITE_MAP
Definition: enum_fe_family.h:48
libMesh::EDGE4
Definition: enum_elem_type.h:37
libMesh::FEGenericBase< FEOutputType< T >::type >::dphidz
std::vector< std::vector< OutputShape > > dphidz
Shape function derivatives in the z direction.
Definition: fe_base.h:542
libMesh::INFHEX8
Definition: enum_elem_type.h:60
libMesh::SIXTH
Definition: enum_order.h:47
libMesh::FEAbstract::fe_type
FEType fe_type
The finite element type for this object.
Definition: fe_abstract.h:585
libMesh::Elem::n_neighbors
unsigned int n_neighbors() const
Definition: elem.h:631
libMesh::HERMITE
Definition: enum_fe_family.h:54
libMesh::FEGenericBase< FEOutputType< T >::type >::div_phi
std::vector< std::vector< OutputDivergence > > div_phi
Shape function divergence values.
Definition: fe_base.h:512
libMesh::QBase::n_points
unsigned int n_points() const
Definition: quadrature.h:126
libMesh::FEGenericBase< FEOutputType< T >::type >::dphidy
std::vector< std::vector< OutputShape > > dphidy
Shape function derivatives in the y direction.
Definition: fe_base.h:537
libMesh::PeriodicBoundaryBase
The base class for defining periodic boundaries.
Definition: periodic_boundary_base.h:48
libMesh::index_range
IntRange< std::size_t > index_range(const std::vector< T > &vec)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:106
libMesh::RealGradient
RealVectorValue RealGradient
Definition: hp_coarsentest.h:49
libMesh::Elem::dim
virtual unsigned short dim() const =0
libMesh::DenseVector::zero
virtual void zero() override
Set every element in the vector to 0.
Definition: dense_vector.h:379
libMesh::JACOBI_20_00
Definition: enum_fe_family.h:49
libMesh::TET10
Definition: enum_elem_type.h:46
libMesh::XYZ
Definition: enum_fe_family.h:46
libMesh::FEGenericBase
This class forms the foundation from which generic finite elements may be derived.
Definition: exact_error_estimator.h:39
libMesh::FEAbstract::print_dphi
virtual void print_dphi(std::ostream &os) const =0
Prints the value of each shape function's derivative at each quadrature point.
libMesh::Order
Order
Definition: enum_order.h:40
libMesh::FEAbstract::calculate_dphiref
bool calculate_dphiref
Should we calculate reference shape function gradients?
Definition: fe_abstract.h:577
libMesh::FEAbstract::calculations_started
bool calculations_started
Have calculations with this object already been started? Then all get_* functions should already have...
Definition: fe_abstract.h:536
libMesh::ReferenceCounter::_counts
static Counts _counts
Actually holds the data.
Definition: reference_counter.h:122
libMesh::TOLERANCE
static const Real TOLERANCE
Definition: libmesh_common.h:128
libMesh::FEAbstract::calculate_phi
bool calculate_phi
Should we calculate shape functions?
Definition: fe_abstract.h:546
libMesh::DenseMatrix< Real >
libMesh::DofMap::n_variables
unsigned int n_variables() const
Definition: dof_map.h:592
libMesh::FEAbstract::calculate_map
bool calculate_map
Are we calculating mapping functions?
Definition: fe_abstract.h:541
libMesh::MONOMIAL_VEC
Definition: enum_fe_family.h:62
libMesh::Elem::p_level
unsigned int p_level() const
Definition: elem.h:2512
libMesh::ReferenceCounter::_n_objects
static Threads::atomic< unsigned int > _n_objects
The number of objects.
Definition: reference_counter.h:130
libMesh::Elem::node_index_range
IntRange< unsigned short > node_index_range() const
Definition: elem.h:2170
libMesh::FE< Dim, L2_HIERARCHIC >::reinit
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.
Definition: fe.C:129
libMesh::Variable::type
const FEType & type() const
Definition: variable.h:119
mesh
MeshBase & mesh
Definition: mesh_communication.C:1257
libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidxidzeta
std::vector< std::vector< OutputShape > > d2phidxidzeta
Shape function second derivatives in the xi-zeta direction.
Definition: fe_base.h:565
libMesh::FIFTH
Definition: enum_order.h:46
libMesh::fe_lagrange_1D_shape_deriv
Real fe_lagrange_1D_shape_deriv(const Order order, const unsigned int i, const unsigned int j, const Real xi)
Definition: fe_lagrange_shape_1D.h:210
libMesh::FEAbstract::calculate_curl_phi
bool calculate_curl_phi
Should we calculate shape function curls?
Definition: fe_abstract.h:567
libMesh::RealVectorValue
VectorValue< Real > RealVectorValue
Useful typedefs to allow transparent switching between Real and Complex data types.
Definition: hp_coarsentest.h:46
libMesh::DofMap::is_constrained_dof
bool is_constrained_dof(const dof_id_type dof) const
Definition: dof_map.h:1962
libMesh::SECOND
Definition: enum_order.h:43
libMesh::FEHermite
Hermite finite elements.
Definition: fe.h:520
libMesh::ReferenceCounter::get_info
static std::string get_info()
Gets a string containing the reference information.
Definition: reference_counter.C:47
libMesh::FEAbstract::shapes_on_quadrature
bool shapes_on_quadrature
A flag indicating if current data structures correspond to quadrature rule points.
Definition: fe_abstract.h:608
libMesh::Elem::active
bool active() const
Definition: elem.h:2345
libMesh::FEGenericBase< FEOutputType< T >::type >::phi
std::vector< std::vector< OutputShape > > phi
Shape function values.
Definition: fe_base.h:497
libMesh::FE< Dim, L2_HIERARCHIC >::last_edge
unsigned int last_edge
Definition: fe.h:483
libMesh::QBase::init
virtual void init(const ElemType type=INVALID_ELEM, unsigned int p_level=0)
Initializes the data structures for a quadrature rule for an element of type type.
Definition: quadrature.C:59
libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidetadzeta
std::vector< std::vector< OutputShape > > d2phidetadzeta
Shape function second derivatives in the eta-zeta direction.
Definition: fe_base.h:575
libMesh::square_number_column
const unsigned char square_number_column[]
Definition: number_lookups.C:56
libMesh::DenseMatrix::resize
void resize(const unsigned int new_m, const unsigned int new_n)
Resize the matrix.
Definition: dense_matrix.h:822
libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidz2
std::vector< std::vector< OutputShape > > d2phidz2
Shape function second derivatives in the z direction.
Definition: fe_base.h:610
libMesh::TET4
Definition: enum_elem_type.h:45
libMesh::DofMap::old_dof_indices
void old_dof_indices(const Elem &elem, unsigned int n, std::vector< dof_id_type > &di, const unsigned int vn) const
Appends to the vector di the old global degree of freedom indices for elem.node_ref(n),...
Definition: dof_map.C:2258
libMesh::PeriodicBoundaries::boundary
PeriodicBoundaryBase * boundary(boundary_id_type id)
Definition: periodic_boundaries.C:40
libMesh::CARTESIAN
Definition: enum_inf_map_type.h:35
libMesh::zero
const Number zero
.
Definition: libmesh.h:243
libMesh::FEGenericBase< FEOutputType< T >::type >::dphidxi
std::vector< std::vector< OutputShape > > dphidxi
Shape function derivatives in the xi direction.
Definition: fe_base.h:517
libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidzeta2
std::vector< std::vector< OutputShape > > d2phidzeta2
Shape function second derivatives in the zeta direction.
Definition: fe_base.h:580
libMesh::FEGenericBase< FEOutputType< T >::type >::dweight
std::vector< RealGradient > dweight
Used for certain infinite element families: the global derivative of the additional radial weight ,...
Definition: fe_base.h:635
libMesh::PRISM15
Definition: enum_elem_type.h:51
libMesh::SZABAB
Definition: enum_fe_family.h:44
libMesh::DofObject::dof_number
dof_id_type dof_number(const unsigned int s, const unsigned int var, const unsigned int comp) const
Definition: dof_object.h:956
libMesh::INFPRISM6
Definition: enum_elem_type.h:63
libMesh::libmesh_assert
libmesh_assert(ctx)
libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidxideta
std::vector< std::vector< OutputShape > > d2phidxideta
Shape function second derivatives in the xi-eta direction.
Definition: fe_base.h:560
std::abs
MetaPhysicL::DualNumber< T, D > abs(const MetaPhysicL::DualNumber< T, D > &in)
libMesh::FE< Dim, L2_HIERARCHIC >::shape
static OutputShape shape(const ElemType t, const Order o, const unsigned int i, const Point &p)
libMesh::JACOBI_30_00
Definition: enum_fe_family.h:50
libMesh::HEX27
Definition: enum_elem_type.h:49
libMesh::FEMap::inverse_map
static Point inverse_map(const unsigned int dim, const Elem *elem, const Point &p, const Real tolerance=TOLERANCE, const bool secure=true)
Definition: fe_map.C:1622
libMesh::FEAbstract::get_p_level
unsigned int get_p_level() const
Definition: fe_abstract.h:422
libMesh::DofMap::sys_number
unsigned int sys_number() const
Definition: dof_map.h:1876
libMesh::FE< 2, SUBDIVISION >::shape_deriv
static OutputShape shape_deriv(const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
libMesh::FEGenericBase< FEOutputType< T >::type >::d2phi
std::vector< std::vector< OutputTensor > > d2phi
Shape function second derivative values.
Definition: fe_base.h:550
libMesh::DofObject::n_comp
unsigned int n_comp(const unsigned int s, const unsigned int var) const
Definition: dof_object.h:926
libMesh::FEAbstract::print_phi
virtual void print_phi(std::ostream &os) const =0
Prints the value of each shape function at each quadrature point.
libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidydz
std::vector< std::vector< OutputShape > > d2phidydz
Shape function second derivatives in the y-z direction.
Definition: fe_base.h:605
libMesh::FEAbstract::calculate_div_phi
bool calculate_div_phi
Should we calculate shape function divergences?
Definition: fe_abstract.h:572
libMesh::DofMap::variable
const Variable & variable(const unsigned int c) const
Definition: dof_map.h:1894
libMesh::Threads::spin_mtx
spin_mutex spin_mtx
A convenient spin mutex object which can be used for obtaining locks.
Definition: threads.C:29
libMesh::FE
A specific instantiation of the FEBase class.
Definition: fe.h:95
libMesh::libmesh_ignore
void libmesh_ignore(const Args &...)
Definition: libmesh_common.h:526
libMesh::QBase::get_points
const std::vector< Point > & get_points() const
Definition: quadrature.h:141
libMesh::FEAbstract::qrule
QBase * qrule
A pointer to the quadrature rule employed.
Definition: fe_abstract.h:602
libMesh::INFHEX18
Definition: enum_elem_type.h:62
libMesh::BoundaryInfo::side_with_boundary_id
unsigned int side_with_boundary_id(const Elem *const elem, const boundary_id_type boundary_id) const
Definition: boundary_info.C:1527
libMesh::QUAD4
Definition: enum_elem_type.h:41
libMesh::FEAbstract::get_type
ElemType get_type() const
Definition: fe_abstract.h:416
libMesh::Point
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition: point.h:38
libMesh::Variable
This class defines the notion of a variable in the system.
Definition: variable.h:49
libMesh::DISCONTINUOUS
Definition: enum_fe_family.h:78
libMesh::TRI3
Definition: enum_elem_type.h:39
libMesh::FEAbstract::_fe_map
std::unique_ptr< FEMap > _fe_map
Definition: fe_abstract.h:524
libMesh::H_CURL
Definition: enum_fe_family.h:81
libMesh::C_ZERO
Definition: enum_fe_family.h:79
libMesh::FEGenericBase< FEOutputType< T >::type >::dphi
std::vector< std::vector< OutputGradient > > dphi
Shape function derivative values.
Definition: fe_base.h:502
libMesh::Node
A Node is like a Point, but with more information.
Definition: node.h:52
libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidxi2
std::vector< std::vector< OutputShape > > d2phidxi2
Shape function second derivatives in the xi direction.
Definition: fe_base.h:555
libMesh::LEGENDRE
Definition: enum_fe_family.h:51
libMesh::TensorTools::inner_product
boostcopy::enable_if_c< ScalarTraits< T >::value &&ScalarTraits< T2 >::value, typename CompareTypes< T, T2 >::supertype >::type inner_product(const T &a, const T2 &b)
Definition: tensor_tools.h:62
std::pow
double pow(double a, int b)
Definition: libmesh_augment_std_namespace.h:58
libMesh::DofMap::constrain_p_dofs
void constrain_p_dofs(unsigned int var, const Elem *elem, unsigned int s, unsigned int p)
Constrains degrees of freedom on side s of element elem which correspond to variable number var and t...
Definition: dof_map_constraints.C:4325
libMesh::FEInterface::n_dofs
static unsigned int n_dofs(const unsigned int dim, const FEType &fe_t, const ElemType t)
Definition: fe_interface.C:472
libMesh::DofMap::variable_type
const FEType & variable_type(const unsigned int c) const
Definition: dof_map.h:1924
libMesh::FEMap::map_fe_type
static FEFamily map_fe_type(const Elem &elem)
Definition: fe_map.C:47
libMesh::FE< Dim, L2_HIERARCHIC >::init_shape_functions
virtual void init_shape_functions(const std::vector< Point > &qp, const Elem *e)
Update the various member data fields phi, dphidxi, dphideta, dphidzeta, etc.
Definition: fe.C:292
libMesh::FEType::default_quadrature_rule
std::unique_ptr< QBase > default_quadrature_rule(const unsigned int dim, const int extraorder=0) const
Definition: fe_type.C:31
libMesh::RATIONAL_BERNSTEIN
Definition: enum_fe_family.h:64
libMesh::BERNSTEIN
Definition: enum_fe_family.h:43
libMesh::PeriodicBoundaryBase::is_my_variable
bool is_my_variable(unsigned int var_num) const
Definition: periodic_boundary_base.C:68
n_nodes
const dof_id_type n_nodes
Definition: tecplot_io.C:68
libMesh::INFHEX16
Definition: enum_elem_type.h:61
libMesh::Elem::is_node_on_edge
virtual bool is_node_on_edge(const unsigned int n, const unsigned int e) const =0
libMesh::FEAbstract::dim
const unsigned int dim
The dimensionality of the object.
Definition: fe_abstract.h:530
libMesh::FEGenericBase< FEOutputType< T >::type >::coarsened_dof_values
static void coarsened_dof_values(const NumericVector< Number > &global_vector, const DofMap &dof_map, const Elem *coarse_elem, DenseVector< Number > &coarse_dofs, const unsigned int var, const bool use_old_dof_indices=false)
Creates a local projection on coarse_elem, based on the DoF values in global_vector for it's children...
Definition: fe_base.C:822
libMesh::FEGenericBase< FEOutputType< T >::type >::OutputNumber
TensorTools::MakeNumber< OutputShape >::type OutputNumber
Definition: fe_base.h:122
libMesh::FE< Dim, L2_HIERARCHIC >::last_side
ElemType last_side
The last side and last edge we did a reinit on.
Definition: fe.h:481
libMesh::is
PetscErrorCode PetscInt const PetscInt IS * is
Definition: petsc_dm_wrapper.C:60
libMesh::fe_lagrange_1D_shape
Real fe_lagrange_1D_shape(const Order order, const unsigned int i, const Real xi)
Definition: fe_lagrange_shape_1D.h:102
libMesh::DenseMatrix::zero
virtual void zero() override
Set every element in the matrix to 0.
Definition: dense_matrix.h:838
libMesh::HIERARCHIC
Definition: enum_fe_family.h:37
libMesh::MONOMIAL
Definition: enum_fe_family.h:39
libMesh::INFPRISM12
Definition: enum_elem_type.h:64
libMesh::FOURTH
Definition: enum_order.h:45
libMesh::QBase::get_weights
const std::vector< Real > & get_weights() const
Definition: quadrature.h:153
libMesh::PeriodicBoundaryBase::get_transformation_matrix
const DenseMatrix< Real > & get_transformation_matrix() const
Get the transformation matrix, if it is defined.
Definition: periodic_boundary_base.C:83
libMesh::DenseMatrix::cholesky_solve
void cholesky_solve(const DenseVector< T2 > &b, DenseVector< T2 > &x)
For symmetric positive definite (SPD) matrices.
Definition: dense_matrix_impl.h:947
libMesh::TRI6
Definition: enum_elem_type.h:40
libMesh::FE< Dim, L2_HIERARCHIC >::shapes_need_reinit
virtual bool shapes_need_reinit() const override
libMesh::DenseVector::resize
void resize(const unsigned int n)
Resize the vector.
Definition: dense_vector.h:355
distance
Real distance(const Point &p)
Definition: subdomains_ex3.C:50
libMesh::INVALID_ELEM
Definition: enum_elem_type.h:75
libMesh::FEGenericBase< FEOutputType< T >::type >::compute_shape_functions
virtual void compute_shape_functions(const Elem *elem, const std::vector< Point > &qp)
After having updated the jacobian and the transformation from local to global coordinates in FEAbstra...
Definition: fe_base.C:697
swap
void swap(Iterator &lhs, Iterator &rhs)
swap, used to implement op=
Definition: variant_filter_iterator.h:478
libMesh::Elem::is_edge
virtual bool is_edge(const unsigned int i) const =0
libMesh::FEType
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
Definition: fe_type.h:178
libMesh::FE< Dim, L2_HIERARCHIC >::nodal_soln
static void nodal_soln(const Elem *elem, const Order o, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
Build the nodal soln from the element soln.
libMesh::FE< Dim, L2_HIERARCHIC >::n_dofs_at_node
static unsigned int n_dofs_at_node(const ElemType t, const Order o, const unsigned int n)
libMesh::FEType::order
OrderWrapper order
The approximation order of the element.
Definition: fe_type.h:197
libMesh::PeriodicBoundaries::neighbor
const Elem * neighbor(boundary_id_type boundary_id, const PointLocatorBase &point_locator, const Elem *e, unsigned int side) const
Definition: periodic_boundaries.C:61
libMesh::FEFamily
FEFamily
Definition: enum_fe_family.h:34
libMesh::SEVENTH
Definition: enum_order.h:48
value
static const bool value
Definition: xdr_io.C:56
libMesh::QUADSHELL8
Definition: enum_elem_type.h:73
libMesh::PYRAMID5
Definition: enum_elem_type.h:53
libMesh::Elem::hmin
virtual Real hmin() const
Definition: elem.C:359
libMesh::NEDELEC_ONE
Definition: enum_fe_family.h:61
libMesh::Elem::subdomain_id
subdomain_id_type subdomain_id() const
Definition: elem.h:2069
libMesh::DofObject::id
dof_id_type id() const
Definition: dof_object.h:767
libMesh::FEGenericBase< FEOutputType< T >::type >::compute_proj_constraints
static void compute_proj_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...
Definition: fe_base.C:1396
libMesh::TYPE_VECTOR
Definition: enum_fe_family.h:94
libMesh::EDGE3
Definition: enum_elem_type.h:36
libMesh::square_number_row
const unsigned char square_number_row[]
Definition: number_lookups.C:69
libMesh::QUADSHELL4
Definition: enum_elem_type.h:72
libMesh::Elem::side_index_range
IntRange< unsigned short > side_index_range() const
Definition: elem.h:2188
libMesh::QBase::shapes_need_reinit
virtual bool shapes_need_reinit()
Definition: quadrature.h:239
libMesh::Elem::is_vertex
virtual bool is_vertex(const unsigned int i) const =0
libMesh::Elem::min_p_level_by_neighbor
unsigned int min_p_level_by_neighbor(const Elem *neighbor, unsigned int current_min) const
Definition: elem.C:1663
libMesh::FEGenericBase< FEOutputType< T >::type >::dphase
std::vector< OutputGradient > dphase
Used for certain infinite element families: the first derivatives of the phase term in global coordin...
Definition: fe_base.h:628
libMesh::FEAbstract::_p_level
unsigned int _p_level
The p refinement level the current data structures are set up for.
Definition: fe_abstract.h:597
libMesh::Elem
This is the base class from which all geometric element types are derived.
Definition: elem.h:100
libMesh::FEGenericBase< FEOutputType< T >::type >::dphidx
std::vector< std::vector< OutputShape > > dphidx
Shape function derivatives in the x direction.
Definition: fe_base.h:532
libMesh::Elem::is_face
virtual bool is_face(const unsigned int i) const =0
libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidxdy
std::vector< std::vector< OutputShape > > d2phidxdy
Shape function second derivatives in the x-y direction.
Definition: fe_base.h:590
libMesh::NODEELEM
Definition: enum_elem_type.h:66
libMesh::PeriodicBoundaryBase::get_variables
const std::set< unsigned int > & get_variables() const
Get the set of variables for this periodic boundary condition.
Definition: periodic_boundary_base.C:108
libMesh::FEAbstract::elem_type
ElemType elem_type
The element type the current data structures are set up for.
Definition: fe_abstract.h:591
libMesh::FEAbstract::get_refspace_nodes
static void get_refspace_nodes(const ElemType t, std::vector< Point > &nodes)
Definition: fe_abstract.C:308
libMesh::L2_LAGRANGE
Definition: enum_fe_family.h:41
libMesh::FEGenericBase< FEOutputType< T >::type >::determine_calculations
void determine_calculations()
Determine which values are to be calculated, for both the FE itself and for the FEMap.
Definition: fe_base.C:756
libMesh::THIRD
Definition: enum_order.h:44
libMesh::FE< Dim, L2_HIERARCHIC >::n_dofs
static unsigned int n_dofs(const ElemType t, const Order o)
libMesh::QUAD9
Definition: enum_elem_type.h:43
libMesh::FEGenericBase< FEOutputType< T >::type >::OutputNumberGradient
TensorTools::IncrementRank< OutputNumber >::type OutputNumberGradient
Definition: fe_base.h:123
libMesh::LAGRANGE_VEC
Definition: enum_fe_family.h:60
libMesh::err
OStreamProxy err
libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidy2
std::vector< std::vector< OutputShape > > d2phidy2
Shape function second derivatives in the y direction.
Definition: fe_base.h:600
libMesh::LAGRANGE
Definition: enum_fe_family.h:36
libMesh::SCALAR
Definition: enum_fe_family.h:58
libMesh::SUBDIVISION
Definition: enum_fe_family.h:55
libMesh::Elem::neighbor_ptr
const Elem * neighbor_ptr(unsigned int i) const
Definition: elem.h:2085
libMesh::Elem::node_ref
const Node & node_ref(const unsigned int i) const
Definition: elem.h:2031
libMesh::TRI3SUBDIVISION
Definition: enum_elem_type.h:69
libMesh::Real
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Definition: libmesh_common.h:121
libMesh::PeriodicBoundaryBase::pairedboundary
boundary_id_type pairedboundary
Definition: periodic_boundary_base.h:58
libMesh::Variable::active_on_subdomain
bool active_on_subdomain(subdomain_id_type sid) const
Definition: variable.h:136
libMesh::FEType::default_quadrature_order
Order default_quadrature_order() const
Definition: fe_type.h:353
libMesh::ReferenceCounter::_enable_print_counter
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called.
Definition: reference_counter.h:141
libMesh::FEContinuity
FEContinuity
Definition: enum_fe_family.h:77
libMesh::Elem::n_sides
virtual unsigned int n_sides() const =0
libMesh::PRISM18
Definition: enum_elem_type.h:52
libMesh::TRISHELL3
Definition: enum_elem_type.h:71
libMesh::Elem::node_ptr
const Node * node_ptr(const unsigned int i) const
Definition: elem.h:2009
libMesh::FEGenericBase< FEOutputType< T >::type >::d2phidx2
std::vector< std::vector< OutputShape > > d2phidx2
Shape function second derivatives in the x direction.
Definition: fe_base.h:585
libMesh::DofConstraintRow
std::map< dof_id_type, Real, std::less< dof_id_type >, Threads::scalable_allocator< std::pair< const dof_id_type, Real > > > DofConstraintRow
A row of the Dof constraint matrix.
Definition: dof_map.h:97
libMesh::FE< Dim, L2_HIERARCHIC >::side_map
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...
Definition: fe_boundary.C:325
libMesh::Elem::type
virtual ElemType type() const =0
libMesh::FIRST
Definition: enum_order.h:42
libMesh::Elem::which_neighbor_am_i
unsigned int which_neighbor_am_i(const Elem *e) const
This function tells you which neighbor e is.
Definition: elem.h:2323
libMesh::remote_elem
const RemoteElem * remote_elem
Definition: remote_elem.C:57
libMesh::FEAbstract::print_JxW
void print_JxW(std::ostream &os) const
Prints the Jacobian times the weight for each quadrature point.
Definition: fe_abstract.C:805
libMesh::TypesEqual
Definition: compare_types.h:51
libMesh::FEAbstract::calculate_d2phi
bool calculate_d2phi
Should we calculate shape function hessians?
Definition: fe_abstract.h:557
libMesh::FEGenericBase< FEOutputType< T >::type >::weight
std::vector< Real > weight
Used for certain infinite element families: the additional radial weight in local coordinates,...
Definition: fe_base.h:642
libMesh::PYRAMID13
Definition: enum_elem_type.h:54
libMesh::Quality::name
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
libMesh::DenseVector< Number >
libMesh::PYRAMID14
Definition: enum_elem_type.h:55
libMesh::EDGE2
Definition: enum_elem_type.h:35
libMesh::QUAD8
Definition: enum_elem_type.h:42
libMesh::ElemType
ElemType
Defines an enum for geometric element types.
Definition: enum_elem_type.h:33
libMesh::FE< Dim, L2_HIERARCHIC >::cached_nodes
std::vector< Point > cached_nodes
An array of the node locations on the last element we computed on.
Definition: fe.h:476
libMesh::TypeVector::absolute_fuzzy_equals
bool absolute_fuzzy_equals(const TypeVector< T > &rhs, Real tol=TOLERANCE) const
Definition: type_vector.h:1017
libMesh::NodeConstraintRow
std::map< const Node *, Real, std::less< const Node * >, Threads::scalable_allocator< std::pair< const Node *const, Real > > > NodeConstraintRow
A row of the Node constraint mapping.
Definition: dof_map.h:145
libMesh::FEInterface::shape
static Real shape(const unsigned int dim, const FEType &fe_t, const ElemType t, const unsigned int i, const Point &p)
Definition: fe_interface.C:687