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