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)