36 #include "libmesh/quadrature.h"
40 template<
class Mu,
class SH,
class TC>
47 template<
class Mu,
class SH,
class TC>
53 template<
class Mu,
class SH,
class TC>
58 #ifdef GRINS_USE_GRVY_TIMERS
59 this->_timer->BeginTimer(
"LowMachNavierStokesSPGSMStabilization::element_time_derivative");
62 this->assemble_continuity_time_deriv( compute_jacobian, context );
63 this->assemble_momentum_time_deriv( compute_jacobian, context );
64 this->assemble_energy_time_deriv( compute_jacobian, context );
66 #ifdef GRINS_USE_GRVY_TIMERS
67 this->_timer->EndTimer(
"LowMachNavierStokesSPGSMStabilization::element_time_derivative");
72 template<
class Mu,
class SH,
class TC>
77 #ifdef GRINS_USE_GRVY_TIMERS
78 this->_timer->BeginTimer(
"LowMachNavierStokesSPGSMStabilization::mass_residual");
81 this->assemble_continuity_mass_residual( compute_jacobian, context );
82 this->assemble_momentum_mass_residual( compute_jacobian, context );
83 this->assemble_energy_mass_residual( compute_jacobian, context );
85 #ifdef GRINS_USE_GRVY_TIMERS
86 this->_timer->EndTimer(
"LowMachNavierStokesSPGSMStabilization::mass_residual");
91 template<
class Mu,
class SH,
class TC>
96 const unsigned int n_p_dofs = context.get_dof_indices(this->_p_var).size();
99 const std::vector<libMesh::Real> &JxW =
100 context.get_element_fe(this->_u_var)->get_JxW();
103 const std::vector<std::vector<libMesh::RealGradient> >& p_dphi =
104 context.get_element_fe(this->_p_var)->get_dphi();
106 libMesh::DenseSubVector<libMesh::Number> &Fp = context.get_elem_residual(this->_p_var);
108 unsigned int n_qpoints = context.get_element_qrule().n_points();
110 for (
unsigned int qp=0; qp != n_qpoints; qp++)
112 libMesh::FEBase* fe = context.get_element_fe(this->_u_var);
114 libMesh::RealGradient g = this->_stab_helper.compute_g( fe, context, qp );
115 libMesh::RealTensor G = this->_stab_helper.compute_G( fe, context, qp );
117 libMesh::Real T = context.interior_value( this->_T_var, qp );
119 libMesh::Real mu = this->_mu(T);
121 libMesh::Real rho = this->rho( T, this->get_p0_steady( context, qp ) );
123 libMesh::RealGradient U( context.interior_value( this->_u_var, qp ),
124 context.interior_value( this->_v_var, qp ) );
125 if( this->_dim == 3 )
126 U(2) = context.interior_value( this->_w_var, qp );
128 libMesh::Real tau_M = this->_stab_helper.compute_tau_momentum( context, qp, g, G, rho, U, mu, this->_is_steady );
130 libMesh::RealGradient RM_s = this->compute_res_momentum_steady( context, qp );
134 for (
unsigned int i=0; i != n_p_dofs; i++)
136 Fp(i) += tau_M*RM_s*p_dphi[i][qp]*JxW[qp];
144 template<
class Mu,
class SH,
class TC>
149 const unsigned int n_u_dofs = context.get_dof_indices(this->_u_var).size();
152 libmesh_assert (n_u_dofs == context.get_dof_indices(this->_v_var).size());
154 libmesh_assert (n_u_dofs == context.get_dof_indices(this->_w_var).size());
157 const std::vector<libMesh::Real> &JxW =
158 context.get_element_fe(this->_u_var)->get_JxW();
161 const std::vector<std::vector<libMesh::RealGradient> >& u_gradphi =
162 context.get_element_fe(this->_u_var)->get_dphi();
164 libMesh::DenseSubVector<libMesh::Number> &Fu = context.get_elem_residual(this->_u_var);
165 libMesh::DenseSubVector<libMesh::Number> &Fv = context.get_elem_residual(this->_v_var);
166 libMesh::DenseSubVector<libMesh::Number> &Fw = context.get_elem_residual(this->_w_var);
168 unsigned int n_qpoints = context.get_element_qrule().n_points();
170 for (
unsigned int qp=0; qp != n_qpoints; qp++)
172 libMesh::Real T = context.interior_value( this->_T_var, qp );
173 libMesh::Real rho = this->rho( T, this->get_p0_steady( context, qp ) );
175 libMesh::RealGradient U( context.interior_value(this->_u_var, qp),
176 context.interior_value(this->_v_var, qp) );
178 libMesh::RealGradient grad_u = context.interior_gradient(this->_u_var, qp);
179 libMesh::RealGradient grad_v = context.interior_gradient(this->_v_var, qp);
180 libMesh::RealGradient grad_w;
182 if( this->_dim == 3 )
184 U(2) = context.interior_value(this->_w_var, qp);
185 grad_w = context.interior_gradient(this->_w_var, qp);
188 libMesh::FEBase* fe = context.get_element_fe(this->_u_var);
190 libMesh::RealGradient g = this->_stab_helper.compute_g( fe, context, qp );
191 libMesh::RealTensor G = this->_stab_helper.compute_G( fe, context, qp );
192 libMesh::Real mu = this->_mu(T);
194 libMesh::Real tau_M = this->_stab_helper.compute_tau_momentum( context, qp, g, G, rho, U, mu, this->_is_steady );
195 libMesh::Real tau_C = this->_stab_helper.compute_tau_continuity( tau_M, g );
197 libMesh::Real RC_s = this->compute_res_continuity_steady( context, qp );
198 libMesh::RealGradient RM_s = this->compute_res_momentum_steady( context, qp );
200 for (
unsigned int i=0; i != n_u_dofs; i++)
202 Fu(i) += ( - tau_C*RC_s*u_gradphi[i][qp](0)
203 - tau_M*RM_s(0)*rho*U*u_gradphi[i][qp] )*JxW[qp];
205 Fv(i) += ( - tau_C*RC_s*u_gradphi[i][qp](1)
206 - tau_M*RM_s(1)*rho*U*u_gradphi[i][qp] )*JxW[qp];
208 if( this->_dim == 3 )
210 Fw(i) += ( - tau_C*RC_s*u_gradphi[i][qp](2)
211 - tau_M*RM_s(2)*rho*U*u_gradphi[i][qp] )*JxW[qp];
219 template<
class Mu,
class SH,
class TC>
224 const unsigned int n_T_dofs = context.get_dof_indices(this->_T_var).size();
227 const std::vector<libMesh::Real> &JxW =
228 context.get_element_fe(this->_T_var)->get_JxW();
231 const std::vector<std::vector<libMesh::RealGradient> >& T_gradphi =
232 context.get_element_fe(this->_T_var)->get_dphi();
234 libMesh::DenseSubVector<libMesh::Number> &FT = context.get_elem_residual(this->_T_var);
236 unsigned int n_qpoints = context.get_element_qrule().n_points();
238 for (
unsigned int qp=0; qp != n_qpoints; qp++)
240 libMesh::Number u, v;
241 u = context.interior_value(this->_u_var, qp);
242 v = context.interior_value(this->_v_var, qp);
244 libMesh::Gradient grad_T = context.interior_gradient(this->_T_var, qp);
246 libMesh::NumberVectorValue U(u,v);
248 U(2) = context.interior_value(this->_w_var, qp);
250 libMesh::Real T = context.interior_value( this->_T_var, qp );
251 libMesh::Real rho = this->rho( T, this->get_p0_steady( context, qp ) );
253 libMesh::Real k = this->_k(T);
254 libMesh::Real cp = this->_cp(T);
256 libMesh::Number rho_cp = rho*this->_cp(T);
258 libMesh::FEBase* fe = context.get_element_fe(this->_u_var);
260 libMesh::RealGradient g = this->_stab_helper.compute_g( fe, context, qp );
261 libMesh::RealTensor G = this->_stab_helper.compute_G( fe, context, qp );
263 libMesh::Real tau_E = this->_stab_helper.compute_tau_energy( context, qp, g, G, rho, U, k, cp, this->_is_steady );
265 libMesh::Real RE_s = this->compute_res_energy_steady( context, qp );
267 for (
unsigned int i=0; i != n_T_dofs; i++)
269 FT(i) -= rho_cp*tau_E*RE_s*U*T_gradphi[i][qp]*JxW[qp];
277 template<
class Mu,
class SH,
class TC>
282 const unsigned int n_p_dofs = context.get_dof_indices(this->_p_var).size();
285 const std::vector<libMesh::Real> &JxW =
286 context.get_element_fe(this->_u_var)->get_JxW();
289 const std::vector<std::vector<libMesh::RealGradient> >& p_dphi =
290 context.get_element_fe(this->_p_var)->get_dphi();
292 libMesh::DenseSubVector<libMesh::Number> &Fp = context.get_elem_residual(this->_p_var);
294 unsigned int n_qpoints = context.get_element_qrule().n_points();
296 for (
unsigned int qp=0; qp != n_qpoints; qp++)
298 libMesh::FEBase* fe = context.get_element_fe(this->_u_var);
300 libMesh::RealGradient g = this->_stab_helper.compute_g( fe, context, qp );
301 libMesh::RealTensor G = this->_stab_helper.compute_G( fe, context, qp );
303 libMesh::Real T = context.fixed_interior_value( this->_T_var, qp );
304 libMesh::Real rho = this->rho( T, this->get_p0_transient( context, qp ) );
306 libMesh::Real mu = this->_mu(T);
308 libMesh::RealGradient U( context.fixed_interior_value( this->_u_var, qp ),
309 context.fixed_interior_value( this->_v_var, qp ) );
310 if( this->_dim == 3 )
311 U(2) = context.fixed_interior_value( this->_w_var, qp );
313 libMesh::Real tau_M = this->_stab_helper.compute_tau_momentum( context, qp, g, G, rho, U, mu,
false );
314 libMesh::RealGradient RM_t = this->compute_res_momentum_transient( context, qp );
318 for (
unsigned int i=0; i != n_p_dofs; i++)
320 Fp(i) += tau_M*RM_t*p_dphi[i][qp]*JxW[qp];
327 template<
class Mu,
class SH,
class TC>
332 const unsigned int n_u_dofs = context.get_dof_indices(this->_u_var).size();
335 libmesh_assert (n_u_dofs == context.get_dof_indices(this->_v_var).size());
337 libmesh_assert (n_u_dofs == context.get_dof_indices(this->_w_var).size());
340 const std::vector<libMesh::Real> &JxW =
341 context.get_element_fe(this->_u_var)->get_JxW();
344 const std::vector<std::vector<libMesh::RealGradient> >& u_gradphi =
345 context.get_element_fe(this->_u_var)->get_dphi();
347 libMesh::DenseSubVector<libMesh::Number> &Fu = context.get_elem_residual(this->_u_var);
348 libMesh::DenseSubVector<libMesh::Number> &Fv = context.get_elem_residual(this->_v_var);
349 libMesh::DenseSubVector<libMesh::Number> &Fw = context.get_elem_residual(this->_w_var);
351 unsigned int n_qpoints = context.get_element_qrule().n_points();
352 for (
unsigned int qp=0; qp != n_qpoints; qp++)
354 libMesh::Real T = context.fixed_interior_value( this->_T_var, qp );
355 libMesh::Real rho = this->rho( T, this->get_p0_transient( context, qp ) );
357 libMesh::Real mu = this->_mu(T);
359 libMesh::RealGradient U( context.fixed_interior_value(this->_u_var, qp),
360 context.fixed_interior_value(this->_v_var, qp) );
362 libMesh::RealGradient grad_u = context.fixed_interior_gradient(this->_u_var, qp);
363 libMesh::RealGradient grad_v = context.fixed_interior_gradient(this->_v_var, qp);
364 libMesh::RealGradient grad_w;
366 if( this->_dim == 3 )
368 U(2) = context.fixed_interior_value(this->_w_var, qp);
369 grad_w = context.fixed_interior_gradient(this->_w_var, qp);
372 libMesh::FEBase* fe = context.get_element_fe(this->_u_var);
374 libMesh::RealGradient g = this->_stab_helper.compute_g( fe, context, qp );
375 libMesh::RealTensor G = this->_stab_helper.compute_G( fe, context, qp );
377 libMesh::Real tau_M = this->_stab_helper.compute_tau_momentum( context, qp, g, G, rho, U, mu,
false );
378 libMesh::Real tau_C = this->_stab_helper.compute_tau_continuity( tau_M, g );
380 libMesh::Real RC_t = this->compute_res_continuity_transient( context, qp );
381 libMesh::RealGradient RM_s = this->compute_res_momentum_steady( context, qp );
382 libMesh::RealGradient RM_t = this->compute_res_momentum_transient( context, qp );
384 for (
unsigned int i=0; i != n_u_dofs; i++)
386 Fu(i) -= ( tau_C*RC_t*u_gradphi[i][qp](0)
387 + tau_M*RM_t(0)*rho*U*u_gradphi[i][qp] )*JxW[qp];
389 Fv(i) -= ( tau_C*RC_t*u_gradphi[i][qp](1)
390 + tau_M*RM_t(1)*rho*U*u_gradphi[i][qp] )*JxW[qp];
392 if( this->_dim == 3 )
394 Fw(i) -= ( tau_C*RC_t*u_gradphi[i][qp](2)
395 + tau_M*RM_t(2)*rho*U*u_gradphi[i][qp] )*JxW[qp];
403 template<
class Mu,
class SH,
class TC>
408 const unsigned int n_T_dofs = context.get_dof_indices(this->_T_var).size();
411 const std::vector<libMesh::Real> &JxW =
412 context.get_element_fe(this->_T_var)->get_JxW();
415 const std::vector<std::vector<libMesh::RealGradient> >& T_gradphi =
416 context.get_element_fe(this->_T_var)->get_dphi();
418 libMesh::DenseSubVector<libMesh::Number> &FT = context.get_elem_residual(this->_T_var);
420 unsigned int n_qpoints = context.get_element_qrule().n_points();
422 for (
unsigned int qp=0; qp != n_qpoints; qp++)
424 libMesh::Number u, v;
425 u = context.fixed_interior_value(this->_u_var, qp);
426 v = context.fixed_interior_value(this->_v_var, qp);
428 libMesh::Gradient grad_T = context.fixed_interior_gradient(this->_T_var, qp);
430 libMesh::NumberVectorValue U(u,v);
432 U(2) = context.fixed_interior_value(this->_w_var, qp);
434 libMesh::Real T = context.fixed_interior_value( this->_T_var, qp );
435 libMesh::Real rho = this->rho( T, this->get_p0_transient( context, qp ) );
437 libMesh::Real k = this->_k(T);
438 libMesh::Real cp = this->_cp(T);
440 libMesh::Number rho_cp = rho*this->_cp(T);
442 libMesh::FEBase* fe = context.get_element_fe(this->_u_var);
444 libMesh::RealGradient g = this->_stab_helper.compute_g( fe, context, qp );
445 libMesh::RealTensor G = this->_stab_helper.compute_G( fe, context, qp );
447 libMesh::Real tau_E = this->_stab_helper.compute_tau_energy( context, qp, g, G, rho, U, k, cp,
false );
449 libMesh::Real RE_t = this->compute_res_energy_transient( context, qp );
451 for (
unsigned int i=0; i != n_T_dofs; i++)
453 FT(i) -= rho_cp*tau_E*RE_t*U*T_gradphi[i][qp]*JxW[qp];
virtual ~LowMachNavierStokesSPGSMStabilization()
Adds SPGSM-based stabilization to LowMachNavierStokes physics class.
void assemble_continuity_mass_residual(bool compute_jacobian, AssemblyContext &context)
virtual void element_time_derivative(bool compute_jacobian, AssemblyContext &context, CachedValues &cache)
Time dependent part(s) of physics for element interiors.
void assemble_momentum_mass_residual(bool compute_jacobian, AssemblyContext &context)
virtual void mass_residual(bool compute_jacobian, AssemblyContext &context, CachedValues &cache)
Mass matrix part(s) for element interiors. All boundary terms lie within the time_derivative part...
void assemble_momentum_time_deriv(bool compute_jacobian, AssemblyContext &context)
LowMachNavierStokesSPGSMStabilization()
void assemble_energy_mass_residual(bool compute_jacobian, AssemblyContext &context)
Adds VMS-based stabilization to LowMachNavierStokes physics class.
void assemble_continuity_time_deriv(bool compute_jacobian, AssemblyContext &context)
void assemble_energy_time_deriv(bool compute_jacobian, AssemblyContext &context)