Cantera  3.1.0a1
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  //! @name Mechanical Properties
94  //! @{
95 
96 protected:
97  void calcDensity() override;
98 
99 public:
100  //! @}
101  //! @name Activities, Standard States, and Activity Concentrations
102  //!
103  //! The activity @f$ a_k @f$ of a species in solution is related to the
104  //! chemical potential by @f[ \mu_k = \mu_k^0(T) + \hat R T \ln a_k. @f] The
105  //! quantity @f$ \mu_k^0(T,P) @f$ is the chemical potential at unit activity,
106  //! which depends only on temperature and pressure.
107  //! @{
108 
109  Units standardConcentrationUnits() const override;
110  void getActivityConcentrations(double* c) const override;
111 
112  /**
113  * The standard concentration @f$ C^0_k @f$ used to normalize the
114  * generalized concentration. In many cases, this quantity will be the same
115  * for all species in a phase - for example, for an ideal gas
116  * @f$ C^0_k = P/\hat R T @f$. For this reason, this method returns a single
117  * value, instead of an array. However, for phases in which the standard
118  * concentration is species-specific (for example, surface species of different
119  * sizes), this method may be called with an optional parameter indicating
120  * the species.
121  *
122  * The standard concentration for defaulted to 1. In other words
123  * the activity concentration is assumed to be 1.
124  *
125  * @param k species index. Defaults to zero.
126  */
127  double standardConcentration(size_t k=0) const override;
128  double logStandardConc(size_t k=0) const override;
129 
130  //! Get the array of non-dimensional activities (molality based for this
131  //! class and classes that derive from it) at the current solution
132  //! temperature, pressure, and solution concentration.
133  /*!
134  * @f[
135  * a_i^\triangle = \gamma_k^{\triangle} \frac{m_k}{m^\triangle}
136  * @f]
137  *
138  * This function must be implemented in derived classes.
139  *
140  * @param ac Output vector of molality-based activities. Length: m_kk.
141  */
142  void getActivities(double* ac) const override;
143 
144  void getActivityCoefficients(double* ac) const override;
145 
146  //! Get the array of temperature derivatives of the log activity coefficients
147  /*!
148  *
149  * units = 1/Kelvin
150  *
151  * @param dlnActCoeffdT Output vector of temperature derivatives of the
152  * log Activity Coefficients. length = m_kk
153  */
154  virtual void getdlnActCoeffdT(double* dlnActCoeffdT) const {
155  throw NotImplementedError("GibbsExcessVPSSTP::getdlnActCoeffdT");
156  }
157 
158  void getdlnActCoeffdlnN(const size_t ld, double* const dlnActCoeffdlnN) override {
159  throw NotImplementedError("GibbsExcessVPSSTP::getdlnActCoeffdlnN: "
160  "nonzero and nonimplemented");
161  }
162 
163  //! Get the array of log concentration-like derivatives of the log activity
164  //! coefficients
165  /*!
166  * This function is a virtual method. For ideal mixtures (unity activity
167  * coefficients), this can return zero. Implementations should take the
168  * derivative of the logarithm of the activity coefficient with respect to
169  * the logarithm of the concentration-like variable (for example, number of moles in
170  * in a unit volume. ) that represents the standard state. This quantity is
171  * to be used in conjunction with derivatives of that concentration-like
172  * variable when the derivative of the chemical potential is taken.
173  *
174  * units = dimensionless
175  *
176  * @param dlnActCoeffdlnX Output vector of derivatives of the
177  * log Activity Coefficients. length = m_kk
178  */
179  virtual void getdlnActCoeffdlnX(double* dlnActCoeffdlnX) const {
180  throw NotImplementedError("GibbsExcessVPSSTP::getdlnActCoeffdlnX");
181  }
182 
183  //! @}
184  //! @name Partial Molar Properties of the Solution
185  //! @{
186 
187  //! Return an array of partial molar volumes for the
188  //! species in the mixture. Units: m^3/kmol.
189  /*!
190  * Frequently, for this class of thermodynamics representations,
191  * the excess Volume due to mixing is zero. Here, we set it as
192  * a default. It may be overridden in derived classes.
193  *
194  * @param vbar Output vector of species partial molar volumes.
195  * Length = m_kk. units are m^3/kmol.
196  */
197  void getPartialMolarVolumes(double* vbar) const override;
198  //! @}
199 
200  bool addSpecies(shared_ptr<Species> spec) override;
201 
202 protected:
203  void compositionChanged() override;
204 
205  //! Storage for the current values of the mole fractions of the species
206  /*!
207  * This vector is kept up-to-date when the setState functions are called.
208  * Therefore, it may be considered to be an independent variable.
209  *
210  * Note in order to do this, the setState functions are redefined to always
211  * keep this vector current.
212  */
213  mutable vector<double> moleFractions_;
214 
215  //! Storage for the current values of the activity coefficients of the
216  //! species
217  mutable vector<double> lnActCoeff_Scaled_;
218 
219  //! Storage for the current derivative values of the gradients with respect
220  //! to temperature of the log of the activity coefficients of the species
221  mutable vector<double> dlnActCoeffdT_Scaled_;
222 
223  //! Storage for the current derivative values of the gradients with respect
224  //! to temperature of the log of the activity coefficients of the species
225  mutable vector<double> d2lnActCoeffdT2_Scaled_;
226 
227  //! Storage for the current derivative values of the gradients with respect
228  //! to logarithm of the mole fraction of the log of the activity
229  //! coefficients of the species
230  mutable vector<double> dlnActCoeffdlnN_diag_;
231 
232  //! Storage for the current derivative values of the gradients with respect
233  //! to logarithm of the mole fraction of the log of the activity
234  //! coefficients of the species
235  mutable vector<double> dlnActCoeffdlnX_diag_;
236 
237  //! Storage for the current derivative values of the gradients with respect
238  //! to logarithm of the species mole number of the log of the activity
239  //! coefficients of the species
240  /*!
241  * dlnActCoeffdlnN_(k, m) is the derivative of ln(gamma_k) wrt ln mole
242  * number of species m
243  */
245 };
246 
247 }
248 
249 #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
GibbsExcessVPSSTP is a derived class of ThermoPhase that handles variable pressure standard state met...
vector< double > d2lnActCoeffdT2_Scaled_
Storage for the current derivative values of the gradients with respect to temperature of the log of ...
double logStandardConc(size_t k=0) const override
Natural logarithm of the standard concentration of the kth species.
Array2D dlnActCoeffdlnN_
Storage for the current derivative values of the gradients with respect to logarithm of the species m...
vector< double > lnActCoeff_Scaled_
Storage for the current values of the activity coefficients of the species.
void getActivityConcentrations(double *c) const override
This method returns an array of generalized concentrations.
void getPartialMolarVolumes(double *vbar) const override
Return an array of partial molar volumes for the species in the mixture.
vector< double > dlnActCoeffdlnX_diag_
Storage for the current derivative values of the gradients with respect to logarithm of the mole frac...
vector< double > moleFractions_
Storage for the current values of the mole fractions of the species.
vector< double > dlnActCoeffdT_Scaled_
Storage for the current derivative values of the gradients with respect to temperature of the log of ...
void calcDensity() override
Calculate the density of the mixture using the partial molar volumes and mole fractions as input.
virtual void getdlnActCoeffdT(double *dlnActCoeffdT) const
Get the array of temperature derivatives of the log activity coefficients.
void getActivities(double *ac) const override
Get the array of non-dimensional activities (molality based for this class and classes that derive fr...
Units standardConcentrationUnits() const override
Returns the units of the "standard concentration" for this phase.
void compositionChanged() override
Apply changes to the state which are needed after the composition changes.
double standardConcentration(size_t k=0) const override
The standard concentration used to normalize the generalized concentration.
void getActivityCoefficients(double *ac) const override
Get the array of non-dimensional molar-based activity coefficients at the current solution temperatur...
vector< double > dlnActCoeffdlnN_diag_
Storage for the current derivative values of the gradients with respect to logarithm of the mole frac...
virtual void getdlnActCoeffdlnX(double *dlnActCoeffdlnX) const
Get the array of log concentration-like derivatives of the log activity coefficients.
void getdlnActCoeffdlnN(const size_t ld, double *const dlnActCoeffdlnN) override
Get the array of derivatives of the log activity coefficients with respect to the log of the species ...
An error indicating that an unimplemented function has been called.
Definition: ctexceptions.h:195
A representation of the units associated with a dimensional quantity.
Definition: Units.h:35
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:701
Namespace for the Cantera kernel.
Definition: AnyMap.cpp:564