17 PhaseCombo_Interaction::PhaseCombo_Interaction() :
18 numBinaryInteractions_(0),
25 const std::string& id_) :
26 numBinaryInteractions_(0),
34 const std::string& id_) :
35 numBinaryInteractions_(0),
44 PhaseCombo_Interaction::operator=(b);
47 PhaseCombo_Interaction& PhaseCombo_Interaction::operator=(
const PhaseCombo_Interaction& b)
53 GibbsExcessVPSSTP::operator=(b);
86 "To be removed after Cantera 2.3.");
87 return cPhaseCombo_Interaction;
98 for (
size_t k = 0; k <
m_kk; k++) {
113 for (
size_t k = 0; k <
m_kk; k++) {
124 for (
size_t i = 0; i <
m_kk; i++) {
135 for (
size_t i = 0; i <
m_kk; i++) {
146 for (
size_t i = 0; i <
m_kk; i++) {
163 for (
size_t k = 0; k <
m_kk; k++) {
171 for (
size_t k = 0; k <
m_kk; k++) {
187 for (
size_t k = 0; k <
m_kk; k++) {
192 for (
size_t k = 0; k <
m_kk; k++) {
208 for (
size_t k = 0; k <
m_kk; k++) {
214 for (
size_t k = 0; k <
m_kk; k++) {
226 for (
size_t iK = 0; iK <
m_kk; iK++) {
243 vbar[iK] += XA*XB*(g0+g1*XB)+((delAK-XA)*XB+XA*(delBK-XB))*(g0+g1*XB)+XA*XB*(delBK-XB)*g1;
261 if ((
int)
id.
size() > 0 && phaseNode.
id() !=
id) {
262 throw CanteraError(
"PhaseCombo_Interaction::initThermoXML",
263 "phasenode and Id are incompatible");
268 if (!phaseNode.
hasChild(
"thermo")) {
269 throw CanteraError(
"PhaseCombo_Interaction::initThermoXML",
270 "no thermo XML node");
273 if (!ba::iequals(thermoNode[
"model"],
"phasecombo_interaction")) {
274 throw CanteraError(
"PhaseCombo_Interaction::initThermoXML",
275 "model name isn't PhaseCombo_Interaction: " + thermoNode[
"model"]);
280 if (thermoNode.
hasChild(
"activityCoefficients")) {
282 if (!ba::iequals(acNode[
"model"],
"margules")) {
283 throw CanteraError(
"PhaseCombo_Interaction::initThermoXML",
284 "Unknown activity coefficient model: " + acNode[
"model"]);
286 for (
size_t i = 0; i < acNode.
nChildren(); i++) {
292 if (ba::iequals(xmlACChild.
name(),
"binaryneutralspeciesparameters")) {
307 for (
size_t iK = 0; iK <
m_kk; iK++) {
329 lnActCoeff_Scaled_[iK] += (delAK * XB + XA * delBK - XA * XB) * (g0 + g1 * XB) + XA * XB * (delBK - XB) * g1;
339 for (
size_t iK = 0; iK <
m_kk; iK++) {
354 double temp = (delAK * XB + XA * delBK - XA * XB) * (g0 + g1 * XB) + XA * XB * (delBK - XB) * g1;
364 for (
size_t k = 0; k <
m_kk; k++) {
372 for (
size_t k = 0; k <
m_kk; k++) {
378 doublereal* dlnActCoeffds)
const 383 for (
size_t iK = 0; iK <
m_kk; iK++) {
389 dlnActCoeffds[iK] += - 1.0 / xx;
406 double dXA = dXds[iA];
407 double dXB = dXds[iB];
410 dlnActCoeffds[iK] += ((delBK-XB)*dXA + (delAK-XA)*dXB)*(g0+2*g1*XB) + (delBK-XB)*2*g1*XA*dXB
421 for (
size_t iK = 0; iK <
m_kk; iK++) {
459 for (
size_t iK = 0; iK <
m_kk; iK++) {
462 for (
size_t iM = 0; iM <
m_kk; iM++) {
495 dlnActCoeffdlnN_(iK,iM) += g0*((delAM-XA)*(delBK-XB)+(delAK-XA)*(delBM-XB));
496 dlnActCoeffdlnN_(iK,iM) += 2*g1*((delAM-XA)*(delBK-XB)*XB+(delAK-XA)*(delBM-XB)*XB+(delBM-XB)*(delBK-XB)*XA);
520 throw CanteraError(
"PhaseCombo_Interaction::s_update_dlnActCoeff_dlnX_diag",
"unimplemented");
526 for (
size_t k = 0; k <
m_kk; k++) {
534 for (
size_t k = 0; k <
m_kk; k++) {
543 for (
size_t k = 0; k <
m_kk; k++) {
544 for (
size_t m = 0; m <
m_kk; m++) {
545 dlnActCoeffdlnN[ld * k + m] = data[
m_kk * k + m];
571 string xname = xmLBinarySpecies.
name();
572 if (xname !=
"binaryNeutralSpeciesParameters") {
573 throw CanteraError(
"PhaseCombo_Interaction::readXMLBinarySpecies",
574 "Incorrect name for processing this routine: " + xname);
577 string iName = xmLBinarySpecies.
attrib(
"speciesA");
579 throw CanteraError(
"PhaseCombo_Interaction::readXMLBinarySpecies",
"no speciesA attrib");
581 string jName = xmLBinarySpecies.
attrib(
"speciesB");
583 throw CanteraError(
"PhaseCombo_Interaction::readXMLBinarySpecies",
"no speciesB attrib");
589 if (iSpecies ==
npos) {
593 if (
charge(iSpecies) != 0) {
594 throw CanteraError(
"PhaseCombo_Interaction::readXMLBinarySpecies",
"speciesA charge problem");
597 if (jSpecies ==
npos) {
601 if (
charge(jSpecies) != 0) {
602 throw CanteraError(
"PhaseCombo_Interaction::readXMLBinarySpecies",
"speciesB charge problem");
610 for (
size_t iChild = 0; iChild < xmLBinarySpecies.
nChildren(); iChild++) {
612 string nodeName = ba::to_lower_copy(xmlChild.
name());
615 if (nodeName ==
"excessenthalpy") {
617 getFloatArray(xmlChild, vParams,
true,
"toSI",
"excessEnthalpy");
618 if (vParams.size() != 2) {
619 throw CanteraError(
"PhaseCombo_Interaction::readXMLBinarySpecies::excessEnthalpy for " + ispName
621 "wrong number of params found");
627 if (nodeName ==
"excessentropy") {
629 getFloatArray(xmlChild, vParams,
true,
"toSI",
"excessEntropy");
630 if (vParams.size() != 2) {
631 throw CanteraError(
"PhaseCombo_Interaction::readXMLBinarySpecies::excessEntropy for " + ispName
633 "wrong number of params found");
639 if (nodeName ==
"excessvolume_enthalpy") {
641 getFloatArray(xmlChild, vParams,
true,
"toSI",
"excessVolume_Enthalpy");
642 if (vParams.size() != 2) {
643 throw CanteraError(
"PhaseCombo_Interaction::readXMLBinarySpecies::excessVolume_Enthalpy for " + ispName
645 "wrong number of params found");
651 if (nodeName ==
"excessvolume_entropy") {
653 getFloatArray(xmlChild, vParams,
true,
"toSI",
"excessVolume_Entropy");
654 if (vParams.size() != 2) {
655 throw CanteraError(
"PhaseCombo_Interaction::readXMLBinarySpecies::excessVolume_Entropy for " + ispName
657 "wrong number of params found");
void s_update_dlnActCoeff_dlnX_diag() const
Update the derivative of the log of the activity coefficients wrt log(mole fraction) ...
vector_fp m_VSE_b_ij
Entropy term for the binary mole fraction interaction of the excess Gibbs free energy expression...
size_t getFloatArray(const XML_Node &node, vector_fp &v, const bool convert, const std::string &unitsString, const std::string &nodeName)
This function reads the current node or a child node of the current node with the default name...
virtual void getd2lnActCoeffdT2(doublereal *d2lnActCoeffdT2) const
Get the array of temperature second derivatives of the log activity coefficients. ...
virtual void getPartialMolarEnthalpies(doublereal *hbar) const
Returns an array of partial molar enthalpies for the species in the mixture.
CTML ("Cantera Markup Language") is the variant of XML that Cantera uses to store data...
std::string name() const
Returns the name of the XML node.
int formTempModel_
form of the temperature dependence of the Margules interaction expression
vector_fp dlnActCoeffdlnX_diag_
Storage for the current derivative values of the gradients with respect to logarithm of the mole frac...
vector_fp m_VHE_c_ij
Enthalpy term for the ternary mole fraction interaction of the excess Gibbs free energy expression...
doublereal temperature() const
Temperature (K).
void resize(size_t n, size_t m, doublereal v=0.0)
Resize the array, and fill the new entries with 'v'.
size_t speciesIndex(const std::string &name) const
Returns the index of a species named 'name' within the Phase object.
virtual void getdlnActCoeffdlnN(const size_t ld, doublereal *const dlnActCoeffdlnN)
Get the array of derivatives of the log activity coefficients with respect to the log of the species ...
Header for intermediate ThermoPhase object for phases which employ the Margules Gibbs free energy for...
const size_t npos
index returned by functions to indicate "no position"
void initLengths()
Initialize lengths of local variables after all species have been identified.
Headers for the factory class that can create known ThermoPhase objects (see Thermodynamic Properties...
virtual void getdlnActCoeffdlnX_diag(doublereal *dlnActCoeffdlnX_diag) const
Get the array of ln mole fraction derivatives of the log activity coefficients - diagonal component o...
PhaseCombo_Interaction()
Constructor.
Class XML_Node is a tree-based representation of the contents of an XML file.
vector_fp m_HE_d_ij
Enthalpy term for the quaternary mole fraction interaction of the excess Gibbs free energy expression...
virtual void initThermoXML(XML_Node &phaseNode, const std::string &id)
Import and initialize a ThermoPhase object using an XML tree.
virtual void getCp_R(doublereal *cpr) const
Get the nondimensional Heat Capacities at constant pressure for the species standard states at the cu...
void warn_deprecated(const std::string &method, const std::string &extra)
Print a warning indicating that method is deprecated.
int formMargules_
form of the Margules interaction expression
void resizeNumInteractions(const size_t num)
Resize internal arrays within the object that depend upon the number of binary Margules interaction t...
virtual void getdlnActCoeffds(const doublereal dTds, const doublereal *const dXds, doublereal *dlnActCoeffds) const
Get the change in activity coefficients wrt changes in state (temp, mole fraction, etc) along a line in parameter space or along a line in physical space.
virtual doublereal cp_mole() const
Molar heat capacity at constant pressure. Units: J/kmol/K.
virtual void getActivityCoefficients(doublereal *ac) const
Get the array of non-dimensional molar-based activity coefficients at the current solution temperatur...
doublereal RT() const
Return the Gas Constant multiplied by the current temperature.
std::vector< size_t > m_pSpecies_A_ij
vector of species indices representing species A in the interaction
Base class for a phase with thermodynamic properties.
virtual void getdlnActCoeffdlnN_diag(doublereal *dlnActCoeffdlnN_diag) const
Get the array of log species mole number derivatives of the log activity coefficients.
virtual void getPartialMolarCp(doublereal *cpbar) const
Returns an array of partial molar entropies for the species in the mixture.
void readXMLBinarySpecies(XML_Node &xmlBinarySpecies)
Process an XML node called "binaryNeutralSpeciesParameters".
virtual doublereal entropy_mole() const
Molar entropy. Units: J/kmol/K.
virtual doublereal enthalpy_mole() const
Molar enthalpy. Units: J/kmol.
virtual void initThermo()
virtual void initThermo()
virtual void getdlnActCoeffdT(doublereal *dlnActCoeffdT) const
Get the array of temperature derivatives of the log activity coefficients.
vector_fp dlnActCoeffdlnN_diag_
Storage for the current derivative values of the gradients with respect to logarithm of the mole frac...
vector_fp d2lnActCoeffdT2_Scaled_
Storage for the current derivative values of the gradients with respect to temperature of the log of ...
vector_fp m_VSE_d_ij
Entropy term for the quaternary mole fraction interaction of the excess Gibbs free energy expression...
vector_fp m_VHE_d_ij
Enthalpy term for the quaternary mole fraction interaction of the excess Gibbs free energy expression...
virtual void getPartialMolarEntropies(doublereal *sbar) const
Returns an array of partial molar entropies for the species in the mixture.
std::string speciesName(size_t k) const
Name of the species with index k.
vector_fp m_HE_b_ij
Enthalpy term for the binary mole fraction interaction of the excess Gibbs free energy expression...
virtual void getStandardChemPotentials(doublereal *mu) const
Get the array of chemical potentials at unit activity for the species at their standard states at the...
Base class for exceptions thrown by Cantera classes.
virtual void getPartialMolarVolumes(doublereal *vbar) const
Return an array of partial molar volumes for the species in the mixture.
std::vector< size_t > m_pSpecies_B_ij
vector of species indices representing species B in the interaction
vector_fp m_VSE_c_ij
Entropy term for the ternary mole fraction interaction of the excess Gibbs free energy expression...
size_t numBinaryInteractions_
number of binary interaction expressions
vector_fp m_SE_c_ij
Entropy term for the ternary mole fraction interaction of the excess Gibbs free energy expression...
void importPhase(XML_Node &phase, ThermoPhase *th)
Import a phase information into an empty ThermoPhase object.
vector_fp lnActCoeff_Scaled_
Storage for the current values of the activity coefficients of the species.
bool hasChild(const std::string &ch) const
Tests whether the current node has a child node with a particular name.
XML_Node & child(const size_t n) const
Return a changeable reference to the n'th child of the current node.
virtual ThermoPhase * duplMyselfAsThermoPhase() const
Duplication routine for objects which inherit from ThermoPhase.
std::string id() const
Return the string id for the phase.
const doublereal SmallNumber
smallest number to compare to zero.
void s_update_dlnActCoeff_dlnN_diag() const
Update the derivative of the log of the activity coefficients wrt log(moles) - diagonal only...
std::string attrib(const std::string &attr) const
Function returns the value of an attribute.
std::vector< double > vector_fp
Turn on the use of stl vectors for the basic array type within cantera Vector of doubles.
PhaseCombo_Interaction is a derived class of GibbsExcessVPSSTP that employs the Margules approximatio...
std::string id() const
Return the id attribute, if present.
void s_update_dlnActCoeff_dT() const
Update the derivative of the log of the activity coefficients wrt T.
const doublereal GasConstant
Universal Gas Constant. [J/kmol/K].
virtual void initThermoXML(XML_Node &phaseNode, const std::string &id)
Import and initialize a ThermoPhase object using an XML tree.
Contains declarations for string manipulation functions within Cantera.
virtual doublereal cv_mole() const
Molar heat capacity at constant volume. Units: J/kmol/K.
doublereal size(size_t k) const
This routine returns the size of species k.
vector_fp moleFractions_
Storage for the current values of the mole fractions of the species.
vector_fp m_SE_d_ij
Entropy term for the quaternary mole fraction interaction of the excess Gibbs free energy expression...
virtual void getChemPotentials(doublereal *mu) const
Get the species chemical potentials. Units: J/kmol.
vector_fp m_SE_b_ij
Entropy term for the binary mole fraction interaction of the excess Gibbs free energy expression...
size_t m_kk
Number of species in the phase.
Array2D dlnActCoeffdlnN_
Storage for the current derivative values of the gradients with respect to logarithm of the species m...
virtual void getEntropy_R(doublereal *sr) const
Get the array of nondimensional Entropy functions for the standard state species at the current T and...
void zero()
Set all of the entries to zero.
virtual void initThermoFile(const std::string &inputFile, const std::string &id)
Namespace for the Cantera kernel.
vector_fp m_HE_c_ij
Enthalpy term for the ternary mole fraction interaction of the excess Gibbs free energy expression...
vector_fp m_VHE_b_ij
Enthalpy term for the binary mole fraction interaction of the excess Gibbs free energy expression...
void s_update_lnActCoeff() const
Update the activity coefficients.
size_t nChildren(bool discardComments=false) const
Return the number of children.
void s_update_dlnActCoeff_dlnN() const
Update the derivative of the log of the activity coefficients wrt log(moles_m)
virtual void getEnthalpy_RT(doublereal *hrt) const
Get the nondimensional Enthalpy functions for the species at their standard states at the current T a...
doublereal charge(size_t k) const
Dimensionless electrical charge of a single molecule of species k The charge is normalized by the the...
virtual void getStandardVolumes(doublereal *vol) const
Get the molar volumes of the species standard states at the current T and P of the solution...
vector_fp dlnActCoeffdT_Scaled_
Storage for the current derivative values of the gradients with respect to temperature of the log of ...
virtual int eosType() const
Equation of state type flag.