34 #include "libmesh/getpot.h"
35 #include "libmesh/fem_system.h"
36 #include "libmesh/quadrature.h"
37 #include "libmesh/fe_base.h"
38 #include "libmesh/parsed_fem_function.h"
61 std::string qoi_functional_string =
62 input(
"QoI/ParsedInterior/qoi_functional", std::string(
"0"));
64 if (qoi_functional_string ==
"0")
65 libmesh_error_msg(
"Error! Zero ParsedInteriorQoI specified!" <<
69 (
new libMesh::ParsedFEMFunction<libMesh::Number>
70 (system, qoi_functional_string));
75 libMesh::FEBase* element_fe;
76 context.get_element_fe<libMesh::Real>(0, element_fe);
77 element_fe->get_JxW();
78 element_fe->get_xyz();
84 const unsigned int qoi_index )
86 libMesh::FEBase* element_fe;
87 context.get_element_fe<libMesh::Real>(0, element_fe);
88 const std::vector<libMesh::Real> &JxW = element_fe->get_JxW();
90 const std::vector<libMesh::Point>& x_qp = element_fe->get_xyz();
92 unsigned int n_qpoints = context.get_element_qrule().n_points();
95 libMesh::Number& qoi = context.get_qois()[qoi_index];
97 for(
unsigned int qp = 0; qp != n_qpoints; qp++ )
99 const libMesh::Number func_val =
100 (*qoi_functional)(context, x_qp[qp], context.get_time());
102 qoi += func_val * JxW[qp];
107 const unsigned int qoi_index )
109 libMesh::FEBase* element_fe;
110 context.get_element_fe<libMesh::Real>(0, element_fe);
111 const std::vector<libMesh::Real> &JxW = element_fe->get_JxW();
113 const std::vector<libMesh::Point>& x_qp = element_fe->get_xyz();
116 const unsigned int n_u_dofs = context.get_dof_indices().size();
118 unsigned int n_qpoints = context.get_element_qrule().n_points();
122 libMesh::DenseVector<libMesh::Number>& elem_solution =
123 const_cast<libMesh::DenseVector<libMesh::Number>&
>
124 (context.get_elem_solution());
127 libMesh::DenseVector<libMesh::Number> &Qu =
128 context.get_qoi_derivatives()[qoi_index];
130 for(
unsigned int qp = 0; qp != n_qpoints; qp++ )
136 for(
unsigned int i = 0; i != n_u_dofs; ++i )
138 libMesh::Number ¤t_solution = elem_solution(i);
139 const libMesh::Number original_solution = current_solution;
141 current_solution = original_solution + libMesh::TOLERANCE;
143 const libMesh::Number plus_val =
144 (*qoi_functional)(context, x_qp[qp], context.get_time());
146 current_solution = original_solution - libMesh::TOLERANCE;
148 const libMesh::Number minus_val =
149 (*qoi_functional)(context, x_qp[qp], context.get_time());
151 Qu(i) += (plus_val - minus_val) *
152 (0.5 / libMesh::TOLERANCE) * JxW[qp];
155 current_solution = original_solution;
virtual ~ParsedInteriorQoI()
ParsedInteriorQoI()
User never call default constructor.
Interface with libMesh for solving Multiphysics problems.
virtual void element_qoi(AssemblyContext &context, const unsigned int qoi_index)
Compute the qoi value.
virtual void init(const GetPot &input, const MultiphysicsSystem &system)
Initialize local variables.
virtual void element_qoi_derivative(AssemblyContext &context, const unsigned int qoi_index)
Compute the qoi derivative with respect to the solution.
virtual void init_context(AssemblyContext &context)
libMesh::AutoPtr< libMesh::FEMFunctionBase< libMesh::Number > > qoi_functional
virtual QoIBase * clone() const
Required to provide clone (deep-copy) for adding QoI object to libMesh objects.