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" 36 this->add_variable (
"u", static_cast<Order>(_fe_order),
37 Utility::string_to_enum<FEFamily>(_fe_family));
47 FEMContext & c = cast_ref<FEMContext &>(context);
55 const std::set<unsigned char> & elem_dims =
58 for (
const auto &
dim : elem_dims)
66 if (this->_hilbert_order > 0)
75 auto & input_context = input_contexts[&c];
76 if (input_system && !input_context)
78 input_context = std::make_unique<FEMContext>(*input_system);
81 _goal_func->init_context(*input_context);
91 FEMContext & c = cast_ref<FEMContext &>(context);
95 if (!_subdomains_list.empty() &&
96 !_subdomains_list.count(elem.subdomain_id()))
97 return request_jacobian;
105 const std::vector<std::vector<Real>> & phi = c.
get_element_fe(0)->get_phi();
118 FEMContext & input_c = *libmesh_map_find(input_contexts, &c);
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]);
134 if (_hilbert_order > 0)
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]);
156 if (_hilbert_order > 0)
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;
Real get_elem_solution_derivative() const
The derivative of the current elem_solution w.r.t.
const DenseMatrix< Number > & get_elem_jacobian() const
Const accessor for element Jacobian.
Number interior_value(unsigned int var, unsigned int qp) 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...
virtual void pre_fe_reinit(const System &, const Elem *e)
Reinitializes local data vectors/matrices on the current geometric element.
const Elem & get_elem() const
Accessor for current Elem object.
virtual void init_context(DiffContext &) override
unsigned int n_dof_indices() const
Total number of dof indices on the element.
This is the base class from which all geometric element types are derived.
virtual bool element_time_derivative(bool request_jacobian, libMesh::DiffContext &context)
Adds the time derivative contribution on elem to elem_residual.
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.
virtual void elem_fe_reinit(const std::vector< Point > *const pts=nullptr)
Reinitializes interior FE objects on the current geometric element.
Defines a dense subvector for use in finite element computations.
Gradient interior_gradient(unsigned int var, unsigned int qp) const
Defines a dense submatrix for use in Finite Element-type computations.
virtual void init_data() override
Initializes the member data fields associated with the system, so that, e.g., assemble() may be used...
This class provides all data required for a physics package (e.g.
unsigned int n_points() const
const DenseVector< Number > & get_elem_residual() const
Const accessor for element residual.
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...
virtual void init_data()
Initializes the member data fields associated with the system, so that, e.g., assemble() may be used...
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.
const std::set< unsigned char > & elem_dimensions() const
virtual void init_context(libMesh::DiffContext &context)