4 #include "libmesh/getpot.h" 5 #include "libmesh/boundary_info.h" 6 #include "libmesh/dirichlet_boundaries.h" 7 #include "libmesh/dof_map.h" 8 #include "libmesh/fe_base.h" 9 #include "libmesh/fe_interface.h" 10 #include "libmesh/fem_context.h" 11 #include "libmesh/fem_system.h" 12 #include "libmesh/quadrature.h" 13 #include "libmesh/string_to_enum.h" 14 #include "libmesh/mesh.h" 15 #include "libmesh/parallel.h" 16 #include "libmesh/quadrature.h" 17 #include "libmesh/fem_context.h" 18 #include "libmesh/zero_function.h" 35 { this->_initialized =
true; }
38 { libmesh_not_implemented(); }
40 virtual void operator() (
const Point & p,
48 output(_T_var) = -x * (1 - x);
51 virtual std::unique_ptr<FunctionBase<Number>>
clone()
const 52 {
return std::make_unique<BdyFunction>(_T_var); }
61 this->add_variable (
"T", static_cast<Order>(_fe_order),
62 Utility::string_to_enum<FEFamily>(_fe_family));
64 GetPot infile(
"poisson.in");
65 exact_QoI[0] = infile(
"QoI_0", 0.0);
66 alpha = infile(
"alpha", 100.0);
69 this->time_evolving(T_var, 1);
71 #ifdef LIBMESH_ENABLE_DIRICHLET 84 this->get_dof_map().add_adjoint_dirichlet_boundary(
DirichletBoundary ({bottom_bdry_id}, {T_var}, &bottom_adjoint), 0);
85 #endif // LIBMESH_ENABLE_DIRICHLET 93 FEMContext & c = cast_ref<FEMContext &>(context);
104 FEBase* side_fe =
nullptr;
114 #define optassert(X) {if (!(X)) libmesh_error_msg("Assertion " #X " failed.");} 123 FEMContext & c = cast_ref<FEMContext &>(context);
127 FEBase* elem_fe =
nullptr;
131 const std::vector<Real> & JxW = elem_fe->get_JxW();
134 const std::vector<std::vector<Real>> & phi = elem_fe->get_phi();
135 const std::vector<std::vector<RealGradient>> & dphi = elem_fe->get_dphi();
138 const std::vector<Point > & q_point = elem_fe->get_xyz();
155 for (
unsigned int qp=0; qp != n_qpoints; qp++)
161 const Real x = q_point[qp](0);
162 const Real y = q_point[qp](1);
165 Real f = -alpha * ( ( (- 4 * alpha * alpha) * exp(-alpha*x) * y * (1 - y) ) + ( -8 + ( 8 * exp(-alpha*x) ) + ( 8 * ( 1 - exp(-alpha) )* x) ) );
168 for (
unsigned int i=0; i != n_T_dofs; i++)
169 F(i) += JxW[qp] * ( (f * phi[i][qp]) - alpha*(grad_T * dphi[i][qp]) ) ;
171 for (
unsigned int i=0; i != n_T_dofs; i++)
172 for (
unsigned int j=0; j != n_T_dofs; ++j)
174 K(i,j) += JxW[qp] * ( -alpha*(dphi[i][qp] * dphi[j][qp]) );
185 computed_QoI[0] = 0.0;
189 this->comm().sum(computed_QoI[0]);
virtual void init_context(DiffContext &context)
const DenseMatrix< Number > & get_elem_jacobian() const
Const accessor for element Jacobian.
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 zero() override final
Set every element in the vector to 0.
ConstFunction that simply returns 0.
void resize(const unsigned int n)
Resize the vector.
unsigned int n_dof_indices() const
Total number of dof indices on the element.
virtual void postprocess(void)
Runs a postprocessing loop over all elements, and if postprocess_sides is true over all sides...
This class allows one to associate Dirichlet boundary values with a given set of mesh boundary ids an...
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.
void compute_jacobian(const NumericVector< Number > &, SparseMatrix< Number > &J, NonlinearImplicitSystem &system)
Defines a dense subvector for use in finite element computations.
virtual bool element_time_derivative(bool request_jacobian, DiffContext &context)
Adds the time derivative contribution on elem to elem_residual.
const std::vector< std::vector< OutputGradient > > & get_dphi() const
Gradient interior_gradient(unsigned int var, unsigned int qp) const
virtual std::unique_ptr< FunctionBase< Number > > clone() const
virtual void init_data()
Initializes the member data fields associated with the system, so that, e.g., assemble() may be used...
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...
virtual_for_inffe const std::vector< Real > & get_JxW() const
const unsigned int _T_var
This class provides all data required for a physics package (e.g.
unsigned int n_points() const
virtual_for_inffe const std::vector< Point > & get_xyz() const
virtual void postprocess() override
Runs a postprocessing loop over all elements, and if postprocess_sides is true over all sides...
const DenseVector< Number > & get_elem_residual() const
Const accessor for element residual.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
BdyFunction(unsigned int T_var)
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...
Base class for functors that can be evaluated at a point and (optionally) time.
A Point defines a location in LIBMESH_DIM dimensional Real space.
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::vector< std::vector< OutputShape > > & get_phi() const