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
Cantera::GibbsExcessVPSSTP::d2lnActCoeffdT2_Scaled_
vector_fp d2lnActCoeffdT2_Scaled_
Storage for the current derivative values of the gradients with respect to temperature of the log of ...
Definition: GibbsExcessVPSSTP.h:257
Cantera::GibbsExcessVPSSTP::calcDensity
void calcDensity()
Calculate the density of the mixture using the partial molar volumes and mole fractions as input.
Definition: GibbsExcessVPSSTP.cpp:32
Cantera::Array2D
A class for 2D arrays stored in column-major (Fortran-compatible) form.
Definition: Array.h:31
Cantera::GibbsExcessVPSSTP::getdlnActCoeffdlnX
virtual void getdlnActCoeffdlnX(doublereal *dlnActCoeffdlnX) const
Get the array of log concentration-like derivatives of the log activity coefficients.
Definition: GibbsExcessVPSSTP.h:205
Cantera::GibbsExcessVPSSTP::getActivities
virtual void getActivities(doublereal *ac) const
Get the array of non-dimensional activities (molality based for this class and classes that derive fr...
Definition: GibbsExcessVPSSTP.cpp:65
Cantera::GibbsExcessVPSSTP::addSpecies
virtual bool addSpecies(shared_ptr< Species > spec)
Definition: GibbsExcessVPSSTP.cpp:111
Cantera::GibbsExcessVPSSTP::standardConcentration
virtual doublereal standardConcentration(size_t k=0) const
The standard concentration used to normalize the generalized concentration.
Definition: GibbsExcessVPSSTP.cpp:55
Cantera::NotImplementedError
An error indicating that an unimplemented function has been called.
Definition: ctexceptions.h:186
Cantera::GibbsExcessVPSSTP::lnActCoeff_Scaled_
vector_fp lnActCoeff_Scaled_
Storage for the current values of the activity coefficients of the species.
Definition: GibbsExcessVPSSTP.h:249
Cantera::GibbsExcessVPSSTP::moleFractions_
vector_fp moleFractions_
Storage for the current values of the mole fractions of the species.
Definition: GibbsExcessVPSSTP.h:245
Cantera::GibbsExcessVPSSTP::getPartialMolarVolumes
virtual void getPartialMolarVolumes(doublereal *vbar) const
Return an array of partial molar volumes for the species in the mixture.
Definition: GibbsExcessVPSSTP.cpp:90
Cantera::GibbsExcessVPSSTP::dlnActCoeffdlnN_
Array2D dlnActCoeffdlnN_
Storage for the current derivative values of the gradients with respect to logarithm of the species m...
Definition: GibbsExcessVPSSTP.h:276
Array.h
Cantera::vector_fp
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
Cantera::GibbsExcessVPSSTP::getActivityCoefficients
virtual void getActivityCoefficients(doublereal *ac) const
Get the array of non-dimensional molar-based activity coefficients at the current solution temperatur...
Definition: GibbsExcessVPSSTP.cpp:74
Cantera::GibbsExcessVPSSTP::getdlnActCoeffdT
virtual void getdlnActCoeffdT(doublereal *dlnActCoeffdT) const
Get the array of temperature derivatives of the log activity coefficients.
Definition: GibbsExcessVPSSTP.h:180
Cantera::GibbsExcessVPSSTP::getdlnActCoeffdlnN
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 ...
Definition: GibbsExcessVPSSTP.h:184
Cantera::GibbsExcessVPSSTP::dlnActCoeffdT_Scaled_
vector_fp dlnActCoeffdT_Scaled_
Storage for the current derivative values of the gradients with respect to temperature of the log of ...
Definition: GibbsExcessVPSSTP.h:253
Cantera::GibbsExcessVPSSTP::logStandardConc
virtual doublereal logStandardConc(size_t k=0) const
Natural logarithm of the standard concentration of the kth species.
Definition: GibbsExcessVPSSTP.cpp:60
Cantera::GibbsExcessVPSSTP::checkMFSum
double checkMFSum(const doublereal *const x) const
utility routine to check mole fraction sum
Definition: GibbsExcessVPSSTP.cpp:101
Cantera::GibbsExcessVPSSTP::dlnActCoeffdlnX_diag_
vector_fp dlnActCoeffdlnX_diag_
Storage for the current derivative values of the gradients with respect to logarithm of the mole frac...
Definition: GibbsExcessVPSSTP.h:267
Cantera::GibbsExcessVPSSTP::compositionChanged
virtual void compositionChanged()
Apply changes to the state which are needed after the composition changes.
Definition: GibbsExcessVPSSTP.cpp:24
Cantera::GibbsExcessVPSSTP::getActivityConcentrations
virtual void getActivityConcentrations(doublereal *c) const
This method returns an array of generalized concentrations.
Definition: GibbsExcessVPSSTP.cpp:50
VPStandardStateTP.h
Cantera::Units
A representation of the units associated with a dimensional quantity.
Definition: Units.h:29
Cantera::GibbsExcessVPSSTP::standardConcentrationUnits
virtual Units standardConcentrationUnits() const
Returns the units of the "standard concentration" for this phase.
Definition: GibbsExcessVPSSTP.cpp:45
Cantera::GibbsExcessVPSSTP::dlnActCoeffdlnN_diag_
vector_fp dlnActCoeffdlnN_diag_
Storage for the current derivative values of the gradients with respect to logarithm of the mole frac...
Definition: GibbsExcessVPSSTP.h:262
Cantera::GibbsExcessVPSSTP
Definition: GibbsExcessVPSSTP.h:84
Cantera
Namespace for the Cantera kernel.
Definition: AnyMap.cpp:263
Cantera::VPStandardStateTP
Definition: VPStandardStateTP.h:41