Cantera 2.6.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 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
18namespace 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{
86public:
87 //! @name Constructors
88 //! @{
89
91
92 //! @}
93 //! @name Mechanical Properties
94 //! @{
95
96protected:
97 /**
98 * Calculate the density of the mixture using the partial molar volumes and
99 * mole fractions as input
100 *
101 * The formula for this is
102 *
103 * \f[
104 * \rho = \frac{\sum_k{X_k W_k}}{\sum_k{X_k V_k}}
105 * \f]
106 *
107 * where \f$X_k\f$ are the mole fractions, \f$W_k\f$ are the molecular
108 * weights, and \f$V_k\f$ are the pure species molar volumes.
109 *
110 * Note, the basis behind this formula is that in an ideal solution the
111 * partial molar volumes are equal to the pure species molar volumes. We
112 * have additionally specified in this class that the pure species molar
113 * volumes are independent of temperature and pressure.
114 *
115 * NOTE: This is a non-virtual function, which is not a member of the
116 * ThermoPhase base class.
117 */
118 void calcDensity();
119
120public:
121 /**
122 * @}
123 * @name Activities, Standard States, and Activity Concentrations
124 *
125 * The activity \f$a_k\f$ of a species in solution is related to the
126 * chemical potential by \f[ \mu_k = \mu_k^0(T) + \hat R T \log a_k. \f] The
127 * quantity \f$\mu_k^0(T,P)\f$ is the chemical potential at unit activity,
128 * which depends only on temperature and pressure.
129 * @{
130 */
131
132 virtual Units standardConcentrationUnits() const;
133 virtual void getActivityConcentrations(doublereal* c) const;
134
135 /**
136 * The standard concentration \f$ C^0_k \f$ used to normalize the
137 * generalized concentration. In many cases, this quantity will be the same
138 * for all species in a phase - for example, for an ideal gas
139 * \f$ C^0_k = P/\hat R T \f$. For this reason, this method returns a single
140 * value, instead of an array. However, for phases in which the standard
141 * concentration is species-specific (for example, surface species of different
142 * sizes), this method may be called with an optional parameter indicating
143 * the species.
144 *
145 * The standard concentration for defaulted to 1. In other words
146 * the activity concentration is assumed to be 1.
147 *
148 * @param k species index. Defaults to zero.
149 */
150 virtual doublereal standardConcentration(size_t k=0) const;
151 virtual doublereal logStandardConc(size_t k=0) const;
152
153 //! Get the array of non-dimensional activities (molality based for this
154 //! class and classes that derive from it) at the current solution
155 //! temperature, pressure, and solution concentration.
156 /*!
157 * \f[
158 * a_i^\triangle = \gamma_k^{\triangle} \frac{m_k}{m^\triangle}
159 * \f]
160 *
161 * This function must be implemented in derived classes.
162 *
163 * @param ac Output vector of molality-based activities. Length: m_kk.
164 */
165 virtual void getActivities(doublereal* ac) const;
166
167 virtual void getActivityCoefficients(doublereal* ac) const;
168
169 //! Get the array of temperature derivatives of the log activity coefficients
170 /*!
171 * This function is virtual, and first appears in GibbsExcessVPSSTP.
172 *
173 * units = 1/Kelvin
174 *
175 * @param dlnActCoeffdT Output vector of temperature derivatives of the
176 * log Activity Coefficients. length = m_kk
177 */
178 virtual void getdlnActCoeffdT(doublereal* dlnActCoeffdT) const {
179 throw NotImplementedError("GibbsExcessVPSSTP::getdlnActCoeffdT");
180 }
181
182 virtual void getdlnActCoeffdlnN(const size_t ld, doublereal* const dlnActCoeffdlnN) {
183 throw NotImplementedError("GibbsExcessVPSSTP::getdlnActCoeffdlnN: "
184 "nonzero and nonimplemented");
185 }
186
187 //! Get the array of log concentration-like derivatives of the log activity
188 //! coefficients
189 /*!
190 * This function is a virtual method. For ideal mixtures (unity activity
191 * coefficients), this can return zero. Implementations should take the
192 * derivative of the logarithm of the activity coefficient with respect to
193 * the logarithm of the concentration-like variable (for example, number of moles in
194 * in a unit volume. ) that represents the standard state. This quantity is
195 * to be used in conjunction with derivatives of that concentration-like
196 * variable when the derivative of the chemical potential is taken.
197 *
198 * units = dimensionless
199 *
200 * @param dlnActCoeffdlnX Output vector of derivatives of the
201 * log Activity Coefficients. length = m_kk
202 */
203 virtual void getdlnActCoeffdlnX(doublereal* dlnActCoeffdlnX) const {
204 throw NotImplementedError("GibbsExcessVPSSTP::getdlnActCoeffdlnX");
205 }
206
207 //! @}
208 /// @name Partial Molar Properties of the Solution
209 //! @{
210
211 //! Return an array of partial molar volumes for the
212 //! species in the mixture. Units: m^3/kmol.
213 /*!
214 * Frequently, for this class of thermodynamics representations,
215 * the excess Volume due to mixing is zero. Here, we set it as
216 * a default. It may be overridden in derived classes.
217 *
218 * @param vbar Output vector of species partial molar volumes.
219 * Length = m_kk. units are m^3/kmol.
220 */
221 virtual void getPartialMolarVolumes(doublereal* vbar) const;
222 virtual const vector_fp& getPartialMolarVolumesVector() const;
223 //! @}
224
225 virtual bool addSpecies(shared_ptr<Species> spec);
226
227protected:
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
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:30
virtual bool addSpecies(shared_ptr< Species > spec)
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...
Namespace for the Cantera kernel.
Definition: AnyMap.h:29
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:184