36 #include "libmesh/getpot.h"
37 #include "libmesh/mesh.h"
38 #include "libmesh/fem_system.h"
44 (
const std::string & helper_name,
52 if (input.have_variable(
"Stabilization/tau_constant_vel"))
54 (_C, input,
"Stabilization/tau_constant_vel", _C );
57 (_C, input,
"Stabilization/tau_constant", _C );
59 if (input.have_variable(
"Stabilization/tau_factor_vel"))
61 (_tau_factor, input,
"Stabilization/tau_factor_vel", _tau_factor );
64 (_tau_factor, input,
"Stabilization/tau_factor", _tau_factor );
75 libMesh::Gradient& grad_u,
76 libMesh::Gradient& grad_v )
const
78 return libMesh::RealGradient( U*grad_u, U*grad_v );
82 libMesh::Gradient& grad_u,
83 libMesh::Gradient& grad_v,
84 libMesh::Gradient& grad_w )
const
86 return libMesh::RealGradient( U*grad_u, U*grad_v, U*grad_w );
90 libMesh::RealTensor& hess_v )
const
92 return libMesh::RealGradient( hess_u(0,0) + hess_u(1,1),
93 hess_v(0,0) + hess_v(1,1) );
97 const libMesh::Gradient& U,
98 const libMesh::Gradient& grad_u,
99 const libMesh::Gradient& grad_v,
100 const libMesh::RealTensor& hess_u,
101 const libMesh::RealTensor& hess_v )
const
103 return libMesh::RealGradient( hess_u(0,0) + hess_u(1,1) + (grad_u(0) - U(0)/r)/r,
104 hess_v(0,0) + hess_v(1,1) + grad_v(0)/r );
108 libMesh::RealTensor& hess_v,
109 libMesh::RealTensor& hess_w )
const
111 return libMesh::RealGradient( hess_u(0,0) + hess_u(1,1) + hess_u(2,2),
112 hess_v(0,0) + hess_v(1,1) + hess_v(2,2),
113 hess_w(0,0) + hess_w(1,1) + hess_w(2,2) );
117 libMesh::RealTensor& hess_v )
const
119 return libMesh::RealGradient( hess_u(0,0) + hess_v(0,1),
120 hess_u(1,0) + hess_v(1,1));
124 const libMesh::Gradient& U,
125 const libMesh::Gradient& grad_u,
126 const libMesh::RealTensor& hess_u,
127 const libMesh::RealTensor& hess_v )
const
129 return libMesh::RealGradient( hess_u(0,0) + hess_v(0,1) + (grad_u(0) - U(0)/r)/r,
130 hess_u(1,0) + hess_v(1,1) + grad_u(1)/r );
134 libMesh::RealTensor& hess_v,
135 libMesh::RealTensor& hess_w )
const
137 return libMesh::RealGradient( hess_u(0,0) + hess_v(0,1) + hess_w(0,2),
138 hess_u(1,0) + hess_v(1,1) + hess_w(1,2),
139 hess_u(2,0) + hess_v(2,1) + hess_w(2,2) );
143 libMesh::RealTensor& hess_v )
const
145 return libMesh::RealGradient( hess_u(0,0) + hess_v(1,0),
146 hess_u(0,1) + hess_v(1,1) );
150 const libMesh::Gradient& U,
151 const libMesh::Gradient& grad_u,
152 const libMesh::RealTensor& hess_u,
153 const libMesh::RealTensor& hess_v )
const
155 return libMesh::RealGradient( hess_u(0,0) + hess_v(1,0) + (grad_u(0) - U(0)/r)/r,
156 hess_u(0,1) + hess_v(1,1) + grad_u(1)/r );
160 libMesh::RealTensor& hess_v,
161 libMesh::RealTensor& hess_w)
const
163 return libMesh::RealGradient( hess_u(0,0) + hess_v(1,0) + hess_w(2,0),
164 hess_u(0,1) + hess_v(1,1) + hess_w(2,1),
165 hess_u(0,2) + hess_v(1,2) + hess_w(2,2) );
169 unsigned int qp )
const
171 libMesh::RealGradient grad_u, grad_v;
173 grad_u = context.fixed_interior_gradient(this->
_flow_vars.
u(), qp);
174 grad_v = context.fixed_interior_gradient(this->
_flow_vars.
v(), qp);
176 libMesh::Real divU = grad_u(0) + grad_v(1);
178 if( context.get_system().get_mesh().mesh_dimension() == 3 )
180 divU += (context.fixed_interior_gradient(this->
_flow_vars.
w(), qp))(2);
189 libMesh::Real &res_C,
190 libMesh::Tensor &d_res_C_dgradU
193 libMesh::RealGradient grad_u, grad_v;
195 grad_u = context.fixed_interior_gradient(this->_flow_vars.u(), qp);
196 grad_v = context.fixed_interior_gradient(this->_flow_vars.v(), qp);
198 libMesh::Real divU = grad_u(0) + grad_v(1);
200 d_res_C_dgradU(0,0) = 1;
201 d_res_C_dgradU(1,1) = 1;
203 if( context.get_system().get_mesh().mesh_dimension() == 3 )
205 divU += (context.fixed_interior_gradient(this->_flow_vars.w(), qp))(2);
206 d_res_C_dgradU(2,2) = 1;
213 unsigned int qp,
const libMesh::Real rho,
const libMesh::Real mu )
const
215 libMesh::RealGradient U( context.fixed_interior_value(this->_flow_vars.u(), qp),
216 context.fixed_interior_value(this->_flow_vars.v(), qp) );
217 if(context.get_system().get_mesh().mesh_dimension() == 3)
218 U(2) = context.fixed_interior_value(this->
_flow_vars.
w(), qp);
220 libMesh::RealGradient grad_p = context.fixed_interior_gradient(this->
_press_var.
p(), qp);
222 libMesh::RealGradient grad_u = context.fixed_interior_gradient(this->
_flow_vars.
u(), qp);
223 libMesh::RealGradient grad_v = context.fixed_interior_gradient(this->
_flow_vars.
v(), qp);
225 libMesh::RealTensor hess_u = context.fixed_interior_hessian(this->
_flow_vars.
u(), qp);
226 libMesh::RealTensor hess_v = context.fixed_interior_hessian(this->
_flow_vars.
v(), qp);
228 libMesh::RealGradient rhoUdotGradU;
229 libMesh::RealGradient divGradU;
231 if( context.get_system().get_mesh().mesh_dimension() < 3 )
233 rhoUdotGradU = rho*this->
UdotGradU( U, grad_u, grad_v );
234 divGradU = this->
div_GradU( hess_u, hess_v );
238 libMesh::RealGradient grad_w = context.fixed_interior_gradient(this->
_flow_vars.
w(), qp);
239 libMesh::RealTensor hess_w = context.fixed_interior_hessian(this->
_flow_vars.
w(), qp);
241 rhoUdotGradU = rho*this->
UdotGradU( U, grad_u, grad_v, grad_w );
243 divGradU = this->
div_GradU( hess_u, hess_v, hess_w );
246 return rhoUdotGradU + grad_p - mu*divGradU;
251 unsigned int qp,
const libMesh::Real rho,
const libMesh::Real mu,
252 libMesh::Gradient &res_M,
253 libMesh::Tensor &d_res_M_dgradp,
254 libMesh::Tensor &d_res_M_dU,
255 libMesh::Gradient &d_res_Muvw_dgraduvw,
256 libMesh::Tensor &d_res_Muvw_dhessuvw
259 libMesh::RealGradient U( context.fixed_interior_value(this->_flow_vars.u(), qp),
260 context.fixed_interior_value(this->_flow_vars.v(), qp) );
261 if(context.get_system().get_mesh().mesh_dimension() == 3)
262 U(2) = context.fixed_interior_value(this->_flow_vars.w(), qp);
264 libMesh::RealGradient grad_p = context.fixed_interior_gradient(this->_press_var.p(), qp);
266 libMesh::RealGradient grad_u = context.fixed_interior_gradient(this->_flow_vars.u(), qp);
267 libMesh::RealGradient grad_v = context.fixed_interior_gradient(this->_flow_vars.v(), qp);
269 libMesh::RealTensor hess_u = context.fixed_interior_hessian(this->_flow_vars.u(), qp);
270 libMesh::RealTensor hess_v = context.fixed_interior_hessian(this->_flow_vars.v(), qp);
272 libMesh::RealGradient rhoUdotGradU;
273 libMesh::RealGradient divGradU;
275 if( context.get_system().get_mesh().mesh_dimension() < 3 )
277 rhoUdotGradU = rho*this->UdotGradU( U, grad_u, grad_v );
278 divGradU = this->div_GradU( hess_u, hess_v );
282 libMesh::RealGradient grad_w = context.fixed_interior_gradient(this->_flow_vars.w(), qp);
283 libMesh::RealTensor hess_w = context.fixed_interior_hessian(this->_flow_vars.w(), qp);
285 rhoUdotGradU = rho*this->UdotGradU( U, grad_u, grad_v, grad_w );
287 divGradU = this->div_GradU( hess_u, hess_v, hess_w );
289 d_res_M_dU(0,2) = rho * grad_u(2);
290 d_res_M_dU(1,2) = rho * grad_v(2);
292 d_res_Muvw_dgraduvw(2) = rho * U(2);
293 d_res_M_dgradp(2,2) = 1;
294 d_res_Muvw_dhessuvw(2,2) = mu;
296 d_res_M_dU(2,0) = rho * grad_w(0);
297 d_res_M_dU(2,1) = rho * grad_w(1);
298 d_res_M_dU(2,2) = rho * grad_w(2);
301 res_M = rhoUdotGradU + grad_p - mu*divGradU;
303 d_res_M_dU(0,0) = rho * grad_u(0);
304 d_res_M_dU(0,1) = rho * grad_u(1);
305 d_res_M_dU(1,0) = rho * grad_v(0);
306 d_res_M_dU(1,1) = rho * grad_v(1);
308 d_res_Muvw_dgraduvw(0) = rho * U(0);
309 d_res_Muvw_dgraduvw(1) = rho * U(1);
311 d_res_M_dgradp(0,0) = 1;
312 d_res_M_dgradp(1,1) = 1;
314 d_res_Muvw_dhessuvw(0,0) = mu;
315 d_res_Muvw_dhessuvw(1,1) = mu;
321 libMesh::RealGradient u_dot;
322 context.interior_rate(this->
_flow_vars.
u(), qp, u_dot(0));
323 context.interior_rate(this->
_flow_vars.
v(), qp, u_dot(1));
324 if(context.get_system().get_mesh().mesh_dimension() == 3)
325 context.interior_rate(this->_flow_vars.w(), qp, u_dot(2));
334 const libMesh::Real rho,
335 libMesh::RealGradient &res_M,
336 libMesh::Real &d_res_Muvw_duvw
339 libMesh::RealGradient u_dot;
340 context.interior_rate(this->_flow_vars.u(), qp, u_dot(0));
341 context.interior_rate(this->_flow_vars.v(), qp, u_dot(1));
342 if(context.get_system().get_mesh().mesh_dimension() == 3)
343 context.interior_rate(this->_flow_vars.w(), qp, u_dot(2));
346 d_res_Muvw_duvw = rho;
libMesh::RealGradient div_divU_I(libMesh::RealTensor &hess_u, libMesh::RealTensor &hess_v) const
libMesh::RealGradient div_divU_I_axi(libMesh::Real r, const libMesh::Gradient &U, const libMesh::Gradient &grad_u, const libMesh::RealTensor &hess_u, const libMesh::RealTensor &hess_v) const
libMesh::RealGradient compute_res_momentum_steady(AssemblyContext &context, unsigned int qp, const libMesh::Real rho, const libMesh::Real mu) const
libMesh::RealGradient compute_res_momentum_transient(AssemblyContext &context, unsigned int qp, const libMesh::Real rho) const
libMesh::RealGradient div_GradU(libMesh::RealTensor &hess_u, libMesh::RealTensor &hess_v) const
libMesh::RealGradient div_GradU_axi(libMesh::Real r, const libMesh::Gradient &U, const libMesh::Gradient &grad_u, const libMesh::Gradient &grad_v, const libMesh::RealTensor &hess_u, const libMesh::RealTensor &hess_v) const
static std::string velocity_section()
static std::string pressure_section()
const VelocityFEVariables & _flow_vars
libMesh::RealGradient UdotGradU(libMesh::Gradient &U, libMesh::Gradient &grad_u, libMesh::Gradient &grad_v) const
libMesh::RealGradient div_GradU_T(libMesh::RealTensor &hess_u, libMesh::RealTensor &hess_v) const
const PressureFEVariable & _press_var
void compute_res_momentum_steady_and_derivs(AssemblyContext &context, unsigned int qp, const libMesh::Real rho, const libMesh::Real mu, libMesh::Gradient &res_M, libMesh::Tensor &d_res_M_dgradp, libMesh::Tensor &d_res_M_dU, libMesh::Gradient &d_res_Muvw_dgraduvw, libMesh::Tensor &d_res_Muvw_dhessuvw) const
void compute_res_momentum_transient_and_derivs(AssemblyContext &context, unsigned int qp, const libMesh::Real rho, libMesh::RealGradient &res_M, libMesh::Real &d_res_Muvw_duvw) const
void compute_res_continuity_and_derivs(AssemblyContext &context, unsigned int qp, libMesh::Real &res_C, libMesh::Tensor &d_res_C_dgradU) const
libMesh::RealGradient div_GradU_T_axi(libMesh::Real r, const libMesh::Gradient &U, const libMesh::Gradient &grad_u, const libMesh::RealTensor &hess_u, const libMesh::RealTensor &hess_v) const
IncompressibleNavierStokesStabilizationHelper(const std::string &helper_name, const GetPot &input)
~IncompressibleNavierStokesStabilizationHelper()
libMesh::Real compute_res_continuity(AssemblyContext &context, unsigned int qp) const