20 #ifndef LIBMESH_FEM_CONTEXT_H    21 #define LIBMESH_FEM_CONTEXT_H    24 #include "libmesh/diff_context.h"    25 #include "libmesh/id_types.h"    26 #include "libmesh/fe_type.h"    27 #include "libmesh/fe_base.h"    28 #include "libmesh/vector_value.h"    30 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES    31 #include "libmesh/tensor_value.h"    44 template <
typename T> 
class FEGenericBase;
    48 template <
typename T> 
class NumericVector;
    75               const std::vector<unsigned int> * 
active_vars = 
nullptr,
    76               bool allocate_local_matrices = 
true);
    88               int extra_quadrature_order,
    89               const std::vector<unsigned int> * 
active_vars = 
nullptr,
    90               bool allocate_local_matrices = 
true);
   168 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES   193 #endif // LIBMESH_ENABLE_SECOND_DERIVATIVES   243 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES   268 #endif // LIBMESH_ENABLE_SECOND_DERIVATIVES   276   template<
typename OutputShape>
   278   { this->get_element_fe<OutputShape>(var,fe,this->
get_elem_dim()); }
   293   template<
typename OutputShape>
   295                        unsigned short dim ) 
const;
   302                        unsigned short dim ) 
const;
   316   template<
typename OutputShape>
   318   { this->get_side_fe<OutputShape>(var,fe,this->
get_elem_dim()); }
   333   template<
typename OutputShape>
   335                     unsigned short dim ) 
const;
   342                     unsigned short dim ) 
const;
   353   template<
typename OutputShape>
   369   template<
typename OutputType>
   372                       OutputType & u) 
const;
   378   template<
typename OutputType>
   381                        std::vector<OutputType> & interior_values_vector) 
const;
   389   template<
typename OutputType>
   392                   OutputType & u) 
const;
   398   template<
typename OutputType>
   401                    std::vector<OutputType> & side_values_vector) 
const;
   412   template<
typename OutputType>
   424   template<
typename OutputType>
   426                          OutputType & du) 
const;
   434   template<
typename OutputType>
   437                           std::vector<OutputType> & interior_gradients_vector) 
const;
   445   template<
typename OutputType>
   448                      OutputType & du) 
const;
   456   template<
typename OutputType>
   459                       std::vector<OutputType> & side_gradients_vector) 
const;
   470   template<
typename OutputType>
   476 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES   483   template<
typename OutputType>
   486                         OutputType & d2u) 
const;
   493   template<
typename OutputType>
   496                          std::vector<OutputType> & d2u_vals) 
const;
   504   template<
typename OutputType>
   507                     OutputType & d2u) 
const;
   514   template<
typename OutputType>
   517                      std::vector<OutputType> & d2u_vals) 
const;
   528   template<
typename OutputType>
   534 #endif // LIBMESH_ENABLE_SECOND_DERIVATIVES   541   template<
typename OutputType>
   544                      OutputType & u) 
const;
   552   template<
typename OutputType>
   555                               OutputType & u) 
const;
   562   template<
typename OutputType>
   565                  OutputType & u) 
const;
   571   template<
typename OutputType>
   574                   OutputType & u) 
const;
   581   template<
typename OutputType>
   584                       OutputType & u) 
const;
   590   template<
typename OutputType>
   593                   OutputType & u) 
const;
   599   template<
typename OutputType>
   602                    OutputType & u) 
const;
   610   template<
typename OutputType>
   613                             OutputType & u) 
const;
   621   template<
typename OutputType>
   624                         OutputType & u) 
const;
   635   template<
typename OutputType>
   647   template<
typename OutputType>
   650                                OutputType & grad_u) 
const;
   658   template<
typename OutputType>
   661                            OutputType & grad_u) 
const;
   672   template<
typename OutputType>
   678 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES   685   template<
typename OutputType>
   688                               OutputType & hess_u) 
const;
   696   template<
typename OutputType>
   699                           OutputType & hess_u) 
const;
   710   template<
typename OutputType>
   716 #endif // LIBMESH_ENABLE_SECOND_DERIVATIVES   722   template<
