diff --git a/Cantera/src/thermo/HMWSoln.cpp b/Cantera/src/thermo/HMWSoln.cpp index d97522f64..999b2f177 100644 --- a/Cantera/src/thermo/HMWSoln.cpp +++ b/Cantera/src/thermo/HMWSoln.cpp @@ -18,7 +18,7 @@ * U.S. Government retains certain rights in this software. */ /* - * $Id: HMWSoln.cpp,v 1.53 2009/03/27 00:38:57 hkmoffa Exp $ + * $Id: HMWSoln.cpp 306 2009-12-09 17:29:23Z hkmoffa $ */ //@{ #ifndef MAX @@ -763,30 +763,7 @@ namespace Cantera { * The mass density is not a function of pressure. */ void HMWSoln::setPressure(doublereal p) { -#ifdef DEBUG_MODE - //printf("setPressure: %g\n", p); -#endif - /* - * Store the current pressure - */ - m_Pcurrent = p; - /* - * update the standard state thermo - * -> This involves calling the water function and setting the pressure - */ - updateStandardStateThermo(); - - /* - * Store the internal density of the water SS. - * Note, we would have to do this for all other - * species if they had pressure dependent properties. - */ - m_densWaterSS = m_waterSS->density(); - /* - * Calculate all of the other standard volumes - * -> note these are constant for now - */ - calcDensity(); + setState_TP(temperature(), p); } void HMWSoln::calcDensity() { @@ -889,9 +866,36 @@ namespace Cantera { * the value propagates to underlying objects. */ void HMWSoln::setTemperature(const doublereal temp) { + setState_TP(temp, m_Pcurrent); + } + + /* + * Overwritten setTemperature(double) from State.h. This + * function sets the temperature, and makes sure that + * the value propagates to underlying objects. + */ + void HMWSoln::setState_TP(doublereal temp, doublereal pres) { State::setTemperature(temp); - //m_waterSS->setTemperature(temp); + /* + * Store the current pressure + */ + m_Pcurrent = pres; + + /* + * update the standard state thermo + * -> This involves calling the water function and setting the pressure + */ updateStandardStateThermo(); + /* + * Store the internal density of the water SS. + * Note, we would have to do this for all other + * species if they had pressure dependent properties. + */ + m_densWaterSS = m_waterSS->density(); + /* + * Calculate all of the other standard volumes + * -> note these are constant for now + */ calcDensity(); } @@ -913,10 +917,14 @@ namespace Cantera { * reaction rate expressions within the phase. */ void HMWSoln::getActivityConcentrations(doublereal* c) const { - double c_solvent = standardConcentration(); + double cs_solvent = standardConcentration(); getActivities(c); - for (int k = 0; k < m_kk; k++) { - c[k] *= c_solvent; + c[0] *= cs_solvent; + if (m_kk > 1) { + double cs_solute = standardConcentration(1); + for (int k = 1; k < m_kk; k++) { + c[k] *= cs_solute; + } } } diff --git a/Cantera/src/thermo/HMWSoln.h b/Cantera/src/thermo/HMWSoln.h index 5279b5164..bdd034eeb 100644 --- a/Cantera/src/thermo/HMWSoln.h +++ b/Cantera/src/thermo/HMWSoln.h @@ -14,7 +14,7 @@ * U.S. Government retains certain rights in this software. */ /* - * $Id: HMWSoln.h,v 1.62 2009/03/27 00:38:57 hkmoffa Exp $ + * $Id: HMWSoln.h 306 2009-12-09 17:29:23Z hkmoffa $ */ #ifndef CT_HMWSOLN_H @@ -104,7 +104,7 @@ namespace Cantera { * water (IAPWS 1995 formulation) is used as its standard state. * All standard state properties for the solvent are based on * this real model for water, and involve function calls - * to the object that handles the real water model, #WaterPropsIAPWS. + * to the object that handles the real water model, #Cantera::WaterPropsIAPWS. * * The standard states for solutes are on the unit molality basis. * Therefore, in the documentation below, the normal \f$ o \f$ @@ -507,7 +507,7 @@ namespace Cantera { * \f] * * - *

Activity of the Water Solvent

+ *

Activity of the Water Solvent

