30 #include "grins_config.h"
40 #include "libmesh/quadrature.h"
45 template<
class Mu,
class SH,
class TC>
48 _p_pinning(input,physics_name),
60 template<
class Mu,
class SH,
class TC>
66 template<
class Mu,
class SH,
class TC>
77 template<
class Mu,
class SH,
class TC>
83 if( input.have_variable(section) )
85 unsigned int n_vars = input.vector_variable_size(section);
87 for(
unsigned int v = 0; v < n_vars; v++ )
89 std::string name = input(section,
"DIE!",v);
91 if( name == std::string(
"rho") )
98 <<
" Found " << name << std::endl
99 <<
" Acceptable values are: rho" << std::endl;
108 template<
class Mu,
class SH,
class TC>
115 context.get_side_fe(this->_u_var)->get_JxW();
116 context.get_side_fe(this->_u_var)->get_phi();
117 context.get_side_fe(this->_u_var)->get_dphi();
118 context.get_side_fe(this->_u_var)->get_xyz();
120 context.get_side_fe(this->_T_var)->get_JxW();
121 context.get_side_fe(this->_T_var)->get_phi();
122 context.get_side_fe(this->_T_var)->get_dphi();
123 context.get_side_fe(this->_T_var)->get_xyz();
129 template<
class Mu,
class SH,
class TC>
134 #ifdef GRINS_USE_GRVY_TIMERS
135 this->_timer->BeginTimer(
"LowMachNavierStokes::element_time_derivative");
138 this->assemble_mass_time_deriv( compute_jacobian, context, cache );
139 this->assemble_momentum_time_deriv( compute_jacobian, context, cache );
140 this->assemble_energy_time_deriv( compute_jacobian, context, cache );
142 if( this->_enable_thermo_press_calc )
143 this->assemble_thermo_press_elem_time_deriv( compute_jacobian, context );
145 #ifdef GRINS_USE_GRVY_TIMERS
146 this->_timer->EndTimer(
"LowMachNavierStokes::element_time_derivative");
152 template<
class Mu,
class SH,
class TC>
157 if( this->_enable_thermo_press_calc )
159 #ifdef GRINS_USE_GRVY_TIMERS
160 this->_timer->BeginTimer(
"LowMachNavierStokes::side_time_derivative");
163 this->assemble_thermo_press_side_time_deriv( compute_jacobian, context );
165 #ifdef GRINS_USE_GRVY_TIMERS
166 this->_timer->EndTimer(
"LowMachNavierStokes::side_time_derivative");
173 template<
class Mu,
class SH,
class TC>
179 if( this->_pin_pressure )
181 this->_p_pinning.pin_value( context, compute_jacobian, this->_p_var);
187 template<
class Mu,
class SH,
class TC>
192 this->assemble_continuity_mass_residual( compute_jacobian, context );
194 this->assemble_momentum_mass_residual( compute_jacobian, context );
196 this->assemble_energy_mass_residual( compute_jacobian, context );
198 if( this->_enable_thermo_press_calc )
199 this->assemble_thermo_press_mass_residual( compute_jacobian, context );
204 template<
class Mu,
class SH,
class TC>
210 const unsigned int n_p_dofs = context.get_dof_indices(this->_p_var).size();
213 const std::vector<libMesh::Real> &JxW =
214 context.get_element_fe(this->_u_var)->get_JxW();
217 const std::vector<std::vector<libMesh::Real> >& p_phi =
218 context.get_element_fe(this->_p_var)->get_phi();
223 const std::vector<std::vector<libMesh::Real> >& u_phi =
224 context.get_element_fe(this->_u_var)->get_phi();
228 const std::vector<std::vector<libMesh::RealGradient> >& u_gradphi =
229 context.get_element_fe(this->_u_var)->get_dphi();
232 const std::vector<std::vector<libMesh::Real> >& T_phi =
233 context.get_element_fe(this->_T_var)->get_phi();
237 const std::vector<std::vector<libMesh::RealGradient> >& T_gradphi =
238 context.get_element_fe(this->_T_var)->get_dphi();
242 libMesh::DenseSubVector<libMesh::Number> &Fp = context.get_elem_residual(this->_p_var);
244 unsigned int n_qpoints = context.get_element_qrule().n_points();
247 const unsigned int n_t_dofs = context.get_dof_indices(this->_T_var).size();
250 const unsigned int n_u_dofs = context.get_dof_indices(this->_u_var).size();
253 libmesh_assert (n_u_dofs == context.get_dof_indices(this->_v_var).size());
255 libmesh_assert (n_u_dofs == context.get_dof_indices(this->_w_var).size());
257 for (
unsigned int qp=0; qp != n_qpoints; qp++)
259 libMesh::Number u, v, T;
270 libMesh::NumberVectorValue U(u,v);
274 libMesh::Number divU = grad_u(0) + grad_v(1);
282 libMesh::DenseSubMatrix<libMesh::Number> &KPu = context.get_elem_jacobian(this->_p_var, this->_u_var);
283 libMesh::DenseSubMatrix<libMesh::Number> &KPv = context.get_elem_jacobian(this->_p_var, this->_v_var);
284 libMesh::DenseSubMatrix<libMesh::Number> &KPT = context.get_elem_jacobian(this->_p_var, this->_T_var);
286 libMesh::DenseSubMatrix<libMesh::Number>* KPw = NULL;
288 if( this->_dim == 3 )
290 KPw = &context.get_elem_jacobian(this->_p_var, this->_w_var);
295 for (
unsigned int i=0; i != n_p_dofs; i++)
297 Fp(i) += (-U*grad_T/T + divU)*p_phi[i][qp]*JxW[qp];
300 if (compute_jacobian)
303 for (
unsigned int j=0; j!=n_u_dofs; j++)
305 KPu(i,j) += JxW[qp]*(
306 +u_gradphi[j][qp](0)*p_phi[i][qp]
307 -u_phi[j][qp]*p_phi[i][qp]*grad_T(0)/T
310 KPv(i,j) += JxW[qp]*(
311 +u_gradphi[j][qp](1)*p_phi[i][qp]
312 -u_phi[j][qp]*p_phi[i][qp]*grad_T(1)/T
317 (*KPw)(i,j) += JxW[qp]*(
318 +u_gradphi[j][qp](2)*p_phi[i][qp]
319 -u_phi[j][qp]*p_phi[i][qp]*grad_T(2)/T
325 for (
unsigned int j=0; j!=n_t_dofs; j++)
327 KPT(i,j) += JxW[qp]*(
328 -T_gradphi[j][qp]*U*p_phi[i][qp]/T
329 +U*p_phi[i][qp]*grad_T*T_phi[j][qp])/(T*T);
338 template<
class Mu,
class SH,
class TC>
344 const unsigned int n_u_dofs = context.get_dof_indices(this->_u_var).size();
345 const unsigned int n_p_dofs = context.get_dof_indices(this->_p_var).size();
346 const unsigned int n_T_dofs = context.get_dof_indices(this->_T_var).size();
349 libmesh_assert (n_u_dofs == context.get_dof_indices(this->_v_var).size());
351 libmesh_assert (n_u_dofs == context.get_dof_indices(this->_w_var).size());
354 const std::vector<libMesh::Real> &JxW =
355 context.get_element_fe(this->_u_var)->get_JxW();
358 const std::vector<std::vector<libMesh::Real> >& u_phi =
359 context.get_element_fe(this->_u_var)->get_phi();
360 const std::vector<std::vector<libMesh::Real> >& p_phi =
361 context.get_element_fe(this->_p_var)->get_phi();
362 const std::vector<std::vector<libMesh::Real> >& T_phi =
363 context.get_element_fe(this->_T_var)->get_phi();
366 const std::vector<std::vector<libMesh::RealGradient> >& u_gradphi =
367 context.get_element_fe(this->_u_var)->get_dphi();
369 libMesh::DenseSubVector<libMesh::Number> &Fu = context.get_elem_residual(this->_u_var);
370 libMesh::DenseSubVector<libMesh::Number> &Fv = context.get_elem_residual(this->_v_var);
371 libMesh::DenseSubVector<libMesh::Number> &Fw = context.get_elem_residual(this->_w_var);
373 unsigned int n_qpoints = context.get_element_qrule().n_points();
374 for (
unsigned int qp=0; qp != n_qpoints; qp++)
376 libMesh::Number u, v, p, p0, T;
387 libMesh::Gradient grad_w;
391 libMesh::NumberVectorValue grad_uT( grad_u(0), grad_v(0) );
392 libMesh::NumberVectorValue grad_vT( grad_u(1), grad_v(1) );
393 libMesh::NumberVectorValue grad_wT;
394 if( this->_dim == 3 )
396 grad_uT(2) = grad_w(0);
397 grad_vT(2) = grad_w(1);
398 grad_wT = libMesh::NumberVectorValue( grad_u(2), grad_v(2), grad_w(2) );
401 libMesh::NumberVectorValue U(u,v);
405 libMesh::Number divU = grad_u(0) + grad_v(1);
409 libMesh::Number rho = this->rho( T, p0 );
410 libMesh::Number d_rho = this->d_rho_dT( T, p0 );
411 libMesh::Number d_mu = this->_mu.deriv(T);
413 libMesh::DenseSubMatrix<libMesh::Number> &Kuu = context.get_elem_jacobian(this->_u_var, this->_u_var);
414 libMesh::DenseSubMatrix<libMesh::Number> &Kuv = context.get_elem_jacobian(this->_u_var, this->_v_var);
415 libMesh::DenseSubMatrix<libMesh::Number>* Kuw = NULL;
417 libMesh::DenseSubMatrix<libMesh::Number> &Kvu = context.get_elem_jacobian(this->_v_var, this->_u_var);
418 libMesh::DenseSubMatrix<libMesh::Number> &Kvv = context.get_elem_jacobian(this->_v_var, this->_v_var);
419 libMesh::DenseSubMatrix<libMesh::Number>* Kvw = NULL;
421 libMesh::DenseSubMatrix<libMesh::Number>* Kwu = NULL;
422 libMesh::DenseSubMatrix<libMesh::Number>* Kwv = NULL;
423 libMesh::DenseSubMatrix<libMesh::Number>* Kww = NULL;
425 libMesh::DenseSubMatrix<libMesh::Number> &Kup = context.get_elem_jacobian(this->_u_var, this->_p_var);
426 libMesh::DenseSubMatrix<libMesh::Number> &Kvp = context.get_elem_jacobian(this->_v_var, this->_p_var);
427 libMesh::DenseSubMatrix<libMesh::Number>* Kwp = NULL;
429 libMesh::DenseSubMatrix<libMesh::Number> &KuT = context.get_elem_jacobian(this->_u_var, this->_T_var);
430 libMesh::DenseSubMatrix<libMesh::Number> &KvT = context.get_elem_jacobian(this->_v_var, this->_T_var);
431 libMesh::DenseSubMatrix<libMesh::Number>* KwT = NULL;
433 if( this->_dim == 3 )
435 Kuw = &context.get_elem_jacobian(this->_u_var, this->_w_var);
436 Kvw = &context.get_elem_jacobian(this->_v_var, this->_w_var);
437 Kwu = &context.get_elem_jacobian(this->_w_var, this->_u_var);
438 Kwv = &context.get_elem_jacobian(this->_w_var, this->_v_var);
439 Kww = &context.get_elem_jacobian(this->_w_var, this->_w_var);
440 Kwp = &context.get_elem_jacobian(this->_w_var, this->_p_var);
441 KwT = &context.get_elem_jacobian(this->_w_var, this->_T_var);
446 for (
unsigned int i=0; i != n_u_dofs; i++)
448 Fu(i) += ( -rho*U*grad_u*u_phi[i][qp]
449 + p*u_gradphi[i][qp](0)
450 - this->_mu(T)*(u_gradphi[i][qp]*grad_u + u_gradphi[i][qp]*grad_uT
451 - 2.0/3.0*divU*u_gradphi[i][qp](0) )
452 + rho*this->_g(0)*u_phi[i][qp]
455 Fv(i) += ( -rho*U*grad_v*u_phi[i][qp]
456 + p*u_gradphi[i][qp](1)
457 - this->_mu(T)*(u_gradphi[i][qp]*grad_v + u_gradphi[i][qp]*grad_vT
458 - 2.0/3.0*divU*u_gradphi[i][qp](1) )
459 + rho*this->_g(1)*u_phi[i][qp]
463 Fw(i) += ( -rho*U*grad_w*u_phi[i][qp]
464 + p*u_gradphi[i][qp](2)
465 - this->_mu(T)*(u_gradphi[i][qp]*grad_w + u_gradphi[i][qp]*grad_wT
466 - 2.0/3.0*divU*u_gradphi[i][qp](2) )
467 + rho*this->_g(2)*u_phi[i][qp]
471 if (compute_jacobian && context.get_elem_solution_derivative())
473 libmesh_assert (context.get_elem_solution_derivative() == 1.0);
475 for (
unsigned int j=0; j != n_u_dofs; j++)
478 libMesh::Number r0 = rho*U*u_phi[i][qp]*u_gradphi[j][qp];
479 libMesh::Number r1 = u_gradphi[i][qp]*u_gradphi[j][qp];
480 libMesh::Number r2 = rho*u_phi[i][qp]*u_phi[j][qp];
483 Kuu(i,j) += JxW[qp]*(
491 + u_gradphi[i][qp](0)*u_gradphi[j][qp](0)
492 - 2.0/3.0*u_gradphi[i][qp](0)*u_gradphi[j][qp](0)
494 Kvv(i,j) += JxW[qp]*(
502 + u_gradphi[i][qp](1)*u_gradphi[j][qp](1)
503 - 2.0/3.0*u_gradphi[i][qp](1)*u_gradphi[j][qp](1)
506 Kuv(i,j) += JxW[qp]*(
507 +2.0/3.0*this->_mu(T)*u_gradphi[i][qp](0)*u_gradphi[j][qp](1)
508 -this->_mu(T)*u_gradphi[i][qp](1)*u_gradphi[j][qp](0)
513 Kvu(i,j) += JxW[qp]*(
514 +2.0/3.0*this->_mu(T)*u_gradphi[i][qp](1)*u_gradphi[j][qp](0)
515 -this->_mu(T)*u_gradphi[i][qp](0)*u_gradphi[j][qp](1)
524 (*Kuw)(i,j) += JxW[qp]*(
525 +2.0/3.0*this->_mu(T)*u_gradphi[i][qp](0)*u_gradphi[j][qp](2)
526 -this->_mu(T)*u_gradphi[i][qp](2)*u_gradphi[j][qp](0)
531 (*Kvw)(i,j) += JxW[qp]*(
532 +2.0/3.0*this->_mu(T)*u_gradphi[i][qp](1)*u_gradphi[j][qp](2)
533 -this->_mu(T)*u_gradphi[i][qp](2)*u_gradphi[j][qp](1)
538 (*Kwu)(i,j) += JxW[qp]*(
539 +2.0/3.0*this->_mu(T)*u_gradphi[i][qp](2)*u_gradphi[j][qp](0)
540 -this->_mu(T)*u_gradphi[i][qp](0)*u_gradphi[j][qp](2)
545 (*Kwv)(i,j) += JxW[qp]*(
546 +2.0/3.0*this->_mu(T)*u_gradphi[i][qp](2)*u_gradphi[j][qp](1)
547 -this->_mu(T)*u_gradphi[i][qp](1)*u_gradphi[j][qp](2)
552 (*Kww)(i,j) += JxW[qp]*(
560 + u_gradphi[i][qp](2)*u_gradphi[j][qp](2)
561 - 2.0/3.0*u_gradphi[i][qp](2)*u_gradphi[j][qp](2)
567 for (
unsigned int j=0; j!=n_T_dofs; j++)
571 libMesh:: Number r3 = d_rho*u_phi[i][qp]*T_phi[j][qp];
574 KuT(i,j) += JxW[qp]*(
577 -d_mu*T_phi[j][qp]*grad_u*u_gradphi[i][qp]
578 -d_mu*T_phi[j][qp]*grad_u(0)*u_gradphi[i][qp](0)
579 +2.0/3.0*d_mu*T_phi[j][qp]*divU*u_gradphi[i][qp](0)
584 KvT(i,j) += JxW[qp]*(
587 -d_mu*T_phi[j][qp]*grad_v*u_gradphi[i][qp]
588 -d_mu*T_phi[j][qp]*grad_v(1)*u_gradphi[i][qp](1)
589 +2.0/3.0*d_mu*T_phi[j][qp]*divU*u_gradphi[i][qp](1)
596 (*KwT)(i,j) += JxW[qp]*(
599 -d_mu*T_phi[j][qp]*grad_w*u_gradphi[i][qp]
600 -d_mu*T_phi[j][qp]*grad_w(2)*u_gradphi[i][qp](2)
601 +2.0/3.0*d_mu*T_phi[j][qp]*divU*u_gradphi[i][qp](2)
610 for (
unsigned int j=0; j != n_p_dofs; j++)
612 Kup(i,j) += JxW[qp]*p_phi[j][qp]*u_gradphi[i][qp](0);
613 Kvp(i,j) += JxW[qp]*p_phi[j][qp]*u_gradphi[i][qp](1);
615 (*Kwp)(i,j) += JxW[qp]*p_phi[j][qp]*u_gradphi[i][qp](2);
626 template<
class Mu,
class SH,
class TC>
632 const unsigned int n_T_dofs = context.get_dof_indices(this->_T_var).size();
633 const unsigned int n_u_dofs = context.get_dof_indices(this->_u_var).size();
636 const std::vector<libMesh::Real> &JxW =
637 context.get_element_fe(this->_T_var)->get_JxW();
640 const std::vector<std::vector<libMesh::Real> >& T_phi =
641 context.get_element_fe(this->_T_var)->get_phi();
642 const std::vector<std::vector<libMesh::Real> >& u_phi =
643 context.get_element_fe(this->_u_var)->get_phi();
646 const std::vector<std::vector<libMesh::RealGradient> >& T_gradphi =
647 context.get_element_fe(this->_T_var)->get_dphi();
649 libMesh::DenseSubVector<libMesh::Number> &FT = context.get_elem_residual(this->_T_var);
651 unsigned int n_qpoints = context.get_element_qrule().n_points();
652 for (
unsigned int qp=0; qp != n_qpoints; qp++)
654 libMesh::Number u, v, T, p0;
662 libMesh::NumberVectorValue U(u,v);
666 libMesh::DenseSubMatrix<libMesh::Number> &KTu = context.get_elem_jacobian(this->_T_var, this->_u_var);
667 libMesh::DenseSubMatrix<libMesh::Number> &KTv = context.get_elem_jacobian(this->_T_var, this->_v_var);
668 libMesh::DenseSubMatrix<libMesh::Number>* KTw = NULL;
670 libMesh::DenseSubMatrix<libMesh::Number> &KTT = context.get_elem_jacobian(this->_T_var, this->_T_var);
672 if( this->_dim == 3 )
674 KTw = &context.get_elem_jacobian(this->_T_var, this->_w_var);
677 libMesh::Number k = this->_k(T);
678 libMesh::Number dk_dT = this->_k.deriv(T);
679 libMesh::Number cp = this->_cp(T);
680 libMesh::Number d_cp = this->_cp.deriv(T);
681 libMesh::Number rho = this->rho( T, p0 );
682 libMesh::Number d_rho = this->d_rho_dT( T, p0 );
686 for (
unsigned int i=0; i != n_T_dofs; i++)
688 FT(i) += ( -rho*cp*U*grad_T*T_phi[i][qp]
689 - k*grad_T*T_gradphi[i][qp]
695 for (
unsigned int j=0; j!=n_u_dofs; j++)
698 libMesh::Number r0 = rho*cp*T_phi[i][qp]*u_phi[j][qp];
710 (*KTw)(i,j) += JxW[qp]*
718 for (
unsigned int j=0; j!=n_T_dofs; j++)
720 KTT(i,j) += JxW[qp]* (
722 cp*U*T_phi[i][qp]*T_gradphi[j][qp]
723 + U*grad_T*T_phi[i][qp]*d_cp*T_phi[j][qp]
725 -cp*U*grad_T*T_phi[i][qp]*d_rho*T_phi[j][qp]
726 -k*T_gradphi[i][qp]*T_gradphi[j][qp]
727 -grad_T*T_gradphi[i][qp]*dk_dT*T_phi[j][qp]
738 template<
class Mu,
class SH,
class TC>
743 const std::vector<libMesh::Real> &JxW =
744 context.get_element_fe(this->_u_var)->get_JxW();
747 const std::vector<std::vector<libMesh::Real> >& p_phi =
748 context.get_element_fe(this->_p_var)->get_phi();
751 const unsigned int n_p_dofs = context.get_dof_indices(this->_p_var).size();
754 libMesh::DenseSubVector<libMesh::Real> &F_p = context.get_elem_residual(this->_p_var);
756 unsigned int n_qpoints = context.get_element_qrule().n_points();
758 for (
unsigned int qp = 0; qp != n_qpoints; ++qp)
766 context.interior_rate(this->_T_var, qp, T_dot);
768 libMesh::Real T = context.fixed_interior_value(this->_T_var, qp);
770 for (
unsigned int i = 0; i != n_p_dofs; ++i)
772 F_p(i) -= T_dot/T*p_phi[i][qp]*JxW[qp];
780 template<
class Mu,
class SH,
class TC>
785 const std::vector<libMesh::Real> &JxW =
786 context.get_element_fe(this->_u_var)->get_JxW();
789 const std::vector<std::vector<libMesh::Real> >& u_phi =
790 context.get_element_fe(this->_u_var)->get_phi();
793 const unsigned int n_u_dofs = context.get_dof_indices(this->_u_var).size();
797 this->_w_var = this->_u_var;
800 libMesh::DenseSubVector<libMesh::Real> &F_u = context.get_elem_residual(this->_u_var);
801 libMesh::DenseSubVector<libMesh::Real> &F_v = context.get_elem_residual(this->_v_var);
802 libMesh::DenseSubVector<libMesh::Real> &F_w = context.get_elem_residual(this->_w_var);
804 unsigned int n_qpoints = context.get_element_qrule().n_points();
806 for (
unsigned int qp = 0; qp != n_qpoints; ++qp)
813 libMesh::Real u_dot, v_dot, w_dot = 0.0;
814 context.interior_rate(this->_u_var, qp, u_dot);
815 context.interior_rate(this->_v_var, qp, v_dot);
817 if( this->_dim == 3 )
818 context.interior_rate(this->_w_var, qp, w_dot);
820 libMesh::Real T = context.fixed_interior_value(this->_T_var, qp);
822 libMesh::Number rho = this->rho(T, this->get_p0_transient(context, qp));
824 for (
unsigned int i = 0; i != n_u_dofs; ++i)
826 F_u(i) -= rho*u_dot*u_phi[i][qp]*JxW[qp];
827 F_v(i) -= rho*v_dot*u_phi[i][qp]*JxW[qp];
829 if( this->_dim == 3 )
830 F_w(i) -= rho*w_dot*u_phi[i][qp]*JxW[qp];
859 template<
class Mu,
class SH,
class TC>
864 const std::vector<libMesh::Real> &JxW =
865 context.get_element_fe(this->_T_var)->get_JxW();
868 const std::vector<std::vector<libMesh::Real> >& T_phi =
869 context.get_element_fe(this->_T_var)->get_phi();
872 const unsigned int n_T_dofs = context.get_dof_indices(this->_T_var).size();
875 libMesh::DenseSubVector<libMesh::Real> &F_T = context.get_elem_residual(this->_T_var);
877 unsigned int n_qpoints = context.get_element_qrule().n_points();
879 for (
unsigned int qp = 0; qp != n_qpoints; ++qp)
887 context.interior_rate(this->_T_var, qp, T_dot);
889 libMesh::Real T = context.fixed_interior_value(this->_T_var, qp);
891 libMesh::Real cp = this->_cp(T);
893 libMesh::Number rho = this->rho(T, this->get_p0_transient(context, qp));
895 for (
unsigned int i = 0; i != n_T_dofs; ++i)
897 F_T(i) -= rho*cp*T_dot*T_phi[i][qp]*JxW[qp];
905 template<
class Mu,
class SH,
class TC>
910 const std::vector<libMesh::Real> &JxW =
911 context.get_element_fe(this->_T_var)->get_JxW();
914 const unsigned int n_p0_dofs = context.get_dof_indices(this->_p0_var).size();
917 libMesh::DenseSubVector<libMesh::Real> &F_p0 = context.get_elem_residual(this->_p0_var);
919 unsigned int n_qpoints = context.get_element_qrule().n_points();
921 for (
unsigned int qp = 0; qp != n_qpoints; ++qp)
924 T = context.interior_value(this->_T_var, qp);
926 libMesh::Gradient grad_u, grad_v, grad_w;
927 grad_u = context.interior_gradient(this->_u_var, qp);
928 grad_v = context.interior_gradient(this->_v_var, qp);
930 grad_w = context.interior_gradient(this->_w_var, qp);
932 libMesh::Number divU = grad_u(0) + grad_v(1);
941 libMesh::Number p0 = context.interior_value( this->_p0_var, qp );
943 for (
unsigned int i = 0; i != n_p0_dofs; ++i)
945 F_p0(i) += (p0/T - this->_p0/this->_T0)*JxW[qp];
953 template<
class Mu,
class SH,
class TC>
958 const unsigned int n_p0_dofs = context.get_dof_indices(this->_p0_var).size();
970 unsigned int n_qpoints = context.get_side_qrule().n_points();
971 for (
unsigned int qp=0; qp != n_qpoints; qp++)
994 for (
unsigned int i=0; i != n_p0_dofs; i++)
1003 template<
class Mu,
class SH,
class TC>
1008 const unsigned int n_p0_dofs = context.get_dof_indices(this->_p0_var).size();
1009 const unsigned int n_T_dofs = context.get_dof_indices(this->_T_var).size();
1010 const unsigned int n_p_dofs = context.get_dof_indices(this->_p_var).size();
1013 const std::vector<libMesh::Real> &JxW =
1014 context.get_element_fe(this->_T_var)->get_JxW();
1017 const std::vector<std::vector<libMesh::Real> >& T_phi =
1018 context.get_element_fe(this->_T_var)->get_phi();
1021 const std::vector<std::vector<libMesh::Real> >& p_phi =
1022 context.get_element_fe(this->_p_var)->get_phi();
1025 libMesh::DenseSubVector<libMesh::Real> &F_p0 = context.get_elem_residual(this->_p0_var);
1026 libMesh::DenseSubVector<libMesh::Real> &F_T = context.get_elem_residual(this->_T_var);
1027 libMesh::DenseSubVector<libMesh::Real> &F_p = context.get_elem_residual(this->_p_var);
1029 unsigned int n_qpoints = context.get_element_qrule().n_points();
1031 for (
unsigned int qp = 0; qp != n_qpoints; ++qp)
1034 T = context.fixed_interior_value(this->_T_var, qp);
1036 libMesh::Number cp = this->_cp(T);
1037 libMesh::Number cv = cp + this->_R;
1038 libMesh::Number gamma = cp/cv;
1039 libMesh::Number one_over_gamma = 1.0/(gamma-1.0);
1041 libMesh::Number p0_dot;
1042 context.interior_rate(this->_p0_var, qp, p0_dot);
1044 libMesh::Number p0 = context.fixed_interior_value(this->_p0_var, qp );
1046 for (
unsigned int i=0; i != n_p0_dofs; i++)
1048 F_p0(i) -= p0_dot*one_over_gamma*JxW[qp];
1051 for (
unsigned int i=0; i != n_T_dofs; i++)
1053 F_T(i) += p0_dot*T_phi[i][qp]*JxW[qp];
1056 for (
unsigned int i=0; i != n_p_dofs; i++)
1058 F_p(i) += p0_dot/p0*p_phi[i][qp]*JxW[qp];
1065 template<
class Mu,
class SH,
class TC>
1069 const unsigned int n_qpoints = context.get_element_qrule().n_points();
1071 std::vector<libMesh::Real> u, v, w, T, p, p0;
1072 u.resize(n_qpoints);
1073 v.resize(n_qpoints);
1074 if( this->_dim > 2 )
1075 w.resize(n_qpoints);
1077 T.resize(n_qpoints);
1078 p.resize(n_qpoints);
1079 p0.resize(n_qpoints);
1081 std::vector<libMesh::Gradient> grad_u, grad_v, grad_w, grad_T;
1082 grad_u.resize(n_qpoints);
1083 grad_v.resize(n_qpoints);
1084 if( this->_dim > 2 )
1085 grad_w.resize(n_qpoints);
1087 grad_T.resize(n_qpoints);
1089 for (
unsigned int qp = 0; qp != n_qpoints; ++qp)
1091 u[qp] = context.interior_value(this->_u_var, qp);
1092 v[qp] = context.interior_value(this->_v_var, qp);
1094 grad_u[qp] = context.interior_gradient(this->_u_var, qp);
1095 grad_v[qp] = context.interior_gradient(this->_v_var, qp);
1096 if( this->_dim > 2 )
1098 w[qp] = context.interior_value(this->_w_var, qp);
1099 grad_w[qp] = context.interior_gradient(this->_w_var, qp);
1101 T[qp] = context.interior_value(this->_T_var, qp);
1102 grad_T[qp] = context.interior_gradient(this->_T_var, qp);
1104 p[qp] = context.interior_value(this->_p_var, qp);
1105 p0[qp] = this->get_p0_steady(context, qp);
1129 template<
class Mu,
class SH,
class TC>
1132 const libMesh::Point& point,
1133 libMesh::Real& value )
1135 if( quantity_index == this->_rho_index )
1137 libMesh::Real T = this->T(point,context);
1138 libMesh::Real p0 = this->get_p0_steady(context,point);
1140 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
Base class for reading and handling boundary conditions for physics classes.
void set_values(unsigned int quantity, std::vector< libMesh::Number > &values)
GRINS::BCHandlingBase * _bc_handler
void assemble_energy_time_deriv(bool compute_jacobian, AssemblyContext &context, CachedValues &cache)
Helper function.
virtual void side_time_derivative(bool compute_jacobian, AssemblyContext &context, CachedValues &cache)
Time dependent part(s) of physics for boundaries of elements on the domain boundary.
virtual void read_input_options(const GetPot &input)
Read options from GetPot input file.
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.
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.
const std::vector< libMesh::Gradient > & get_cached_gradient_values(unsigned int quantity) const
const PhysicsName low_mach_navier_stokes
virtual void side_constraint(bool compute_jacobian, AssemblyContext &context, CachedValues &cache)
Constraint part(s) of physics for boundaries of elements on the domain boundary.
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.
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)