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/elem.h"
64 int num_ids = input.vector_variable_size(
"QoI/Vorticity/enabled_subdomains" );
68 std::cerr <<
"Error: Must specify at least one subdomain id on which to compute vorticity." << std::endl;
72 for(
int i = 0; i < num_ids; i++ )
74 libMesh::subdomain_id_type s_id = input(
"QoI/Vorticity/enabled_subdomains", -1, i );
75 _subdomain_ids.insert( s_id );
79 std::string u_var_name = input(
"Physics/VariableNames/u_velocity",
u_var_name_default);
80 std::string v_var_name = input(
"Physics/VariableNames/v_velocity",
v_var_name_default);
81 this->_u_var = system.variable_number(u_var_name);
82 this->_v_var = system.variable_number(v_var_name);
89 libMesh::FEBase* u_fe = NULL;
90 libMesh::FEBase* v_fe = NULL;
92 context.get_element_fe<libMesh::Real>(this->
_u_var, u_fe);
93 context.get_element_fe<libMesh::Real>(this->
_v_var, v_fe);
104 const unsigned int qoi_index )
109 libMesh::FEBase* element_fe;
110 context.get_element_fe<libMesh::Real>(this->
_u_var, element_fe);
111 const std::vector<libMesh::Real> &JxW = element_fe->get_JxW();
113 unsigned int n_qpoints = context.get_element_qrule().n_points();
116 libMesh::Number& qoi = context.get_qois()[qoi_index];
118 for(
unsigned int qp = 0; qp != n_qpoints; qp++ )
120 libMesh::Gradient grad_u = 0.;
121 libMesh::Gradient grad_v = 0.;
122 context.interior_gradient( this->_u_var, qp, grad_u );
123 context.interior_gradient( this->
_v_var, qp, grad_v );
124 qoi += (grad_v(0) - grad_u(1)) * JxW[qp];
132 const unsigned int qoi_index )
138 libMesh::FEBase* element_fe;
139 context.get_element_fe<libMesh::Real>(this->
_u_var, element_fe);
142 const std::vector<libMesh::Real> &JxW = element_fe->get_JxW();
145 const std::vector<std::vector<libMesh::RealGradient> >& du_phi =
146 context.get_element_fe(_u_var)->get_dphi();
147 const std::vector<std::vector<libMesh::RealGradient> >& dv_phi =
148 context.get_element_fe(
_v_var)->get_dphi();
151 const unsigned int n_T_dofs = context.get_dof_indices(0).size();
152 unsigned int n_qpoints = context.get_element_qrule().n_points();
157 libMesh::DenseSubVector<libMesh::Number> &Qu = context.get_qoi_derivatives(qoi_index, _u_var);
158 libMesh::DenseSubVector<libMesh::Number> &Qv = context.get_qoi_derivatives(qoi_index,
_v_var);
161 for(
unsigned int qp = 0; qp != n_qpoints; qp++ )
163 for(
unsigned int i = 0; i != n_T_dofs; i++ )
165 Qu(i) += - dv_phi[i][qp](1) * JxW[qp];
166 Qv(i) += du_phi[i][qp](0) * JxW[qp];
Vorticity()
User never call default constructor.
virtual QoIBase * clone() const
Required to provide clone (deep-copy) for adding QoI object to libMesh objects.
virtual void init_context(AssemblyContext &context)
std::set< libMesh::subdomain_id_type > _subdomain_ids
List of sumdomain ids for which we want to compute this QoI.
const std::string v_var_name_default
y-velocity
const std::string u_var_name_default
Default physics variable names.
virtual void element_qoi(AssemblyContext &context, const unsigned int qoi_index)
Compute the qoi value.
Interface with libMesh for solving Multiphysics problems.
virtual void init(const GetPot &input, const MultiphysicsSystem &system, unsigned int qoi_num)
Initialize local variables.
virtual void element_qoi_derivative(AssemblyContext &context, const unsigned int qoi_index)
Compute the qoi derivative with respect to the solution.
VariableIndex _v_var
v-velocity component variable index
VariableIndex _u_var
u-velocity component variable index