typename OutputType>
   725                      OutputType & curl_u) 
const;
   734   template<
typename OutputType>
   744   template<
typename OutputType>
   747                     OutputType & div_u) 
const;
   786   virtual void elem_fe_reinit(
const std::vector<Point> * 
const pts = 
nullptr);
   903   { 
return (this->
_elem != 
nullptr); }
   910     return *(this->
_elem); }
   917     return *(
const_cast<Elem *
>(this->
_elem)); }
   937   { 
return this->
_dim; }
  1042   template<
typename OutputShape>
  1046                                             const int get_derivative_level = -1) 
const;
  1081 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS  1086   template<
typename OutputShape>
  1089                                           const int get_derivative_level ) 
const;
  1109   template <
typename OutputType>
  1138   template<
typename OutputType,
  1141   void some_value(
unsigned int var, 
unsigned int qp, OutputType & u) 
const;
  1147   template<
typename OutputType,
  1150   void some_gradient(
unsigned int var, 
unsigned int qp, OutputType & u) 
const;
  1152 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES  1157   template<
typename OutputType,
  1160   void some_hessian(
unsigned int var, 
unsigned int qp, OutputType & u) 
const;
  1168   std::vector<std::map<FEType, std::unique_ptr<FEAbstract>>> 
_element_fe;
  1169   std::vector<std::map<FEType, std::unique_ptr<FEAbstract>>> 
_side_fe;
  1170   std::map<FEType, std::unique_ptr<FEAbstract>> 
_edge_fe;
  1276 template<
typename OutputShape>
  1279                                  unsigned short dim )
 const  1288                                  unsigned short dim )
 const  1303 template<
typename OutputShape>
  1306                               unsigned short dim )
 const  1310   fe = cast_ptr<FEGenericBase<OutputShape> *>( (
_side_fe_var[
dim][var] ) );
  1315                               unsigned short dim )
 const  1330 template<
