libMesh::Real CanteraThermodynamics::cv( const CachedValues& cache, unsigned int qp ) const { const libMesh::Real T = cache.get_cached_values(Cache::TEMPERATURE)[qp]; const libMesh::Real P = cache.get_cached_values(Cache::THERMO_PRESSURE)[qp]; const std::vector<libMesh::Real>& Y = cache.get_cached_vector_values(Cache::MASS_FRACTIONS)[qp]; libmesh_assert_equal_to( Y.size(), _cantera_gas.nSpecies() ); libMesh::Real cv = 0.0; { /*! \todo Need to make sure this will work in a threaded environment. Not sure if we will get thread lock here or not. */ libMesh::Threads::spin_mutex::scoped_lock lock(cantera_mutex); try { _cantera_gas.setState_TPY( T, P, &Y[0] ); cv = _cantera_gas.cv_mass(); } catch(Cantera::CanteraError) { Cantera::showErrors(std::cerr); libmesh_error(); } } return cv; }
void CanteraTransport::D( const CachedValues& cache, unsigned int qp, std::vector<libMesh::Real>& D ) const { const libMesh::Real T = cache.get_cached_values(Cache::TEMPERATURE)[qp]; const libMesh::Real P = cache.get_cached_values(Cache::THERMO_PRESSURE)[qp]; const std::vector<libMesh::Real>& Y = cache.get_cached_vector_values(Cache::MASS_FRACTIONS)[qp]; libmesh_assert_equal_to( Y.size(), D.size() ); libmesh_assert_equal_to( Y.size(), _cantera_gas.nSpecies() ); { libMesh::Threads::spin_mutex::scoped_lock lock(cantera_mutex); /*! \todo Need to make sure this will work in a threaded environment. Not sure if we will get thread lock here or not. */ try { _cantera_gas.setState_TPY(T, P, &Y[0]); _cantera_transport.getMixDiffCoeffsMass(&D[0]); } catch(Cantera::CanteraError) { Cantera::showErrors(std::cerr); libmesh_error(); } } return; }
libMesh::Real AntiochWilkeTransportEvaluator<Th,V,C,D>::k( const CachedValues& cache, unsigned int qp ) { const libMesh::Real T = cache.get_cached_values(Cache::TEMPERATURE)[qp]; const std::vector<libMesh::Real>& Y = cache.get_cached_vector_values(Cache::MASS_FRACTIONS)[qp]; return this->k( T, Y ); }
void AntiochWilkeTransportEvaluator<Th,V,C,D>::mu_and_k( const CachedValues& cache, unsigned int qp, libMesh::Real& mu, libMesh::Real& k ) { const libMesh::Real T = cache.get_cached_values(Cache::TEMPERATURE)[qp]; const std::vector<libMesh::Real>& Y = cache.get_cached_vector_values(Cache::MASS_FRACTIONS)[qp]; _wilke_evaluator->mu_and_k( T, Y, mu, k ); return; }
void CanteraThermodynamics::h( const CachedValues& cache, unsigned int qp, std::vector<libMesh::Real>& h) const { const libMesh::Real T = cache.get_cached_values(Cache::TEMPERATURE)[qp]; const libMesh::Real P = cache.get_cached_values(Cache::THERMO_PRESSURE)[qp]; const std::vector<libMesh::Real>& Y = cache.get_cached_vector_values(Cache::MASS_FRACTIONS)[qp]; libmesh_assert_equal_to( Y.size(), h.size() ); libmesh_assert_equal_to( Y.size(), _cantera_gas.nSpecies() ); { /*! \todo Need to make sure this will work in a threaded environment. Not sure if we will get thread lock here or not. */ libMesh::Threads::spin_mutex::scoped_lock lock(cantera_mutex); try { _cantera_gas.setState_TPY( T, P, &Y[0] ); _cantera_gas.getEnthalpy_RT( &h[0] ); } catch(Cantera::CanteraError) { Cantera::showErrors(std::cerr); libmesh_error(); } for( unsigned int s = 0; s < h.size(); s++ ) { h[s] *= _cantera_mixture.R(s)*T; } } return; }
void GasRecombinationCatalyticWall<Chemistry>::apply_fluxes( AssemblyContext& context, const CachedValues& cache, const bool request_jacobian ) { libmesh_do_once(libmesh_deprecated()); libMesh::FEGenericBase<libMesh::Real>* side_fe = NULL; context.get_side_fe( _reactant_var_idx, side_fe ); // The number of local degrees of freedom in each variable. const unsigned int n_var_dofs = context.get_dof_indices(_reactant_var_idx).size(); libmesh_assert_equal_to( n_var_dofs, context.get_dof_indices(_product_var_idx).size() ); // Element Jacobian * quadrature weight for side integration. const std::vector<libMesh::Real> &JxW_side = side_fe->get_JxW(); // The var shape functions at side quadrature points. const std::vector<std::vector<libMesh::Real> >& var_phi_side = side_fe->get_phi(); // Physical location of the quadrature points const std::vector<libMesh::Point>& var_qpoint = side_fe->get_xyz(); // reactant residual libMesh::DenseSubVector<libMesh::Number> &F_r_var = context.get_elem_residual(_reactant_var_idx); // product residual libMesh::DenseSubVector<libMesh::Number> &F_p_var = context.get_elem_residual(_product_var_idx); unsigned int n_qpoints = context.get_side_qrule().n_points(); for (unsigned int qp=0; qp != n_qpoints; qp++) { libMesh::Real jac = JxW_side[qp]; if(Physics::is_axisymmetric()) { const libMesh::Number r = var_qpoint[qp](0); jac *= r; } const libMesh::Real rho = cache.get_cached_values(Cache::MIXTURE_DENSITY)[qp]; const libMesh::Real Y_r = cache.get_cached_vector_values(Cache::MASS_FRACTIONS)[qp][this->_reactant_species_idx]; const libMesh::Real T = cache.get_cached_values(Cache::TEMPERATURE)[qp]; const libMesh::Real r_value = this->compute_reactant_mass_flux(rho, Y_r, T); const libMesh::Real p_value = -r_value; for (unsigned int i=0; i != n_var_dofs; i++) { F_r_var(i) += r_value*var_phi_side[i][qp]*jac; F_p_var(i) += p_value*var_phi_side[i][qp]*jac; if( request_jacobian ) { libmesh_not_implemented(); } } } }