diff --git a/Cantera/src/IdealGasPhase.cpp b/Cantera/src/IdealGasPhase.cpp
index ae42627f9..77545804f 100644
--- a/Cantera/src/IdealGasPhase.cpp
+++ b/Cantera/src/IdealGasPhase.cpp
@@ -230,8 +230,8 @@ namespace Cantera {
* @param vol Output vector containing the standard state volumes.
* Length: m_kk.
*/
- void IdealGasPhase::getStandardVolumes(doublereal *vol) const {
- doublereal tmp = _RT() / pressure();
+ void IdealGasPhase::getStandardVolumes(doublereal *vol) const {
+ double tmp = 1.0 / molarDensity();
for (int k = 0; k < m_kk; k++) {
vol[k] = tmp;
}
@@ -292,15 +292,22 @@ namespace Cantera {
}
}
- /**
- * Returns the vector of nondimensional
- * constant pressure heat capacities of the reference state
- * at the current temperature and reference pressure.
- */
- void IdealGasPhase::getCp_R_ref(doublereal *cprt) const {
- const array_fp& _cpr = cp_R_ref();
- copy(_cpr.begin(), _cpr.end(), cprt);
+ /**
+ * Returns the vector of nondimensional
+ * constant pressure heat capacities of the reference state
+ * at the current temperature and reference pressure.
+ */
+ void IdealGasPhase::getCp_R_ref(doublereal *cprt) const {
+ const array_fp& _cpr = cp_R_ref();
+ copy(_cpr.begin(), _cpr.end(), cprt);
+ }
+
+ void IdealGasPhase::getStandardVolumes_ref(doublereal *vol) const {
+ doublereal tmp = _RT() / m_p0;
+ for (int k = 0; k < m_kk; k++) {
+ vol[k] = tmp;
}
+ }
// new methods defined here -------------------------------
diff --git a/Cantera/src/IdealGasPhase.h b/Cantera/src/IdealGasPhase.h
index ea56921f3..7738655ff 100644
--- a/Cantera/src/IdealGasPhase.h
+++ b/Cantera/src/IdealGasPhase.h
@@ -472,6 +472,15 @@ namespace Cantera {
*/
virtual void getCp_R_ref(doublereal *cprt) const;
+ //! Get the molar volumes of the species standard states at the current
+ //! T and P_ref of the solution.
+ /*!
+ * units = m^3 / kmol
+ *
+ * @param vol Output vector containing the standard state volumes.
+ * Length: m_kk.
+ */
+ virtual void getStandardVolumes_ref(doublereal *vol) const;
//@}
/// @name New Methods Defined Here -------------------------------------------------
diff --git a/Cantera/src/ThermoPhase.h b/Cantera/src/ThermoPhase.h
index 0e1beffdf..36f6971e7 100755
--- a/Cantera/src/ThermoPhase.h
+++ b/Cantera/src/ThermoPhase.h
@@ -45,19 +45,23 @@ namespace Cantera {
*
*
* The calculation of thermodynamic functions within %ThermoPhase is
- * broken down roughly into two or more steps. First, the standard state properties
- * of all of the species are calculated at the current temperature and at either
+ * broken down roughly into two or more steps. First, the standard state
+ * properties
+ * of all of the species are calculated at the current temperature and at
+ * either
* the current pressure or at a reference pressure. If the calculation is
* carried out at a refereence pressure instead of at the current pressure
* the calculation is called a "reference state properties" calculation,
* just to make the distinction (even though it may be considered to be
* a fixed-pressure standard-state calculation). The next step is to
- * adjust the reference state calculation to the current pressure. The thermodynamic
+ * adjust the reference state calculation to the current pressure. The
+ * thermodynamic
* functions then are considered to be at the standard state of each species.
* Lastly the mixing contributions are added to arrive at the thermodynamic
* functions for the solution.
*
- * The %ThermoPhase class provides interfaces to thermodynamic properties calculated for
+ * The %ThermoPhase class provides interfaces to thermodynamic properties
+ * calculated for
* the reference state of each species, the standard state values for
* each species, the thermodynamic functions for solution values, both
* on a per mole of solution basis (i.e., enthalpy_mole()), on a per kg of
@@ -66,7 +70,8 @@ namespace Cantera {
* getPartialMolarEnthalpies(double *hbar)).
* At each level, functions for the enthalpy, entropy, Gibbs free energy,
* internal energy, and volume are provided. So, 5 levels (reference state,
- * standard state, partial molar, per mole of solution, and per mass of solution)
+ * standard state, partial molar, per mole of solution, and per mass of
+ * solution)
* and 5 functions multiplied together makes 25 possible functions. That's
* why %ThermoPhase is such a large class.
*
@@ -97,7 +102,8 @@ namespace Cantera {
* .
*
* The following additional objects inherit from %ThermoPhase. Most of these
- * are associated with an electrochemistry capability that is under construction.
+ * are associated with an electrochemistry capability that is under
+ * construction.
*
* - DebyeHuckel in thermo/DebyeHuckel.h
* - SingleSpeciesTP in thermo/SingleSpeciesTP.h
@@ -296,7 +302,7 @@ namespace Cantera {
//! Return the thermodynamic pressure (Pa).
/*!
- * This method must be overloaded in derived classes. Since the
+ * This method must be overloaded in derived classes. Since the
* mass density, temperature, and mass fractions are stored,
* this method should use these values to implement the
* mechanical equation of state \f$ P(T, \rho, Y_1, \dots,
@@ -323,16 +329,16 @@ namespace Cantera {
err("setPressure");
}
- //! Returns the isothermal compressibility. Units: 1/Pa.
- /*!
- * The isothermal compressibility is defined as
- * \f[
- * \kappa_T = -\frac{1}{v}\left(\frac{\partial v}{\partial P}\right)_T
- * \f]
- */
- virtual doublereal isothermalCompressibility() const {
- err("isothermalCompressibility"); return -1.0;
- }
+ //! Returns the isothermal compressibility. Units: 1/Pa.
+ /*!
+ * The isothermal compressibility is defined as
+ * \f[
+ * \kappa_T = -\frac{1}{v}\left(\frac{\partial v}{\partial P}\right)_T
+ * \f]
+ */
+ virtual doublereal isothermalCompressibility() const {
+ err("isothermalCompressibility"); return -1.0;
+ }
//! Return the volumetric thermal expansion coefficient. Units: 1/K.
/*!
@@ -394,27 +400,27 @@ namespace Cantera {
* @{
*/
- /**
- * This method returns the convention used in specification
- * of the activities, of which there are currently two, molar-
- * and molality-based conventions.
- *
- * Currently, there are two activity conventions:
- * - Molar-based activities
- * Unit activity of species at either a hypothetical pure
- * solution of the species or at a hypothetical
- * pure ideal solution at infinite dilution
- * cAC_CONVENTION_MOLAR 0
- * - default
- *
- * - Molality-based acvtivities
- * (unit activity of solutes at a hypothetical 1 molal
- * solution referenced to infinite dilution at all
- * pressures and temperatures).
- * cAC_CONVENTION_MOLALITY 1
- */
- virtual int activityConvention() const;
-
+
+ //! This method returns the convention used in specification
+ //! of the activities, of which there are currently two, molar-
+ //! and molality-based conventions.
+ /*!
+ * Currently, there are two activity conventions:
+ * - Molar-based activities
+ * %Unit activity of species at either a hypothetical pure
+ * solution of the species or at a hypothetical
+ * pure ideal solution at infinite dilution
+ * cAC_CONVENTION_MOLAR 0
+ * - default
+ *
+ * - Molality-based acvtivities
+ * (unit activity of solutes at a hypothetical 1 molal
+ * solution referenced to infinite dilution at all
+ * pressures and temperatures).
+ * cAC_CONVENTION_MOLALITY 1
+ */
+ virtual int activityConvention() const;
+
//! This method returns an array of generalized concentrations
/*!
@@ -478,7 +484,7 @@ namespace Cantera {
* units are needed. Usually, MKS units are assumed throughout
* the program and in the XML input files.
*
- * The base %ThermoPhase class assigns thedefault quantities
+ * The base %ThermoPhase class assigns the default quantities
* of (kmol/m3) for all species.
* Inherited classes are responsible for overriding the default
* values if necessary.
@@ -497,40 +503,36 @@ namespace Cantera {
*/
virtual void getUnitsStandardConc(double *uA, int k = 0,
int sizeUA = 6);
-
- /**
- * Get the array of non-dimensional activities at
- * the current solution temperature, pressure, and
- * solution concentration.
- *
- * We resolve this function at this level by calling
- * on the activityConcentration function. However,
- * derived classes may want to override this default
- * implementation.
- *
- * @param a Output vector of activities. Length: m_kk.
- */
- virtual void getActivities(doublereal* a);
-
- /**
- * Get the array of non-dimensional molar-based
- * activity coefficients at
- * the current solution temperature, pressure, and
- * solution concentration.
- *
- * @param ac Output vector of activity coefficients. Length: m_kk.
- */
- virtual void getActivityCoefficients(doublereal* ac) const {
- if (m_kk == 1) {
- ac[0] = 1.0;
+
+ //! Get the array of non-dimensional activities at
+ //! the current solution temperature, pressure, and solution concentration.
+ /*!
+ *
+ * We resolve this function at this level by calling
+ * on the activityConcentration function. However,
+ * derived classes may want to override this default
+ * implementation.
+ *
+ * @param a Output vector of activities. Length: m_kk.
+ */
+ virtual void getActivities(doublereal* a);
+
+ //! Get the array of non-dimensional molar-based activity coefficients at
+ //! the current solution temperature, pressure, and solution concentration.
+ /*!
+ * @param ac Output vector of activity coefficients. Length: m_kk.
+ */
+ virtual void getActivityCoefficients(doublereal* ac) const {
+ if (m_kk == 1) {
+ ac[0] = 1.0;
} else {
err("getActivityCoefficients");
}
- }
+ }
- //@}
- /// @name Partial Molar Properties of the Solution
- //@{
+ //@}
+ /// @name Partial Molar Properties of the Solution
+ //@{
/**
* Get the array of non-dimensional species chemical potentials
@@ -559,22 +561,22 @@ namespace Cantera {
err("getChemPotentials");
}
- //! Get the species electrochemical potentials.
- /*!
- * These are partial molar quantities. This method adds a term \f$ Fz_k
- * \phi_k \f$ to each chemical potential.
- *
- * @param mu Output vector of species electrochemical
- * potentials. Length: m_kk. Units: J/kmol
- */
- void getElectrochemPotentials(doublereal* mu) const {
- getChemPotentials(mu);
- double ve = Faraday * electricPotential();
- for (int k = 0; k < m_kk; k++) {
- mu[k] += ve*charge(k);
- }
+ //! Get the species electrochemical potentials.
+ /*!
+ * These are partial molar quantities. This method adds a term \f$ Fz_k
+ * \phi_k \f$ to each chemical potential.
+ *
+ * @param mu Output vector of species electrochemical
+ * potentials. Length: m_kk. Units: J/kmol
+ */
+ void getElectrochemPotentials(doublereal* mu) const {
+ getChemPotentials(mu);
+ double ve = Faraday * electricPotential();
+ for (int k = 0; k < m_kk; k++) {
+ mu[k] += ve*charge(k);
}
-
+ }
+
//! Get the species partial molar enthalpies. Units: J/kmol.
/*!
* @param hbar Output vector of species partial molar enthalpies.
@@ -1083,15 +1085,15 @@ namespace Cantera {
*/
bool getElementPotentials(doublereal* lambda) const;
- //@}
+ //@}
- //---------------------------------------------------------
- /// @name Critical State Properties.
- /// These methods are only implemented by some subclasses, and may
- /// be moved out of ThermoPhase at a later date.
+ //---------------------------------------------------------
+ /// @name Critical State Properties.
+ /// These methods are only implemented by some subclasses, and may
+ /// be moved out of ThermoPhase at a later date.
- //@{
+ //@{
/// Critical temperature (K).
virtual doublereal critTemperature() const {
@@ -1136,7 +1138,7 @@ namespace Cantera {
}
- //@}
+ //@}
//! @name Initialization Methods - For Internal Use (%ThermoPhase)
@@ -1172,21 +1174,24 @@ namespace Cantera {
}
- /**
- * @internal Install a species thermodynamic property
- * manager. The species thermodynamic property manager
- * computes properties of the pure species for use in
- * constructing solution properties. It is meant for internal
- * use, and some classes derived from ThermoPhase may not use
- * any species thermodynamic property manager. This method is
- * called by function importPhase() in importCTML.cpp.
- *
- * @param spthermo input pointer to the species thermodynamic property
- * manager.
- */
- void setSpeciesThermo(SpeciesThermo* spthermo)
- { m_spthermo = spthermo; }
-
+
+ //! Install a species thermodynamic property manager.
+ /*!
+ * The species thermodynamic property manager
+ * computes properties of the pure species for use in
+ * constructing solution properties. It is meant for internal
+ * use, and some classes derived from ThermoPhase may not use
+ * any species thermodynamic property manager. This method is
+ * called by function importPhase() in importCTML.cpp.
+ *
+ * @param spthermo input pointer to the species thermodynamic property
+ * manager.
+ *
+ * @internal
+ */
+ void setSpeciesThermo(SpeciesThermo* spthermo)
+ { m_spthermo = spthermo; }
+
/**
* @internal Return a reference to the species thermodynamic property
* manager. @todo This method will fail if no species thermo
@@ -1331,21 +1336,22 @@ namespace Cantera {
*/
virtual void setParametersFromXML(const XML_Node& eosdata) {}
- /**
- * Set the initial state of the phase to the conditions
- * specified in the state XML element.
- *
- * This method sets the temperature, pressure, and mole
- * fraction vector to a set default value.
- *
- * @param state AN XML_Node object corresponding to
- * the "state" entry for this phase in the
- * input file.
- */
- virtual void setStateFromXML(const XML_Node& state);
+
+ //! Set the initial state of the phase to the conditions
+ //! specified in the state XML element.
+ /*!
+ *
+ * This method sets the temperature, pressure, and mole
+ * fraction vector to a set default value.
+ *
+ * @param state AN XML_Node object corresponding to
+ * the "state" entry for this phase in the
+ * input file.
+ */
+ virtual void setStateFromXML(const XML_Node& state);
- //@}
+ //@}
protected:
diff --git a/Cantera/src/thermo/DebyeHuckel.cpp b/Cantera/src/thermo/DebyeHuckel.cpp
index a56fa15ca..b6215e82c 100644
--- a/Cantera/src/thermo/DebyeHuckel.cpp
+++ b/Cantera/src/thermo/DebyeHuckel.cpp
@@ -473,7 +473,7 @@ namespace Cantera {
}
}
- /**
+ /*
* The standard concentration \f$ C^0_k \f$ used to normalize
* the generalized concentration. In many cases, this quantity
* will be the same for all species in a phase - for example,
@@ -678,7 +678,7 @@ namespace Cantera {
}
}
- /**
+ /*
*
* getPartialMolarEntropies() (virtual, const)
*
@@ -910,10 +910,7 @@ namespace Cantera {
getStandardChemPotentials(gpure);
}
- /**
- *
- * getEnthalpy_RT() (virtual, const)
- *
+ /*
* Get the array of nondimensional Enthalpy functions for the ss
* species at the current T and P of the solution.
* We assume an incompressible constant partial molar
@@ -942,9 +939,7 @@ namespace Cantera {
}
}
- /**
- * getEntropy_R() (virtual, const)
- *
+ /*
* Get the nondimensional Entropies for the species
* standard states at the current T and P of the solution.
*
@@ -952,6 +947,9 @@ namespace Cantera {
* due to the zero volume expansivity:
* i.e., (dS/dp)_T = (dV/dT)_P = 0.0
*
+ * The solvent water entropy is obtained from a pure water
+ * equation of state model.
+ *
* @param sr Vector of length m_kk, which on return sr[k]
* will contain the nondimensional
* standard state entropy of species k.
@@ -965,7 +963,7 @@ namespace Cantera {
}
}
- /**
+ /*
* Get the nondimensional heat capacity at constant pressure
* function for the species
* standard states at the current T and P of the solution.
@@ -976,6 +974,9 @@ namespace Cantera {
* \f$ Cp^{ref}_k(T)\f$ is the constant pressure heat capacity
* of species k at the reference pressure, \f$p_{ref}\f$.
*
+ * The solvent water heat capacity is obtained from a pure water
+ * equation of state model.
+ *
* @param cpr Vector of length m_kk, which on return cpr[k]
* will contain the nondimensional
* constant pressure heat capacity for species k.
@@ -988,7 +989,7 @@ namespace Cantera {
}
}
- /**
+ /*
* Get the molar volumes of each species in their standard
* states at the current
* T and P of the solution.
diff --git a/Cantera/src/thermo/DebyeHuckel.h b/Cantera/src/thermo/DebyeHuckel.h
index 4f33c2d3c..31d6f1b90 100644
--- a/Cantera/src/thermo/DebyeHuckel.h
+++ b/Cantera/src/thermo/DebyeHuckel.h
@@ -105,6 +105,11 @@ namespace Cantera {
*
* Specification of Species Standard %State Properties
*
+ * The standard states are on the unit molality basis. Therefore, in the
+ * documentation below, the normal \f$ o \f$ superscript is replaced with
+ * the \f$ \triangle \f$ symbol. The reference state symbol is now
+ * \f$ \triangle, ref \f$.
+ *
*
* It is assumed that the reference state thermodynamics may be
* obtained by a pointer to a populated species thermodynamic property
@@ -122,7 +127,7 @@ namespace Cantera {
* The enthalpy function is given by the following relation.
*
* \f[
- * \raggedright h^o_k(T,P) = h^{ref}_k(T) + \tilde v \left( P - P_{ref} \right)
+ * \raggedright h^\triangle_k(T,P) = h^{\triangle,ref}_k(T) + \tilde v \left( P - P_{ref} \right)
* \f]
*
* For an incompressible,
@@ -133,12 +138,26 @@ namespace Cantera {
* enthalpy to compute the molar internal energy.
*
* \f[
- * u^o_k(T,P) = h^{ref}_k(T) - P_{ref} \tilde v
+ * u^\triangle_k(T,P) = h^{\triangle,ref}_k(T) - P_{ref} \tilde v
* \f]
*
* The standard state heat capacity and entropy are independent
* of pressure. The standard state gibbs free energy is obtained
* from the enthalpy and entropy functions.
+ *
+ * The vector Constituents::m_speciesSize[] is used to hold the
+ * base values of species sizes. These are defined as the
+ * molar volumes of species at infinite dilution at 300 K and 1 atm
+ * of water. m_speciesSize are calculated during the initialization of the
+ * %DebyeHuckel object and are then not touched.
+ *
+ * The current model assumes that an incompressible molar volume for
+ * all solutes. The molar volume for the water solvent, however,
+ * is obtained from a pure water equation of state, waterSS.
+ * Therefore, the water standard state varies with both T and P.
+ * It is an error to request standard state water properties at a T and P
+ * where the water phase is not a stable phase, i.e., beyond its
+ * spinodal curve.
*
*
* Specification of Solution Thermodynamic Properties
@@ -146,7 +165,7 @@ namespace Cantera {
* All solution properties are obtained from the standard state
* species functions, since there is only one species in the phase.
*
- * Application within %Kinetics Managers
+ * %Application within %Kinetics Managers
*
* The standard concentration is equal to 1.0. This means that the
* kinetics operator works on an (activities basis). Since this
@@ -166,7 +185,7 @@ namespace Cantera {
* appear in the rate constant expression, since it's a stoichiometric
* phase and the activity is always equal to 1.0.
*
- * Instanteation of the Class
+ * Instantiation of the Class
*
* The constructor for this phase is NOT located in the default ThermoFactory
* for %Cantera. However, a new %StoichSubstanceSSTP may be created by
@@ -333,17 +352,22 @@ namespace Cantera {
* thrown.
*/
- /**
- * Pressure. Units: Pa.
+ //! Return the thermodynamic pressure (Pa).
+ /*!
* For this incompressible system, we return the internally storred
* independent value of the pressure.
- */
+ */
virtual doublereal pressure() const;
- /**
- * Set the pressure at constant temperature. Units: Pa.
- * This method sets a constant within the object.
- * The mass density is not a function of pressure.
+ //! Set the internally storred pressure (Pa) at constant
+ //! temperature and composition
+ /*!
+ * This method sets a constant within the object.
+ * The mass density is not a function of pressure.
+ *
+ * @param p input Pressure (Pa)
+ *
+ * @todo Implement a variable pressure capability
*/
virtual void setPressure(doublereal p);
@@ -395,7 +419,7 @@ namespace Cantera {
* NOTE: This is an overwritten function from the State.h
* class
*
- * @param density Input density (kg/m^3).
+ * @param rho Input density (kg/m^3).
*/
void setDensity(doublereal rho);
@@ -455,40 +479,6 @@ namespace Cantera {
* @{
*/
- /**
- * Set the potential energy of species k to pe.
- * Units: J/kmol.
- * This function must be reimplemented in inherited classes
- * of ThermoPhase.
- */
- virtual void setPotentialEnergy(int k, doublereal pe) {
- err("setPotentialEnergy");
- }
-
- /**
- * Get the potential energy of species k.
- * Units: J/kmol.
- * This function must be reimplemented in inherited classes
- * of ThermoPhase.
- */
- virtual doublereal potentialEnergy(int k) const {
- return err("potentialEnergy");
- }
-
- /**
- * Set the electric potential of this phase (V).
- * This is used by classes InterfaceKinetics and EdgeKinetics to
- * compute the rates of charge-transfer reactions, and in computing
- * the electrochemical potentials of the species.
- */
- void setElectricPotential(doublereal v) {
- m_phi = v;
- }
-
- /// The electric potential of this phase (V).
- doublereal electricPotential() const { return m_phi; }
-
-
/**
* @}
* @name Activities, Standard States, and Activity Concentrations
@@ -517,9 +507,10 @@ namespace Cantera {
*/
virtual void getActivityConcentrations(doublereal* c) const;
- /**
+ //! Return the standard concentration for the kth species
+ /*!
* The standard concentration \f$ C^0_k \f$ used to normalize
- * the generalized concentration. In many cases, this quantity
+ * the activity (i.e., generalized) concentration. In many cases, this quantity
* will be the same for all species in a phase - for example,
* for an ideal gas \f$ C^0_k = P/\hat R T \f$. For this
* reason, this method returns a single value, instead of an
@@ -527,18 +518,29 @@ namespace Cantera {
* concentration is species-specific (e.g. surface species of
* different sizes), this method may be called with an
* optional parameter indicating the species.
+ *
+ * For the time being, we will use the concentration of pure
+ * solvent for the the standard concentration of all species.
+ * This has the effect of making reaction rates
+ * based on the molality of species proportional to the
+ * molality of the species.
+ *
+ * @param k Optional parameter indicating the species. The default
+ * is to assume this refers to species 0.
+ * @return
+ * Returns the standard Concentration in units of m3 kmol-1.
*/
virtual doublereal standardConcentration(int k=0) const;
- /**
- * Returns the natural logarithm of the standard
- * concentration of the kth species
+ //! Natural logarithm of the standard concentration of the kth species.
+ /*!
+ * @param k index of the species (defaults to zero)
*/
virtual doublereal logStandardConc(int k=0) const;
- /**
- * Returns the units of the standard and generalized
- * concentrations Note they have the same units, as their
+ //! Returns the units of the standard and generalized concentrations.
+ /*!
+ * Note they have the same units, as their
* ratio is defined to be equal to the activity of the kth
* species in the solution, which is unitless.
*
@@ -546,6 +548,12 @@ namespace Cantera {
* units are needed. Usually, MKS units are assumed throughout
* the program and in the XML input files.
*
+ * The base %ThermoPhase class assigns the default quantities
+ * of (kmol/m3) for all species.
+ * Inherited classes are responsible for overriding the default
+ * values if necessary.
+ *
+ * @param uA Output vector containing the units
* uA[0] = kmol units - default = 1
* uA[1] = m units - default = -nDim(), the number of spatial
* dimensions in the Phase class.
@@ -553,25 +561,37 @@ namespace Cantera {
* uA[3] = Pa(pressure) units - default = 0;
* uA[4] = Temperature units - default = 0;
* uA[5] = time units - default = 0
+ * @param k species index. Defaults to 0.
+ * @param sizeUA output int containing the size of the vector.
+ * Currently, this is equal to 6.
*/
virtual void getUnitsStandardConc(double *uA, int k = 0,
int sizeUA = 6);
- /**
- * Get the array of non-dimensional molality-based activities at
- * the current solution temperature, pressure, and
- * solution concentration.
+ //! Get the array of non-dimensional activities at
+ //! the current solution temperature, pressure, and solution concentration.
+ /*!
+ *
+ * We resolve this function at this level by calling
+ * on the activityConcentration function. However,
+ * derived classes may want to override this default
+ * implementation.
+ *
* (note solvent is on molar scale).
+ *
+ * @param ac Output vector of activities. Length: m_kk.
*/
virtual void getActivities(doublereal* ac) const;
- /**
- * Get the array of non-dimensional molality-based
- * activity coefficients at
- * the current solution temperature, pressure, and
- * solution concentration.
- * (note solvent is on molar scale. The solvent molar
- * based activity coefficient is returned).
+ //! Get the array of non-dimensional molality-based
+ //! activity coefficients at
+ //! the current solution temperature, pressure, and solution concentration.
+ /*!
+ * note solvent is on molar scale. The solvent molar
+ * based activity coefficient is returned.
+ *
+ * @param acMolality Vector of Molality-based activity coefficients
+ * Length: m_kk
*/
virtual void
getMolalityActivityCoefficients(doublereal* acMolality) const;
@@ -580,19 +600,22 @@ namespace Cantera {
/// @name Partial Molar Properties of the Solution -----------------
//@{
- /**
- * Get the species chemical potentials. Units: J/kmol.
+
+ //! Get the species chemical potentials. Units: J/kmol.
+ /*!
*
* This function returns a vector of chemical potentials of the
* species in solution.
+ *
* \f[
- * \mu_k = \mu^{ref}_k(T) + V_k * (p - p_o) + R T ln(X_k)
+ * \mu_k = \mu^{\triangle}_k(T,P) + R T ln(\gamma_k^{\triangle} m_k)
* \f]
* or another way to phrase this is
- * \f[
- * \mu_k = \mu^o_k(T,p) + R T ln(X_k)
- * \f]
- * where \f$ \mu^o_k(T,p) = \mu^{ref}_k(T) + V_k * (p - p_o)\f$
+ *
+ * where
+ *
+ * @param mu Output vector of species chemical
+ * potentials. Length: m_kk. Units: J/kmol
*/
virtual void getChemPotentials(doublereal* mu) const;
@@ -662,15 +685,22 @@ namespace Cantera {
*/
virtual void getPartialMolarEntropies(doublereal* sbar) const;
- /**
- * returns an array of partial molar volumes of the species
- * in the solution. Units: m^3 kmol-1.
- *
- * For this solution, thepartial molar volumes are equal to the
+ //! Get the species partial molar volumes. Units: m^3/kmol.
+ /*!
+ * For this solution, the partial molar volumes are equal to the
* constant species molar volumes.
+ *
+ * @param vbar Output vector of speciar partial molar volumes.
+ * Length = m_kk. units are m^3/kmol.
*/
virtual void getPartialMolarVolumes(doublereal* vbar) const;
+ //! Get the partial molar heat capacities Units: J/kmol/K
+ /*!
+ * @param cpbar Output vector of species partial molar heat
+ * capacities at constant pressure.
+ * Length = m_kk. units are J/kmol/K.
+ */
virtual void getPartialMolarCp(doublereal* cpbar) const;
@@ -681,7 +711,14 @@ namespace Cantera {
//@{
- /**
+
+ //! Get the array of chemical potentials at unit activity for the species
+ //! at their standard states at the current T and P of the solution.
+ /*!
+ * These are the standard state chemical potentials \f$ \mu^0_k(T,P)
+ * \f$. The values are evaluated at the current
+ * temperature and pressure of the solution
+ *
* Get the standard state chemical potentials of the species.
* This is the array of chemical potentials at unit activity
* \f$ \mu^0_k(T,P) \f$.
@@ -692,87 +729,119 @@ namespace Cantera {
* equilibrium constant Kc. Therefore, Kc will also depend
* on T and P. This is the norm for liquid and solid systems.
*
- * units = J / kmol
+ * @param mu Output vector of chemical potentials.
+ * Length: m_kk.
*/
virtual void getStandardChemPotentials(doublereal* mu) const;
- /**
- * Get the nondimensional gibbs function for the species
- * standard states at the current T and P of the solution.
- *
+ //! Get the nondimensional Gibbs functions for the species
+ //! in their standard states at the current T and P of the solution.
+ /*!
+ * The standard states are on the unit molality basis.
* \f[
- * \mu^0_k(T,P) = \mu^{ref}_k(T) + (P - P_{ref}) * V_k
+ * \mu^{\triangle}_k(T,P) = \mu^{\triangle,ref}_k(T) + (P - P_{ref}) * V_k
* \f]
- * where \f$V_k\f$ is the molar volume of pure species k.
- * \f$ \mu^{ref}_k(T)\f$ is the chemical potential of pure
+ *
+ * where \f$V_k\f$ is the molar volume of pure species k.
+ * \f$ \mu^{\triangle,ref}_k(T)\f$ is the chemical potential of pure
* species k at the reference pressure, \f$P_{ref}\f$.
*
- * @param grt Vector of length m_kk, which on return sr[k]
- * will contain the nondimensional
- * standard state gibbs function for species k.
+ * @param grt Output vector of nondimensional standard state gibbs free energies
+ * Length: m_kk.
*/
virtual void getGibbs_RT(doublereal* grt) const;
- /**
- * Get the nondimensional Gibbs functions for the standard
- * state of the species at the current T and P.
+ //! Get the Gibbs functions for the standard
+ //! state of the species at the current T and P of the solution
+ /*!
+ * The standard states are on the unit molality basis.
+ * Units are Joules/kmol
+ * @param gpure Output vector of standard state gibbs free energies
+ * Length: m_kk.
*/
virtual void getPureGibbs(doublereal* gpure) const;
- /**
- *
- * getEnthalpy_RT() (virtual, const)
- *
- * Get the array of nondimensional Enthalpy functions for the
- * standard states
- * species at the current T and P of the solution.
+ //! Get the nondimensional Enthalpy functions for the species
+ //! at their standard states at the current T and P of the solution.
+ /*!
+ * The standard states are on the unit molality basis.
* We assume an incompressible constant partial molar
- * volume here:
- * \f[
- * h^0_k(T,P) = h^{ref}_k(T) + (P - P_{ref}) * V_k
- * \f]
- * where \f$V_k\f$ is the molar volume of SS species k<\I>.
+ * volume for the solutes.
+ *
+ * \f[
+ * h^{\triangle}_k(T,P) = h^{\triangle,ref}_k(T) + (P - P_{ref}) * V_k
+ * \f]
+ *
+ * where \f$V_k\f$ is the molar volume of SS species k.
* \f$ h^{ref}_k(T)\f$ is the enthalpy of the SS
- * species k<\I> at the reference pressure, \f$P_{ref}\f$.
+ * species k at the reference pressure, \f$P_{ref}\f$.
+ *
+ * The solvent water enthalpy is obtained from a pure water
+ * equation of state model.
+ *
+ * @param hrt Output vector of nondimensional standard state enthalpies.
+ * Length: m_kk.
*/
virtual void getEnthalpy_RT(doublereal* hrt) const;
- /**
- * Get the nondimensional Entropies for the species
- * standard states at the current T and P of the solution.
+ //! Get the array of nondimensional Entropy functions for the
+ //! standard state species at the current T and P of the solution.
+ /*!
+ *
+ * The standard states are on the unit molality basis.
+ *
+ * \f[
+ * s^{\triangle}_k(T,P) = s^{\triangle,ref}_k(T)
+ * \f]
*
* Note, this is equal to the reference state entropies
* due to the zero volume expansivity:
* i.e., (dS/dp)_T = (dV/dT)_P = 0.0
*
- * @param sr Vector of length m_kk, which on return sr[k]
- * will contain the nondimensional
- * standard state entropy of species k.
+ * The solvent water entropy is obtained from a pure water
+ * equation of state model.
+ *
+ * @param sr Output vector of nondimensional standard state entropies.
+ * Length: m_kk. The solvent water is species 0, always.
*/
virtual void getEntropy_R(doublereal* sr) const;
- /**
- * Get the nondimensional heat capacity at constant pressure
- * function for the species
- * standard states at the current T and P of the solution.
+ //! Get the nondimensional Heat Capacities at constant
+ //! pressure for the species standard states
+ //! at the current T and P of the solution
+ /*!
+ * The standard states are on the unit molality basis.
+ * For the solutes:
* \f[
- * Cp^0_k(T,P) = Cp^{ref}_k(T)
+ * Cp^\triangle_k(T,P) = Cp^{\triangle,ref}_k(T)
* \f]
- * where \f$V_k\f$ is the molar volume of pure species k.
+ *
* \f$ Cp^{ref}_k(T)\f$ is the constant pressure heat capacity
* of species k at the reference pressure, \f$p_{ref}\f$.
*
+ * The solute heat capacity is obtained from a pure water
+ * equation of state model, so it depends on T and P.
+ *
* @param cpr Vector of length m_kk, which on return cpr[k]
* will contain the nondimensional
- * constant pressure heat capacity for species k.
+ * constant pressure heat capacity for species k.
*/
virtual void getCp_R(doublereal* cpr) const;
- /**
- * Get the molar volumes of each species in their standard
- * states at the current
- * T and P of the solution.
+ //! Get the molar volumes of the species standard states at the current
+ //! T and P of the solution.
+ /*!
+ * The current model assumes that an incompressible molar volume for
+ * all solutes. The molar volume for the water solvent, however,
+ * is obtained from a pure water equation of state, waterSS.
+ * Therefore, the water standard state varies with both T and P.
+ * It is an error to request the water molar volume at a T and P
+ * where the water phase is not stable phase.
+ *
* units = m^3 / kmol
+ *
+ * @param vol Output vector containing the standard state volumes.
+ * Length: m_kk. The solvent water is species 0, always.
*/
virtual void getStandardVolumes(doublereal *vol) const;
@@ -810,14 +879,17 @@ namespace Cantera {
* @{
*/
- /**
- * This method is used by the ChemEquil equilibrium solver.
+ //!This method is used by the ChemEquil equilibrium solver.
+ /*!
* It sets the state such that the chemical potentials satisfy
* \f[ \frac{\mu_k}{\hat R T} = \sum_m A_{k,m}
* \left(\frac{\lambda_m} {\hat R T}\right) \f] where
* \f$ \lambda_m \f$ is the element potential of element m. The
* temperature is unchanged. Any phase (ideal or not) that
* implements this method can be equilibrated by ChemEquil.
+ *
+ * @param lambda_RT Input vector of dimensionless element potentials
+ * The length is equal to nElements().
*/
virtual void setToEquilState(const doublereal* lambda_RT) {
err("setToEquilState");
@@ -827,27 +899,38 @@ namespace Cantera {
//@}
- /**
+ //! Set the equation of state parameters
+ /*!
* @internal
- * Set equation of state parameters. The number and meaning of
- * these depends on the subclass.
+ * The number and meaning of these depends on the subclass.
+ *
* @param n number of parameters
- * @param c array of \i n coefficients
- *
+ * @param c array of \a n coefficients
*/
virtual void setParameters(int n, doublereal* c);
+
+ //! Get the equation of state parameters in a vector
+ /*!
+ * @internal
+ * The number and meaning of these depends on the subclass.
+ *
+ * @param n number of parameters
+ * @param c array of \a n coefficients
+ */
virtual void getParameters(int &n, doublereal * const c);
- /**
- * Set equation of state parameter values from XML
- * entries. This method is called by function importPhase in
+ //! Set equation of state parameter values from XML entries.
+ /*!
+ *
+ * This method is called by function importPhase() in
* file importCTML.cpp when processing a phase definition in
* an input file. It should be overloaded in subclasses to set
* any parameters that are specific to that particular phase
- * model.
+ * model. Note, this method is called before the phase is
+ * initialzed with elements and/or species.
*
* @param eosdata An XML_Node object corresponding to
- * the "thermo" entry for this phase in the input file.
+ * the "thermo" entry for this phase in the input file.
*/
virtual void setParametersFromXML(const XML_Node& eosdata);
@@ -892,17 +975,7 @@ namespace Cantera {
* -------------- Utilities -------------------------------
*/
- /**
- * @internal Install a species thermodynamic property
- * manager. The species thermodynamic property manager
- * computes properties of the pure species for use in
- * constructing solution properties. It is meant for internal
- * use, and some classes derived from ThermoPhase may not use
- * any species thermodynamic property manager.
- */
- void setSpeciesThermo(SpeciesThermo* spthermo)
- { m_spthermo = spthermo; }
-
+
/**
* Return a reference to the species thermodynamic property
* manager. @todo This method will fail if no species thermo
@@ -926,10 +999,9 @@ namespace Cantera {
*/
virtual void initThermo();
- /*
- * Initialization of a DebyeHuckel phase using an
- * xml file
- *
+
+ //! Initialization of a DebyeHuckel phase using an xml file
+ /*!
* This routine is a precursor to initThermo(XML_Node*)
* routine, which does most of the work.
*
@@ -971,20 +1043,6 @@ namespace Cantera {
virtual void initThermoXML(XML_Node& phaseNode, std::string id);
- /**
- * Report the molar volume of species k
- *
- * units - \f$ m^3 kmol^-1 \f$
- */
- //double speciesMolarVolume(int k) const;
-
- /**
- * Fill in a return vector containing the species molar volumes
- * units - \f$ m^3 kmol^-1 \f$
- */
- //void getSpeciesMolarVolumes(double *smv) const;
-
-
/**
* Value of the Debye Huckel constant as a function of temperature
* and pressure.
diff --git a/Cantera/src/thermo/HMWSoln.h b/Cantera/src/thermo/HMWSoln.h
index 8ef0279f2..7407731d8 100644
--- a/Cantera/src/thermo/HMWSoln.h
+++ b/Cantera/src/thermo/HMWSoln.h
@@ -763,16 +763,6 @@ namespace Cantera {
* -------------- Utilities -------------------------------
*/
- /**
- * @internal Install a species thermodynamic property
- * manager. The species thermodynamic property manager
- * computes properties of the pure species for use in
- * constructing solution properties. It is meant for internal
- * use, and some classes derived from ThermoPhase may not use
- * any species thermodynamic property manager.
- */
- void setSpeciesThermo(SpeciesThermo* spthermo)
- { m_spthermo = spthermo; }
/**
* Return a reference to the species thermodynamic property
diff --git a/Cantera/src/thermo/MolalityVPSSTP.cpp b/Cantera/src/thermo/MolalityVPSSTP.cpp
index 79bf5ac42..d8079c87d 100644
--- a/Cantera/src/thermo/MolalityVPSSTP.cpp
+++ b/Cantera/src/thermo/MolalityVPSSTP.cpp
@@ -357,7 +357,7 @@ namespace Cantera {
* - Activities, Standard States, Activity Concentrations -----------
*/
- /**
+ /*
* This method returns the activity convention.
* Currently, there are two activity conventions
* Molar-based activities
@@ -380,7 +380,7 @@ namespace Cantera {
return cAC_CONVENTION_MOLALITY;
}
- /**
+ /*
* Get the array of non-dimensional activity coefficients at
* the current solution temperature, pressure, and
* solution concentration.
@@ -406,7 +406,7 @@ namespace Cantera {
}
}
- /**
+ /*
* osmotic coefficient:
*
* Calculate the osmotic coefficient of the solvent. Note there
@@ -452,7 +452,7 @@ namespace Cantera {
return 0;
}
- /**
+ /*
* Returns the units of the standard and general concentrations
* Note they have the same units, as their divisor is
* defined to be equal to the activity of the kth species
@@ -485,7 +485,6 @@ namespace Cantera {
}
}
-
/*
* Set the thermodynamic state.
*/
@@ -501,7 +500,7 @@ namespace Cantera {
}
}
- /**
+ /*
* Set the temperature (K), pressure (Pa), and molalities
* (gmol kg-1) of the solutes
*/
@@ -512,14 +511,18 @@ namespace Cantera {
setPressure(p);
}
- /** Set the temperature (K), pressure (Pa), and molalities. */
+ /*
+ * Set the temperature (K), pressure (Pa), and molalities.
+ */
void MolalityVPSSTP::setState_TPM(doublereal t, doublereal p, compositionMap& m) {
setMolalitiesByName(m);
setTemperature(t);
setPressure(p);
}
- /** Set the temperature (K), pressure (Pa), and molality. */
+ /*
+ * Set the temperature (K), pressure (Pa), and molality.
+ */
void MolalityVPSSTP::setState_TPM(doublereal t, doublereal p, const std::string& m) {
setMolalitiesByName(m);
setTemperature(t);
@@ -527,7 +530,7 @@ namespace Cantera {
}
- /**
+ /*
* @internal Initialize. This method is provided to allow
* subclasses to perform any initialization required after all
* species have been added. For example, it might be used to
@@ -555,7 +558,7 @@ namespace Cantera {
m_molalities.resize(m_kk);
}
- /**
+ /*
* initThermoXML() (virtual from ThermoPhase)
* Import and initialize a ThermoPhase object
*
diff --git a/Cantera/src/thermo/MolalityVPSSTP.h b/Cantera/src/thermo/MolalityVPSSTP.h
index 20aa89f06..b36a041d9 100644
--- a/Cantera/src/thermo/MolalityVPSSTP.h
+++ b/Cantera/src/thermo/MolalityVPSSTP.h
@@ -27,13 +27,134 @@ namespace Cantera {
* @ingroup thermoprops
*/
- /**
+ /*!
* MolalityVPSSTP is a derived class of ThermoPhase that handles
* variable pressure standard state methods for calculating
* thermodynamic properties that are further based on
* molality-scaled activities.
- * These include most of the methods
- * for calculating liquid electrolyte thermodynamics.
+ * This category incorporates most of the methods
+ * for calculating liquid electrolyte thermodynamics that have been
+ * developed since the 1970's.
+ *
+ * This class adds additional functions onto the %ThermoPhase interface
+ * that handle molality based standard states. The %ThermoPhase
+ * class includes a member function, ThermoPhase::activityConvention()
+ * that indicates which convention the activities are based on. The
+ * default is to assume activities are based on the molar convention.
+ * However, classes which derive from the MolalityVPSSTP class return
+ * cAC_CONVENTION_MOLALITY from this member function.
+ *
+ * The molality of a solute, \f$ m_i \f$, is defined as
+ *
+ * \f[
+ * m_i = \frac{n_i}{\tilde{M}_o n_o}
+ * \f]
+ * where
+ * \f[
+ * \tilde{M}_o = \frac{M_o}{1000}
+ * \f]
+ *
+ * where \f$ M_o \f$ is the molecular weight of the solvent. The molality
+ * has units of gmol kg-1. For the solute, the molality may be
+ * considered as the amount of gmol's of solute per kg of solvent, a natural
+ * experimental quantity.
+ *
+ * The formulas for calculating mole fractions if given the molalities of
+ * the solutes is stated below. First calculate \f$ L^{sum} \f$, an intermediate
+ * quantity.
+ *
+ * \f[
+ * L^{sum} = \frac{1}{\tilde{M}_o X_o} = \frac{1}{\tilde{M}_o} + \sum_{i\ne o} m_i
+ * \f]
+ * Then,
+ * \f[
+ * X_o = \frac{1}{\tilde{M}_o L^{sum}}
+ * \f]
+ * \f[
+ * X_i = \frac{m_i}{L^{sum}}
+ * \f]
+ * where \f$ X_o \f$ is the mole fraction of solvent, and \f$ X_o \f$ is the
+ * mole fraction of solute i. Thus, the molality scale and the mole fraction
+ * scale offer a one-to-one mapping between each other, except in the limit
+ * of a zero solvent mole fraction.
+ *
+ * The standard states for thermodynamic objects that derive from MolalityVPSSTP
+ * are on the unit molality basis. Chemical potentials
+ * of the solutes, \f$ \mu_k \f$, and the solvent, \f$ \mu_o \f$, which are based
+ * on the molality form, have the following general format:
+ *
+ * \f[
+ * \mu_k = \mu^{\triangle}_k(T,P) + R T ln(\gamma_k^{\triangle} \frac{m_k}{m^\triangle})
+ * \f]
+ * \f[
+ * \mu_o = \mu^o_o(T,P) + RT ln(a_o)
+ * \f]
+ *
+ * where \f$ \gamma_k^{\triangle} \f$ is the molality based activity coefficient for species
+ * \f$k\f$.
+ *
+ * The chemical potential of the solvent is thus expressed in a different format
+ * than the chemical potential of the solutes. Additionally, the activity of the
+ * solvent, \f$ a_o \f$, is further reexpressed in terms of an osmotic coefficient,
+ * \f$ \phi \f$.
+ * \f[
+ * \phi = \frac{- ln(a_o)}{\tilde{M}_o \sum_{i \ne o} m_i}
+ * \f]
+ *
+ * MolalityVPSSTP::osmoticCoefficient() returns the value of \f$ \phi \f$.
+ * Note there are a few of definitions of the osmotic coefficient floating
+ * around. We use the one defined in
+ * (Activity Coefficients in Electrolyte Solutions, K. S. Pitzer
+ * CRC Press, Boca Raton, 1991, p. 85, Eqn. 28). This definition is most clearly
+ * related to theoretical calculation.
+ *
+ * The molar-based activity coefficients \f$ \gamma_k \f$ may be calculated
+ * from the molality-based
+ * activity coefficients, \f$ \gamma_k^\triangle \f$ by the following
+ * formula.
+ * \f[
+ * \gamma_k = \frac{\gamma_k^\triangle}{X_o}
+ * \f]
+ * For purposes of establishing a convention, the molar activity coefficient of the
+ * solvent is set equal to the molality-based activity coefficient of the
+ * solvent:
+ * \f[
+ * \gamma_o = \gamma_o^\triangle
+ * \f]
+ *
+ * The molality-based and molarity-based standard states may be related to one
+ * another by the following formula.
+ *
+ * \f[
+ * \mu_k^\triangle(T,P) = \mu_k^o(T,P) + R T \ln(\tilde{M}_o m^\triangle)
+ * \f]
+ *
+ * An important convention is followed in all routines that derive from %MolalityVPSSTP.
+ * Standard state thermodynamic functions and reference state thermodynamic functions
+ * return the molality-based quantities. Also all functions which return
+ * activities return the molality-based activities. The reason for this convention
+ * has been discussed in supporting memos. However, it's important because the
+ * term in the equation above is non-trivial. For example it's equal to 2.38 kcal gmol-1
+ * for water at 298 K.
+ *
+ *
+ * In order to prevent a singularity, this class includes the concept of a minimum
+ * value for the solvent mole fraction. All calculations involving the formulation
+ * of activity coefficients and other non-ideal solution behavior adhere to
+ * this concept of a minimul value for the solvent mole fraction. This makes sense
+ * because these solution behavior were all designed and measured far away from
+ * the zero solvent singularity condition and are not applicable in that limit.
+ *
+ *
+ * This objects add a layer that supports molality. It inherits from VPStandardStateTP.
+ *
+ * All objects that derive from this are assumed to have molality based standard states.
+ *
+ * @todo Make two solvent minimum fractions. One would be for calculation of the non-ideal
+ * factors. The other one would be for purposes of stoichiometry evaluation. the
+ * stoichiometry evaluation one would be a 1E-13 limit. Anything less would create
+ * problems with roundoff error.
+ *
*/
class MolalityVPSSTP : public VPStandardStateTP {
@@ -85,8 +206,10 @@ namespace Cantera {
* @{
*/
- /**
- * Equation of state type flag. The ThermoPhase base class returns
+
+ //! Equation of state type flag.
+ /*!
+ * The ThermoPhase base class returns
* zero. Subclasses should define this to return a unique
* non-zero value. Known constants defined for this purpose are
* listed in mix_defs.h. The MolalityVPSSTP class also returns
@@ -130,9 +253,7 @@ namespace Cantera {
*/
void setMoleFSolventMin(doublereal xmolSolventMIN);
- /**
- * Returns the solvent index.
- */
+ //! Returns the solvent index.
int solventIndex() const;
/**
@@ -141,60 +262,72 @@ namespace Cantera {
*/
doublereal moleFSolventMin() const;
-
- //! Calculates the molality of all species andstores the result internally.
+ //! Calculates the molality of all species and stores the result internally.
/*!
* We calculate the vector of molalities of the species
* in the phase and store the result internally:
* \f[
- * m_i = (n_i) / (1000 * M_o * n_{o,p})
+ * m_i = \frac{X_i}{1000 * M_o * X_{o,p}}
* \f]
* where
* - \f$ M_o \f$ is the molecular weight of the solvent
- * - \f$ n_o \f$ is the mole fraction of the solvent
- * - \f$ n_i \f$ is the mole fraction of the solute.
- * - \f$ n_{o,p} = max (n_{o, min}, n_o) \f$
- * - \f$ n_{o,min} \f$ = minimum mole fraction of solvent allowed
+ * - \f$ X_o \f$ is the mole fraction of the solvent
+ * - \f$ X_i \f$ is the mole fraction of the solute.
+ * - \f$ X_{o,p} = max (X_{o}^{min}, X_o) \f$
+ * - \f$ X_{o}^{min} \f$ = minimum mole fraction of solvent allowed
* in the denominator.
*/
void calcMolalities() const;
-
//! This function will return the molalities of the species.
/*!
* We calculate the vector of molalities of the species
* in the phase
* \f[
- * m_i = (n_i) / (1000 * M_o * n_{o,p})
+ * m_i = \frac{X_i}{1000 * M_o * X_{o,p}}
* \f]
* where
* - \f$ M_o \f$ is the molecular weight of the solvent
- * - \f$ n_o \f$ is the mole fraction of the solvent
- * - \f$ n_i \f$ is the mole fraction of the solute.
- * - \f$ n_{o,p} = max (n_{o, min}, n_o) \f$
- * - \f$ n_{o,min} \f$ = minimum mole fraction of solvent allowed
+ * - \f$ X_o \f$ is the mole fraction of the solvent
+ * - \f$ X_i \f$ is the mole fraction of the solute.
+ * - \f$ X_{o,p} = \max (X_{o}^{min}, X_o) \f$
+ * - \f$ X_{o}^{min} \f$ = minimum mole fraction of solvent allowed
* in the denominator.
*
* @param molal Output vector of molalities. Length: m_kk.
*/
void getMolalities(doublereal * const molal) const;
- //! Set the molalities of a phase
+ //! Set the molalities of the solutes in a phase
/*!
- * Set the molalities of the solutes in a phase. Note, the entry for the
- * solvent is not used.
+ * Note, the entry for the solvent is not used.
* We are supplied with the molalities of all of the
* solute species. We then calculate the mole fractions of all
- * species and update the ThermoPhase object.
+ * species and update the %ThermoPhase object.
+ * \f[
+ * m_i = \frac{X_i}{M_o/1000 * X_{o,p}}
+ * \f]
+ * where
+ * - \f$M_o\f$ is the molecular weight of the solvent
+ * - \f$X_o\f$ is the mole fraction of the solvent
+ * - \f$X_i\f$ is the mole fraction of the solute.
+ * - \f$X_{o,p} = \max(X_o^{min}, X_o)\f$
+ * - \f$X_o^{min}\f$ = minimum mole fraction of solvent allowed
+ * in the denominator.
*
- * m_i = (n_i) / (W_o/1000 * n_o_p)
- *
- * where M_o is the molecular weight of the solvent
- * n_o is the mole fraction of the solvent
- * n_i is the mole fraction of the solute.
- * n_o_p = max (n_o_min, n_o)
- * n_o_min = minimum mole fraction of solvent allowed
- * in the denominator.
+ * The formulas for calculating mole fractions are
+ * \f[
+ * L^{sum} = \frac{1}{\tilde{M}_o X_o} = \frac{1}{\tilde{M}_o} + \sum_{i\ne o} m_i
+ * \f]
+ * Then,
+ * \f[
+ * X_o = \frac{1}{\tilde{M}_o L^{sum}}
+ * \f]
+ * \f[
+ * X_i = \frac{m_i}{L^{sum}}
+ * \f]
+ * It is currently an error if the solvent mole fraction is attempted to be set
+ * to a value lower than \f$X_o^{min}\f$.
*
* @param molal Input vector of molalities. Length: m_kk.
*/
@@ -338,48 +471,87 @@ namespace Cantera {
virtual void getUnitsStandardConc(double *uA, int k = 0,
int sizeUA = 6);
- /**
- * Get the array of non-dimensional activities (molality
- * based for this class and classes that derive from it) at
- * the current solution temperature, pressure, and
- * solution concentration.
+
+ //! Get the array of non-dimensional activities (molality
+ //! based for this class and classes that derive from it) at
+ //! the current solution temperature, pressure, and solution concentration.
+ /*!
+ * All standard state properties for molality-based phases are
+ * evaluated consistent with the molality scale. Therefore, this function
+ * must return molality-based activities.
*
- * @param ac Output vector of activities. Length: m_kk.
+ * \f[
+ * a_i^\triangle = \gamma_k^{\triangle} \frac{m_k}{m^\triangle}
+ * \f]
+ *
+ * This function must be implemented in derived classes.
+ *
+ * @param ac Output vector of molality-based activities. Length: m_kk.
*/
virtual void getActivities(doublereal* ac) const {
err("getActivities");
}
- /**
- * Get the array of non-dimensional activity coefficients at
- * the current solution temperature, pressure, and
- * solution concentration.
+ //! Get the array of non-dimensional activity coefficients at
+ //! the current solution temperature, pressure, and solution concentration.
+ /*!
* These are mole-fraction based activity coefficients. In this
* object, their calculation is based on translating the values
- * of the molality based activity coefficients.
- * See Denbigh p. 278 for a thorough discussion
+ * of the molality-based activity coefficients.
+ * See Denbigh p. 278 for a thorough discussion.
+ *
+ * The molar-based activity coefficients \f$ \gamma_k \f$ may be calculated from the
+ * molality-based
+ * activity coefficients, \f$ \gamma_k^\triangle \f$ by the following
+ * formula.
+ * \f[
+ * \gamma_k = \frac{\gamma_k^\triangle}{X_o}
+ * \f]
+ *
+ * For purposes of establishing a convention, the molar activity coefficient of the
+ * solvent is set equal to the molality-based activity coefficient of the
+ * solvent:
+ *
+ * \f[
+ * \gamma_o = \gamma_o^\triangle
+ * \f]
+ *
+ * Derived classes don't need to overload this function. This function is
+ * handled at this level.
*
* @param ac Output vector containing the mole-fraction based activity coefficients.
* length: m_kk.
*/
void getActivityCoefficients(doublereal* ac) const;
- /**
- * Get the array of non-dimensional molality based
- * activity coefficients at the current solution temperature,
- * pressure, and solution concentration.
- * See Denbigh p. 278 for a thorough discussion
+ //! Get the array of non-dimensional molality based
+ //! activity coefficients at the current solution temperature,
+ //! pressure, and solution concentration.
+ /*!
+ * See Denbigh p. 278 for a thorough discussion. This class must be overwritten in
+ * classes which derive from %MolalityVPSSTP. This function takes over from the
+ * molar-based activity coefficient calculation, getActivityCoefficients(), in
+ * derived classes.
*
* @param acMolality Output vector containing the molality based activity coefficients.
* length: m_kk.
*/
- virtual void getMolalityActivityCoefficients(doublereal *acMolality)
- const {
+ virtual void getMolalityActivityCoefficients(doublereal *acMolality) const {
err("getMolalityActivityCoefficients");
}
-
- /**
- * Calculate the osmotic coefficient
+
+ //! Calculate the osmotic coefficient
+ /*!
+ * \f[
+ * \phi = \frac{- ln(a_o)}{\tilde{M}_o \sum_{i \ne o} m_i}
+ * \f]
+ *
+ * Note there are a few of definitions of the osmotic coefficient floating
+ * around. We use the one defined in
+ * (Activity Coefficients in Electrolyte Solutions, K. S. Pitzer
+ * CRC Press, Boca Raton, 1991, p. 85, Eqn. 28). This definition is most clearly
+ * related to theoretical calculation.
+ *
* units = dimensionless
*/
virtual double osmoticCoefficient() const;
@@ -469,13 +641,12 @@ namespace Cantera {
}
-
//@}
- /**
- * Set equation of state parameter values from XML
- * entries. This method is called by function importPhase in
+ //! Set equation of state parameter values from XML entries.
+ /*!
+ * This method is called by function importPhase() in
* file importCTML.cpp when processing a phase definition in
* an input file. It should be overloaded in subclasses to set
* any parameters that are specific to that particular phase
@@ -488,10 +659,16 @@ namespace Cantera {
* set to the "name":"molalities pairs found within that
* XML block. The solvent concentration is then set
* to everything else.
+ *
+ * The function first calls the overloaded function ,
+ * VPStandardStateTP::setStateFromXML(), to pick up the parent class
+ * behavior.
+ *
+ * usage: Overloaded functions should call this function
+ * before carrying out their own behavior.
*
* @param state An XML_Node object corresponding to
* the "state" entry for this phase in the input file.
- *
*/
virtual void setStateFromXML(const XML_Node& state);
@@ -501,7 +678,8 @@ namespace Cantera {
/// To see how they are used, see files importCTML.cpp and
/// ThermoFactory.cpp.
- /**
+
+ /*!
* @internal Initialize. This method is provided to allow
* subclasses to perform any initialization required after all
* species have been added. For example, it might be used to
@@ -585,10 +763,11 @@ namespace Cantera {
* molal_solvent = 0 when xmol_solvent = 0.
*/
doublereal m_xmolSolventMIN;
+
+ //! This is the multiplication factor that goes inside
+ //! log expressions involving the molalities of species.
/*!
- * This is the multiplication factor that goes inside
- * log expressions involving the molalities of species.
- * Its equal to Wt_0 / 1000.
+ * Its equal to Wt_0 / 1000,
* where Wt_0 = weight of solvent (kg/kmol)
*/
doublereal m_Mnaught;