cantera/include/cantera/transport/MixTransport.h
2017-07-17 23:41:44 -04:00

189 lines
6.3 KiB
C++

/**
* @file MixTransport.h
* Headers for the MixTransport object, which models transport properties
* in ideal gas solutions using a mixture averaged approximation
* (see \ref tranprops and \link Cantera::MixTransport MixTransport \endlink) .
*/
// This file is part of Cantera. See License.txt in the top-level directory or
// at http://www.cantera.org/license.txt for license and copyright information.
#ifndef CT_MIXTRAN_H
#define CT_MIXTRAN_H
#include "GasTransport.h"
#include "cantera/numerics/DenseMatrix.h"
namespace Cantera
{
//! Class MixTransport implements mixture-averaged transport properties for
//! ideal gas mixtures.
/*!
* The model is based on that described in: R. J. Kee, M. J. Coltrin, and P.
* Glarborg, "Chemically Reacting Flow: Theory & Practice", John Wiley & Sons,
* 2003.
*
* The viscosity is computed using the Wilke mixture rule (kg /m /s)
*
* \f[
* \mu = \sum_k \frac{\mu_k X_k}{\sum_j \Phi_{k,j} X_j}.
* \f]
*
* Here \f$ \mu_k \f$ is the viscosity of pure species \e k, and
*
* \f[
* \Phi_{k,j} = \frac{\left[1
* + \sqrt{\left(\frac{\mu_k}{\mu_j}\sqrt{\frac{M_j}{M_k}}\right)}\right]^2}
* {\sqrt{8}\sqrt{1 + M_k/M_j}}
* \f]
*
* The thermal conductivity is computed from the following mixture rule:
* \f[
* \lambda = 0.5 \left( \sum_k X_k \lambda_k + \frac{1}{\sum_k X_k/\lambda_k} \right)
* \f]
*
* It's used to compute the flux of energy due to a thermal gradient
*
* \f[
* j_T = - \lambda \nabla T
* \f]
*
* The flux of energy has units of energy (kg m2 /s2) per second per area.
*
* The units of lambda are W / m K which is equivalent to kg m / s^3 K.
* @ingroup tranprops
*/
class MixTransport : public GasTransport
{
public:
//! Default constructor.
MixTransport();
virtual std::string transportType() const {
return "Mix";
}
//! Return the thermal diffusion coefficients
/*!
* For this approximation, these are all zero.
*
* @param dt Vector of thermal diffusion coefficients. Units = kg/m/s
*/
virtual void getThermalDiffCoeffs(doublereal* const dt);
//! Returns the mixture thermal conductivity (W/m /K)
/*!
* The thermal conductivity is computed from the following mixture rule:
* \f[
* \lambda = 0.5 \left( \sum_k X_k \lambda_k + \frac{1}{\sum_k X_k/\lambda_k} \right)
* \f]
*
* It's used to compute the flux of energy due to a thermal gradient
*
* \f[
* j_T = - \lambda \nabla T
* \f]
*
* The flux of energy has units of energy (kg m2 /s2) per second per area.
*
* The units of lambda are W / m K which is equivalent to kg m / s^3 K.
*
* @returns the mixture thermal conductivity, with units of W/m/K
*/
virtual doublereal thermalConductivity();
//! Get the Electrical mobilities (m^2/V/s).
/*!
* This function returns the mobilities. In some formulations this is equal
* to the normal mobility multiplied by Faraday's constant.
*
* Here, the mobility is calculated from the diffusion coefficient using the
* Einstein relation
*
* \f[
* \mu^e_k = \frac{F D_k}{R T}
* \f]
*
* @param mobil Returns the mobilities of the species in array \c mobil.
* The array must be dimensioned at least as large as the
* number of species.
*/
virtual void getMobilities(doublereal* const mobil);
//! Update the internal parameters whenever the temperature has changed
/*!
* This is called whenever a transport property is requested if the
* temperature has changed since the last call to update_T().
*/
virtual void update_T();
//! Update the internal parameters whenever the concentrations have changed
/*!
* This is called whenever a transport property is requested if the
* concentrations have changed since the last call to update_C().
*/
virtual void update_C();
//! Get the species diffusive mass fluxes wrt to the mass averaged velocity,
//! given the gradients in mole fraction and temperature
/*!
* Units for the returned fluxes are kg m-2 s-1.
*
* The diffusive mass flux of species \e k is computed from
* \f[
* \vec{j}_k = -n M_k D_k \nabla X_k.
* \f]
*
* @param ndim Number of dimensions in the flux expressions
* @param grad_T Gradient of the temperature (length = ndim)
* @param ldx Leading dimension of the grad_X array
* (usually equal to m_nsp but not always)
* @param grad_X Gradients of the mole fraction. Flat vector with the
* m_nsp in the inner loop. length = ldx * ndim
* @param ldf Leading dimension of the fluxes array
* (usually equal to m_nsp but not always)
* @param fluxes Output of the diffusive mass fluxes. Flat vector with
* the m_nsp in the inner loop. length = ldx * ndim
*/
virtual void getSpeciesFluxes(size_t ndim, const doublereal* const grad_T,
size_t ldx, const doublereal* const grad_X,
size_t ldf, doublereal* const fluxes);
virtual void init(thermo_t* thermo, int mode=0, int log_level=0);
private:
//! Calculate the pressure from the ideal gas law
doublereal pressure_ig() const {
return (m_thermo->molarDensity() * GasConstant *
m_thermo->temperature());
}
//! Update the temperature dependent parts of the species thermal
//! conductivities
/*!
* These are evaluated from the polynomial fits of the temperature and are
* assumed to be independent of pressure
*/
void updateCond_T();
//! vector of species thermal conductivities (W/m /K)
/*!
* These are used in wilke's rule to calculate the viscosity of the
* solution. units = W /m /K = kg m /s^3 /K. length = m_kk.
*/
vector_fp m_cond;
//! Internal storage for the calculated mixture thermal conductivity
/*!
* Units = W /m /K
*/
doublereal m_lambda;
//! Update boolean for the species thermal conductivities
bool m_spcond_ok;
//! Update boolean for the mixture rule for the mixture thermal conductivity
bool m_condmix_ok;
};
}
#endif