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
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 */
84 class GibbsExcessVPSSTP : public VPStandardStateTP
85{
86 public:
87 //! @name Constructors
88 //! @{
89
90 GibbsExcessVPSSTP() {}
91
92 //! @}
93 //! @name Mechanical Properties
94 //! @{
95
96 protected:
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
120 public:
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
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 */
244 mutable vector_fp moleFractions_;
245
246 //! Storage for the current values of the activity coefficients of the
247 //! species
248 mutable vector_fp lnActCoeff_Scaled_;
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
252 mutable vector_fp dlnActCoeffdT_Scaled_;
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
256 mutable vector_fp d2lnActCoeffdT2_Scaled_;
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
261 mutable vector_fp dlnActCoeffdlnN_diag_;
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
266 mutable vector_fp dlnActCoeffdlnX_diag_;
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 */
275 mutable Array2D dlnActCoeffdlnN_;
276};
277
278}
279
280#endif
Array.h
Header file for class Cantera::Array2D.
VPStandardStateTP.h
Header file for a derived class of ThermoPhase that handles variable pressure standard state methods ...
Cantera::Array2D
A class for 2D arrays stored in column-major (Fortran-compatible) form.
Definition: Array.h:30
Cantera::GibbsExcessVPSSTP
Definition: GibbsExcessVPSSTP.h:85
Cantera::GibbsExcessVPSSTP::addSpecies
virtual bool addSpecies(shared_ptr< Species > spec)
Definition: GibbsExcessVPSSTP.cpp:112
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:203
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:182
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:275
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:75
Cantera::GibbsExcessVPSSTP::logStandardConc
virtual doublereal logStandardConc(size_t k=0) const
Natural logarithm of the standard concentration of the kth species.
Definition: GibbsExcessVPSSTP.cpp:61
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:91
Cantera::GibbsExcessVPSSTP::getActivityConcentrations
virtual void getActivityConcentrations(doublereal *c) const
This method returns an array of generalized concentrations.
Definition: GibbsExcessVPSSTP.cpp:51
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:266
Cantera::GibbsExcessVPSSTP::lnActCoeff_Scaled_
vector_fp lnActCoeff_Scaled_
Storage for the current values of the activity coefficients of the species.
Definition: GibbsExcessVPSSTP.h:248
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:256
Cantera::GibbsExcessVPSSTP::moleFractions_
vector_fp moleFractions_
Storage for the current values of the mole fractions of the species.
Definition: GibbsExcessVPSSTP.h:244
Cantera::GibbsExcessVPSSTP::standardConcentrationUnits
virtual Units standardConcentrationUnits() const
Returns the units of the "standard concentration" for this phase.
Definition: GibbsExcessVPSSTP.cpp:46
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:261
Cantera::GibbsExcessVPSSTP::compositionChanged
virtual void compositionChanged()
Apply changes to the state which are needed after the composition changes.
Definition: GibbsExcessVPSSTP.cpp:25
Cantera::GibbsExcessVPSSTP::getdlnActCoeffdT
virtual void getdlnActCoeffdT(doublereal *dlnActCoeffdT) const
Get the array of temperature derivatives of the log activity coefficients.
Definition: GibbsExcessVPSSTP.h:178
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:66
Cantera::GibbsExcessVPSSTP::checkMFSum
double checkMFSum(const doublereal *const x) const
utility routine to check mole fraction sum
Definition: GibbsExcessVPSSTP.cpp:102
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:252
Cantera::GibbsExcessVPSSTP::calcDensity
void calcDensity()
Calculate the density of the mixture using the partial molar volumes and mole fractions as input.
Definition: GibbsExcessVPSSTP.cpp:33
Cantera::GibbsExcessVPSSTP::standardConcentration
virtual doublereal standardConcentration(size_t k=0) const
The standard concentration used to normalize the generalized concentration.
Definition: GibbsExcessVPSSTP.cpp:56
Cantera::NotImplementedError
An error indicating that an unimplemented function has been called.
Definition: ctexceptions.h:187
Cantera::Units
A representation of the units associated with a dimensional quantity.
Definition: Units.h:30
Cantera::VPStandardStateTP
This is a filter class for ThermoPhase that implements some preparatory steps for efficiently handlin...
Definition: VPStandardStateTP.h:44
Cantera
Namespace for the Cantera kernel.
Definition: AnyMap.cpp:557
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:184