typename OutputShape>
  1335   fe = cast_ptr<FEGenericBase<OutputShape> *>( 
_edge_fe_var[var] );
  1355 #endif // LIBMESH_FEM_CONTEXT_H void point_accel(unsigned int var, const Point &p, OutputType &u) const
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
void interior_curl(unsigned int var, unsigned int qp, OutputType &curl_u) const
unsigned char get_edge() const
Accessor for current edge of Elem object. 
virtual void nonlocal_reinit(Real theta) override
Gives derived classes the opportunity to reinitialize data needed for nonlocal calculations at a new ...
FEGenericBase< OutputShape > * cached_fe(const unsigned int elem_dim, const FEType fe_type, const int get_derivative_level) const
void(FEMContext::* value_getter)(unsigned int, value_base *&, unsigned short) const
Number fixed_side_value(unsigned int var, unsigned int qp) const
Number side_value(unsigned int var, unsigned int qp) const
Tensor fixed_point_hessian(unsigned int var, const Point &p) const
void set_mesh_z_var(unsigned int z_var)
Accessor for z-variable of moving mesh System. 
void point_rate(unsigned int var, const Point &p, OutputType &u) const
Number interior_value(unsigned int var, unsigned int qp) const
void elem_position_set(Real theta)
Uses the coordinate data specified by mesh_*_position configuration to set the geometry of elem to th...
This class provides all data required for a physics package (e.g. 
void get_side_fe(unsigned int var, FEGenericBase< OutputShape > *&fe) const
Accessor for edge/face (2D/3D) finite element object for variable var for the largest dimension in th...
virtual void pre_fe_reinit(const System &, const Elem *e)
Reinitializes local data vectors/matrices on the current geometric element. 
unsigned int get_mesh_x_var() const
Accessor for x-variable of moving mesh System. 
std::unique_ptr< const std::vector< unsigned int > > _active_vars
Variables on which to enable calculations, or nullptr if all variables in the System are to be enable...
void set_mesh_x_var(unsigned int x_var)
Accessor for x-variable of moving mesh System. 
const NumericVector< Number > * _custom_solution
Data with which to do algebra reinitialization. 
void set_elem(const Elem *e)
Helper function to promote accessor usage. 
void get_edge_fe(unsigned int var, FEGenericBase< OutputShape > *&fe) const
Accessor for edge (3D only!) finite element object for variable var. 
std::unique_ptr< FEGenericBase< RealGradient > > _real_grad_fe
static constexpr Real TOLERANCE
unsigned char get_elem_dim() const
const Elem & get_elem() const
Accessor for current Elem object. 
FEMContext(const System &sys, const std::vector< unsigned int > *active_vars=nullptr, bool allocate_local_matrices=true)
Constructor. 
bool _real_grad_fe_is_inf
void side_hessians(unsigned int var, const NumericVector< Number > &_system_vector, std::vector< OutputType > &d2u_vals) const
Fills a vector of hessians of the _system_vector at the all the quadrature points on the current elem...
void interior_accel(unsigned int var, unsigned int qp, OutputType &u) const
TensorTools::MakeReal< OutputType >::type value_shape
const QBase & get_element_qrule(unsigned short dim) const
Accessor for element interior quadrature rule. 
const DenseSubVector< Number > &(DiffContext::* diff_subsolution_getter)(unsigned int) const
Helper typedef to simplify refactoring. 
FEGenericBase< value_shape > value_base
void interior_gradients(unsigned int var, const NumericVector< Number > &_system_vector, std::vector< OutputType > &interior_gradients_vector) const
Fills a vector with the gradient of the solution variable var at all the quadrature points in the cur...
virtual void elem_edge_reinit(Real theta) override
Resets the current time in the context. 
This is the base class from which all geometric element types are derived. 
void set_algebraic_type(const AlgebraicType atype)
Setting which determines whether to initialize algebraic structures (elem_*) on each element and set ...
int _extra_quadrature_order
The extra quadrature order for this context. 
This class defines a vector in LIBMESH_DIM dimensional Real or Complex space. 
void elem_position_get()
Uses the geometry of elem to set the coordinate data specified by mesh_*_position configuration...
The libMesh namespace provides an interface to certain functionality in the library. 
FEGenericBase< hess_shape > hess_base
void interior_values(unsigned int var, const NumericVector< Number > &_system_vector, std::vector< OutputType > &interior_values_vector) const
Fills a vector of values of the _system_vector at the all the quadrature points in the current elemen...
bool has_side_boundary_id(boundary_id_type id) const
Reports if the boundary id is found on the current side. 
void use_default_quadrature_rules(int extra_quadrature_order=0)
Use quadrature rules designed to over-integrate a mass matrix, plus extra_quadrature_order. 
virtual ~FEMContext()
Destructor. 
void side_boundary_ids(std::vector< boundary_id_type > &vec_to_fill) const
As above, but fills in the std::set provided by the user. 
unsigned char get_side() const
Accessor for current side of Elem object. 
Number point_value(unsigned int var, const Point &p) const
std::vector< std::map< FEType, std::unique_ptr< FEAbstract > > > _element_fe
Finite element objects for each variable's interior, sides and edges. 
unsigned char get_dim() const
Accessor for cached mesh dimension. 
virtual void elem_fe_reinit(const std::vector< Point > *const pts=nullptr)
Reinitializes interior FE objects on the current geometric element. 
std::unique_ptr< FEGenericBase< Real > > _real_fe
Number fixed_interior_value(unsigned int var, unsigned int qp) const
void interior_rate_gradient(unsigned int var, unsigned int qp, OutputType &u) const
Defines a dense subvector for use in finite element computations. 
virtual void set_mesh_system(System *sys)
Tells the FEMContext that system sys contains the isoparametric Lagrangian variables which correspond...
Tensor fixed_side_hessian(unsigned int var, unsigned int qp) const
unsigned char edge
Current edge for edge_* to examine. 
std::set< unsigned char > _elem_dims
Cached dimensions of elements in the mesh, plus dimension 0 if SCALAR variables are in use...
Gradient interior_gradient(unsigned int var, unsigned int qp) const
void point_curl(unsigned int var, const Point &p, OutputType &curl_u, const Real tolerance=TOLERANCE) const
unsigned char _elem_dim
Cached dimension of this->_elem. 
void side_gradients(unsigned int var, const NumericVector< Number > &_system_vector, std::vector< OutputType > &side_gradients_vector) const
Fills a vector with the gradient of the solution variable var at all the quadrature points on the cur...
Tensor side_hessian(unsigned int var, unsigned int qp) const
virtual void side_fe_reinit()
Reinitializes side FE objects on the current geometric element. 
std::map< FEType, std::unique_ptr< FEAbstract > > _edge_fe
void _update_time_from_system(Real theta)
Update the time in the context object for the given value of theta, based on the values of "time" and...
void init_internal_data(const System &sys)
Helper function used in constructors to set up internal data. 
Gradient fixed_point_gradient(unsigned int var, const Point &p) const
const QBase & get_side_qrule(unsigned short dim) const
Accessor for element side quadrature rule. 
void side_accel(unsigned int var, unsigned int qp, OutputType &u) const
Manages consistently variables, degrees of freedom, and coefficient vectors. 
void set_jacobian_tolerance(Real tol)
Calls set_jacobian_tolerance() on all the FE objects controlled by this class. 
System * _mesh_sys
System from which to acquire moving mesh information. 
void interior_hessians(unsigned int var, const NumericVector< Number > &_system_vector, std::vector< OutputType > &d2u_vals) const
Fills a vector of hessians of the _system_vector at the all the quadrature points in the current elem...
void some_value(unsigned int var, unsigned int qp, OutputType &u) const
Helper function to reduce some code duplication in the *interior_value methods. 
void some_hessian(unsigned int var, unsigned int qp, OutputType &u) const
Helper function to reduce some code duplication in the *interior_hessian methods. ...
FEType find_hardest_fe_type()
Helper function for creating quadrature rules. 
Tensor interior_hessian(unsigned int var, unsigned int qp) const
const std::vector< unsigned int > * active_vars() const
Return a pointer to the vector of active variables being computed for, or a null pointer if all varia...
Tensor point_hessian(unsigned int var, const Point &p) const
Gradient fixed_interior_gradient(unsigned int var, unsigned int qp) const
unsigned int _mesh_x_var
Variables from which to acquire moving mesh information. 
The BoundaryInfo class contains information relevant to boundary conditions including storing faces...
void use_unweighted_quadrature_rules(int extra_quadrature_order=0)
Use quadrature rules designed to exactly integrate unweighted undistorted basis functions, plus extra_quadrature_order. 
TensorTools::MakeReal< Rank1Decrement >::type grad_shape
This class provides all data required for a physics package (e.g. 
TensorTools::MakeReal< Rank2Decrement >::type hess_shape
AlgebraicType _atype
Keep track of what type of algebra reinitialization is to be done. 
void side_values(unsigned int var, const NumericVector< Number > &_system_vector, std::vector< OutputType > &side_values_vector) const
Fills a vector of values of the _system_vector at the all the quadrature points on the current elemen...
const BoundaryInfo & _boundary_info
Saved reference to BoundaryInfo on the mesh for this System. 
std::vector< std::vector< FEAbstract * > > _element_fe_var
Pointers to the same finite element objects, but indexed by variable number. 
FEGenericBase< grad_shape > grad_base
void(FEMContext::* hess_getter)(unsigned int, hess_base *&, unsigned short) const
FEBase * get_side_fe(unsigned int var) const
Accessor for side finite element object for scalar-valued variable var for the largest dimension in t...
FEGenericBase< Real > FEBase
int _real_grad_fe_derivative_level
TensorTools::DecrementRank< Rank1Decrement >::type Rank2Decrement
virtual void elem_side_reinit(Real theta) override
Resets the current time in the context. 
Number fixed_point_value(unsigned int var, const Point &p) const
unsigned char _dim
Cached dimension of largest dimension element in this mesh. 
virtual void edge_fe_reinit()
Reinitializes edge FE objects on the current geometric element. 
std::vector< FEAbstract * > _edge_fe_var
Elem & get_elem()
Accessor for current Elem object. 
std::vector< std::unique_ptr< QBase > > _side_qrule
Quadrature rules for element sides The FEM context will try to find a quadrature rule that correctly ...
std::vector< std::map< FEType, std::unique_ptr< FEAbstract > > > _side_fe
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::vector< std::unique_ptr< QBase > > _element_qrule
Quadrature rule for element interior. 
unsigned char side
Current side for side_* to examine. 
int _real_fe_derivative_level
AlgebraicType
Enum describing what data to use when initializing algebraic structures on each element. 
TensorTools::DecrementRank< OutputType >::type Rank1Decrement
void set_mesh_y_var(unsigned int y_var)
Accessor for y-variable of moving mesh System. 
std::unique_ptr< QBase > _edge_qrule
Quadrature rules for element edges. 
Helper nested class for C++03-compatible "template typedef". 
const System * get_mesh_system() const
Accessor for moving mesh System. 
void get_element_fe(unsigned int var, FEGenericBase< OutputShape > *&fe) const
Accessor for interior finite element object for variable var for the largest dimension in the mesh...
Gradient fixed_side_gradient(unsigned int var, unsigned int qp) const
unsigned int get_mesh_y_var() const
Accessor for y-variable of moving mesh System. 
void(FEMContext::* grad_getter)(unsigned int, grad_base *&, unsigned short) const
AlgebraicType algebraic_type() const
DiffContext(const System &, bool allocate_local_matrices=true)
Constructor. 
FEGenericBase< OutputShape > * build_new_fe(const FEGenericBase< OutputShape > *fe, const Point &p, const Real tolerance=TOLERANCE, const int get_derivative_level=-1) const
Helper function to reduce some code duplication in the *_point_* methods. 
void interior_div(unsigned int var, unsigned int qp, OutputType &div_u) const
const QBase & get_edge_qrule() const
Accessor for element edge quadrature rule. 
void some_gradient(unsigned int var, unsigned int qp, OutputType &u) const
Helper function to reduce some code duplication in the *interior_gradient methods. 
void set_custom_solution(const NumericVector< Number > *custom_sol)
Set a NumericVector to be used in place of current_local_solution for calculating elem_solution...
std::vector< std::vector< FEAbstract * > > _side_fe_var
This class forms the foundation from which generic finite elements may be derived. 
Gradient point_gradient(unsigned int var, const Point &p) const
const Elem * _elem
Current element for element_* to examine. 
void attach_quadrature_rules()
Helper function for attaching quadrature rules. 
void _do_elem_position_set(Real theta)
Uses the coordinate data specified by mesh_*_position configuration to set the geometry of elem to th...
bool has_elem() const
Test for current Elem object. 
Gradient side_gradient(unsigned int var, unsigned int qp) const
FEBase * get_element_fe(unsigned int var) const
Accessor for interior finite element object for scalar-valued variable var for the largest dimension ...
void interior_rate(unsigned int var, unsigned int qp, OutputType &u) const
template class LIBMESH_EXPORT FEGenericBase< Real >
A Point defines a location in LIBMESH_DIM dimensional Real space. 
System * get_mesh_system()
Accessor for moving mesh System. 
The QBase class provides the basic functionality from which various quadrature rules can be derived...
void ErrorVector unsigned int
void side_rate(unsigned int var, unsigned int qp, OutputType &u) const
This class forms the foundation from which generic finite elements may be derived. 
const QBase & get_element_qrule() const
Accessor for element interior quadrature rule for the dimension of the current _elem. 
virtual void elem_reinit(Real theta) override
Resets the current time in the context. 
unsigned int get_mesh_z_var() const
Accessor for z-variable of moving mesh System. 
const std::set< unsigned char > & elem_dimensions() const
const QBase & get_side_qrule() const
Accessor for element side quadrature rule for the dimension of the current _elem. ...
This class defines a tensor in LIBMESH_DIM dimensional Real or Complex space. 
Tensor fixed_interior_hessian(unsigned int var, unsigned int qp) const