Cantera  2.5.1
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 https://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 Units standardConcentrationUnits() const;
135  virtual void getActivityConcentrations(doublereal* c) const;
136 
137  /**
138  * The standard concentration \f$ C^0_k \f$ used to normalize the
139  * generalized concentration. In many cases, this quantity will be the same
140  * for all species in a phase - for example, for an ideal gas
141  * \f$ C^0_k = P/\hat R T \f$. For this reason, this method returns a single
142  * value, instead of an array. However, for phases in which the standard
143  * concentration is species-specific (e.g. surface species of different
144  * sizes), this method may be called with an optional parameter indicating
145  * the species.
146  *
147  * The standard concentration for defaulted to 1. In other words
148  * the activity concentration is assumed to be 1.
149  *
150  * @param k species index. Defaults to zero.
151  */
152  virtual doublereal standardConcentration(size_t k=0) const;
153  virtual doublereal logStandardConc(size_t k=0) const;
154 
155  //! Get the array of non-dimensional activities (molality based for this
156  //! class and classes that derive from it) at the current solution
157  //! temperature, pressure, and solution concentration.
158  /*!
159  * \f[
160  * a_i^\triangle = \gamma_k^{\triangle} \frac{m_k}{m^\triangle}
161  * \f]
162  *
163  * This function must be implemented in derived classes.
164  *
165  * @param ac Output vector of molality-based activities. Length: m_kk.
166  */
167  virtual void getActivities(doublereal* ac) const;
168 
169  virtual void getActivityCoefficients(doublereal* ac) const;
170 
171  //! Get the array of temperature derivatives of the log activity coefficients
172  /*!
173  * This function is virtual, and first appears in GibbsExcessVPSSTP.
174  *
175  * units = 1/Kelvin
176  *
177  * @param dlnActCoeffdT Output vector of temperature derivatives of the
178  * log Activity Coefficients. length = m_kk
179  */
180  virtual void getdlnActCoeffdT(doublereal* dlnActCoeffdT) const {
181  throw NotImplementedError("GibbsExcessVPSSTP::getdlnActCoeffdT");
182  }
183 
184  virtual void getdlnActCoeffdlnN(const size_t ld, doublereal* const dlnActCoeffdlnN) {
185  throw NotImplementedError("GibbsExcessVPSSTP::getdlnActCoeffdlnN: "
186  "nonzero and nonimplemented");
187  }
188 
189  //! Get the array of log concentration-like derivatives of the log activity
190  //! coefficients
191  /*!
192  * This function is a virtual method. For ideal mixtures (unity activity
193  * coefficients), this can return zero. Implementations should take the
194  * derivative of the logarithm of the activity coefficient with respect to
195  * the logarithm of the concentration-like variable (i.e. number of moles in
196  * in a unit volume. ) that represents the standard state. This quantity is
197  * to be used in conjunction with derivatives of that concentration-like
198  * variable when the derivative of the chemical potential is taken.
199  *
200  * units = dimensionless
201  *
202  * @param dlnActCoeffdlnX Output vector of derivatives of the
203  * log Activity Coefficients. length = m_kk
204  */
205  virtual void getdlnActCoeffdlnX(doublereal* dlnActCoeffdlnX) const {
206  throw NotImplementedError("GibbsExcessVPSSTP::getdlnActCoeffdlnX");
207  }
208 
209  //@}
210  /// @name Partial Molar Properties of the Solution
211  //@{
212 
213  //! Return an array of partial molar volumes for the
214  //! species in the mixture. Units: m^3/kmol.
215  /*!
216  * Frequently, for this class of thermodynamics representations,
217  * the excess Volume due to mixing is zero. Here, we set it as
218  * a default. It may be overridden in derived classes.
219  *
220  * @param vbar Output vector of species partial molar volumes.
221  * Length = m_kk. units are m^3/kmol.
222  */
223  virtual void getPartialMolarVolumes(doublereal* vbar) const;
224  virtual const vector_fp& getPartialMolarVolumesVector() const;
225 
226  virtual bool addSpecies(shared_ptr<Species> spec);
227 
228 protected:
229  virtual void compositionChanged();
230 
231  //! utility routine to check mole fraction sum
232  /*!
233  * @param x vector of mole fractions.
234  */
235  double checkMFSum(const doublereal* const x) const;
236 
237  //! Storage for the current values of the mole fractions of the species
238  /*!
239  * This vector is kept up-to-date when the setState functions are called.
240  * Therefore, it may be considered to be an independent variable.
241  *
242  * Note in order to do this, the setState functions are redefined to always
243  * keep this vector current.
244  */
246 
247  //! Storage for the current values of the activity coefficients of the
248  //! species
250 
251  //! Storage for the current derivative values of the gradients with respect
252  //! to temperature of the log of the activity coefficients of the species
254 
255  //! Storage for the current derivative values of the gradients with respect
256  //! to temperature of the log of the activity coefficients of the species
258 
259  //! Storage for the current derivative values of the gradients with respect
260  //! to logarithm of the mole fraction of the log of the activity
261  //! coefficients of the species
263 
264  //! Storage for the current derivative values of the gradients with respect
265  //! to logarithm of the mole fraction of the log of the activity
266  //! coefficients of the species
268 
269  //! Storage for the current derivative values of the gradients with respect
270  //! to logarithm of the species mole number of the log of the activity
271  //! coefficients of the species
272  /*!
273  * dlnActCoeffdlnN_(k, m) is the derivative of ln(gamma_k) wrt ln mole
274  * number of species m
275  */
277 };
278 
279 }
280 
281 #endif
Header file for class Cantera::Array2D.
Header file for a derived class of ThermoPhase that handles variable pressure standard state methods ...
A class for 2D arrays stored in column-major (Fortran-compatible) form.
Definition: Array.h:32
virtual void getdlnActCoeffdlnX(doublereal *dlnActCoeffdlnX) const
Get the array of log concentration-like derivatives of the log activity coefficients.
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 ...
Array2D dlnActCoeffdlnN_
Storage for the current derivative values of the gradients with respect to logarithm of the species m...
virtual void getActivityCoefficients(doublereal *ac) const
Get the array of non-dimensional molar-based activity coefficients at the current solution temperatur...
virtual doublereal logStandardConc(size_t k=0) const
Natural logarithm of the standard concentration of the kth species.
virtual void getPartialMolarVolumes(doublereal *vbar) const
Return an array of partial molar volumes for the species in the mixture.
virtual void getActivityConcentrations(doublereal *c) const
This method returns an array of generalized concentrations.
vector_fp dlnActCoeffdlnX_diag_
Storage for the current derivative values of the gradients with respect to logarithm of the mole frac...
vector_fp lnActCoeff_Scaled_
Storage for the current values of the activity coefficients of the species.
vector_fp d2lnActCoeffdT2_Scaled_
Storage for the current derivative values of the gradients with respect to temperature of the log of ...
vector_fp moleFractions_
Storage for the current values of the mole fractions of the species.
virtual Units standardConcentrationUnits() const
Returns the units of the "standard concentration" for this phase.
vector_fp dlnActCoeffdlnN_diag_
Storage for the current derivative values of the gradients with respect to logarithm of the mole frac...
virtual void compositionChanged()
Apply changes to the state which are needed after the composition changes.
virtual void getdlnActCoeffdT(doublereal *dlnActCoeffdT) const
Get the array of temperature 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...
double checkMFSum(const doublereal *const x) const
utility routine to check mole fraction sum
vector_fp dlnActCoeffdT_Scaled_
Storage for the current derivative values of the gradients with respect to temperature of the log of ...
void calcDensity()
Calculate the density of the mixture using the partial molar volumes and mole fractions as input.
virtual doublereal standardConcentration(size_t k=0) const
The standard concentration used to normalize the generalized concentration.
An error indicating that an unimplemented function has been called.
Definition: ctexceptions.h:187
A representation of the units associated with a dimensional quantity.
Definition: Units.h:30
This is a filter class for ThermoPhase that implements some preparatory steps for efficiently handlin...
virtual bool addSpecies(shared_ptr< Species > spec)
Add a Species to this Phase.
Definition: Phase.cpp:833
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:180
Namespace for the Cantera kernel.
Definition: AnyMap.cpp:264