30 #include "grins_config.h"
39 #include "libmesh/quadrature.h"
44 template<
class Mu,
class SH,
class TC>
47 _p_pinning(input,physics_name),
55 template<
class Mu,
class SH,
class TC>
59 _p_pinning.check_pin_location(system.get_mesh());
62 template<
class Mu,
class SH,
class TC>
68 if( input.have_variable(section) )
70 unsigned int n_vars = input.vector_variable_size(section);
72 for(
unsigned int v = 0; v < n_vars; v++ )
74 std::string name = input(section,
"DIE!",v);
76 if( name == std::string(
"rho") )
83 <<
" Found " << name << std::endl
84 <<
" Acceptable values are: rho" << std::endl;
93 template<
class Mu,
class SH,
class TC>
100 context.get_side_fe(this->_flow_vars.u())->get_JxW();
101 context.get_side_fe(this->_flow_vars.u())->get_phi();
102 context.get_side_fe(this->_flow_vars.u())->get_dphi();
103 context.get_side_fe(this->_flow_vars.u())->get_xyz();
105 context.get_side_fe(this->_temp_vars.T())->get_JxW();
106 context.get_side_fe(this->_temp_vars.T())->get_phi();
107 context.get_side_fe(this->_temp_vars.T())->get_dphi();
108 context.get_side_fe(this->_temp_vars.T())->get_xyz();
114 template<
class Mu,
class SH,
class TC>
119 #ifdef GRINS_USE_GRVY_TIMERS
120 this->_timer->BeginTimer(
"LowMachNavierStokes::element_time_derivative");
123 this->assemble_mass_time_deriv( compute_jacobian, context, cache );
124 this->assemble_momentum_time_deriv( compute_jacobian, context, cache );
125 this->assemble_energy_time_deriv( compute_jacobian, context, cache );
127 if( this->_enable_thermo_press_calc )
128 this->assemble_thermo_press_elem_time_deriv( compute_jacobian, context );
130 #ifdef GRINS_USE_GRVY_TIMERS
131 this->_timer->EndTimer(
"LowMachNavierStokes::element_time_derivative");
137 template<
class Mu,
class SH,
class TC>
143 if( this->_pin_pressure )
145 this->_p_pinning.pin_value( context, compute_jacobian, this->_press_var.p());
151 template<
class Mu,
class SH,
class TC>
156 this->assemble_continuity_mass_residual( compute_jacobian, context );
158 this->assemble_momentum_mass_residual( compute_jacobian, context );
160 this->assemble_energy_mass_residual( compute_jacobian, context );
162 if( this->_enable_thermo_press_calc )
163 this->assemble_thermo_press_mass_residual( compute_jacobian, context );
168 template<
class Mu,
class SH,
class TC>
174 const unsigned int n_p_dofs = context.get_dof_indices(this->_press_var.p()).size();
177 const std::vector<libMesh::Real> &JxW =
178 context.get_element_fe(this->_flow_vars.u())->get_JxW();
181 const std::vector<std::vector<libMesh::Real> >& p_phi =
182 context.get_element_fe(this->_press_var.p())->get_phi();
187 const std::vector<std::vector<libMesh::Real> >& u_phi =
188 context.get_element_fe(this->_flow_vars.u())->get_phi();
192 const std::vector<std::vector<libMesh::RealGradient> >& u_gradphi =
193 context.get_element_fe(this->_flow_vars.u())->get_dphi();
196 const std::vector<std::vector<libMesh::Real> >& T_phi =
197 context.get_element_fe(this->_temp_vars.T())->get_phi();
201 const std::vector<std::vector<libMesh::RealGradient> >& T_gradphi =
202 context.get_element_fe(this->_temp_vars.T())->get_dphi();
206 libMesh::DenseSubVector<libMesh::Number> &Fp = context.get_elem_residual(this->_press_var.p());
208 unsigned int n_qpoints = context.get_element_qrule().n_points();
211 const unsigned int n_t_dofs = context.get_dof_indices(this->_temp_vars.T()).size();
214 const unsigned int n_u_dofs = context.get_dof_indices(this->_flow_vars.u()).size();
217 libmesh_assert (n_u_dofs == context.get_dof_indices(this->_flow_vars.v()).size());
219 libmesh_assert (n_u_dofs == context.get_dof_indices(this->_flow_vars.w()).size());
221 for (
unsigned int qp=0; qp != n_qpoints; qp++)
223 libMesh::Number u, v, T;
234 libMesh::NumberVectorValue U(u,v);
238 libMesh::Number divU = grad_u(0) + grad_v(1);
246 libMesh::DenseSubMatrix<libMesh::Number> &KPu = context.get_elem_jacobian(this->_press_var.p(), this->_flow_vars.u());
247 libMesh::DenseSubMatrix<libMesh::Number> &KPv = context.get_elem_jacobian(this->_press_var.p(), this->_flow_vars.v());
248 libMesh::DenseSubMatrix<libMesh::Number> &KPT = context.get_elem_jacobian(this->_press_var.p(), this->_temp_vars.T());
250 libMesh::DenseSubMatrix<libMesh::Number>* KPw = NULL;
252 if( this->_dim == 3 )
254 KPw = &context.get_elem_jacobian(this->_press_var.p(), this->_flow_vars.w());
259 for (
unsigned int i=0; i != n_p_dofs; i++)
261 Fp(i) += (-U*grad_T/T + divU)*p_phi[i][qp]*JxW[qp];
264 if (compute_jacobian)
267 for (
unsigned int j=0; j!=n_u_dofs; j++)
269 KPu(i,j) += JxW[qp]*(
270 +u_gradphi[j][qp](0)*p_phi[i][qp]
271 -u_phi[j][qp]*p_phi[i][qp]*grad_T(0)/T
274 KPv(i,j) += JxW[qp]*(
275 +u_gradphi[j][qp](1)*p_phi[i][qp]
276 -u_phi[j][qp]*p_phi[i][qp]*grad_T(1)/T
281 (*KPw)(i,j) += JxW[qp]*(
282 +u_gradphi[j][qp](2)*p_phi[i][qp]
283 -u_phi[j][qp]*p_phi[i][qp]*grad_T(2)/T
289 for (
unsigned int j=0; j!=n_t_dofs; j++)
291 KPT(i,j) += JxW[qp]*(
292 -T_gradphi[j][qp]*U*p_phi[i][qp]/T
293 +U*p_phi[i][qp]*grad_T*T_phi[j][qp])/(T*T);
302 template<
class Mu,
class SH,
class TC>
308 const unsigned int n_u_dofs = context.get_dof_indices(this->_flow_vars.u()).size();
309 const unsigned int n_p_dofs = context.get_dof_indices(this->_press_var.p()).size();
310 const unsigned int n_T_dofs = context.get_dof_indices(this->_temp_vars.T()).size();
313 libmesh_assert (n_u_dofs == context.get_dof_indices(this->_flow_vars.v()).size());
315 libmesh_assert (n_u_dofs == context.get_dof_indices(this->_flow_vars.w()).size());
318 const std::vector<libMesh::Real> &JxW =
319 context.get_element_fe(this->_flow_vars.u())->get_JxW();
322 const std::vector<std::vector<libMesh::Real> >& u_phi =
323 context.get_element_fe(this->_flow_vars.u())->get_phi();
324 const std::vector<std::vector<libMesh::Real> >& p_phi =
325 context.get_element_fe(this->_press_var.p())->get_phi();
326 const std::vector<std::vector<libMesh::Real> >& T_phi =
327 context.get_element_fe(this->_temp_vars.T())->get_phi();
330 const std::vector<std::vector<libMesh::RealGradient> >& u_gradphi =
331 context.get_element_fe(this->_flow_vars.u())->get_dphi();
333 libMesh::DenseSubVector<libMesh::Number> &Fu = context.get_elem_residual(this->_flow_vars.u());
334 libMesh::DenseSubVector<libMesh::Number> &Fv = context.get_elem_residual(this->_flow_vars.v());
335 libMesh::DenseSubVector<libMesh::Real>* Fw = NULL;
337 if( this->_dim == 3 )
339 Fw = &context.get_elem_residual(this->_flow_vars.w());
342 unsigned int n_qpoints = context.get_element_qrule().n_points();
343 for (
unsigned int qp=0; qp != n_qpoints; qp++)
345 libMesh::Number u, v, p, p0, T;
356 libMesh::Gradient grad_w;
360 libMesh::NumberVectorValue grad_uT( grad_u(0), grad_v(0) );
361 libMesh::NumberVectorValue grad_vT( grad_u(1), grad_v(1) );
362 libMesh::NumberVectorValue grad_wT;
363 if( this->_dim == 3 )
365 grad_uT(2) = grad_w(0);
366 grad_vT(2) = grad_w(1);
367 grad_wT = libMesh::NumberVectorValue( grad_u(2), grad_v(2), grad_w(2) );
370 libMesh::NumberVectorValue U(u,v);
374 libMesh::Number divU = grad_u(0) + grad_v(1);
378 libMesh::Number rho = this->rho( T, p0 );
379 libMesh::Number d_rho = this->d_rho_dT( T, p0 );
380 libMesh::Number d_mu = this->_mu.deriv(T);
382 libMesh::DenseSubMatrix<libMesh::Number> &Kuu = context.get_elem_jacobian(this->_flow_vars.u(), this->_flow_vars.u());
383 libMesh::DenseSubMatrix<libMesh::Number> &Kuv = context.get_elem_jacobian(this->_flow_vars.u(), this->_flow_vars.v());
384 libMesh::DenseSubMatrix<libMesh::Number>* Kuw = NULL;
386 libMesh::DenseSubMatrix<libMesh::Number> &Kvu = context.get_elem_jacobian(this->_flow_vars.v(), this->_flow_vars.u());
387 libMesh::DenseSubMatrix<libMesh::Number> &Kvv = context.get_elem_jacobian(this->_flow_vars.v(), this->_flow_vars.v());
388 libMesh::DenseSubMatrix<libMesh::Number>* Kvw = NULL;
390 libMesh::DenseSubMatrix<libMesh::Number>* Kwu = NULL;
391 libMesh::DenseSubMatrix<libMesh::Number>* Kwv = NULL;
392 libMesh::DenseSubMatrix<libMesh::Number>* Kww = NULL;
394 libMesh::DenseSubMatrix<libMesh::Number> &Kup = context.get_elem_jacobian(this->_flow_vars.u(), this->_press_var.p());
395 libMesh::DenseSubMatrix<libMesh::Number> &Kvp = context.get_elem_jacobian(this->_flow_vars.v(), this->_press_var.p());
396 libMesh::DenseSubMatrix<libMesh::Number>* Kwp = NULL;
398 libMesh::DenseSubMatrix<libMesh::Number> &KuT = context.get_elem_jacobian(this->_flow_vars.u(), this->_temp_vars.T());
399 libMesh::DenseSubMatrix<libMesh::Number> &KvT = context.get_elem_jacobian(this->_flow_vars.v(), this->_temp_vars.T());
400 libMesh::DenseSubMatrix<libMesh::Number>* KwT = NULL;
402 if( this->_dim == 3 )
404 Kuw = &context.get_elem_jacobian(this->_flow_vars.u(), this->_flow_vars.w());
405 Kvw = &context.get_elem_jacobian(this->_flow_vars.v(), this->_flow_vars.w());
406 Kwu = &context.get_elem_jacobian(this->_flow_vars.w(), this->_flow_vars.u());
407 Kwv = &context.get_elem_jacobian(this->_flow_vars.w(), this->_flow_vars.v());
408 Kww = &context.get_elem_jacobian(this->_flow_vars.w(), this->_flow_vars.w());
409 Kwp = &context.get_elem_jacobian(this->_flow_vars.w(), this->_press_var.p());
410 KwT = &context.get_elem_jacobian(this->_flow_vars.w(), this->_temp_vars.T());
415 for (
unsigned int i=0; i != n_u_dofs; i++)
417 Fu(i) += ( -rho*U*grad_u*u_phi[i][qp]
418 + p*u_gradphi[i][qp](0)
419 - this->_mu(T)*(u_gradphi[i][qp]*grad_u + u_gradphi[i][qp]*grad_uT
420 - 2.0/3.0*divU*u_gradphi[i][qp](0) )
421 + rho*this->_g(0)*u_phi[i][qp]
424 Fv(i) += ( -rho*U*grad_v*u_phi[i][qp]
425 + p*u_gradphi[i][qp](1)
426 - this->_mu(T)*(u_gradphi[i][qp]*grad_v + u_gradphi[i][qp]*grad_vT
427 - 2.0/3.0*divU*u_gradphi[i][qp](1) )
428 + rho*this->_g(1)*u_phi[i][qp]
432 (*Fw)(i) += ( -rho*U*grad_w*u_phi[i][qp]
433 + p*u_gradphi[i][qp](2)
434 - this->_mu(T)*(u_gradphi[i][qp]*grad_w + u_gradphi[i][qp]*grad_wT
435 - 2.0/3.0*divU*u_gradphi[i][qp](2) )
436 + rho*this->_g(2)*u_phi[i][qp]
440 if (compute_jacobian && context.get_elem_solution_derivative())
442 libmesh_assert (context.get_elem_solution_derivative() == 1.0);
444 for (
unsigned int j=0; j != n_u_dofs; j++)
447 libMesh::Number r0 = rho*U*u_phi[i][qp]*u_gradphi[j][qp];
448 libMesh::Number r1 = u_gradphi[i][qp]*u_gradphi[j][qp];
449 libMesh::Number r2 = rho*u_phi[i][qp]*u_phi[j][qp];
452 Kuu(i,j) += JxW[qp]*(
460 + u_gradphi[i][qp](0)*u_gradphi[j][qp](0)
461 - 2.0/3.0*u_gradphi[i][qp](0)*u_gradphi[j][qp](0)
463 Kvv(i,j) += JxW[qp]*(
471 + u_gradphi[i][qp](1)*u_gradphi[j][qp](1)
472 - 2.0/3.0*u_gradphi[i][qp](1)*u_gradphi[j][qp](1)
475 Kuv(i,j) += JxW[qp]*(
476 +2.0/3.0*this->_mu(T)*u_gradphi[i][qp](0)*u_gradphi[j][qp](1)
477 -this->_mu(T)*u_gradphi[i][qp](1)*u_gradphi[j][qp](0)
482 Kvu(i,j) += JxW[qp]*(
483 +2.0/3.0*this->_mu(T)*u_gradphi[i][qp](1)*u_gradphi[j][qp](0)
484 -this->_mu(T)*u_gradphi[i][qp](0)*u_gradphi[j][qp](1)
493 (*Kuw)(i,j) += JxW[qp]*(
494 +2.0/3.0*this->_mu(T)*u_gradphi[i][qp](0)*u_gradphi[j][qp](2)
495 -this->_mu(T)*u_gradphi[i][qp](2)*u_gradphi[j][qp](0)
500 (*Kvw)(i,j) += JxW[qp]*(
501 +2.0/3.0*this->_mu(T)*u_gradphi[i][qp](1)*u_gradphi[j][qp](2)
502 -this->_mu(T)*u_gradphi[i][qp](2)*u_gradphi[j][qp](1)
507 (*Kwu)(i,j) += JxW[qp]*(
508 +2.0/3.0*this->_mu(T)*u_gradphi[i][qp](2)*u_gradphi[j][qp](0)
509 -this->_mu(T)*u_gradphi[i][qp](0)*u_gradphi[j][qp](2)
514 (*Kwv)(i,j) += JxW[qp]*(
515 +2.0/3.0*this->_mu(T)*u_gradphi[i][qp](2)*u_gradphi[j][qp](1)
516 -this->_mu(T)*u_gradphi[i][qp](1)*u_gradphi[j][qp](2)
521 (*Kww)(i,j) += JxW[qp]*(
529 + u_gradphi[i][qp](2)*u_gradphi[j][qp](2)
530 - 2.0/3.0*u_gradphi[i][qp](2)*u_gradphi[j][qp](2)
536 for (
unsigned int j=0; j!=n_T_dofs; j++)
540 libMesh:: Number r3 = d_rho*u_phi[i][qp]*T_phi[j][qp];
543 KuT(i,j) += JxW[qp]*(
546 -d_mu*T_phi[j][qp]*grad_u*u_gradphi[i][qp]
547 -d_mu*T_phi[j][qp]*grad_u(0)*u_gradphi[i][qp](0)
548 +2.0/3.0*d_mu*T_phi[j][qp]*divU*u_gradphi[i][qp](0)
553 KvT(i,j) += JxW[qp]*(
556 -d_mu*T_phi[j][qp]*grad_v*u_gradphi[i][qp]
557 -d_mu*T_phi[j][qp]*grad_v(1)*u_gradphi[i][qp](1)
558 +2.0/3.0*d_mu*T_phi[j][qp]*divU*u_gradphi[i][qp](1)
565 (*KwT)(i,j) += JxW[qp]*(
568 -d_mu*T_phi[j][qp]*grad_w*u_gradphi[i][qp]
569 -d_mu*T_phi[j][qp]*grad_w(2)*u_gradphi[i][qp](2)
570 +2.0/3.0*d_mu*T_phi[j][qp]*divU*u_gradphi[i][qp](2)
579 for (
unsigned int j=0; j != n_p_dofs; j++)
581 Kup(i,j) += JxW[qp]*p_phi[j][qp]*u_gradphi[i][qp](0);
582 Kvp(i,j) += JxW[qp]*p_phi[j][qp]*u_gradphi[i][qp](1);
584 (*Kwp)(i,j) += JxW[qp]*p_phi[j][qp]*u_gradphi[i][qp](2);
595 template<
class Mu,
class SH,
class TC>
601 const unsigned int n_T_dofs = context.get_dof_indices(this->_temp_vars.T()).size();
602 const unsigned int n_u_dofs = context.get_dof_indices(this->_flow_vars.u()).size();
605 const std::vector<libMesh::Real> &JxW =
606 context.get_element_fe(this->_temp_vars.T())->get_JxW();
609 const std::vector<std::vector<libMesh::Real> >& T_phi =
610 context.get_element_fe(this->_temp_vars.T())->get_phi();
611 const std::vector<std::vector<libMesh::Real> >& u_phi =
612 context.get_element_fe(this->_flow_vars.u())->get_phi();
615 const std::vector<std::vector<libMesh::RealGradient> >& T_gradphi =
616 context.get_element_fe(this->_temp_vars.T())->get_dphi();
618 libMesh::DenseSubVector<libMesh::Number> &FT = context.get_elem_residual(this->_temp_vars.T());
620 unsigned int n_qpoints = context.get_element_qrule().n_points();
621 for (
unsigned int qp=0; qp != n_qpoints; qp++)
623 libMesh::Number u, v, T, p0;
631 libMesh::NumberVectorValue U(u,v);
635 libMesh::DenseSubMatrix<libMesh::Number> &KTu = context.get_elem_jacobian(this->_temp_vars.T(), this->_flow_vars.u());
636 libMesh::DenseSubMatrix<libMesh::Number> &KTv = context.get_elem_jacobian(this->_temp_vars.T(), this->_flow_vars.v());
637 libMesh::DenseSubMatrix<libMesh::Number>* KTw = NULL;
639 libMesh::DenseSubMatrix<libMesh::Number> &KTT = context.get_elem_jacobian(this->_temp_vars.T(), this->_temp_vars.T());
641 if( this->_dim == 3 )
643 KTw = &context.get_elem_jacobian(this->_temp_vars.T(), this->_flow_vars.w());
646 libMesh::Number k = this->_k(T);
647 libMesh::Number dk_dT = this->_k.deriv(T);
648 libMesh::Number cp = this->_cp(T);
649 libMesh::Number d_cp = this->_cp.deriv(T);
650 libMesh::Number rho = this->rho( T, p0 );
651 libMesh::Number d_rho = this->d_rho_dT( T, p0 );
655 for (
unsigned int i=0; i != n_T_dofs; i++)
657 FT(i) += ( -rho*cp*U*grad_T*T_phi[i][qp]
658 - k*grad_T*T_gradphi[i][qp]
664 for (
unsigned int j=0; j!=n_u_dofs; j++)
667 libMesh::Number r0 = rho*cp*T_phi[i][qp]*u_phi[j][qp];
679 (*KTw)(i,j) += JxW[qp]*
687 for (
unsigned int j=0; j!=n_T_dofs; j++)
689 KTT(i,j) += JxW[qp]* (
691 cp*U*T_phi[i][qp]*T_gradphi[j][qp]
692 + U*grad_T*T_phi[i][qp]*d_cp*T_phi[j][qp]
694 -cp*U*grad_T*T_phi[i][qp]*d_rho*T_phi[j][qp]
695 -k*T_gradphi[i][qp]*T_gradphi[j][qp]
696 -grad_T*T_gradphi[i][qp]*dk_dT*T_phi[j][qp]
707 template<
class Mu,
class SH,
class TC>
712 const std::vector<libMesh::Real> &JxW =
713 context.get_element_fe(this->_flow_vars.u())->get_JxW();
716 const std::vector<std::vector<libMesh::Real> >& p_phi =
717 context.get_element_fe(this->_press_var.p())->get_phi();
720 const unsigned int n_p_dofs = context.get_dof_indices(this->_press_var.p()).size();
723 libMesh::DenseSubVector<libMesh::Real> &F_p = context.get_elem_residual(this->_press_var.p());
725 unsigned int n_qpoints = context.get_element_qrule().n_points();
727 for (
unsigned int qp = 0; qp != n_qpoints; ++qp)
735 context.interior_rate(this->_temp_vars.T(), qp, T_dot);
737 libMesh::Real T = context.fixed_interior_value(this->_temp_vars.T(), qp);
739 for (
unsigned int i = 0; i != n_p_dofs; ++i)
741 F_p(i) -= T_dot/T*p_phi[i][qp]*JxW[qp];
749 template<
class Mu,
class SH,
class TC>
754 const std::vector<libMesh::Real> &JxW =
755 context.get_element_fe(this->_flow_vars.u())->get_JxW();
758 const std::vector<std::vector<libMesh::Real> >& u_phi =
759 context.get_element_fe(this->_flow_vars.u())->get_phi();
762 const unsigned int n_u_dofs = context.get_dof_indices(this->_flow_vars.u()).size();
765 libMesh::DenseSubVector<libMesh::Real> &F_u = context.get_elem_residual(this->_flow_vars.u());
766 libMesh::DenseSubVector<libMesh::Real> &F_v = context.get_elem_residual(this->_flow_vars.v());
767 libMesh::DenseSubVector<libMesh::Real>* F_w = NULL;
769 if( this->_dim == 3 )
771 F_w = &context.get_elem_residual(this->_flow_vars.w());
774 unsigned int n_qpoints = context.get_element_qrule().n_points();
776 for (
unsigned int qp = 0; qp != n_qpoints; ++qp)
783 libMesh::Real u_dot, v_dot, w_dot = 0.0;
784 context.interior_rate(this->_flow_vars.u(), qp, u_dot);
785 context.interior_rate(this->_flow_vars.v(), qp, v_dot);
787 if( this->_dim == 3 )
788 context.interior_rate(this->_flow_vars.w(), qp, w_dot);
790 libMesh::Real T = context.fixed_interior_value(this->_temp_vars.T(), qp);
792 libMesh::Number rho = this->rho(T, this->get_p0_transient(context, qp));
794 for (
unsigned int i = 0; i != n_u_dofs; ++i)
796 F_u(i) -= rho*u_dot*u_phi[i][qp]*JxW[qp];
797 F_v(i) -= rho*v_dot*u_phi[i][qp]*JxW[qp];
799 if( this->_dim == 3 )
800 (*F_w)(i) -= rho*w_dot*u_phi[i][qp]*JxW[qp];
829 template<
class Mu,
class SH,
class TC>
834 const std::vector<libMesh::Real> &JxW =
835 context.get_element_fe(this->_temp_vars.T())->get_JxW();
838 const std::vector<std::vector<libMesh::Real> >& T_phi =
839 context.get_element_fe(this->_temp_vars.T())->get_phi();
842 const unsigned int n_T_dofs = context.get_dof_indices(this->_temp_vars.T()).size();
845 libMesh::DenseSubVector<libMesh::Real> &F_T = context.get_elem_residual(this->_temp_vars.T());
847 unsigned int n_qpoints = context.get_element_qrule().n_points();
849 for (
unsigned int qp = 0; qp != n_qpoints; ++qp)
857 context.interior_rate(this->_temp_vars.T(), qp, T_dot);
859 libMesh::Real T = context.fixed_interior_value(this->_temp_vars.T(), qp);
861 libMesh::Real cp = this->_cp(T);
863 libMesh::Number rho = this->rho(T, this->get_p0_transient(context, qp));
865 for (
unsigned int i = 0; i != n_T_dofs; ++i)
867 F_T(i) -= rho*cp*T_dot*T_phi[i][qp]*JxW[qp];
875 template<
class Mu,
class SH,
class TC>
880 const std::vector<libMesh::Real> &JxW =
881 context.get_element_fe(this->_temp_vars.T())->get_JxW();
884 const unsigned int n_p0_dofs = context.get_dof_indices(this->_p0_var->p0()).size();
887 libMesh::DenseSubVector<libMesh::Real> &F_p0 = context.get_elem_residual(this->_p0_var->p0());
889 unsigned int n_qpoints = context.get_element_qrule().n_points();
891 for (
unsigned int qp = 0; qp != n_qpoints; ++qp)
894 T = context.interior_value(this->_temp_vars.T(), qp);
896 libMesh::Gradient grad_u, grad_v, grad_w;
897 grad_u = context.interior_gradient(this->_flow_vars.u(), qp);
898 grad_v = context.interior_gradient(this->_flow_vars.v(), qp);
900 grad_w = context.interior_gradient(this->_flow_vars.w(), qp);
902 libMesh::Number divU = grad_u(0) + grad_v(1);
911 libMesh::Number p0 = context.interior_value( this->_p0_var->p0(), qp );
913 for (
unsigned int i = 0; i != n_p0_dofs; ++i)
915 F_p0(i) += (p0/T - this->_p0/this->_T0)*JxW[qp];
923 template<
class Mu,
class SH,
class TC>
928 const unsigned int n_p0_dofs = context.get_dof_indices(this->_p0_var->p0()).size();
940 unsigned int n_qpoints = context.get_side_qrule().n_points();
941 for (
unsigned int qp=0; qp != n_qpoints; qp++)
964 for (
unsigned int i=0; i != n_p0_dofs; i++)
973 template<
class Mu,
class SH,
class TC>
978 const unsigned int n_p0_dofs = context.get_dof_indices(this->_p0_var->p0()).size();
979 const unsigned int n_T_dofs = context.get_dof_indices(this->_temp_vars.T()).size();
980 const unsigned int n_p_dofs = context.get_dof_indices(this->_press_var.p()).size();
983 const std::vector<libMesh::Real> &JxW =
984 context.get_element_fe(this->_temp_vars.T())->get_JxW();
987 const std::vector<std::vector<libMesh::Real> >& T_phi =
988 context.get_element_fe(this->_temp_vars.T())->get_phi();
991 const std::vector<std::vector<libMesh::Real> >& p_phi =
992 context.get_element_fe(this->_press_var.p())->get_phi();
995 libMesh::DenseSubVector<libMesh::Real> &F_p0 = context.get_elem_residual(this->_p0_var->p0());
996 libMesh::DenseSubVector<libMesh::Real> &F_T = context.get_elem_residual(this->_temp_vars.T());
997 libMesh::DenseSubVector<libMesh::Real> &F_p = context.get_elem_residual(this->_press_var.p());
999 unsigned int n_qpoints = context.get_element_qrule().n_points();
1001 for (
unsigned int qp = 0; qp != n_qpoints; ++qp)
1004 T = context.fixed_interior_value(this->_temp_vars.T(), qp);
1006 libMesh::Number cp = this->_cp(T);
1007 libMesh::Number cv = cp + this->_R;
1008 libMesh::Number gamma = cp/cv;
1009 libMesh::Number one_over_gamma = 1.0/(gamma-1.0);
1011 libMesh::Number p0_dot;
1012 context.interior_rate(this->_p0_var->p0(), qp, p0_dot);
1014 libMesh::Number p0 = context.fixed_interior_value(this->_p0_var->p0(), qp );
1016 for (
unsigned int i=0; i != n_p0_dofs; i++)
1018 F_p0(i) -= p0_dot*one_over_gamma*JxW[qp];
1021 for (
unsigned int i=0; i != n_T_dofs; i++)
1023 F_T(i) += p0_dot*T_phi[i][qp]*JxW[qp];
1026 for (
unsigned int i=0; i != n_p_dofs; i++)
1028 F_p(i) += p0_dot/p0*p_phi[i][qp]*JxW[qp];
1035 template<
class Mu,
class SH,
class TC>
1039 const unsigned int n_qpoints = context.get_element_qrule().n_points();
1041 std::vector<libMesh::Real> u, v, w, T, p, p0;
1042 u.resize(n_qpoints);
1043 v.resize(n_qpoints);
1044 if( this->_dim > 2 )
1045 w.resize(n_qpoints);
1047 T.resize(n_qpoints);
1048 p.resize(n_qpoints);
1049 p0.resize(n_qpoints);
1051 std::vector<libMesh::Gradient> grad_u, grad_v, grad_w, grad_T;
1052 grad_u.resize(n_qpoints);
1053 grad_v.resize(n_qpoints);
1054 if( this->_dim > 2 )
1055 grad_w.resize(n_qpoints);
1057 grad_T.resize(n_qpoints);
1059 for (
unsigned int qp = 0; qp != n_qpoints; ++qp)
1061 u[qp] = context.interior_value(this->_flow_vars.u(), qp);
1062 v[qp] = context.interior_value(this->_flow_vars.v(), qp);
1064 grad_u[qp] = context.interior_gradient(this->_flow_vars.u(), qp);
1065 grad_v[qp] = context.interior_gradient(this->_flow_vars.v(), qp);
1066 if( this->_dim > 2 )
1068 w[qp] = context.interior_value(this->_flow_vars.w(), qp);
1069 grad_w[qp] = context.interior_gradient(this->_flow_vars.w(), qp);
1071 T[qp] = context.interior_value(this->_temp_vars.T(), qp);
1072 grad_T[qp] = context.interior_gradient(this->_temp_vars.T(), qp);
1074 p[qp] = context.interior_value(this->_press_var.p(), qp);
1075 p0[qp] = this->get_p0_steady(context, qp);
1099 template<
class Mu,
class SH,
class TC>
1102 const libMesh::Point& point,
1103 libMesh::Real& value )
1105 if( quantity_index == this->_rho_index )
1107 libMesh::Real T = this->T(point,context);
1108 libMesh::Real p0 = this->get_p0_steady(context,point);
1110 value = this->rho( T, p0 );
virtual void compute_element_time_derivative_cache(const AssemblyContext &context, CachedValues &cache)
virtual void element_time_derivative(bool compute_jacobian, AssemblyContext &context, CachedValues &cache)
Time dependent part(s) of physics for element interiors.
unsigned int register_quantity(std::string name)
Register quantity to be postprocessed.
GRINS::ICHandlingBase * _ic_handler
virtual void auxiliary_init(MultiphysicsSystem &system)
Any auxillary initialization a Physics class may need.
void set_values(unsigned int quantity, std::vector< libMesh::Number > &values)
void assemble_energy_time_deriv(bool compute_jacobian, AssemblyContext &context, CachedValues &cache)
Helper function.
static PhysicsName low_mach_navier_stokes()
Base class for reading and handling initial conditions for physics classes.
virtual void compute_postprocessed_quantity(unsigned int quantity_index, const AssemblyContext &context, const libMesh::Point &point, libMesh::Real &value)
void assemble_thermo_press_mass_residual(bool compute_jacobian, AssemblyContext &c)
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...
Physics class for Incompressible Navier-Stokes.
virtual void element_constraint(bool compute_jacobian, AssemblyContext &context, CachedValues &cache)
Constraint part(s) of physics for element interiors.
void assemble_thermo_press_elem_time_deriv(bool compute_jacobian, AssemblyContext &c)
void assemble_momentum_time_deriv(bool compute_jacobian, AssemblyContext &context, CachedValues &cache)
Helper function.
void assemble_momentum_mass_residual(bool compute_jacobian, AssemblyContext &c)
Helper function.
Interface with libMesh for solving Multiphysics problems.
const std::vector< libMesh::Gradient > & get_cached_gradient_values(unsigned int quantity) const
void assemble_mass_time_deriv(bool compute_jacobian, AssemblyContext &context, CachedValues &cache)
Helper function.
virtual void register_postprocessing_vars(const GetPot &input, PostProcessedQuantities< libMesh::Real > &postprocessing)
Register postprocessing variables for LowMachNavierStokes.
bool _pin_pressure
Enable pressure pinning.
Physics class for Incompressible Navier-Stokes.
virtual void init_context(AssemblyContext &context)
Initialize context for added physics variables.
virtual void init_context(AssemblyContext &context)
Initialize context for added physics variables.
void assemble_energy_mass_residual(bool compute_jacobian, AssemblyContext &c)
Helper function.
void set_gradient_values(unsigned int quantity, std::vector< libMesh::Gradient > &values)
void assemble_continuity_mass_residual(bool compute_jacobian, AssemblyContext &c)
Helper function.
const std::vector< libMesh::Number > & get_cached_values(unsigned int quantity) const
void assemble_thermo_press_side_time_deriv(bool compute_jacobian, AssemblyContext &c)