36 #include "libmesh/quadrature.h" 
   37 #include "libmesh/fem_system.h" 
   41   template<
typename Mixture, 
typename Evaluator>
 
   44                                                                               libMesh::UniquePtr<Mixture> & gas_mix)
 
   46     _p_pinning(input,physics_name),
 
   57   template<
typename Mixture, 
typename Evaluator>
 
   61       _p_pinning.check_pin_location(system.get_mesh());
 
   64   template<
typename Mixture, 
typename Evaluator>
 
   70     if( input.have_variable(section) )
 
   72         unsigned int n_vars = input.vector_variable_size(section);
 
   74         for( 
unsigned int v = 0; v < n_vars; v++ )
 
   76             std::string name = input(section,
"DIE!",v);
 
   78             if( name == std::string(
"rho") )
 
   82             else if( name == std::string(
"mu") )
 
   86             else if( name == std::string(
"k") )
 
   90             else if( name == std::string(
"cp") )
 
   94             else if( name == std::string(
"mole_fractions") )
 
   96                 this->_mole_fractions_index.resize(this->n_species());
 
   98                 for( 
unsigned int s = 0; s < this->n_species(); s++ )
 
  100                     this->_mole_fractions_index[s] = postprocessing.
register_quantity( 
"X_"+this->_gas_mixture->species_name(s) );
 
  103             else if( name == std::string(
"h_s") )
 
  105                 this->_h_s_index.resize(this->n_species());
 
  107                 for( 
unsigned int s = 0; s < this->n_species(); s++ )
 
  109                     this->_h_s_index[s] = postprocessing.
register_quantity( 
"h_"+this->_gas_mixture->species_name(s) );
 
  112             else if( name == std::string(
"omega_dot") )
 
  114                 this->_omega_dot_index.resize(this->n_species());
 
  116                 for( 
unsigned int s = 0; s < this->n_species(); s++ )
 
  117                   this->_omega_dot_index[s] = postprocessing.
register_quantity( 
"omega_dot_"+this->_gas_mixture->species_name(s) );
 
  119             else if( name == std::string(
"D_s") )
 
  121                 this->_Ds_index.resize(this->n_species());
 
  123                 for( 
unsigned int s = 0; s < this->n_species(); s++ )
 
  124                   this->_Ds_index[s] = postprocessing.
register_quantity( 
"D_"+this->_gas_mixture->species_name(s) );
 
  129                           << 
"       Found " << name << std::endl
 
  130                           << 
"       Acceptable values are: rho" << std::endl
 
  131                           << 
"                              mu" << std::endl
 
  133                           << 
"                              cp" << std::endl
 
  134                           << 
"                              mole_fractions" << std::endl
 
  135                           << 
"                              omega_dot" << std::endl;
 
  144   template<
typename Mixture, 
typename Evaluator>
 
  151     context.get_side_fe(this->_flow_vars.u())->get_JxW();
 
  152     context.get_side_fe(this->_flow_vars.u())->get_phi();
 
  153     context.get_side_fe(this->_flow_vars.u())->get_dphi();
 
  154     context.get_side_fe(this->_flow_vars.u())->get_xyz();
 
  156     context.get_side_fe(this->_temp_vars.T())->get_JxW();
 
  157     context.get_side_fe(this->_temp_vars.T())->get_phi();
 
  158     context.get_side_fe(this->_temp_vars.T())->get_dphi();
 
  159     context.get_side_fe(this->_temp_vars.T())->get_xyz();
 
  162   template<
