20#include "libmesh/elem.h"
21#include "libmesh/fe_base.h"
22#include "libmesh/fe_interface.h"
23#include "libmesh/fem_context.h"
24#include "libmesh/getpot.h"
25#include "libmesh/mesh.h"
26#include "libmesh/quadrature.h"
27#include "libmesh/string_to_enum.h"
28#include "libmesh/utility.h"
37 Utility::string_to_enum<FEFamily>(
_fe_family));
40 FEMSystem::init_data();
47 FEMContext & c = cast_ref<FEMContext &>(context);
55 const std::set<unsigned char> & elem_dims =
58 for (
const auto &
dim : elem_dims)
78 input_context = std::make_unique<FEMContext>(*
input_system);
84 FEMSystem::init_context(context);
91 FEMContext & c = cast_ref<FEMContext &>(context);
97 return request_jacobian;
105 const std::vector<std::vector<Real>> & phi = c.
get_element_fe(0)->get_phi();
125 for (
unsigned int qp=0; qp != n_qpoints; qp++)
128 const Number ufunc = (*_goal_func)(input_c, xyz[qp]);
129 const Number err_u = u - ufunc;
131 for (
unsigned int i=0; i != n_u_dofs; i++)
132 F(i) += JxW[qp] * (err_u * phi[i][qp]);
136 const std::vector<std::vector<RealGradient>> & dphi =
140 Gradient ufuncgrad = (*_goal_grad)(input_c, xyz[qp]);
141 const Gradient err_grad_u = grad_u - ufuncgrad;
143 for (
unsigned int i=0; i != n_u_dofs; i++)
144 F(i) += JxW[qp] * (err_grad_u * dphi[i][qp]);
147 if (request_jacobian)
149 const Number JxWxD = JxW[qp] *
152 for (
unsigned int i=0; i != n_u_dofs; i++)
153 for (
unsigned int j=0; j != n_u_dofs; ++j)
154 K(i,j) += JxWxD * (phi[i][qp] * phi[j][qp]);
158 const std::vector<std::vector<RealGradient>> & dphi =
161 for (
unsigned int i=0; i != n_u_dofs; i++)
162 for (
unsigned int j=0; j != n_u_dofs; ++j)
163 K(i,j) += JxWxD * (dphi[i][qp] * dphi[j][qp]);
168 return request_jacobian;
libMesh::System * input_system
virtual void init_context(libMesh::DiffContext &context)
std::unique_ptr< libMesh::FEMFunctionBase< libMesh::Number > > _goal_func
virtual void init_data()
Initializes the member data fields associated with the system, so that, e.g., assemble() may be used.
unsigned int _hilbert_order
std::map< libMesh::FEMContext *, std::unique_ptr< libMesh::FEMContext > > input_contexts
std::set< libMesh::subdomain_id_type > _subdomains_list
virtual bool element_time_derivative(bool request_jacobian, libMesh::DiffContext &context)
Adds the time derivative contribution on elem to elem_residual.
Defines a dense submatrix for use in Finite Element-type computations.
Defines a dense subvector for use in finite element computations.
This class provides all data required for a physics package (e.g.
Real get_elem_solution_derivative() const
The derivative of the current elem_solution w.r.t.
unsigned int n_dof_indices() const
Total number of dof indices on the element.
const DenseVector< Number > & get_elem_residual() const
Const accessor for element residual.
const DenseMatrix< Number > & get_elem_jacobian() const
Const accessor for element Jacobian.
This is the base class from which all geometric element types are derived.
subdomain_id_type subdomain_id() const
virtual_for_inffe const std::vector< Real > & get_JxW() const
virtual_for_inffe const std::vector< Point > & get_xyz() const
This class forms the foundation from which generic finite elements may be derived.
const std::vector< std::vector< OutputShape > > & get_phi() const
const std::vector< std::vector< OutputGradient > > & get_dphi() const
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...
Gradient interior_gradient(unsigned int var, unsigned int qp) const
const std::set< unsigned char > & elem_dimensions() const
virtual void pre_fe_reinit(const System &, const Elem *e)
Reinitializes local data vectors/matrices on the current geometric element.
const QBase & get_element_qrule() const
Accessor for element interior quadrature rule for the dimension of the current _elem.
Number interior_value(unsigned int var, unsigned int qp) const
const Elem & get_elem() const
Accessor for current Elem object.
virtual void elem_fe_reinit(const std::vector< Point > *const pts=nullptr)
Reinitializes interior FE objects on the current geometric element.
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.
unsigned int n_points() const
unsigned int add_variable(std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variable var to the list of variables for this system.
This class defines a vector in LIBMESH_DIM dimensional Real or Complex space.
The libMesh namespace provides an interface to certain functionality in the library.