23 MixedSolventElectrolyte::MixedSolventElectrolyte() :
24 numBinaryInteractions_(0),
31 const std::string& id_) :
32 numBinaryInteractions_(0),
40 const std::string& id_) :
41 numBinaryInteractions_(0),
91 numBinaryInteractions_(0),
95 warn_deprecated(
"MixedSolventElectrolyte::MixedSolventElectrolyte(int testProb)",
96 "To be removed after Cantera 2.2");
135 throw CanteraError(
"MixedSolventElectrolyte test1 constructor",
136 "Unable to find LiCl(L)");
143 throw CanteraError(
"MixedSolventElectrolyte test1 constructor",
144 "Unable to find KCl(L)");
163 for (
size_t k = 0; k <
m_kk; k++) {
176 for (
size_t k = 0; k <
m_kk; k++) {
195 for (
size_t k = 0; k <
m_kk; k++) {
206 for (
size_t i = 0; i <
m_kk; i++) {
217 for (
size_t i = 0; i <
m_kk; i++) {
228 for (
size_t i = 0; i <
m_kk; i++) {
250 for (
size_t k = 0; k <
m_kk; k++) {
260 for (
size_t k = 0; k <
m_kk; k++) {
279 for (
size_t k = 0; k <
m_kk; k++) {
285 for (
size_t k = 0; k <
m_kk; k++) {
304 for (
size_t k = 0; k <
m_kk; k++) {
311 for (
size_t k = 0; k <
m_kk; k++) {
325 for (
size_t iK = 0; iK <
m_kk; iK++) {
344 vbar[iK] += XA*XB*(g0+g1*XB)+((delAK-XA)*XB+XA*(delBK-XB))*(g0+g1*XB)+XA*XB*(delBK-XB)*g1;
362 if ((
int) id_.size() > 0 && phaseNode.
id() != id_) {
363 throw CanteraError(
"MixedSolventElectrolyte::initThermoXML",
364 "phasenode and Id are incompatible");
371 if (!phaseNode.
hasChild(
"thermo")) {
372 throw CanteraError(
"MixedSolventElectrolyte::initThermoXML",
373 "no thermo XML node");
376 string mString = thermoNode.
attrib(
"model");
377 if (
lowercase(mString) !=
"mixedsolventelectrolyte") {
378 throw CanteraError(
"MixedSolventElectrolyte::initThermoXML",
379 "Unknown thermo model: " + mString);
386 if (thermoNode.
hasChild(
"activityCoefficients")) {
388 mString = acNode.
attrib(
"model");
390 throw CanteraError(
"MixedSolventElectrolyte::initThermoXML",
391 "Unknown activity coefficient model: " + mString);
393 for (
size_t i = 0; i < acNode.
nChildren(); i++) {
400 if (
lowercase(xmlACChild.
name()) ==
"binaryneutralspeciesparameters") {
420 for (
size_t iK = 0; iK <
m_kk; iK++) {
435 lnActCoeff_Scaled_[iK] += (delAK * XB + XA * delBK - XA * XB) * (g0 + g1 * XB) + XA * XB * (delBK - XB) * g1;
446 for (
size_t iK = 0; iK <
m_kk; iK++) {
461 double temp = (delAK * XB + XA * delBK - XA * XB) * (g0 + g1 * XB) + XA * XB * (delBK - XB) * g1;
471 for (
size_t k = 0; k <
m_kk; k++) {
479 for (
size_t k = 0; k <
m_kk; k++) {
485 doublereal* dlnActCoeffds)
const
491 for (
size_t iK = 0; iK <
m_kk; iK++) {
492 dlnActCoeffds[iK] = 0.0;
510 double dXA = dXds[iA];
511 double dXB = dXds[iB];
516 dlnActCoeffds[iK] += ((delBK-XB)*dXA + (delAK-XA)*dXB)*(g0+2*g1*XB) + (delBK-XB)*2*g1*XA*dXB
529 for (
size_t iK = 0; iK <
m_kk; iK++) {
568 for (
size_t iK = 0; iK <
m_kk; iK++) {
569 for (
size_t iM = 0; iM <
m_kk; iM++) {
597 dlnActCoeffdlnN_(iK,iM) += g0*((delAM-XA)*(delBK-XB)+(delAK-XA)*(delBM-XB));
598 dlnActCoeffdlnN_(iK,iM) += 2*g1*((delAM-XA)*(delBK-XB)*XB+(delAK-XA)*(delBM-XB)*XB+(delBM-XB)*(delBK-XB)*XA);
631 for (
size_t k = 0; k <
m_kk; k++) {
639 for (
size_t k = 0; k <
m_kk; k++) {
648 for (
size_t k = 0; k <
m_kk; k++) {
649 for (
size_t m = 0; m <
m_kk; m++) {
650 dlnActCoeffdlnN[ld * k + m] = data[m_kk * k + m];
678 string xname = xmLBinarySpecies.
name();
679 if (xname !=
"binaryNeutralSpeciesParameters") {
680 throw CanteraError(
"MixedSolventElectrolyte::readXMLBinarySpecies",
681 "Incorrect name for processing this routine: " + xname);
684 string iName = xmLBinarySpecies.
attrib(
"speciesA");
686 throw CanteraError(
"MixedSolventElectrolyte::readXMLBinarySpecies",
"no speciesA attrib");
688 string jName = xmLBinarySpecies.
attrib(
"speciesB");
690 throw CanteraError(
"MixedSolventElectrolyte::readXMLBinarySpecies",
"no speciesB attrib");
697 if (iSpecies ==
npos) {
701 if (
charge(iSpecies) != 0) {
702 throw CanteraError(
"MixedSolventElectrolyte::readXMLBinarySpecies",
"speciesA charge problem");
705 if (jSpecies ==
npos) {
709 if (
charge(jSpecies) != 0) {
710 throw CanteraError(
"MixedSolventElectrolyte::readXMLBinarySpecies",
"speciesB charge problem");
718 for (
size_t iChild = 0; iChild < xmLBinarySpecies.
nChildren(); iChild++) {
724 if (nodeName ==
"excessenthalpy") {
728 getFloatArray(xmlChild, vParams,
true,
"toSI",
"excessEnthalpy");
729 if (vParams.size() != 2) {
730 throw CanteraError(
"MixedSolventElectrolyte::readXMLBinarySpecies::excessEnthalpy for " + ispName
732 "wrong number of params found");
738 if (nodeName ==
"excessentropy") {
742 getFloatArray(xmlChild, vParams,
true,
"toSI",
"excessEntropy");
743 if (vParams.size() != 2) {
744 throw CanteraError(
"MixedSolventElectrolyte::readXMLBinarySpecies::excessEntropy for " + ispName
746 "wrong number of params found");
752 if (nodeName ==
"excessvolume_enthalpy") {
756 getFloatArray(xmlChild, vParams,
true,
"toSI",
"excessVolume_Enthalpy");
757 if (vParams.size() != 2) {
758 throw CanteraError(
"MixedSolventElectrolyte::readXMLBinarySpecies::excessVolume_Enthalpy for " + ispName
760 "wrong number of params found");
766 if (nodeName ==
"excessvolume_entropy") {
770 getFloatArray(xmlChild, vParams,
true,
"toSI",
"excessVolume_Entropy");
771 if (vParams.size() != 2) {
772 throw CanteraError(
"MixedSolventElectrolyte::readXMLBinarySpecies::excessVolume_Entropy for " + ispName
774 "wrong number of params found");
virtual void getdlnActCoeffdlnN_diag(doublereal *dlnActCoeffdlnN_diag) const
Get the array of derivatives of the log activity coefficients wrt mole numbers - diagonal only...
void s_update_dlnActCoeff_dlnN_diag() const
Update the derivative of the log of the activity coefficients wrt log(moles) - diagonal only...
doublereal electricPotential() const
Returns the electric potential of this phase (V).
virtual void getPartialMolarEntropies(doublereal *sbar) const
Returns an array of partial molar entropies for the species in the mixture.
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...
XML_Node * findXMLPhase(XML_Node *root, const std::string &idtarget)
Search an XML_Node tree for a named phase XML_Node.
std::string attrib(const std::string &attr) const
Function returns the value of an attribute.
void s_update_dlnActCoeff_dlnN() const
Update the derivative of the log of the activity coefficients wrt log(moles_m)
void resize(size_t n, size_t m, doublereal v=0.0)
Resize the array, and fill the new entries with 'v'.
virtual void getd2lnActCoeffdT2(doublereal *d2lnActCoeffdT2) const
Get the array of temperature second derivatives of the log activity coefficients. ...
void s_update_dlnActCoeff_dlnX_diag() const
Update the derivative of the log of the activity coefficients wrt log(mole fraction) ...
void s_update_lnActCoeff() const
Update the activity coefficients.
virtual ThermoPhase * duplMyselfAsThermoPhase() const
Duplication routine for objects which inherit from ThermoPhase.
virtual void getStandardVolumes(doublereal *vol) const
Get the molar volumes of each species in their standard states at the current T and P of the solution...
const size_t npos
index returned by functions to indicate "no position"
virtual void getCp_R(doublereal *cpr) const
Get the nondimensional Heat Capacities at constant pressure for the standard state of the species at ...
vector_fp m_HE_d_ij
Enthalpy term for the quaternary mole fraction interaction of the excess Gibbs free energy expression...
Headers for the factory class that can create known ThermoPhase objects (see Thermodynamic Properties...
Class XML_Node is a tree-based representation of the contents of an XML file.
void warn_deprecated(const std::string &method, const std::string &extra)
Print a warning indicating that method is deprecated.
vector_fp m_SE_b_ij
Entropy term for the binary mole fraction interaction of the excess Gibbs free energy expression...
std::string lowercase(const std::string &s)
Cast a copy of a string to lower case.
std::vector< doublereal > d2lnActCoeffdT2_Scaled_
Storage for the current derivative values of the gradients with respect to temperature of the log of ...
std::vector< doublereal > dlnActCoeffdlnN_diag_
Storage for the current derivative values of the gradients with respect to logarithm of the mole frac...
MolarityIonicVPSSTP & operator=(const MolarityIonicVPSSTP &b)
Assignment operator.
virtual doublereal entropy_mole() const
Molar entropy. Units: J/kmol.
XML_Node & child(const size_t n) const
Return a changeable reference to the n'th child of the current node.
virtual void getChemPotentials(doublereal *mu) const
Get the species chemical potentials. Units: J/kmol.
Base class for a phase with thermodynamic properties.
void readXMLBinarySpecies(XML_Node &xmlBinarySpecies)
Process an XML node called "binaryNeutralSpeciesParameters".
size_t speciesIndex(const std::string &name) const
Returns the index of a species named 'name' within the Phase object.
bool importPhase(XML_Node &phase, ThermoPhase *th, SpeciesThermoFactory *spfactory)
Import a phase information into an empty ThermoPhase object.
virtual void getdlnActCoeffds(const doublereal dTds, const doublereal *const dXds, doublereal *dlnActCoeffds) const
Get the change in activity coefficients w.r.t.
void initThermoXML(XML_Node &phaseNode, const std::string &id)
Import and initialize a ThermoPhase object.
virtual void getPartialMolarCp(doublereal *cpbar) const
Returns an array of partial molar entropies for the species in the mixture.
void initLengths()
Initialize lengths of local variables after all species have been identified.
int formTempModel_
form of the temperature dependence of the Margules interaction expression
virtual void getdlnActCoeffdlnX_diag(doublereal *dlnActCoeffdlnX_diag) const
Get the array of log concentration-like derivatives of the log activity coefficients - diagonal compo...
void s_update_dlnActCoeff_dT() const
Update the derivative of the log of the activity coefficients wrt T.
vector_fp m_HE_b_ij
Enthalpy term for the binary mole fraction interaction of the excess Gibbs free energy expression...
void initThermoXML(XML_Node &phaseNode, const std::string &id)
Import and initialize a ThermoPhase object.
virtual void initThermo()
MixedSolventElectrolyte is a derived class of GibbsExcessVPSSTP that employs the DH and local Margule...
virtual void getdlnActCoeffdlnN(const size_t ld, doublereal *const dlnActCoeffdlnN)
Get the array of derivatives of the log activity coefficients with respect to the ln species mole num...
vector_fp m_VHE_d_ij
Enthalpy term for the quaternary mole fraction interaction of the excess Gibbs free energy expression...
std::string name() const
Returns the name of the XML node.
void resizeNumInteractions(const size_t num)
Resize internal arrays within the object that depend upon the number of binary Margules interaction t...
virtual doublereal cv_mole() const
Molar heat capacity at constant volume. 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...
Base class for exceptions thrown by Cantera classes.
vector_fp m_VHE_b_ij
Enthalpy term for the binary mole fraction interaction of the excess Gibbs free energy expression...
int formMargules_
form of the Margules interaction expression
vector_fp m_VHE_c_ij
Enthalpy term for the ternary mole fraction interaction of the excess Gibbs free energy expression...
bool hasChild(const std::string &ch) const
Tests whether the current node has a child node with a particular name.
virtual void initThermo()
virtual void getdlnActCoeffdT(doublereal *dlnActCoeffdT) const
Get the array of temperature derivatives of the log activity coefficients.
void getElectrochemPotentials(doublereal *mu) const
Get the species electrochemical potentials.
vector_fp m_VSE_c_ij
Entropy term for the ternary mole fraction interaction of the excess Gibbs free energy expression...
vector_fp m_VSE_d_ij
Entropy term for the quaternary mole fraction interaction of the excess Gibbs free energy expression...
std::vector< size_t > m_pSpecies_B_ij
vector of species indices representing species B in the interaction
vector_fp m_SE_c_ij
Entropy term for the ternary mole fraction interaction of the excess Gibbs free energy expression...
vector_fp m_HE_c_ij
Enthalpy term for the ternary mole fraction interaction of the excess Gibbs free energy expression...
size_t numBinaryInteractions_
number of binary interaction expressions
virtual doublereal enthalpy_mole() const
Molar enthalpy. Units: J/kmol.
std::vector< size_t > m_pSpecies_A_ij
vector of species indices representing species A in the interaction
std::vector< doublereal > dlnActCoeffdlnX_diag_
Storage for the current derivative values of the gradients with respect to logarithm of the mole frac...
virtual void getEntropy_R(doublereal *sr) const
Get the array of nondimensional Enthalpy functions for the standard state species at the current T an...
doublereal temperature() const
Temperature (K).
std::string id() const
Return the id attribute, if present.
const doublereal SmallNumber
smallest number to compare to zero.
std::vector< doublereal > lnActCoeff_Scaled_
Storage for the current values of the activity coefficients of the species.
std::vector< double > vector_fp
Turn on the use of stl vectors for the basic array type within cantera Vector of doubles.
size_t getFloatArray(const XML_Node &node, std::vector< doublereal > &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...
std::vector< doublereal > moleFractions_
Storage for the current values of the mole fractions of the species.
virtual void getEnthalpy_RT(doublereal *hrt) const
Get the nondimensional Enthalpy functions for the species at their standard states at the current T a...
const doublereal GasConstant
Universal Gas Constant. [J/kmol/K].
Contains declarations for string manipulation functions within Cantera.
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 doublereal cp_mole() const
Molar heat capacity at constant pressure. Units: J/kmol/K.
vector_fp m_SE_d_ij
Entropy term for the quaternary mole fraction interaction of the excess Gibbs free energy expression...
void zero()
Set all of the entries to zero.
virtual void initThermoFile(const std::string &inputFile, const std::string &id)
virtual void getPartialMolarVolumes(doublereal *vbar) const
Return an array of partial molar volumes for the species in the mixture.
MixedSolventElectrolyte & operator=(const MixedSolventElectrolyte &b)
Assignment operator.
vector_fp m_VSE_b_ij
Entropy 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.
MixedSolventElectrolyte()
Constructor.
Header for intermediate ThermoPhase object for phases which employ Gibbs excess free energy based for...
std::string speciesName(size_t k) const
Name of the species with index k.
size_t nChildren(bool discardComments=false) const
Return the number of children.
std::vector< doublereal > dlnActCoeffdT_Scaled_
Storage for the current derivative values of the gradients with respect to temperature of the log of ...
doublereal charge(size_t k) const
Dimensionless electrical charge of a single molecule of species k The charge is normalized by the the...