added enthalpy_mole(), entropy_mole().... capabilities to MargulesVPSSTP
This commit is contained in:
parent
2820296ac5
commit
42e2dd0c0b
6 changed files with 143 additions and 5 deletions
|
|
@ -66,6 +66,7 @@ namespace Cantera {
|
||||||
moleFractions_ = b.moleFractions_;
|
moleFractions_ = b.moleFractions_;
|
||||||
lnActCoeff_Scaled_ = b.lnActCoeff_Scaled_;
|
lnActCoeff_Scaled_ = b.lnActCoeff_Scaled_;
|
||||||
dlnActCoeffdT_Scaled_ = b.dlnActCoeffdT_Scaled_;
|
dlnActCoeffdT_Scaled_ = b.dlnActCoeffdT_Scaled_;
|
||||||
|
d2lnActCoeffdT2_Scaled_ = b.d2lnActCoeffdT2_Scaled_;
|
||||||
dlnActCoeffdlnX_Scaled_ = b.dlnActCoeffdlnX_Scaled_;
|
dlnActCoeffdlnX_Scaled_ = b.dlnActCoeffdlnX_Scaled_;
|
||||||
dlnActCoeffdlnN_Scaled_ = b.dlnActCoeffdlnN_Scaled_;
|
dlnActCoeffdlnN_Scaled_ = b.dlnActCoeffdlnN_Scaled_;
|
||||||
m_pp = b.m_pp;
|
m_pp = b.m_pp;
|
||||||
|
|
@ -324,6 +325,7 @@ namespace Cantera {
|
||||||
moleFractions_.resize(m_kk);
|
moleFractions_.resize(m_kk);
|
||||||
lnActCoeff_Scaled_.resize(m_kk);
|
lnActCoeff_Scaled_.resize(m_kk);
|
||||||
dlnActCoeffdT_Scaled_.resize(m_kk);
|
dlnActCoeffdT_Scaled_.resize(m_kk);
|
||||||
|
d2lnActCoeffdT2_Scaled_.resize(m_kk);
|
||||||
dlnActCoeffdlnX_Scaled_.resize(m_kk);
|
dlnActCoeffdlnX_Scaled_.resize(m_kk);
|
||||||
dlnActCoeffdlnN_Scaled_.resize(m_kk);
|
dlnActCoeffdlnN_Scaled_.resize(m_kk);
|
||||||
m_pp.resize(m_kk);
|
m_pp.resize(m_kk);
|
||||||
|
|
|
||||||
|
|
@ -578,6 +578,11 @@ namespace Cantera {
|
||||||
//! log of theactivity coefficients of the species
|
//! log of theactivity coefficients of the species
|
||||||
mutable std::vector<doublereal> dlnActCoeffdT_Scaled_;
|
mutable std::vector<doublereal> dlnActCoeffdT_Scaled_;
|
||||||
|
|
||||||
|
//! Storage for the current derivative values of the
|
||||||
|
//! gradients with respect to temperature of the
|
||||||
|
//! log of theactivity coefficients of the species
|
||||||
|
mutable std::vector<doublereal> d2lnActCoeffdT2_Scaled_;
|
||||||
|
|
||||||
//! Storage for the current derivative values of the
|
//! Storage for the current derivative values of the
|
||||||
//! gradients with respect to logarithm of the mole fraction of the
|
//! gradients with respect to logarithm of the mole fraction of the
|
||||||
//! log of theactivity coefficients of the species
|
//! log of theactivity coefficients of the species
|
||||||
|
|
|
||||||
|
|
@ -408,6 +408,43 @@ namespace Cantera {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Molar enthalpy. Units: J/kmol.
|
||||||
|
doublereal MargulesVPSSTP::enthalpy_mole() const {
|
||||||
|
int kk = nSpecies();
|
||||||
|
double hbar[kk], h = 0;
|
||||||
|
getPartialMolarEnthalpies(hbar);
|
||||||
|
for (int i = 0; i < kk; i++){
|
||||||
|
h += moleFractions_[i]*hbar[i];
|
||||||
|
}
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Molar entropy. Units: J/kmol.
|
||||||
|
doublereal MargulesVPSSTP::entropy_mole() const {
|
||||||
|
int kk = nSpecies();
|
||||||
|
double sbar[kk], s = 0;
|
||||||
|
getPartialMolarEntropies(sbar);
|
||||||
|
for (int i = 0; i < kk; i++){
|
||||||
|
s += moleFractions_[i]*sbar[i];
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Molar heat capacity at constant pressure. Units: J/kmol/K.
|
||||||
|
doublereal MargulesVPSSTP::cp_mole() const {
|
||||||
|
int kk = nSpecies();
|
||||||
|
double cpbar[kk], cp = 0;
|
||||||
|
getPartialMolarCp(cpbar);
|
||||||
|
for (int i = 0; i < kk; i++){
|
||||||
|
cp += moleFractions_[i]*cpbar[i];
|
||||||
|
}
|
||||||
|
return cp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Molar heat capacity at constant volume. Units: J/kmol/K.
|
||||||
|
doublereal MargulesVPSSTP::cv_mole() const {
|
||||||
|
return cp_mole() - GasConstant;
|
||||||
|
}
|
||||||
|
|
||||||
// Returns an array of partial molar enthalpies for the species
|
// Returns an array of partial molar enthalpies for the species
|
||||||
// in the mixture.
|
// in the mixture.
|
||||||
|
|
@ -448,6 +485,44 @@ namespace Cantera {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns an array of partial molar heat capacities for the species
|
||||||
|
// in the mixture.
|
||||||
|
/*
|
||||||
|
* Units (J/kmol)
|
||||||
|
*
|
||||||
|
* For this phase, the partial molar enthalpies are equal to the
|
||||||
|
* standard state enthalpies modified by the derivative of the
|
||||||
|
* activity coefficent wrt temperature
|
||||||
|
*
|
||||||
|
* \f[
|
||||||
|
* ??????????? \bar s_k(T,P) = s^o_k(T,P) - R T^2 \frac{d \ln(\gamma_k)}{dT}
|
||||||
|
* \f]
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void MargulesVPSSTP::getPartialMolarCp(doublereal* cpbar) const {
|
||||||
|
/*
|
||||||
|
* Get the nondimensional standard state entropies
|
||||||
|
*/
|
||||||
|
getCp_R(cpbar);
|
||||||
|
double T = temperature();
|
||||||
|
/*
|
||||||
|
* Update the activity coefficients, This also update the
|
||||||
|
* internally storred molalities.
|
||||||
|
*/
|
||||||
|
s_update_lnActCoeff();
|
||||||
|
s_update_dlnActCoeff_dT();
|
||||||
|
|
||||||
|
for (int k = 0; k < m_kk; k++) {
|
||||||
|
cpbar[k] -= 2 * T * dlnActCoeffdT_Scaled_[k] + T * T * d2lnActCoeffdT2_Scaled_[k];
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* dimensionalize it.
|
||||||
|
*/
|
||||||
|
for (int k = 0; k < m_kk; k++) {
|
||||||
|
cpbar[k] *= GasConstant;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Returns an array of partial molar entropies for the species
|
// Returns an array of partial molar entropies for the species
|
||||||
// in the mixture.
|
// in the mixture.
|
||||||
/*
|
/*
|
||||||
|
|
@ -733,6 +808,7 @@ namespace Cantera {
|
||||||
double RTT = GasConstant*T*T;
|
double RTT = GasConstant*T*T;
|
||||||
|
|
||||||
fvo_zero_dbl_1(dlnActCoeffdT_Scaled_, m_kk);
|
fvo_zero_dbl_1(dlnActCoeffdT_Scaled_, m_kk);
|
||||||
|
fvo_zero_dbl_1(d2lnActCoeffdT2_Scaled_, m_kk);
|
||||||
|
|
||||||
for ( iK = 0; iK < m_kk; iK++ ){
|
for ( iK = 0; iK < m_kk; iK++ ){
|
||||||
|
|
||||||
|
|
@ -755,7 +831,9 @@ namespace Cantera {
|
||||||
g0 = -m_HE_b_ij[i] / RTT;
|
g0 = -m_HE_b_ij[i] / RTT;
|
||||||
g1 = -m_HE_c_ij[i] / RTT;
|
g1 = -m_HE_c_ij[i] / RTT;
|
||||||
|
|
||||||
dlnActCoeffdT_Scaled_[iK] += (delAK*XB+XA*delBK-XA*XB)*(g0+g1*XB)+XA*XB*(delBK-XB)*g1;
|
double temp = (delAK*XB+XA*delBK-XA*XB)*(g0+g1*XB)+XA*XB*(delBK-XB)*g1;
|
||||||
|
dlnActCoeffdT_Scaled_[iK] += temp;
|
||||||
|
d2lnActCoeffdT2_Scaled_[iK] -= 2*temp/T;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -793,6 +871,13 @@ namespace Cantera {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MargulesVPSSTP::getd2lnActCoeffdT2(doublereal *d2lnActCoeffdT2) const {
|
||||||
|
s_update_dlnActCoeff_dT();
|
||||||
|
for (int k = 0; k < m_kk; k++) {
|
||||||
|
d2lnActCoeffdT2[k] = d2lnActCoeffdT2_Scaled_[k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// calculate the change of the log of the activity coefficients wrt change in state: dT, dX
|
// calculate the change of the log of the activity coefficients wrt change in state: dT, dX
|
||||||
/*
|
/*
|
||||||
* This function will be called to calculate gradient of the
|
* This function will be called to calculate gradient of the
|
||||||
|
|
|
||||||
|
|
@ -525,7 +525,18 @@ namespace Cantera {
|
||||||
*/
|
*/
|
||||||
virtual void getChemPotentials(doublereal* mu) const;
|
virtual void getChemPotentials(doublereal* mu) const;
|
||||||
|
|
||||||
|
/// Molar enthalpy. Units: J/kmol.
|
||||||
|
virtual doublereal enthalpy_mole() const;
|
||||||
|
|
||||||
|
/// Molar entropy. Units: J/kmol.
|
||||||
|
virtual doublereal entropy_mole() const;
|
||||||
|
|
||||||
|
/// Molar heat capacity at constant pressure. Units: J/kmol/K.
|
||||||
|
virtual doublereal cp_mole() const;
|
||||||
|
|
||||||
|
/// Molar heat capacity at constant volume. Units: J/kmol/K.
|
||||||
|
virtual doublereal cv_mole() const;
|
||||||
|
|
||||||
//! Returns an array of partial molar enthalpies for the species
|
//! Returns an array of partial molar enthalpies for the species
|
||||||
//! in the mixture.
|
//! in the mixture.
|
||||||
/*!
|
/*!
|
||||||
|
|
@ -564,6 +575,28 @@ namespace Cantera {
|
||||||
*/
|
*/
|
||||||
virtual void getPartialMolarEntropies(doublereal* sbar) const;
|
virtual void getPartialMolarEntropies(doublereal* sbar) const;
|
||||||
|
|
||||||
|
//! Returns an array of partial molar entropies for the species
|
||||||
|
//! in the mixture.
|
||||||
|
/*!
|
||||||
|
* Units (J/kmol)
|
||||||
|
*
|
||||||
|
* For this phase, the partial molar enthalpies are equal to the
|
||||||
|
* standard state enthalpies modified by the derivative of the
|
||||||
|
* activity coefficent wrt temperature
|
||||||
|
*
|
||||||
|
* \f[
|
||||||
|
* ???????????????
|
||||||
|
* \bar s_k(T,P) = s^o_k(T,P) - R T^2 \frac{d \ln(\gamma_k)}{dT}
|
||||||
|
* - R \ln( \gamma_k X_k)
|
||||||
|
* - R T \frac{d \ln(\gamma_k) }{dT}
|
||||||
|
* ???????????????
|
||||||
|
* \f]
|
||||||
|
*
|
||||||
|
* @param cpbar Vector of returned partial molar heat capacities
|
||||||
|
* (length m_kk, units = J/kmol/K)
|
||||||
|
*/
|
||||||
|
virtual void getPartialMolarCp(doublereal* cpbar) const;
|
||||||
|
|
||||||
|
|
||||||
//! Return an array of partial molar volumes for the
|
//! Return an array of partial molar volumes for the
|
||||||
//! species in the mixture. Units: m^3/kmol.
|
//! species in the mixture. Units: m^3/kmol.
|
||||||
|
|
@ -604,6 +637,19 @@ namespace Cantera {
|
||||||
*/
|
*/
|
||||||
virtual void getdlnActCoeff(const doublereal dT, const doublereal * const dX, doublereal *dlnActCoeffdT) const;
|
virtual void getdlnActCoeff(const doublereal dT, const doublereal * const dX, doublereal *dlnActCoeffdT) const;
|
||||||
|
|
||||||
|
//! Get the array of temperature second derivatives of the log activity coefficients
|
||||||
|
/*!
|
||||||
|
* This function is a virtual class, but it first appears in GibbsExcessVPSSTP
|
||||||
|
* class and derived classes from GibbsExcessVPSSTP.
|
||||||
|
*
|
||||||
|
* units = 1/Kelvin
|
||||||
|
*
|
||||||
|
* @param d2lnActCoeffdT2 Output vector of temperature 2nd derivatives of the
|
||||||
|
* log Activity Coefficients. length = m_kk
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
virtual void getd2lnActCoeffdT2(doublereal *d2lnActCoeffdT2) const;
|
||||||
|
|
||||||
//! Get the array of temperature derivatives of the log activity coefficients
|
//! Get the array of temperature derivatives of the log activity coefficients
|
||||||
/*!
|
/*!
|
||||||
* This function is a virtual class, but it first appears in GibbsExcessVPSSTP
|
* This function is a virtual class, but it first appears in GibbsExcessVPSSTP
|
||||||
|
|
|
||||||
|
|
@ -829,7 +829,7 @@ namespace Cantera {
|
||||||
f0->name() + " and " + f1->name());
|
f0->name() + " and " + f1->name());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (nc >= 2) {
|
else if (nc > 2) {
|
||||||
const XML_Node* f0 = tp[0];
|
const XML_Node* f0 = tp[0];
|
||||||
if (f0->name() == "NASA9") {
|
if (f0->name() == "NASA9") {
|
||||||
installNasa9ThermoFromXML(speciesNode["name"], spthermo, k, tp);
|
installNasa9ThermoFromXML(speciesNode["name"], spthermo, k, tp);
|
||||||
|
|
|
||||||
|
|
@ -859,7 +859,7 @@ namespace Cantera {
|
||||||
|
|
||||||
/// Molar internal energy. Units: J/kmol.
|
/// Molar internal energy. Units: J/kmol.
|
||||||
virtual doublereal intEnergy_mole() const {
|
virtual doublereal intEnergy_mole() const {
|
||||||
return err("intEnergy_mole");
|
return enthalpy_mole() - pressure()* molarVolume();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Molar entropy. Units: J/kmol/K.
|
/// Molar entropy. Units: J/kmol/K.
|
||||||
|
|
@ -869,7 +869,7 @@ namespace Cantera {
|
||||||
|
|
||||||
/// Molar Gibbs function. Units: J/kmol.
|
/// Molar Gibbs function. Units: J/kmol.
|
||||||
virtual doublereal gibbs_mole() const {
|
virtual doublereal gibbs_mole() const {
|
||||||
return err("gibbs_mole");
|
return enthalpy_mole() - temperature()*entropy_mole();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Molar heat capacity at constant pressure. Units: J/kmol/K.
|
/// Molar heat capacity at constant pressure. Units: J/kmol/K.
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue