1 /**
2  *  @file SingleSpeciesTP.h
3  *  Header for the SingleSpeciesTP class, which is a filter class for ThermoPhase,
4  *  that eases the construction of single species phases
5  *  ( see \ref thermoprops and class \link Cantera::SingleSpeciesTP SingleSpeciesTP\endlink).
6  */
7 
8 // This file is part of Cantera. See License.txt in the top-level directory or
9 // at https://cantera.org/license.txt for license and copyright information.
10 
11 #ifndef CT_SINGLESPECIESTP_H
12 #define CT_SINGLESPECIESTP_H
13 
14 #include "ThermoPhase.h"
15 
16 namespace Cantera
17 {
18 
19 /**
20  * @ingroup thermoprops
21  *
22  * The SingleSpeciesTP class is a filter class for ThermoPhase. What it does is
23  * to simplify the construction of ThermoPhase objects by assuming that the
24  * phase consists of one and only one type of species. In other words, it's a
25  * stoichiometric phase. However, no assumptions are made concerning the
26  * thermodynamic functions or the equation of state of the phase. Therefore it's
27  * an incomplete description of the thermodynamics. The complete description
28  * must be made in a derived class of SingleSpeciesTP.
29  *
30  * Several different groups of thermodynamic functions are resolved at this
31  * level by this class. For example, All partial molar property routines call
32  * their single species standard state equivalents. All molar solution
33  * thermodynamic routines call the single species standard state equivalents.
34  * Activities routines are resolved at this level, as there is only one species.
35  *
36  * It is assumed that the reference state thermodynamics may be obtained by a
37  * pointer to a populated species thermodynamic property manager class (see
38  * ThermoPhase::m_spthermo). How to relate pressure changes to the reference
39  * state thermodynamics is again left open to implementation.
40  *
41  * Mole fraction and Mass fraction vectors are assumed to be equal to x[0] = 1
42  * y[0] = 1, respectively. Simplifications to the interface of setState_TPY()
43  * and setState_TPX() functions result and are made within the class.
44  *
45  * Note, this class can handle the thermodynamic description of one phase of one
46  * species. It can not handle the description of phase equilibrium between two
47  * phases of a stoichiometric compound (e.g. water liquid and water vapor, below
48  * the critical point). However, it may be used to describe the thermodynamics
49  * of one phase of such a compound even past the phase equilibrium point, up to
50  * the point where the phase itself ceases to be a stable phase.
51  *
52  * This class doesn't do much at the initialization level. Its
53  * SingleSpeciesTP::initThermo() member does check that one and only one species
54  * has been defined to occupy the phase.
55  */
56 class SingleSpeciesTP : public ThermoPhase
57 {
58 public:
59     //! Base empty constructor.
60     SingleSpeciesTP();
61 
type()62     virtual std::string type() const {
63         return "SingleSpecies";
64     }
65 
isPure()66     virtual bool isPure() const {
67         return true;
68     }
69 
70     /**
71      * @name  Molar Thermodynamic Properties of the Solution
72      *
73      * These functions are resolved at this level, by reference to the partial
74      * molar functions and standard state functions for species 0. Derived
75      * classes don't need to supply entries for these functions.
76      * @{
77      */
78 
79     virtual doublereal enthalpy_mole() const;
80     virtual doublereal intEnergy_mole() const;
81     virtual doublereal entropy_mole() const;
82     virtual doublereal gibbs_mole() const;
83     virtual doublereal cp_mole() const;
84     virtual doublereal cv_mole() const;
85 
86     /**
87      * @}
88      * @name Activities, Standard State, and Activity Concentrations
89      *
90      * The activity \f$a_k\f$ of a species in solution is related to the
91      * chemical potential by \f[ \mu_k = \mu_k^0(T) + \hat R T \log a_k. \f]
92      * The quantity \f$\mu_k^0(T)\f$ is the chemical potential at unit activity,
93      * which depends only on temperature.
94      * @{
95      */
96 
97     /**
98      * Get the array of non-dimensional activities at the current solution
99      * temperature, pressure, and solution concentration.
100      *
101      * We redefine this function to just return 1.0 here.
102      *
103      * @param a   Output vector of activities. Length: 1.
104      */
getActivities(doublereal * a)105     virtual void getActivities(doublereal* a) const {
106         a[0] = 1.0;
107     }
108 
getActivityCoefficients(doublereal * ac)109     virtual void getActivityCoefficients(doublereal* ac) const {
110         ac[0] = 1.0;
111     }
112 
113     //@}
114     /// @name  Partial Molar Properties of the Solution
115     ///
116     /// These functions are resolved at this level, by reference to the partial
117     /// molar functions and standard state functions for species 0. Derived
118     /// classes don't need to supply entries for these functions.
119     //@{
120 
121     //! Get the array of non-dimensional species chemical potentials. These are
122     //! partial molar Gibbs free energies.
123     /*!
124      *  These are the phase, partial molar, and the standard state dimensionless
125      *  chemical potentials.
126      *  \f$ \mu_k / \hat R T \f$.
127      *
128      * Units: unitless
129      *
130      * @param murt  On return, Contains the chemical potential / RT of the
131      *              single species and the phase. Units are unitless. Length = 1
132      */
133     virtual void getChemPotentials_RT(doublereal* murt) const;
134 
135     //! Get the array of chemical potentials
136     /*!
137      * These are the phase, partial molar, and the standard state chemical
138      * potentials.
139      *     \f$ \mu(T,P) = \mu^0_k(T,P) \f$.
140      *
141      * @param mu   On return, Contains the chemical potential of the single
142      *             species and the phase. Units are J / kmol . Length = 1
143      */
144     virtual void getChemPotentials(doublereal* mu) const;
145 
146     //! Get the species partial molar enthalpies. Units: J/kmol.
147     /*!
148      * These are the phase enthalpies.  \f$ h_k \f$.
149      *
150      * @param hbar    Output vector of species partial molar enthalpies.
151      *                Length: 1. units are J/kmol.
152      */
153     virtual void getPartialMolarEnthalpies(doublereal* hbar) const;
154 
155     //! Get the species partial molar internal energies. Units: J/kmol.
156     /*!
157      * These are the phase internal energies.  \f$ u_k \f$.
158      *
159      * @param ubar On return, Contains the internal energy of the single species
160      *             and the phase. Units are J / kmol . Length = 1
161      */
162     virtual void getPartialMolarIntEnergies(doublereal* ubar) const;
163 
164     //! Get the species partial molar entropy. Units: J/kmol K.
165     /*!
166      * This is the phase entropy.  \f$ s(T,P) = s_o(T,P) \f$.
167      *
168      * @param sbar On return, Contains the entropy of the single species and the
169      *             phase. Units are J / kmol / K . Length = 1
170      */
171     virtual void getPartialMolarEntropies(doublereal* sbar) const;
172 
173     //! Get the species partial molar Heat Capacities. Units: J/ kmol /K.
174     /*!
175      * This is the phase heat capacity.  \f$ Cp(T,P) = Cp_o(T,P) \f$.
176      *
177      * @param cpbar On return, Contains the heat capacity of the single species
178      *              and the phase. Units are J / kmol / K . Length = 1
179      */
180     virtual void getPartialMolarCp(doublereal* cpbar) const;
181 
182     //! Get the species partial molar volumes. Units: m^3/kmol.
183     /*!
184      * This is the phase molar volume.  \f$ V(T,P) = V_o(T,P) \f$.
185      *
186      * @param vbar On return, Contains the molar volume of the single species
187      *             and the phase. Units are m^3 / kmol. Length = 1
188      */
189     virtual void getPartialMolarVolumes(doublereal* vbar) const;
190 
191     //@}
192     /// @name  Properties of the Standard State of the Species in the Solution
193     /// These functions are the primary way real properties are
194     /// supplied to derived thermodynamics classes of SingleSpeciesTP.
195     /// These functions must be supplied in derived classes. They
196     /// are not resolved at the SingleSpeciesTP level.
197     //@{
198 
199     virtual void getPureGibbs(doublereal* gpure) const;
200 
201     //! Get the molar volumes of each species in their standard states at the
202     //! current *T* and *P* of the solution.
203     /*!
204      *   units = m^3 / kmol
205      *
206      * We resolve this function at this level, by assigning the molecular weight
207      * divided by the phase density
208      *
209      * @param vbar On output this contains the standard volume of the species
210      *             and phase (m^3/kmol). Vector of length 1
211      */
212     virtual void getStandardVolumes(doublereal* vbar) const;
213 
214     //@}
215     /// @name Thermodynamic Values for the Species Reference State
216     ///
217     /// Almost all functions in this group are resolved by this class. The
218     /// internal energy function is not given by this class, since it would
219     /// involve a specification of the equation of state.
220     //@{
221 
222     virtual void getEnthalpy_RT_ref(doublereal* hrt) const;
223     virtual void getGibbs_RT_ref(doublereal* grt) const;
224     virtual void getGibbs_ref(doublereal* g) const;
225     virtual void getEntropy_R_ref(doublereal* er) const;
226     virtual void getCp_R_ref(doublereal* cprt) const;
227 
228     /**
229      * @name Setting the State
230      *
231      * These methods set all or part of the thermodynamic state.
232      * @{
233      */
234 
235     //! Mass fractions are fixed, with Y[0] = 1.0.
setMassFractions(const doublereal * const y)236     virtual void setMassFractions(const doublereal* const y) {};
237 
238     //! Mole fractions are fixed, with x[0] = 1.0.
setMoleFractions(const doublereal * const x)239     virtual void setMoleFractions(const doublereal* const x) {};
240 
241     virtual void setState_HP(double h, double p, double tol=1e-9);
242     virtual void setState_UV(double u, double v, double tol=1e-9);
243     virtual void setState_SP(double s, double p, double tol=1e-9);
244     virtual void setState_SV(double s, double v, double tol=1e-9);
245     //@}
246 
247     virtual bool addSpecies(shared_ptr<Species> spec);
248 
249 protected:
250     //! The current pressure of the solution (Pa). It gets initialized to 1 atm.
251     doublereal m_press;
252 
253     // Reference pressure (Pa). Must be the same for all species. Defaults to
254     // 1 atm.
255     doublereal m_p0;
256 
257     //! Dimensionless enthalpy at the (mtlast, m_p0)
258     mutable double m_h0_RT;
259     //! Dimensionless heat capacity at the (mtlast, m_p0)
260     mutable double m_cp0_R;
261     //! Dimensionless entropy at the (mtlast, m_p0)
262     mutable double m_s0_R;
263 
264     /**
265      * @internal This crucial internal routine calls the species thermo update
266      *        program to calculate new species Cp0, H0, and S0 whenever the
267      *        temperature has changed.
268      */
269     void _updateThermo() const;
270 };
271 
272 }
273 
274 #endif
275