* * The activity for the solvent water,\f$ a_o \f$, is not independent and must be * determined either from the Gibbs-Duhem relation or from taking the appropriate derivative @@ -1027,10 +1027,12 @@ namespace Cantera { * this phase equal to the default concentration of the solvent at the system temperature * and pressure multiplied by Mnaught (kg solvent / gmol solvent). The solvent * standard concentration is just equal to its standard state concentration. + * + * * This means that the - * kinetics operator essentially works on an generalized concentration basis (kg / m3), + * kinetics operator essentially works on an generalized concentration basis (kmol / m3), * with units for the kinetic rate constant specified - * as if all reactants (solvent or solute) are on a concentration basis (kg /m3). + * as if all reactants (solvent or solute) are on a concentration basis (kmol /m3). * The concentration will be modified by the activity coefficients. * * For example, a bulk-phase binary reaction between liquid solute species @@ -1039,39 +1041,50 @@ namespace Cantera { * following equation for its rate of progress variable, \f$ R^1 \f$, which has * units of kmol m-3 s-1. * + * \f[ + * R^1 = k^1 C_j^a C_k^a = k^1 (C^o_o \tilde{M}_o a_j) (C^o_o \tilde{M}_o a_k) + * \f] + * + * where * * \f[ - * R^1 = k^1 C_j^a C_k^a = k^1 (C_o \tilde{M}_o a_j) (C_o \tilde{M}_o a_k) - * \f] - * where - * \f[ - * C_j^a = C_o \tilde{M}_o a_j \quad and \quad C_k^a = C_o \tilde{M}_o a_k + * C_j^a = C^o_o \tilde{M}_o a_j \quad and \quad C_k^a = C^o_o \tilde{M}_o a_k * \f] * * \f$ C_j^a \f$ is the activity concentration of species j, and - * \f$ C_k^a \f$ is the activity concentration of species k. \f$ C_o \f$ - * is the concentration of water at 298 K and 1 atm. \f$ \tilde{M}_o \f$ is + * \f$ C_k^a \f$ is the activity concentration of species k. \f$ C^o_o \f$ + * is the concentration of water at 298 K and 1 atm. \f$ \tilde{M}_o \f$ * has units of kg solvent per gmol solvent and is equal to * * \f[ * \tilde{M}_o = \frac{M_o}{1000} * \f] * - * * \f$ a_j \f$ is * the activity of species j at the current temperature and pressure * and concentration of the liquid phase is given by the molality based * activity coefficient multiplied by the molality of the jth species. * * \f[ - * a_j = \gamma_j^\triangle m_j + * a_j = \gamma_j^\triangle m_j = \gamma_j^\triangle \frac{n_j}{\tilde{M}_o n_o} * \f] * * \f$k^1 \f$ has units of m3 kmol-1 s-1. * + * Therefore the generalized activity concentration of a solute species has the following form + * + * \f[ + * C_j^a = C^o_o \frac{\gamma_j^\triangle n_j}{n_o} + * \f] + * + * The generalized activity concentration of the solvent has the same units, but its a simpler form + * + * \f[ + * C_o^a = C^o_o a_o + * \f] * * The reverse rate constant can then be obtained from the law of microscopic reversibility - * and the equilibrium expression for the system. + * and the equilibrium expression for the system. * * \f[ * \frac{a_j a_k}{ a_l} = K^{o,1} = \exp(\frac{\mu^o_l - \mu^o_j - \mu^o_k}{R T} ) @@ -1455,7 +1468,7 @@ namespace Cantera { */ virtual void setPressure(doublereal p); - private: + protected: /** * Calculate the density of the mixture using the partial * molar volumes and mole fractions as input @@ -1532,6 +1545,16 @@ namespace Cantera { */ virtual void setTemperature(const doublereal temp); + //! Set the temperature (K) and pressure (Pa) + /*! + * Set the temperature and pressure. + * + * @param t Temperature (K) + * @param p Pressure (Pa) + */ + virtual void setState_TP(doublereal t, doublereal p); + + /** * The isothermal compressibility. Units: 1/Pa. * The isothermal compressibility is defined as @@ -1577,18 +1600,31 @@ namespace Cantera { * @{ */ - /** - * This method returns an array of generalized concentrations - * \f$ C_k\f$ that are defined such that - * \f$ a_k = C_k / C^0_k, \f$ where \f$ C^0_k \f$ + + //! This method returns an array of generalized activity concentrations + /*! + * The generalized activity concentrations, \f$ C_k^a\f$, are defined such that + * \f$ a_k = C^a_k / C^0_k, \f$ where \f$ C^0_k \f$ * is a standard concentration * defined below. These generalized concentrations are used * by kinetics manager classes to compute the forward and * reverse rates of elementary reactions. * + * The generalized activity concentration of a solute species has the following form + * + * \f[ + * C_j^a = C^o_o \frac{\gamma_j^\triangle n_j}{n_o} + * \f] + * + * The generalized activity concentration of the solvent has the same units, but its a simpler form + * + * \f[ + * C_o^a = C^o_o a_o + * \f] + * + * * @param c Array of generalized concentrations. The - * units depend upon the implementation of the - * reaction rate expressions within the phase. + * units are kmol m-3 for both the solvent and the solute species */ virtual void getActivityConcentrations(doublereal* c) const; @@ -1597,12 +1633,73 @@ namespace Cantera { * The standard concentration \f$ C^0_k \f$ used to normalize * the activity (i.e., generalized) concentration for use * - * For the time being, we will use the concentration of pure - * solvent at the temperature and pressure of the solution - * for the the standard concentration of all species. - * This has the effect of making mass-action reaction rates - * based on the molality of species proportional to the - * molality of the species. + * We have set the standard concentration for all solute species in + * this phase equal to the default concentration of the solvent at the system temperature + * and pressure multiplied by Mnaught (kg solvent / gmol solvent). The solvent + * standard concentration is just equal to its standard state concentration. + * + * \f[ + * C_j^0 = C^o_o \tilde{M}_o \quad and C_o^0 = C^o_o + * \f] + * + * The consequence of this is that the standard concentrations have unequal units + * between the solvent and the solute. However, both the solvent and the solute + * activity concentrations will have the same units of kmol kg-3. + * + * This means that the + * kinetics operator essentially works on an generalized concentration basis (kmol / m3), + * with units for the kinetic rate constant specified + * as if all reactants (solvent or solute) are on a concentration basis (kmol /m3). + * The concentration will be modified by the activity coefficients. + * + * For example, a bulk-phase binary reaction between liquid solute species + * j and k, producing + * a new liquid solute species l would have the + * following equation for its rate of progress variable, \f$ R^1 \f$, which has + * units of kmol m-3 s-1. + * + * \f[ + * R^1 = k^1 C_j^a C_k^a = k^1 (C^o_o \tilde{M}_o a_j) (C^o_o \tilde{M}_o a_k) + * \f] + * + * where + * + * \f[ + * C_j^a = C^o_o \tilde{M}_o a_j \quad and \quad C_k^a = C^o_o \tilde{M}_o a_k + * \f] + * + * \f$ C_j^a \f$ is the activity concentration of species j, and + * \f$ C_k^a \f$ is the activity concentration of species k. \f$ C^o_o \f$ + * is the concentration of water at 298 K and 1 atm. \f$ \tilde{M}_o \f$ + * has units of kg solvent per gmol solvent and is equal to + * + * \f[ + * \tilde{M}_o = \frac{M_o}{1000} + * \f] + * + * \f$ a_j \f$ is + * the activity of species j at the current temperature and pressure + * and concentration of the liquid phase is given by the molality based + * activity coefficient multiplied by the molality of the jth species. + * + * \f[ + * a_j = \gamma_j^\triangle m_j = \gamma_j^\triangle \frac{n_j}{\tilde{M}_o n_o} + * \f] + * + * \f$k^1 \f$ has units of m3 kmol-1 s-1. + * + * Therefore the generalized activity concentration of a solute species has the following form + * + * \f[ + * C_j^a = C^o_o \frac{\gamma_j^\triangle n_j}{n_o} + * \f] + * + * The generalized activity concentration of the solvent has the same units, but its a simpler form + * + * \f[ + * C_o^a = C^o_o a_o + * \f] + * * * @param k Optional parameter indicating the species. The default * is to assume this refers to species 0.