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)