diff --git a/Cantera/src/thermo/Makefile.in b/Cantera/src/thermo/Makefile.in
index b8287db93..55aa795db 100644
--- a/Cantera/src/thermo/Makefile.in
+++ b/Cantera/src/thermo/Makefile.in
@@ -18,8 +18,8 @@ do_ranlib = @DO_RANLIB@
CXX_FLAGS = @CXXFLAGS@ $(CXX_OPT)
# Extended Cantera Thermodynamics Object Files
-CATHERMO_OBJ = SingleSpeciesTP.o
-CATHERMO_H = SingleSpeciesTP.h
+CATHERMO_OBJ = SingleSpeciesTP.o StoichSubstanceSSTP.o
+CATHERMO_H = SingleSpeciesTP.h StoichSubstanceSSTP.h
CXX_INCLUDES = -I.. @CXX_INCLUDES@
LIB = @buildlib@/libcaThermo.a
diff --git a/Cantera/src/thermo/SingleSpeciesTP.cpp b/Cantera/src/thermo/SingleSpeciesTP.cpp
index 9c902acbc..592041c3d 100644
--- a/Cantera/src/thermo/SingleSpeciesTP.cpp
+++ b/Cantera/src/thermo/SingleSpeciesTP.cpp
@@ -30,7 +30,12 @@ namespace Cantera {
* class constructor
*/
SingleSpeciesTP::SingleSpeciesTP() :
- ThermoPhase()
+ ThermoPhase(),
+ m_tmin(0.0),
+ m_tmax(0.0),
+ m_press(OneAtm),
+ m_p0(OneAtm),
+ m_tlast(-1.0)
{
}
@@ -281,6 +286,52 @@ namespace Cantera {
* ---- Thermodynamic Values for the Species Reference States -------
*/
+
+ /**
+ * Returns the vector of nondimensional
+ * enthalpies of the reference state at the current temperature
+ * of the solution and the reference pressure for the species.
+ *
+ *
+ */
+ void SingleSpeciesTP::getEnthalpy_RT_ref(doublereal *hrt) const {
+ _updateThermo();
+ hrt[0] = m_h0_RT[0];
+ }
+
+
+ /**
+ * Returns the vector of nondimensional
+ * enthalpies of the reference state at the current temperature
+ * of the solution and the reference pressure for the species.
+ */
+ void SingleSpeciesTP::getGibbs_RT_ref(doublereal *grt) const {
+ _updateThermo();
+ grt[0] = m_h0_RT[0] - m_s0_R[0];
+ }
+
+ /**
+ * Returns the vector of the
+ * gibbs function of the reference state at the current temperature
+ * of the solution and the reference pressure for the species.
+ * units = J/kmol
+ */
+ void SingleSpeciesTP::getGibbs_ref(doublereal *g) const {
+ getGibbs_RT_ref(g);
+ g[0] *= GasConstant * temperature();
+ }
+
+ /**
+ * Returns the vector of nondimensional
+ * entropies of the reference state at the current temperature
+ * of the solution and the reference pressure for the species.
+ */
+ void SingleSpeciesTP::getEntropy_R_ref(doublereal *er) const {
+ _updateThermo();
+ er[0] = m_s0_R[0];
+ }
+
+
/*
* ------------------ Setting the State ------------------------
*/
@@ -475,6 +526,23 @@ namespace Cantera {
ThermoPhase::initThermo();
}
+
+ /**
+ * _updateThermo():
+ *
+ * This crucial internal routine calls the species thermo
+ * update program to calculate new species Cp0, H0, and
+ * S0 whenever the temperature has changed.
+ */
+ void SingleSpeciesTP::_updateThermo() const {
+ doublereal tnow = temperature();
+ if (m_tlast != tnow) {
+ m_spthermo->update(tnow, m_cp0_R.begin(), m_h0_RT.begin(),
+ m_s0_R.begin());
+ m_tlast = tnow;
+ }
+ }
+
}
diff --git a/Cantera/src/thermo/SingleSpeciesTP.h b/Cantera/src/thermo/SingleSpeciesTP.h
index 1140f4ac6..9029fea6e 100644
--- a/Cantera/src/thermo/SingleSpeciesTP.h
+++ b/Cantera/src/thermo/SingleSpeciesTP.h
@@ -27,14 +27,9 @@
namespace Cantera {
-
/**
- * @defgroup thermoprops Thermodynamic Properties
+ * @ingroup thermoprops
*
- * These classes are used to compute thermodynamic properties.
- */
-
- /**
* The SingleSpeciesTP class is a filter class for ThermoPhase.
* What it does is to simplify the construction of ThermoPhase
* objects by assuming that the phase consists of one and
@@ -43,7 +38,8 @@ namespace Cantera {
* thermodynamic functions or the equation of state of the
* phase. Therefore it's an incomplete description of
* the thermodynamics. The complete description must be
- * made in a derived class.
+ * made in a derived class of SingleSpeciesTP.
+ * \nosubgrouping
*/
class SingleSpeciesTP : public ThermoPhase {
@@ -57,28 +53,29 @@ namespace Cantera {
/**
*
- * @name Utilities
+ * @name Information Methods
* @{
*/
/**
- * Equation of state type flag. The base class returns
- * zero. Subclasses should define this to return a unique
- * non-zero value. Constants defined for this purpose are
- * listed in mix_defs.h.
+ * Returns the equation of state type flag.
+ * This is a modified base class.
+ * Therefore, if not overridden in derivied classes,
+ * this call will throw an exception.
*/
virtual int eosType() const;
/**
* @}
- * @name Molar Thermodynamic Properties
+ * @name Molar Thermodynamic Properties of the Solution
+ *
+ * These functions are resolved at this level, by reference
+ * to the partial molar functions and standard state
+ * functions for species 0. Derived classes don't need
+ * to supply entries for these functions.
* @{
*/
- /*
- * These functions are resolved at this level, by reference
- * to the partial molar functions
- */
/// Molar enthalpy. Units: J/kmol.
doublereal enthalpy_mole() const;
@@ -147,6 +144,16 @@ namespace Cantera {
err("thermalExpansionCoeff()"); return -1.0;
}
+ /**
+ * @}
+ * @name Electric Potential
+ *
+ * The phase may be at some non-zero electrical
+ * potential. These methods set or get the value of the
+ * electric potential.
+ */
+ //@{
+
/**
* @}
* @name Potential Energy
@@ -180,7 +187,7 @@ namespace Cantera {
/**
* @}
- * @name Activities and Activity Concentrations
+ * @name Activities, Standard State, and Activity Concentrations
*
* The activity \f$a_k\f$ of a species in solution is
* related to the chemical potential by \f[ \mu_k = \mu_k^0(T)
@@ -257,8 +264,10 @@ namespace Cantera {
* Get the array of non-dimensional activities at
* the current solution temperature, pressure, and
* solution concentration.
+ *
+ * We redefine this function to just return 1.0 here.
*/
- void getActivities(doublereal* a) {
+ virtual void getActivities(doublereal* a) {
a[0] = 1.0;
}
@@ -276,21 +285,19 @@ namespace Cantera {
}
//@}
- /// @name Partial Molar Properties of the Solution -----------------
+ /// @name Partial Molar Properties of the Solution
+ ///
+ /// These functions are resolved at this level, by reference
+ /// to the partial molar functions and standard state
+ /// functions for species 0. Derived classes don't need
+ /// to supply entries for these functions.
//@{
/*
- * These functions are all resolved here, to point to the
- * standard state functions.
+ * These functions are all resolved here to point to the
+ * standard state functions for species 0
*/
- /**
- * Get the species chemical potentials in the solution
- * These are partial molar Gibbs free energies.
- * Units: J/kmol.
- */
- void getChemPotentials(doublereal* mu) const;
-
/**
* Get the array of non-dimensional species chemical potentials
* These are partial molar Gibbs free energies.
@@ -299,6 +306,13 @@ namespace Cantera {
*/
void getChemPotentials_RT(doublereal* mu) const;
+ /**
+ * Get the species chemical potentials in the solution
+ * These are partial molar Gibbs free energies.
+ * Units: J/kmol.
+ */
+ void getChemPotentials(doublereal* mu) const;
+
/**
* Get the species electrochemical potentials. Units: J/kmol.
* This method adds a term \f$ Fz_k \phi_k \f$ to
@@ -331,13 +345,18 @@ namespace Cantera {
void getPartialMolarVolumes(doublereal* vbar) const;
//@}
- /// @name Properties of the Standard State of the Species in the Solution -------------------------------------
+ /// @name Properties of the Standard State of the Species in the Solution
+ /// These functions are the primary way real properties are
+ /// supplied to derived thermodynamics classes of SingleSpeciesTP.
+ /// These functions must be supplied in derived classes. They
+ /// are not resolved at the SingleSpeciesTP level.
//@{
- /**
- * Get the array of chemical potentials at unit activity
+ /**
+ * Get the array of chemical potentials at unit activity.
* These are the standard state chemical potentials.
- * \f$ \mu^0_k \f$.
+ * \f$ \mu^0_k(T,P) \f$. The values are evaluated at the current
+ * temperature and pressure.
*/
virtual void getStandardChemPotentials(doublereal* mu) const {
err("getStandardChemPotentials");
@@ -406,7 +425,14 @@ namespace Cantera {
//@}
- /// @name Thermodynamic Values for the Species Reference States --------------------
+ /// @name Thermodynamic Values for the Species Reference State
+ ///
+ /// Almost all functions in this group are resolved by this
+ /// class. It is assumed that the m_spthermo species thermo
+ /// pointer is populated and yields the reference state.
+ /// The internal energy function is not given by this
+ /// class, since it would involve a specification of the
+ /// equation of state.
//@{
/**
@@ -414,18 +440,14 @@ namespace Cantera {
* enthalpies of the reference state at the current temperature
* of the solution and the reference pressure for the species.
*/
- virtual void getEnthalpy_RT_ref(doublereal *hrt) const {
- err("enthalpy_RT_ref");
- }
+ virtual void getEnthalpy_RT_ref(doublereal *hrt) const;
/**
* Returns the vector of nondimensional
* enthalpies of the reference state at the current temperature
* of the solution and the reference pressure for the species.
*/
- virtual void getGibbs_RT_ref(doublereal *grt) const {
- err("gibbs_RT_ref");
- }
+ virtual void getGibbs_RT_ref(doublereal *grt) const;
/**
* Returns the vector of the
@@ -433,18 +455,14 @@ namespace Cantera {
* of the solution and the reference pressure for the species.
* units = J/kmol
*/
- virtual void getGibbs_ref(doublereal *g) const {
- err("gibbs_ref");
- }
+ virtual void getGibbs_ref(doublereal *g) const;
/**
* Returns the vector of nondimensional
* entropies of the reference state at the current temperature
* of the solution and the reference pressure for the species.
*/
- virtual void getEntropy_R_ref(doublereal *er) const {
- err("entropy_R_ref");
- }
+ virtual void getEntropy_R_ref(doublereal *er) const;
/**
* Returns the vector of nondimensional
@@ -452,9 +470,7 @@ namespace Cantera {
* at the current temperature of the solution
* and reference pressure for the species.
*/
- virtual void getCp_R_ref(doublereal *cprt) const {
- err("cp_R_ref()");
- }
+ virtual void getCp_R_ref(doublereal *cprt) const;
/**
* @name Setting the State
@@ -619,12 +635,25 @@ namespace Cantera {
virtual void initThermo();
+ protected:
+
+
+ doublereal m_tmin, m_tmax, m_press, m_p0;
+
+ /**
+ * Last temperature used to evaluate the thermodynamic
+ * polynomial.
+ */
+ mutable doublereal m_tlast;
+ mutable array_fp m_h0_RT;
+ mutable array_fp m_cp0_R;
+ mutable array_fp m_s0_R;
-
protected:
- private:
+ void _updateThermo() const;
+ private:
doublereal err(string msg) const;
};
@@ -635,5 +664,3 @@ namespace Cantera {
-
-
diff --git a/Cantera/src/thermo/StoichSubstanceSSTP.cpp b/Cantera/src/thermo/StoichSubstanceSSTP.cpp
new file mode 100644
index 000000000..d39adb2c0
--- /dev/null
+++ b/Cantera/src/thermo/StoichSubstanceSSTP.cpp
@@ -0,0 +1,411 @@
+/**
+ *
+ * @file StoichSubstanceSSTP.cpp
+ *
+ */
+
+/*
+ * Copywrite (2005) Sandia Corporation. Under the terms of
+ * Contract DE-AC04-94AL85000 with Sandia Corporation, the
+ * U.S. Government retains certain rights in this software.
+ */
+
+/*
+ * $Id$
+ */
+
+#include "ct_defs.h"
+#include "mix_defs.h"
+#include "StoichSubstanceSSTP.h"
+#include "SpeciesThermo.h"
+
+namespace Cantera {
+
+ /*
+ * ---- Constructors -------
+ */
+
+ /**
+ * Default Constructor for the StoichSubstanceSSTP class
+ */
+ StoichSubstanceSSTP::StoichSubstanceSSTP():
+ SingleSpeciesTP()
+ {
+ }
+
+ /**
+ * Destructor for the routine (virtual)
+ *
+ */
+ StoichSubstanceSSTP::~StoichSubstanceSSTP()
+ {
+ }
+
+ /*
+ * ---- Utilities -----
+ */
+
+ /**
+ * Equation of state flag. Returns the value cStoichSubstance,
+ * defined in mix_defs.h.
+ */
+ int StoichSubstanceSSTP::eosType() const {
+ return cStoichSubstance;
+ }
+
+ /*
+ * ---- Molar Thermodynamic properties of the solution ----
+ */
+
+ /**
+ * ----- Mechanical Equation of State ------
+ */
+
+ /**
+ * Pressure. Units: Pa.
+ * For an incompressible substance, the density is independent
+ * of pressure. This method simply returns the stored
+ * pressure value.
+ */
+ doublereal StoichSubstanceSSTP::pressure() const {
+ return m_press;
+ }
+
+ /**
+ * Set the pressure at constant temperature. Units: Pa.
+ * For an incompressible substance, the density is
+ * independent of pressure. Therefore, this method only
+ * stores the specified pressure value. It does not
+ * modify the density.
+ */
+ void StoichSubstanceSSTP::setPressure(doublereal p) {
+ m_press = p;
+ }
+
+ /**
+ * 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]
+ *
+ * It's equal to zero for this model, since the molar volume
+ * doesn't change with pressure or temperature.
+ */
+ doublereal StoichSubstanceSSTP::isothermalCompressibility() const {
+ return 0.0;
+ }
+
+ /**
+ * The thermal expansion coefficient. Units: 1/K.
+ * The thermal expansion coefficient is defined as
+ *
+ * \f[
+ * \beta = \frac{1}{v}\left(\frac{\partial v}{\partial T}\right)_P
+ * \f]
+ *
+ * It's equal to zero for this model, since the molar volume
+ * doesn't change with pressure or temperature.
+ */
+ doublereal StoichSubstanceSSTP::thermalExpansionCoeff() const {
+ return 0.0;
+ }
+
+ /*
+ * ---- Chemical Potentials and Activities ----
+ */
+
+ /**
+ * This method returns the array of generalized
+ * concentrations. For a stoichiomeetric substance, there is
+ * only one species, and the generalized concentration is 1.0.
+ */
+ void StoichSubstanceSSTP::
+ getActivityConcentrations(doublereal* c) const {
+ c[0] = 1.0;
+ }
+
+ /**
+ * The standard concentration. This is defined as the concentration
+ * by which the generalized concentration is normalized to produce
+ * the activity.
+ */
+ doublereal StoichSubstanceSSTP::standardConcentration(int k) const {
+ return 1.0;
+ }
+
+ /**
+ * Returns the natural logarithm of the standard
+ * concentration of the kth species
+ */
+ doublereal StoichSubstanceSSTP::logStandardConc(int k) const {
+ return 0.0;
+ }
+
+ /**
+ * 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.
+ *
+ * This routine is used in print out applications where the
+ * units are needed. Usually, MKS units are assumed throughout
+ * the program and in the XML input files.
+ *
+ * uA[0] = kmol units - default = 1
+ * uA[1] = m units - default = -nDim(), the number of spatial
+ * dimensions in the Phase class.
+ * uA[2] = kg units - default = 0;
+ * uA[3] = Pa(pressure) units - default = 0;
+ * uA[4] = Temperature units - default = 0;
+ * uA[5] = time units - default = 0
+ */
+ void StoichSubstanceSSTP::
+ getUnitsStandardConc(double *uA, int k, int sizeUA) {
+ for (int i = 0; i < 6; i++) {
+ uA[i] = 0;
+ }
+ }
+
+ /*
+ * ---- Partial Molar Properties of the Solution ----
+ */
+
+
+
+ /*
+ * ---- Properties of the Standard State of the Species in the Solution
+ * ----
+ */
+
+ /**
+ * Get the array of chemical potentials at unit activity
+ * \f$ \mu^0_k \f$.
+ *
+ * For a stoichiometric substance, there is no activity term in
+ * the chemical potential expression, and therefore the
+ * standard chemical potential and the chemical potential
+ * are both equal to the molar Gibbs function.
+ */
+ void StoichSubstanceSSTP::
+ getStandardChemPotentials(doublereal* mu0) const {
+ getGibbs_RT(mu0);
+ mu0[0] *= GasConstant * temperature();
+ }
+
+ /**
+ * Get the nondimensional Enthalpy functions for the species
+ * at their standard states at the current
+ * T and P of the solution.
+ * Molar enthalpy. Units: J/kmol. For an incompressible,
+ * stoichiometric substance, the internal energy is
+ * independent of pressure, and therefore the molar enthalpy
+ * is \f[ \hat h(T, P) = \hat u(T) + P \hat v \f], where the
+ * molar specific volume is constant.
+ */
+ void StoichSubstanceSSTP::getEnthalpy_RT(doublereal* hrt) const {
+ getEnthalpy_RT_ref(hrt);
+ double RT = GasConstant * temperature();
+ double presCorrect = (m_press - m_p0) / molarDensity();
+ hrt[0] += presCorrect / RT;
+ }
+
+ /**
+ * Get the array of nondimensional Entropy functions for the
+ * standard state species
+ * at the current T and P of the solution.
+ */
+ void StoichSubstanceSSTP::getEntropy_R(doublereal* sr) const {
+ getEntropy_R_ref(sr);
+ }
+
+ /**
+ * Get the nondimensional Gibbs functions for the species
+ * at their standard states of solution at the current T and P
+ * of the solution
+ */
+ void StoichSubstanceSSTP::getGibbs_RT(doublereal* grt) const {
+ getEnthalpy_RT(grt);
+ grt[0] -= m_s0_R[0];
+ }
+
+ /**
+ * Get the nondimensional Gibbs functions for the standard
+ * state of the species at the current T and P.
+ */
+ void StoichSubstanceSSTP::getCp_R(doublereal* cpr) const {
+ _updateThermo();
+ cpr[0] = m_cp0_R[0];
+ }
+
+ /**
+ * Molar internal energy (J/kmol).
+ * For an incompressible,
+ * stoichiometric substance, the molar internal energy is
+ * independent of pressure. Since the thermodynamic properties
+ * are specified by giving the standard-state enthalpy, the
+ * term \f$ P_0 \hat v\f$ is subtracted from the specified molar
+ * enthalpy to compute the molar internal energy.
+ */
+ void StoichSubstanceSSTP::getIntEnergy_RT(doublereal* urt) const {
+ _updateThermo();
+ double RT = GasConstant * temperature();
+ double PV = m_press / molarDensity();
+ urt[0] = m_h0_RT[0] - PV / RT;
+ }
+
+ /*
+ * ---- Thermodynamic Values for the Species Reference States ----
+ */
+ /**
+ * Molar internal energy or the reference state at the current
+ * temperature, T (J/kmol).
+ * For an incompressible,
+ * stoichiometric substance, the molar internal energy is
+ * independent of pressure. Since the thermodynamic properties
+ * are specified by giving the standard-state enthalpy, the
+ * term \f$ P_0 \hat v\f$ is subtracted from the specified molar
+ * enthalpy to compute the molar internal energy.
+ *
+ * Note, this is equal to the standard state internal energy
+ * evaluated at the reference pressure.
+ */
+ void StoichSubstanceSSTP::getIntEnergy_RT_ref(doublereal* urt) const {
+ _updateThermo();
+ double RT = GasConstant * temperature();
+ double PV = m_p0 / molarDensity();
+ urt[0] = m_h0_RT[0] - PV / RT;
+ }
+
+ /*
+ * ---- Critical State Properties
+ */
+ /// Critical temperature (K).
+ doublereal StoichSubstanceSSTP::critTemperature() const {
+ return -1.0;
+ }
+
+ /// Critical pressure (Pa).
+ doublereal StoichSubstanceSSTP::critPressure() const {
+ return -1.0;
+ }
+
+ /// Critical density (kg/m3).
+ doublereal StoichSubstanceSSTP::critDensity() const {
+ return -1.0;
+ }
+
+ /*
+ * ---- Saturation Properties
+ */
+
+ doublereal StoichSubstanceSSTP::satTemperature(doublereal p) const {
+ return (-1.0);
+ }
+ doublereal StoichSubstanceSSTP::satPressure(doublereal t) const {
+ return 0.0;
+ }
+ doublereal StoichSubstanceSSTP::vaporFraction() const {
+ return 0.0;
+ }
+ void StoichSubstanceSSTP::setState_Tsat(doublereal t, doublereal x) {
+ setTemperature(t);
+ }
+ void StoichSubstanceSSTP::setState_Psat(doublereal p, doublereal x) {
+ setPressure(p);
+ }
+
+ /*
+ * ---- Initialization and Internal functions
+ */
+
+ /**
+ * @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
+ * resize internal work arrays that must have an entry for
+ * each species. The base class implementation does nothing,
+ * and subclasses that do not require initialization do not
+ * need to overload this method. When importing a CTML phase
+ * description, this method is called just prior to returning
+ * from function importPhase.
+ *
+ * @see importCTML.cpp
+ */
+ void StoichSubstanceSSTP::initThermo() {
+ /*
+ * Make sure there is one and only one species in this phase.
+ */
+ m_kk = nSpecies();
+ if (m_kk != 1) {
+ throw CanteraError("initThermo",
+ "stoichiometric substances may only contain one species.");
+ }
+ doublereal tmin = m_spthermo->minTemp();
+ doublereal tmax = m_spthermo->maxTemp();
+ if (tmin > 0.0) m_tmin = tmin;
+ if (tmax > 0.0) m_tmax = tmax;
+ /*
+ * Store the reference pressure in the variables for the class.
+ */
+ m_p0 = refPressure();
+
+ /*
+ * Resize temporary arrays.
+ */
+ int leng = 1;
+ m_h0_RT.resize(leng);
+ m_cp0_R.resize(leng);
+ m_s0_R.resize(leng);
+ /*
+ * Call the base class thermo initializer
+ */
+ SingleSpeciesTP::initThermo();
+ }
+
+ /**
+ * setParameters:
+ *
+ * Generic routine that is used to set the parameters used
+ * by this model.
+ * C[0] = density of phase [ kg/m3 ]
+ */
+ void StoichSubstanceSSTP::setParameters(int n, double * c) {
+ double rho = c[0];
+ setDensity(rho);
+ }
+
+ /**
+ * getParameters:
+ *
+ * Generic routine that is used to get the parameters used
+ * by this model.
+ * n = 1
+ * C[0] = density of phase [ kg/m3 ]
+ */
+ void StoichSubstanceSSTP::getParameters(int &n, double * const c) {
+ double rho = density();
+ n = 1;
+ c[0] = rho;
+ }
+
+ /**
+ * Reads an xml data block for the parameters needed by this
+ * routine. eosdata is a reference to the xml thermo block, and looks
+ * like this:
+ *
+ *
+ *
+ * 3.52
+ *
+ *
+ */
+ void StoichSubstanceSSTP::setParametersFromXML(const XML_Node& eosdata) {
+ eosdata._require("model","StoichSubstanceSSTP");
+ doublereal rho = getFloat(eosdata, "density", "-");
+ setDensity(rho);
+ }
+
+}
+
+
diff --git a/Cantera/src/thermo/StoichSubstanceSSTP.h b/Cantera/src/thermo/StoichSubstanceSSTP.h
new file mode 100644
index 000000000..bcec4cb3f
--- /dev/null
+++ b/Cantera/src/thermo/StoichSubstanceSSTP.h
@@ -0,0 +1,305 @@
+/**
+ *
+ * @file StoichSubstanceSSTP.h
+ *
+ * Header file for the StoichSubstanceSSTP class
+ */
+
+/*
+ * Copywrite (2005) Sandia Corporation. Under the terms of
+ * Contract DE-AC04-94AL85000 with Sandia Corporation, the
+ * U.S. Government retains certain rights in this software.
+ */
+
+/* $Author$
+ * $Date$
+ * $Revision$
+ *
+ */
+
+#ifndef CT_STOICHSUBSTANCESSTP_H
+#define CT_STOICHSUBSTANCESSTP_H
+
+#include "mix_defs.h"
+#include "SingleSpeciesTP.h"
+#include "SpeciesThermo.h"
+
+namespace Cantera {
+
+ /**
+ * @ingroup thermoprops
+ *
+ * Class StoichSubstance represents a stoichiometric (fixed composition)
+ * incompressible substance.
+ *
+ */
+ class StoichSubstanceSSTP : public SingleSpeciesTP {
+
+ public:
+ /**
+ * Default Constructor for the StoichSubstanceSSTP class
+ */
+ StoichSubstanceSSTP();
+
+ /**
+ * Destructor for the routine (virtual)
+ *
+ */
+ virtual ~StoichSubstanceSSTP();
+
+ /**
+ *
+ * @name Utilities
+ * @{
+ */
+
+ /**
+ * Equation of state flag.
+ *
+ * Returns the value cStoichSubstance, defined in mix_defs.h.
+ */
+ virtual int eosType() const;
+
+ /**
+ * @}
+ * @name Molar Thermodynamic Properties of the Solution
+ * @{
+ */
+
+ /**
+ * @}
+ * @name Mechanical Equation of State
+ * @{
+ */
+
+ /**
+ * Pressure. Units: Pa.
+ * For an incompressible substance, the density is independent
+ * of pressure. This method simply returns the stored
+ * pressure value.
+ */
+ virtual doublereal pressure() const;
+
+ /**
+ * Set the pressure at constant temperature. Units: Pa.
+ * For an incompressible substance, the density is
+ * independent of pressure. Therefore, this method only
+ * stores the specified pressure value. It does not
+ * modify the density.
+ */
+ virtual void setPressure(doublereal p);
+
+ /**
+ * 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;
+
+ /**
+ * The thermal expansion coefficient. Units: 1/K.
+ * The thermal expansion coefficient is defined as
+ *
+ * \f[
+ * \beta = \frac{1}{v}\left(\frac{\partial v}{\partial T}\right)_P
+ * \f]
+ */
+ virtual doublereal thermalExpansionCoeff() const ;
+
+ //@}
+
+ /**
+ * @}
+ * @name Activities, Standard States, and Activity Concentrations
+ *
+ * This section is largely handled by parent classes, since there
+ * is only one species. Therefore, the activity is equal to one.
+ * @{
+ */
+
+ /**
+ * This method returns the array of generalized
+ * concentrations. For a stoichiomeetric substance, there is
+ * only one species, and the generalized concentration is 1.0.
+ */
+ virtual void getActivityConcentrations(doublereal* c) const;
+
+ /**
+ * The standard concentration. This is defined as the concentration
+ * by which the generalized concentration is normalized to produce
+ * the activity.
+ */
+ virtual doublereal standardConcentration(int k=0) const;
+
+ /**
+ * Returns the natural logarithm of the standard
+ * concentration of the kth species
+ */
+ virtual doublereal logStandardConc(int k=0) const;
+
+ /**
+ * Get the array of chemical potentials at unit activity
+ * \f$ \mu^0_k \f$.
+ *
+ * For a stoichiometric substance, there is no activity term in
+ * the chemical potential expression, and therefore the
+ * standard chemical potential and the chemical potential
+ * are both equal to the molar Gibbs function.
+ */
+ virtual void getStandardChemPotentials(doublereal* mu0) const;
+
+ /**
+ * 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.
+ *
+ * This routine is used in print out applications where the
+ * units are needed. Usually, MKS units are assumed throughout
+ * the program and in the XML input files.
+ *
+ * uA[0] = kmol units - default = 0
+ * uA[1] = m units - default = 0
+ * uA[2] = kg units - default = 0;
+ * uA[3] = Pa(pressure) units - default = 0;
+ * uA[4] = Temperature units - default = 0;
+ * uA[5] = time units - default = 0
+ */
+ virtual void getUnitsStandardConc(double *uA, int k = 0,
+ int sizeUA = 6);
+
+ //@}
+ /// @name Partial Molar Properties of the Solution
+ ///
+ /// These properties are handled by the parent class,
+ /// SingleSpeciesTP
+ //@{
+
+
+ //@}
+ /// @name Properties of the Standard State of the Species in the Solution
+ //@{
+
+ /**
+ * Get the nondimensional Enthalpy functions for the species
+ * at their standard states at the current
+ * T and P of the solution.
+ */
+ virtual void getEnthalpy_RT(doublereal* hrt) const;
+
+ /**
+ * Get the array of nondimensional Entropy functions for the
+ * standard state species
+ * at the current T and P of the solution.
+ */
+ virtual void getEntropy_R(doublereal* sr) const;
+
+ /**
+ * Get the nondimensional Gibbs functions for the species
+ * at their standard states of solution at the current T and P
+ * of the solution
+ */
+ 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.
+ */
+ virtual void getCp_R(doublereal* cpr) const;
+
+
+ /**
+ * Molar internal energy. J/kmol. For an incompressible,
+ * stoichiometric substance, the molar internal energy is
+ * independent of pressure. Since the thermodynamic properties
+ * are specified by giving the standard-state enthalpy, the
+ * term \f$ P_0 \hat v\f$ is subtracted from the specified molar
+ * enthalpy to compute the molar internal energy.
+ */
+ virtual void getIntEnergy_RT(doublereal* urt) const;
+
+ //@}
+ /// @name Thermodynamic Values for the Species Reference States
+ //@{
+
+ /**
+ * Returns the vector of nondimensional
+ * internal Energies of the reference state at the current temperature
+ * of the solution and the reference pressure for each species.
+ */
+ virtual void getIntEnergy_RT_ref(doublereal *urt) const;
+
+ /*
+ * ---- Critical State Properties
+ */
+ /// Critical temperature (K).
+ virtual doublereal critTemperature() const;
+ /// Critical pressure (Pa).
+ virtual doublereal critPressure() const;
+ /// Critical density (kg/m3).
+ virtual doublereal critDensity() const;
+
+ /*
+ * ---- Saturation Properties
+ */
+ virtual doublereal satTemperature(doublereal p) const;
+ virtual doublereal satPressure(doublereal t) const;
+ virtual doublereal vaporFraction() const;
+ virtual void setState_Tsat(doublereal t, doublereal x);
+ virtual void setState_Psat(doublereal p, doublereal x);
+
+ /*
+ * @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
+ * resize internal work arrays that must have an entry for
+ * each species. The base class implementation does nothing,
+ * and subclasses that do not require initialization do not
+ * need to overload this method. When importing a CTML phase
+ * description, this method is called just prior to returning
+ * from function importPhase.
+ *
+ * @see importCTML.cpp
+ */
+ virtual void initThermo();
+
+ /*
+ * setParameters:
+ *
+ * Generic routine that is used to set the parameters used
+ * by this model.
+ * C[0] = density of phase [ kg/m3 ]
+ */
+ virtual void setParameters(int n, double *c);
+ /*
+ * getParameters:
+ *
+ * Generic routine that is used to get the parameters used
+ * by this model.
+ * n = 1
+ * C[0] = density of phase [ kg/m3 ]
+ */
+ virtual void getParameters(int &n, double * const c);
+
+ /*
+ * Reads an xml data block for the parameters needed by this
+ * routine. eosdata points to the thermo block, and looks
+ * like this:
+ *
+ *
+ *
+ * 3.52
+ *
+ *
+ */
+ virtual void setParametersFromXML(const XML_Node& eosdata);
+
+ protected:
+
+ };
+
+}
+
+#endif