Cantera  2.4.0
GibbsExcessVPSSTP.h
Go to the documentation of this file.
1 /**
2  * @file GibbsExcessVPSSTP.h
3  * Header for intermediate ThermoPhase object for phases which
4  * employ Gibbs excess free energy based formulations
5  * (see \ref thermoprops
6  * and class \link Cantera::GibbsExcessVPSSTP GibbsExcessVPSSTP\endlink).
7  */
8 
9 // This file is part of Cantera. See License.txt in the top-level directory or
10 // at http://www.cantera.org/license.txt for license and copyright information.
11 
12 #ifndef CT_GIBBSEXCESSVPSSTP_H
13 #define CT_GIBBSEXCESSVPSSTP_H
14 
15 #include "VPStandardStateTP.h"
16 #include "cantera/base/Array.h"
17 
18 namespace Cantera
19 {
20 
21 /*!
22  * GibbsExcessVPSSTP is a derived class of ThermoPhase that handles variable
23  * pressure standard state methods for calculating thermodynamic properties that
24  * are further based on expressing the Excess Gibbs free energy as a function of
25  * the mole fractions (or pseudo mole fractions) of constituents. This category
26  * is the workhorse for describing molten salts, solid-phase mixtures of
27  * semiconductors, and mixtures of miscible and semi-miscible compounds.
28  *
29  * It includes
30  * - regular solutions
31  * - Margules expansions
32  * - NTRL equation
33  * - Wilson's equation
34  * - UNIQUAC equation of state.
35  *
36  * This class adds additional functions onto the ThermoPhase interface that
37  * handles the calculation of the excess Gibbs free energy. The ThermoPhase
38  * class includes a member function, ThermoPhase::activityConvention() that
39  * indicates which convention the activities are based on. The default is to
40  * assume activities are based on the molar convention. That default is used
41  * here.
42  *
43  * All of the Excess Gibbs free energy formulations in this area employ
44  * symmetrical formulations.
45  *
46  * Chemical potentials of species k, \f$ \mu_o \f$, has the following general
47  * format:
48  *
49  * \f[
50  * \mu_k = \mu^o_k(T,P) + R T ln( \gamma_k X_k )
51  * \f]
52  *
53  * where \f$ \gamma_k^{\triangle} \f$ is a molar based activity coefficient for
54  * species \f$k\f$.
55  *
56  * GibbsExcessVPSSTP contains an internal vector with the current mole fraction
57  * vector. That's one of its primary usages. In order to keep the mole fraction
58  * vector constant, all of the setState functions are redesigned at this layer.
59  *
60  * ### Activity Concentrations: Relationship of ThermoPhase to %Kinetics Expressions
61  *
62  * As explained in a similar discussion in the ThermoPhase class, the actual
63  * units used in kinetics expressions must be specified in the ThermoPhase class
64  * for the corresponding species. These units vary with the field of study.
65  * %Cantera uses the concept of activity concentrations to represent this.
66  * Activity concentrations are used directly in the expressions for kinetics.
67  * Standard concentrations are used as the multiplicative constant that takes
68  * the activity of a species and turns it into an activity concentration.
69  * Standard concentrations must not depend on the concentration of the species
70  * in the phase.
71  *
72  * Here we set a standard for the specification of the standard concentrations
73  * for this class and all child classes underneath it. We specify here that the
74  * standard concentration is equal to 1 for all species. Therefore, the
75  * activities appear directly in kinetics expressions involving species in
76  * underlying GibbsExcessVPSSTP phases.
77  *
78  * ### SetState Strategy
79  *
80  * All setState functions that set the internal state of the ThermoPhase object
81  * are overloaded at this level, so that a current mole fraction vector is
82  * maintained within the object.
83  */
85 {
86 public:
87  //! @name Constructors
88  //! @{
89 
91 
92  //! @}
93 
94  //! @}
95  //! @name Mechanical Properties
96  //! @{
97 
98 protected:
99  /**
100  * Calculate the density of the mixture using the partial molar volumes and
101  * mole fractions as input
102  *
103  * The formula for this is
104  *
105  * \f[
106  * \rho = \frac{\sum_k{X_k W_k}}{\sum_k{X_k V_k}}
107  * \f]
108  *
109  * where \f$X_k\f$ are the mole fractions, \f$W_k\f$ are the molecular
110  * weights, and \f$V_k\f$ are the pure species molar volumes.
111  *
112  * Note, the basis behind this formula is that in an ideal solution the
113  * partial molar volumes are equal to the pure species molar volumes. We
114  * have additionally specified in this class that the pure species molar
115  * volumes are independent of temperature and pressure.
116  *
117  * NOTE: This is a non-virtual function, which is not a member of the
118  * ThermoPhase base class.
119  */
120  void calcDensity();
121 
122 public:
123  /**
124  * @}
125  * @name Activities, Standard States, and Activity Concentrations
126  *
127  * The activity \f$a_k\f$ of a species in solution is related to the
128  * chemical potential by \f[ \mu_k = \mu_k^0(T) + \hat R T \log a_k. \f] The
129  * quantity \f$\mu_k^0(T,P)\f$ is the chemical potential at unit activity,
130  * which depends only on temperature and pressure.
131  * @{
132  */
133 
134  virtual void getActivityConcentrations(doublereal* c) const;
135 
136  /**
137  * The standard concentration \f$ C^0_k \f$ used to normalize the
138  * generalized concentration. In many cases, this quantity will be the same
139  * for all species in a phase - for example, for an ideal gas
140  * \f$ C^0_k = P/\hat R T \f$. For this reason, this method returns a single
141  * value, instead of an array. However, for phases in which the standard
142  * concentration is species-specific (e.g. surface species of different
143  * sizes), this method may be called with an optional parameter indicating
144  * the species.
145  *
146  * The standard concentration for defaulted to 1. In other words
147  * the activity concentration is assumed to be 1.
148  *
149  * @param k species index. Defaults to zero.
150  */
151  virtual doublereal standardConcentration(size_t k=0) const;
152  virtual doublereal logStandardConc(size_t k=0) const;
153 
154  //! Get the array of non-dimensional activities (molality based for this
155  //! class and classes that derive from it) at the current solution
156  //! temperature, pressure, and solution concentration.
157  /*!
158  * \f[
159  * a_i^\triangle = \gamma_k^{\triangle} \frac{m_k}{m^\triangle}
160  * \f]
161  *
162  * This function must be implemented in derived classes.
163  *
164  * @param ac Output vector of molality-based activities. Length: m_kk.
165  */
166  virtual void getActivities(doublereal* ac) const;
167 
168  virtual void getActivityCoefficients(doublereal* ac) const;
169 
170  //! Get the array of temperature derivatives of the log activity coefficients
171  /*!
172  * This function is virtual, and first appears in GibbsExcessVPSSTP.
173  *
174  * units = 1/Kelvin
175  *
176  * @param dlnActCoeffdT Output vector of temperature derivatives of the
177  * log Activity Coefficients. length = m_kk
178  */
179  virtual void getdlnActCoeffdT(doublereal* dlnActCoeffdT) const {
180  throw NotImplementedError("GibbsExcessVPSSTP::getdlnActCoeffdT");
181  }
182 
183  virtual void getdlnActCoeffdlnN(const size_t ld, doublereal* const dlnActCoeffdlnN) {
184  throw NotImplementedError("GibbsExcessVPSSTP::getdlnActCoeffdlnN: "
185  "nonzero and nonimplemented");
186  }
187 
188  //! Get the array of log concentration-like derivatives of the log activity
189  //! coefficients
190  /*!
191  * This function is a virtual method. For ideal mixtures (unity activity
192  * coefficients), this can return zero. Implementations should take the
193  * derivative of the logarithm of the activity coefficient with respect to
194  * the logarithm of the concentration-like variable (i.e. number of moles in
195  * in a unit volume. ) that represents the standard state. This quantity is
196  * to be used in conjunction with derivatives of that concentration-like
197  * variable when the derivative of the chemical potential is taken.
198  *
199  * units = dimensionless
200  *
201  * @param dlnActCoeffdlnX Output vector of derivatives of the
202  * log Activity Coefficients. length = m_kk
203  */
204  virtual void getdlnActCoeffdlnX(doublereal* dlnActCoeffdlnX) const {
205  throw NotImplementedError("GibbsExcessVPSSTP::getdlnActCoeffdlnX");
206  }
207 
208  //@}
209  /// @name Partial Molar Properties of the Solution
210  //@{
211 
212  //! Return an array of partial molar volumes for the
213  //! species in the mixture. Units: m^3/kmol.
214  /*!
215  * Frequently, for this class of thermodynamics representations,
216  * the excess Volume due to mixing is zero. Here, we set it as
217  * a default. It may be overridden in derived classes.
218  *
219  * @param vbar Output vector of species partial molar volumes.
220  * Length = m_kk. units are m^3/kmol.
221  */
222  virtual void getPartialMolarVolumes(doublereal* vbar) const;
223  virtual const vector_fp& getPartialMolarVolumesVector() const;
224 
225  virtual bool addSpecies(shared_ptr<Species> spec);
226 
227 protected:
228  virtual void compositionChanged();
229 
230  //! utility routine to check mole fraction sum
231  /*!
232  * @param x vector of mole fractions.
233  */
234  double checkMFSum(const doublereal* const x) const;
235 
236  //! Storage for the current values of the mole fractions of the species
237  /*!
238  * This vector is kept up-to-date when the setState functions are called.
239  * Therefore, it may be considered to be an independent variable.
240  *
241  * Note in order to do this, the setState functions are redefined to always
242  * keep this vector current.
243  */
245 
246  //! Storage for the current values of the activity coefficients of the
247  //! species
249 
250  //! Storage for the current derivative values of the gradients with respect
251  //! to temperature of the log of the activity coefficients of the species
253 
254  //! Storage for the current derivative values of the gradients with respect
255  //! to temperature of the log of the activity coefficients of the species
257 
258  //! Storage for the current derivative values of the gradients with respect
259  //! to logarithm of the mole fraction of the log of the activity
260  //! coefficients of the species
262 
263  //! Storage for the current derivative values of the gradients with respect
264  //! to logarithm of the mole fraction of the log of the activity
265  //! coefficients of the species
267 
268  //! Storage for the current derivative values of the gradients with respect
269  //! to logarithm of the species mole number of the log of the activity
270  //! coefficients of the species
271  /*!
272  * dlnActCoeffdlnN_(k, m) is the derivative of ln(gamma_k) wrt ln mole
273  * number of species m
274  */
276 };
277 
278 }
279 
280 #endif
virtual void getdlnActCoeffdlnN(const size_t ld, doublereal *const dlnActCoeffdlnN)
Get the array of derivatives of the log activity coefficients with respect to the log of the species ...
double checkMFSum(const doublereal *const x) const
utility routine to check mole fraction sum
vector_fp dlnActCoeffdlnX_diag_
Storage for the current derivative values of the gradients with respect to logarithm of the mole frac...
An error indicating that an unimplemented function has been called.
Definition: ctexceptions.h:187
virtual void compositionChanged()
Apply changes to the state which are needed after the composition changes.
virtual void getActivityConcentrations(doublereal *c) const
This method returns an array of generalized concentrations.
A class for 2D arrays stored in column-major (Fortran-compatible) form.
Definition: Array.h:31
Header file for class Cantera::Array2D.
vector_fp dlnActCoeffdlnN_diag_
Storage for the current derivative values of the gradients with respect to logarithm of the mole frac...
vector_fp d2lnActCoeffdT2_Scaled_
Storage for the current derivative values of the gradients with respect to temperature of the log of ...
virtual bool addSpecies(shared_ptr< Species > spec)
void calcDensity()
Calculate the density of the mixture using the partial molar volumes and mole fractions as input...
This is a filter class for ThermoPhase that implements some prepatory steps for efficiently handling ...
vector_fp lnActCoeff_Scaled_
Storage for the current values of the activity coefficients of the species.
virtual void getdlnActCoeffdlnX(doublereal *dlnActCoeffdlnX) const
Get the array of log concentration-like derivatives of the log activity coefficients.
virtual void getActivities(doublereal *ac) const
Get the array of non-dimensional activities (molality based for this class and classes that derive fr...
virtual doublereal standardConcentration(size_t k=0) const
The standard concentration used to normalize the generalized concentration.
Header file for a derived class of ThermoPhase that handles variable pressure standard state methods ...
virtual void getPartialMolarVolumes(doublereal *vbar) const
Return an array of partial molar volumes for the species in the mixture.
std::vector< double > vector_fp
Turn on the use of stl vectors for the basic array type within cantera Vector of doubles.
Definition: ct_defs.h:157
vector_fp moleFractions_
Storage for the current values of the mole fractions of the species.
Array2D dlnActCoeffdlnN_
Storage for the current derivative values of the gradients with respect to logarithm of the species m...
Namespace for the Cantera kernel.
Definition: AnyMap.cpp:8
virtual void getActivityCoefficients(doublereal *ac) const
Get the array of non-dimensional molar-based activity coefficients at the current solution temperatur...
virtual void getdlnActCoeffdT(doublereal *dlnActCoeffdT) const
Get the array of temperature derivatives of the log activity coefficients.
vector_fp dlnActCoeffdT_Scaled_
Storage for the current derivative values of the gradients with respect to temperature of the log of ...
virtual doublereal logStandardConc(size_t k=0) const
Natural logarithm of the standard concentration of the kth species.