typename Mixture, 
typename Evaluator>
 
  166     if( compute_jacobian )
 
  167       libmesh_not_implemented();
 
  175     const unsigned int n_p_dofs = context.get_dof_indices(this->_press_var.p()).size();
 
  176     const unsigned int n_s_dofs = context.get_dof_indices(s0_var).size();
 
  177     const unsigned int n_u_dofs = context.get_dof_indices(this->_flow_vars.u()).size();
 
  178     const unsigned int n_T_dofs = context.get_dof_indices(this->_temp_vars.T()).size();
 
  181     if (this->_flow_vars.dim() > 1)
 
  182       libmesh_assert (n_u_dofs == context.get_dof_indices(this->_flow_vars.v()).size());
 
  184     if (this->_flow_vars.dim() == 3)
 
  185       libmesh_assert (n_u_dofs == context.get_dof_indices(this->_flow_vars.w()).size());
 
  188     const std::vector<libMesh::Real>& JxW =
 
  189       context.get_element_fe(this->_flow_vars.u())->get_JxW();
 
  192     const std::vector<std::vector<libMesh::Real> >& p_phi =
 
  193       context.get_element_fe(this->_press_var.p())->get_phi();
 
  196     const std::vector<std::vector<libMesh::Real> >& s_phi = context.get_element_fe(s0_var)->get_phi();
 
  199     const std::vector<std::vector<libMesh::Gradient> >& s_grad_phi = context.get_element_fe(s0_var)->get_dphi();
 
  202     const std::vector<std::vector<libMesh::Real> >& u_phi =
 
  203       context.get_element_fe(this->_flow_vars.u())->get_phi();
 
  206     const std::vector<std::vector<libMesh::RealGradient> >& u_gradphi =
 
  207       context.get_element_fe(this->_flow_vars.u())->get_dphi();
 
  210     const std::vector<std::vector<libMesh::Real> >& T_phi =
 
  211       context.get_element_fe(this->_temp_vars.T())->get_phi();
 
  214     const std::vector<std::vector<libMesh::RealGradient> >& T_gradphi =
 
  215       context.get_element_fe(this->_temp_vars.T())->get_dphi();
 
  217     const std::vector<libMesh::Point>& u_qpoint =
 
  218       context.get_element_fe(this->_flow_vars.u())->get_xyz();
 
  220     libMesh::DenseSubVector<libMesh::Number>& Fp = context.get_elem_residual(this->_press_var.p()); 
 
  222     libMesh::DenseSubVector<libMesh::Number> &Fu = context.get_elem_residual(this->_flow_vars.u()); 
 
  224     libMesh::DenseSubVector<libMesh::Number>* Fv = NULL;
 
  225     if( this->_flow_vars.dim() > 1 )
 
  226       Fv = &context.get_elem_residual(this->_flow_vars.v()); 
 
  228     libMesh::DenseSubVector<libMesh::Number>* Fw = NULL;
 
  229     if( this->_flow_vars.dim() == 3 )
 
  230       Fw = &context.get_elem_residual(this->_flow_vars.w()); 
 
  232     libMesh::DenseSubVector<libMesh::Number> &FT = context.get_elem_residual(this->_temp_vars.T()); 
 
  234     unsigned int n_qpoints = context.get_element_qrule().n_points();
 
  235     for (
unsigned int qp=0; qp != n_qpoints; qp++)
 
  239         libMesh::Number u, T;
 
  244         const libMesh::Gradient& grad_T =
 
  247         libMesh::NumberVectorValue U(u);
 
  248         if (this->_flow_vars.dim() > 1)
 
  250         if (this->_flow_vars.dim() == 3)
 
  254         libMesh::Gradient grad_v;
 
  256         if (this->_flow_vars.dim() > 1)
 
  259         libMesh::Gradient grad_w;
 
  260         if (this->_flow_vars.dim() == 3)
 
  263         libMesh::Number divU = grad_u(0);
 
  264         if (this->_flow_vars.dim() > 1)
 
  266         if (this->_flow_vars.dim() == 3)
 
  269         libMesh::NumberVectorValue grad_uT( grad_u(0) );
 
  270         libMesh::NumberVectorValue grad_vT;
 
  271         if( this->_flow_vars.dim() > 1 )
 
  273             grad_uT(1) = grad_v(0);
 
  274             grad_vT = libMesh::NumberVectorValue( grad_u(1), grad_v(1) );
 
  276         libMesh::NumberVectorValue grad_wT;
 
  277         if( this->_flow_vars.dim() == 3 )
 
  279             grad_uT(2) = grad_w(0);
 
  280             grad_vT(2) = grad_w(1);
 
  281             grad_wT = libMesh::NumberVectorValue( grad_u(2), grad_v(2), grad_w(2) );
 
  287         const std::vector<libMesh::Real>& D =
 
  296         const std::vector<libMesh::Real>& omega_dot =
 
  299         const std::vector<libMesh::Real>& h =
 
  302         const libMesh::Number r = u_qpoint[qp](0);
 
  304         libMesh::Real jac = JxW[qp];
 
  315         libmesh_assert_equal_to( grad_ws.size(), this->_n_species );
 
  318         libMesh::Gradient mass_term(0.0,0.0,0.0);
 
  319         for(
unsigned int s=0; s < this->_n_species; s++ )
 
  321             mass_term += grad_ws[s]/this->_gas_mixture->M(s);
 
  325         for (
unsigned int i=0; i != n_p_dofs; i++)
 
  327             Fp(i) += (-U*(mass_term + grad_T/T) + divU)*jac*p_phi[i][qp];
 
  331         for(
unsigned int s=0; s < this->_n_species; s++ )
 
  333             libMesh::DenseSubVector<libMesh::Number> &Fs =
 
  334               context.get_elem_residual(this->_species_vars.species(s)); 
 
  336             const libMesh::Real term1 = -rho*(U*grad_ws[s]) + omega_dot[s];
 
  337             const libMesh::Gradient term2 = -rho*D[s]*grad_ws[s];
 
  339             for (
unsigned int i=0; i != n_s_dofs; i++)
 
  342                 Fs(i) += ( term1*s_phi[i][qp] + term2*s_grad_phi[i][qp] )*jac;
 
  347         for (
unsigned int i=0; i != n_u_dofs; i++)
 
  349             Fu(i) += ( -rho*U*grad_u*u_phi[i][qp]
 
  350                        + p*u_gradphi[i][qp](0)
 
  351                        - mu*(u_gradphi[i][qp]*grad_u + u_gradphi[i][qp]*grad_uT
 
  352                              - 2.0/3.0*divU*u_gradphi[i][qp](0) )
 
  353                        + rho*this->_g(0)*u_phi[i][qp]
 
  360                 Fu(i) += u_phi[i][qp]*( p/r - 2*mu*U(0)/(r*r) - 2.0/3.0*mu*divU/r )*jac;
 
  363             if (this->_flow_vars.dim() > 1)
 
  365                 (*Fv)(i) += ( -rho*U*grad_v*u_phi[i][qp]
 
  366                               + p*u_gradphi[i][qp](1)
 
  367                               - mu*(u_gradphi[i][qp]*grad_v + u_gradphi[i][qp]*grad_vT
 
  368                                     - 2.0/3.0*divU*u_gradphi[i][qp](1) )
 
  369                               + rho*this->_g(1)*u_phi[i][qp]
 
  373             if (this->_flow_vars.dim() == 3)
 
  375                 (*Fw)(i) += ( -rho*U*grad_w*u_phi[i][qp]
 
  376                               + p*u_gradphi[i][qp](2)
 
  377                               - mu*(u_gradphi[i][qp]*grad_w + u_gradphi[i][qp]*grad_wT
 
  378                                     - 2.0/3.0*divU*u_gradphi[i][qp](2) )
 
  379                               + rho*this->_g(2)*u_phi[i][qp]
 
  385         libMesh::Real chem_term = 0.0;
 
  386         for(
unsigned int s=0; s < this->_n_species; s++ )
 
  388             chem_term += h[s]*omega_dot[s];
 
  391         for (
unsigned int i=0; i != n_T_dofs; i++)
 
  393             FT(i) += ( ( -rho*cp*U*grad_T - chem_term )*T_phi[i][qp]
 
  394                        - k*grad_T*T_gradphi[i][qp]  )*jac;
 
  402   template<
typename Mixture, 
typename Evaluator>
 
  404   ( 
bool compute_jacobian,
 
  408     if( this->_pin_pressure )
 
  410         _p_pinning.pin_value( context, compute_jacobian, this->_press_var.p() );
 
  416   template<
typename Mixture, 
typename Evaluator>
 
  420     const unsigned int n_p_dofs = context.get_dof_indices(this->_press_var.p()).size();
 
  421     const unsigned int n_u_dofs = context.get_dof_indices(this->_flow_vars.u()).size();
 
  422     const unsigned int n_T_dofs = context.get_dof_indices(this->_temp_vars.T()).size();
 
  424     const unsigned int n_s_dofs = context.get_dof_indices(s0_var).size();
 
  426     const std::vector<libMesh::Real> &JxW =
 
  427       context.get_element_fe(this->_flow_vars.u())->get_JxW();
 
  429     const std::vector<std::vector<libMesh::Real> >& p_phi =
 
  430       context.get_element_fe(this->_press_var.p())->get_phi();
 
  432     const std::vector<std::vector<libMesh::Real> >& u_phi =
 
  433       context.get_element_fe(this->_flow_vars.u())->get_phi();
 
  435     const std::vector<std::vector<libMesh::Real> >& T_phi =
 
  436       context.get_element_fe(this->_temp_vars.T())->get_phi();
 
  438     const std::vector<std::vector<libMesh::Real> >& s_phi =
 
  439       context.get_element_fe(s0_var)->get_phi();
 
  443     libMesh::DenseSubVector<libMesh::Real> &F_p = context.get_elem_residual(this->_press_var.p());
 
  446     libMesh::DenseSubVector<libMesh::Real> &F_u = context.get_elem_residual(this->_flow_vars.u());
 
  448     libMesh::DenseSubVector<libMesh::Real>* F_v = NULL;
 
  449     if( this->_flow_vars.dim() > 1 )
 
  450       F_v  = &context.get_elem_residual(this->_flow_vars.v());
 
  452     libMesh::DenseSubVector<libMesh::Real>* F_w = NULL;
 
  453     if( this->_flow_vars.dim() == 3 )
 
  454       F_w  = &context.get_elem_residual(this->_flow_vars.w()); 
 
  456     libMesh::DenseSubVector<libMesh::Real> &F_T = context.get_elem_residual(this->_temp_vars.T());
 
  458     unsigned int n_qpoints = context.get_element_qrule().n_points();
 
  460     const std::vector<libMesh::Point>& u_qpoint =
 
  461       context.get_element_fe(this->_flow_vars.u())->get_xyz();
 
  463     for (
unsigned int qp = 0; qp != n_qpoints; ++qp)
 
  465         libMesh::Real u_dot, v_dot = 0.0, w_dot = 0.0;
 
  466         context.interior_rate(this->_flow_vars.u(), qp, u_dot);
 
  468         if( this->_flow_vars.dim() > 1 )
 
  469           context.interior_rate(this->_flow_vars.v(), qp, v_dot);
 
  471         if( this->_flow_vars.dim() == 3 )
 
  472           context.interior_rate(this->_flow_vars.w(), qp, w_dot);
 
  475         context.interior_rate(this->_temp_vars.T(), qp, T_dot);
 
  477         libMesh::Real T = context.interior_value(this->_temp_vars.T(), qp);
 
  479         std::vector<libMesh::Real> ws(this->n_species());
 
  480         for(
unsigned int s=0; s < this->_n_species; s++ )
 
  481           ws[s] = context.interior_value(this->_species_vars.species(s), qp);
 
  483         Evaluator gas_evaluator( *(this->_gas_mixture) );
 
  484         const libMesh::Real R_mix = gas_evaluator.R_mix(ws);
 
  485         const libMesh::Real p0 = this->get_p0_steady(context,qp);
 
  486         const libMesh::Real rho = this->rho(T, p0, R_mix);
 
  487         const libMesh::Real cp = gas_evaluator.cp(T,p0,ws);
 
  488         const libMesh::Real M = gas_evaluator.M_mix( ws );
 
  490         libMesh::Real jac = JxW[qp];
 
  491         const libMesh::Number r = u_qpoint[qp](0);
 
  493         if( this->_is_axisymmetric )
 
  497         libMesh::Real M_dot = 0.0;
 
  500         for(
unsigned int s=0; s < this->n_species(); s++)
 
  502             libMesh::DenseSubVector<libMesh::Number> &F_s =
 
  503               context.get_elem_residual(this->_species_vars.species(s));
 
  505             libMesh::Real ws_dot;
 
  506             context.interior_rate(this->_species_vars.species(s), qp, ws_dot);
 
  508             for (
unsigned int i = 0; i != n_s_dofs; ++i)
 
  509               F_s(i) -= rho*ws_dot*s_phi[i][qp]*jac;
 
  512             M_dot += ws_dot/this->_gas_mixture->M(s);
 
  517         libMesh::Real M_dot_over_M = M_dot*(-M);
 
  519         for (
unsigned int i = 0; i != n_p_dofs; ++i)
 
  520           F_p(i) -= (T_dot/T-M_dot_over_M)*p_phi[i][qp]*jac;
 
  523         for (
unsigned int i = 0; i != n_u_dofs; ++i)
 
  525             F_u(i) -= rho*u_dot*u_phi[i][qp]*jac;
 
  527             if( this->_flow_vars.dim() > 1 )
 
  528               (*F_v)(i) -= rho*v_dot*u_phi[i][qp]*jac;
 
  530             if( this->_flow_vars.dim() == 3 )
 
  531               (*F_w)(i) -= rho*w_dot*u_phi[i][qp]*jac;
 
  535         for (
unsigned int i = 0; i != n_T_dofs; ++i)
 
  536           F_T(i) -= rho*cp*T_dot*T_phi[i][qp]*jac;
 
  538         if( compute_jacobian )
 
  539           libmesh_not_implemented();
 
  544   template<
typename Mixture, 
typename Evaluator>
 
  550     Evaluator gas_evaluator( *(this->_gas_mixture) );
 
  552     const unsigned int n_qpoints = context.get_element_qrule().n_points();
 
  554     std::vector<libMesh::Real> u, v, w, T, p, p0;
 
  557     if( this->_flow_vars.dim() > 2 )
 
  562     p0.resize(n_qpoints);
 
  564     std::vector<libMesh::Gradient> grad_u, grad_v, grad_w, grad_T;
 
  565     grad_u.resize(n_qpoints);
 
  566     grad_v.resize(n_qpoints);
 
  567     if( this->_flow_vars.dim() > 2 )
 
  568       grad_w.resize(n_qpoints);
 
  570     grad_T.resize(n_qpoints);
 
  572     std::vector<std::vector<libMesh::Real> > mass_fractions;
 
  573     std::vector<std::vector<libMesh::Gradient> > grad_mass_fractions;
 
  574     mass_fractions.resize(n_qpoints);
 
  575     grad_mass_fractions.resize(n_qpoints);
 
  577     std::vector<libMesh::Real> M;
 
  580     std::vector<libMesh::Real> R;
 
  583     std::vector<libMesh::Real> rho;
 
  584     rho.resize(n_qpoints);
 
  586     std::vector<libMesh::Real> cp;
 
  587     cp.resize(n_qpoints);
 
  589     std::vector<libMesh::Real> mu;
 
  590     mu.resize(n_qpoints);
 
  592     std::vector<libMesh::Real> k;
 
  595     std::vector<std::vector<libMesh::Real> > h_s;
 
  596     h_s.resize(n_qpoints);
 
  598     std::vector<std::vector<libMesh::Real> > D_s;
 
  599     D_s.resize(n_qpoints);
 
  601     std::vector<std::vector<libMesh::Real> > omega_dot_s;
 
  602     omega_dot_s.resize(n_qpoints);
 
  604     for (
unsigned int qp = 0; qp != n_qpoints; ++qp)
 
  606         u[qp] = context.interior_value(this->_flow_vars.u(), qp);
 
  607         v[qp] = context.interior_value(this->_flow_vars.v(), qp);
 
  609         grad_u[qp] = context.interior_gradient(this->_flow_vars.u(), qp);
 
  610         grad_v[qp] = context.interior_gradient(this->_flow_vars.v(), qp);
 
  611         if( this->_flow_vars.dim() > 2 )
 
  613             w[qp] = context.interior_value(this->_flow_vars.w(), qp);
 
  614             grad_w[qp] = context.interior_gradient(this->_flow_vars.w(), qp);
 
  617         T[qp] = context.interior_value(this->_temp_vars.T(), qp);
 
  618         grad_T[qp] = context.interior_gradient(this->_temp_vars.T(), qp);
 
  620         p[qp] = context.interior_value(this->_press_var.p(), qp);
 
  621         p0[qp] = this->get_p0_steady(context, qp);
 
  623         mass_fractions[qp].resize(this->_n_species);
 
  624         grad_mass_fractions[qp].resize(this->_n_species);
 
  625         h_s[qp].resize(this->_n_species);
 
  627         for( 
unsigned int s = 0; s < this->_n_species; s++ )
 
  631             mass_fractions[qp][s] = std::max( context.interior_value(this->_species_vars.species(s),qp), 0.0 );
 
  632             grad_mass_fractions[qp][s] = context.interior_gradient(this->_species_vars.species(s),qp);
 
  633             h_s[qp][s] = gas_evaluator.h_s( T[qp], s );
 
  636         M[qp] = gas_evaluator.M_mix( mass_fractions[qp] );
 
  638         R[qp] = gas_evaluator.R_mix( mass_fractions[qp] );
 
  640         rho[qp] = this->rho( T[qp], p0[qp], R[qp] );
 
  642         cp[qp] = gas_evaluator.cp(T[qp], p0[qp], mass_fractions[qp]);
 
  644         D_s[qp].resize(this->_n_species);
 
  646         gas_evaluator.mu_and_k_and_D( T[qp], rho[qp], cp[qp], mass_fractions[qp],
 
  647                                       mu[qp], k[qp], D_s[qp] );
 
  649         omega_dot_s[qp].resize(this->_n_species);
 
  650         gas_evaluator.omega_dot( T[qp], rho[qp], mass_fractions[qp], omega_dot_s[qp] );
 
  658     if(this->_flow_vars.dim() > 2)
 
  681   template<
typename Mixture, 
typename Evaluator>
 
  684                                                                                        const libMesh::Point& point,
 
  685                                                                                        libMesh::Real& value )
 
  687     Evaluator gas_evaluator( *(this->_gas_mixture) );
 
  689     if( quantity_index == this->_rho_index )
 
  691         std::vector<libMesh::Real> Y( this->_n_species );
 
  692         libMesh::Real T = this->T(point,context);
 
  693         libMesh::Real p0 = this->get_p0_steady(context,point);
 
  694         this->mass_fractions( point, context, Y );
 
  696         value = this->rho( T, p0, gas_evaluator.R_mix(Y) );
 
  698     else if( quantity_index == this->_mu_index )
 
  700         std::vector<libMesh::Real> Y( this->_n_species );
 
  701         libMesh::Real T = this->T(point,context);
 
  702         this->mass_fractions( point, context, Y );
 
  703         libMesh::Real p0 = this->get_p0_steady(context,point);
 
  705         value = gas_evaluator.mu( T, p0, Y );
 
  707     else if( quantity_index == this->_k_index )
 
  709         std::vector<libMesh::Real> Y( this->_n_species );
 
  711         libMesh::Real T = this->T(point,context);
 
  712         this->mass_fractions( point, context, Y );
 
  713         libMesh::Real p0 = this->get_p0_steady(context,point);
 
  715         libMesh::Real cp = gas_evaluator.cp( T, p0, Y );
 
  717         libMesh::Real rho = this->rho( T, p0, gas_evaluator.R_mix(Y) );
 
  720         std::vector<libMesh::Real> D( this->_n_species );
 
  722         gas_evaluator.mu_and_k_and_D( T, rho, cp, Y, mu, k, D );
 
  727     else if( quantity_index == this->_cp_index )
 
  729         std::vector<libMesh::Real> Y( this->_n_species );
 
  730         libMesh::Real T = this->T(point,context);
 
  731         this->mass_fractions( point, context, Y );
 
  732         libMesh::Real p0 = this->get_p0_steady(context,point);
 
  734         value = gas_evaluator.cp( T, p0, Y );
 
  739         if( !this->_h_s_index.empty() )
 
  741             libmesh_assert_equal_to( _h_s_index.size(), this->n_species() );
 
  743             for( 
unsigned int s = 0; s < this->n_species(); s++ )
 
  745                 if( quantity_index == this->_h_s_index[s] )
 
  747                     libMesh::Real T = this->T(point,context);
 
  749                     value = gas_evaluator.h_s( T, s );
 
  755         if( !this->_mole_fractions_index.empty() )
 
  757             libmesh_assert_equal_to( _mole_fractions_index.size(), this->n_species() );
 
  759             for( 
unsigned int s = 0; s < this->n_species(); s++ )
 
  761                 if( quantity_index == this->_mole_fractions_index[s] )
 
  763                     std::vector<libMesh::Real> Y( this->_n_species );
 
  764                     this->mass_fractions( point, context, Y );
 
  766                     libMesh::Real M = gas_evaluator.M_mix(Y);
 
  768                     value = gas_evaluator.X( s, M, Y[s] );
 
  774         if( !this->_omega_dot_index.empty() )
 
  776             libmesh_assert_equal_to( _omega_dot_index.size(), this->n_species() );
 
  778             for( 
unsigned int s = 0; s < this->n_species(); s++ )
 
  780                 if( quantity_index == this->_omega_dot_index[s] )
 
  782                     std::vector<libMesh::Real> Y( this->n_species() );
 
  783                     this->mass_fractions( point, context, Y );
 
  785                     libMesh::Real T = this->T(point,context);
 
  787                     libMesh::Real p0 = this->get_p0_steady(context,point);
 
  789                     libMesh::Real rho = this->rho( T, p0, gas_evaluator.R_mix(Y) );
 
  791                     std::vector<libMesh::Real> omega_dot( this->n_species() );
 
  792                     gas_evaluator.omega_dot( T, rho, Y, omega_dot );
 
  794                     value = omega_dot[s];
 
  800         if( !this->_Ds_index.empty() )
 
  802             libmesh_assert_equal_to( _Ds_index.size(), this->n_species() );
 
  804             for( 
unsigned int s = 0; s < this->n_species(); s++ )
 
  806                 if( quantity_index == this->_Ds_index[s] )
 
  808                     std::vector<libMesh::Real> Y( this->_n_species );
 
  810                     libMesh::Real T = this->T(point,context);
 
  811                     this->mass_fractions( point, context, Y );
 
  812                     libMesh::Real p0 = this->get_p0_steady(context,point);
 
  814                     libMesh::Real cp = gas_evaluator.cp( T, p0, Y );
 
  816                     libMesh::Real rho = this->rho( T, p0, gas_evaluator.R_mix(Y) );
 
  819                     std::vector<libMesh::Real> D( this->_n_species );
 
  821                     gas_evaluator.mu_and_k_and_D( T, rho, cp, Y, mu, k, D );
 
static bool is_axisymmetric()
CachedValues & get_cached_values()
unsigned int VariableIndex
More descriptive name of the type used for variable indices. 
unsigned int register_quantity(std::string name)
Register quantity to be postprocessed. 
GRINS::ICHandlingBase * _ic_handler
virtual void register_postprocessing_vars(const GetPot &input, PostProcessedQuantities< libMesh::Real > &postprocessing)
Register postprocessing variables for ReactingLowMachNavierStokes. 
void set_values(unsigned int quantity, std::vector< libMesh::Number > &values)
static PhysicsName reacting_low_mach_navier_stokes()
void set_vector_gradient_values(unsigned int quantity, std::vector< std::vector< libMesh::Gradient > > &values)
virtual void element_time_derivative(bool compute_jacobian, AssemblyContext &context)
Time dependent part(s) of physics for element interiors. 
Base class for reading and handling initial conditions for physics classes. 
virtual void element_constraint(bool compute_jacobian, AssemblyContext &context)
Constraint part(s) of physics for element interiors. 
const std::vector< std::vector< libMesh::Number > > & get_cached_vector_values(unsigned int quantity) const 
virtual void init_context(AssemblyContext &context)
Initialize context for added physics variables. 
bool _pin_pressure
Enable pressure pinning. 
const std::vector< std::vector< libMesh::Gradient > > & get_cached_vector_gradient_values(unsigned int quantity) const 
Interface with libMesh for solving Multiphysics problems. 
const std::vector< libMesh::Gradient > & get_cached_gradient_values(unsigned int quantity) const 
virtual void compute_element_time_derivative_cache(AssemblyContext &context)
ReactingLowMachNavierStokes()
void set_vector_values(unsigned int quantity, std::vector< std::vector< libMesh::Number > > &values)
void set_gradient_values(unsigned int quantity, std::vector< libMesh::Gradient > &values)
virtual void auxiliary_init(MultiphysicsSystem &system)
Any auxillary initialization a Physics class may need. 
virtual void compute_postprocessed_quantity(unsigned int quantity_index, const AssemblyContext &context, const libMesh::Point &point, libMesh::Real &value)
virtual void mass_residual(bool compute_jacobian, AssemblyContext &context)
Mass matrix part(s) for element interiors. All boundary terms lie within the time_derivative part...
virtual void init_context(AssemblyContext &context)
Initialize context for added physics variables. 
const std::vector< libMesh::Number > & get_cached_values(unsigned int quantity) const