110 lines
3.1 KiB
C++
110 lines
3.1 KiB
C++
/**
|
|
*
|
|
* @file IdealGasPhase.cpp
|
|
*
|
|
*/
|
|
|
|
#ifdef WIN32
|
|
#pragma warning(disable:4786)
|
|
#pragma warning(disable:4503)
|
|
#endif
|
|
|
|
#include "ct_defs.h"
|
|
#include "mix_defs.h"
|
|
#include "IdealGasPhase.h"
|
|
#include "SpeciesThermo.h"
|
|
|
|
namespace Cantera {
|
|
|
|
void IdealGasPhase::getChemPotentials(doublereal* mu) const {
|
|
doublereal logp = log(pressure()/m_spthermo->refPressure());
|
|
doublereal xx;
|
|
doublereal rt = temperature() * GasConstant;
|
|
const array_fp& g_RT = gibbs_RT();
|
|
for (int k = 0; k < m_kk; k++) {
|
|
xx = fmaxx(SmallNumber, moleFraction(k));
|
|
mu[k] = rt*(g_RT[k] + log(xx) + logp);
|
|
}
|
|
}
|
|
|
|
// new methods defined here
|
|
|
|
|
|
void IdealGasPhase::initThermo() {
|
|
m_kk = nSpecies();
|
|
m_mm = nElements();
|
|
doublereal tmin = m_spthermo->minTemp();
|
|
doublereal tmax = m_spthermo->maxTemp();
|
|
if (tmin > 0.0) m_tmin = tmin;
|
|
if (tmax > 0.0) m_tmax = tmax;
|
|
m_p0 = refPressure();
|
|
|
|
int leng = m_kk;
|
|
m_h0_RT.resize(leng);
|
|
m_g0_RT.resize(leng);
|
|
m_expg0_RT.resize(leng);
|
|
m_cp0_R.resize(leng);
|
|
m_s0_R.resize(leng);
|
|
m_pe.resize(leng, 0.0);
|
|
m_pp.resize(leng);
|
|
}
|
|
|
|
|
|
/**
|
|
* Set mixture to an equilibrium state consistent with specified
|
|
* element potentials and temperature.
|
|
*
|
|
* @param lambda_RT vector of non-dimensional element potentials
|
|
* \f[ \lambda_m/RT \f].
|
|
* @param t temperature in K.
|
|
* @param work. Temporary work space. Must be dimensioned at least
|
|
* as large as the number of species.
|
|
*
|
|
*/
|
|
void IdealGasPhase::setToEquilState(const doublereal* lambda_RT)
|
|
{
|
|
const array_fp& grt = gibbs_RT();
|
|
|
|
// set the pressure and composition to be consistent with
|
|
// the temperature,
|
|
doublereal pres = 0.0;
|
|
for (int k = 0; k < m_kk; k++) {
|
|
m_pp[k] = -grt[k];
|
|
for (int m = 0; m < m_mm; m++) {
|
|
m_pp[k] += nAtoms(k,m)*lambda_RT[m];
|
|
//cout << "m = " << m << " k = " << k << " " <<
|
|
// nAtoms(k,m) << " " << lambda_RT[m] << endl;
|
|
}
|
|
//cout << "m_pp = " << m_pp[k] << endl;
|
|
m_pp[k] = m_p0 * exp(m_pp[k]);
|
|
//cout << "after exp, m_pp[k] = " << m_pp[k] << endl;
|
|
pres += m_pp[k];
|
|
}
|
|
//cout << "pres = " << pres << endl;
|
|
// set state
|
|
setState_PX(pres, m_pp.begin());
|
|
}
|
|
|
|
void IdealGasPhase::_updateThermo() const {
|
|
doublereal tnow = temperature();
|
|
if (m_tlast != tnow) {
|
|
m_spthermo->update(tnow, m_cp0_R.begin(), m_h0_RT.begin(),
|
|
m_s0_R.begin());
|
|
m_tlast = tnow;
|
|
// doublereal rrt = 1.0 / (GasConstant * tnow);
|
|
int k;
|
|
//doublereal deltaE;
|
|
for (k = 0; k < m_kk; k++) {
|
|
//deltaE = rrt * m_pe[k];
|
|
//m_h0_RT[k] += deltaE;
|
|
m_g0_RT[k] = m_h0_RT[k] - m_s0_R[k];
|
|
}
|
|
m_logc0 = log(m_p0/(GasConstant * tnow));
|
|
m_tlast = tnow;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|