Loading [MathJax]/extensions/tex2jax.js
Cantera  3.2.0a1
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
LatticePhase.cpp
Go to the documentation of this file.
1/**
2 * @file LatticePhase.cpp
3 * Definitions for a simple thermodynamics model of a bulk phase
4 * derived from ThermoPhase,
5 * assuming a lattice of solid atoms
6 * (see @ref thermoprops and class @link Cantera::LatticePhase LatticePhase@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
17
18namespace Cantera
19{
20
21LatticePhase::LatticePhase(const string& inputFile, const string& id_)
22{
23 initThermoFile(inputFile, id_);
24}
25
27{
28 return RT() * mean_X(enthalpy_RT_ref()) +
30}
31
33{
34 return GasConstant * (mean_X(entropy_R_ref()) - sum_xlogx());
35}
36
38 return enthalpy_mole() - temperature() * entropy_mole();
39}
40
42{
43 return GasConstant * mean_X(cp_R_ref());
44}
45
47{
48 return cp_mole();
49}
50
52{
55}
56
58{
59 m_Pcurrent = p;
61}
62
64{
67}
68
70{
71 return Units(1.0);
72}
73
75{
77}
78
80{
81 for (size_t k = 0; k < m_kk; k++) {
82 ac[k] = 1.0;
83 }
84}
85
87{
88 return 1.0;
89}
90
91double LatticePhase::logStandardConc(size_t k) const
92{
93 return 0.0;
94}
95
96void LatticePhase::getChemPotentials(double* mu) const
97{
98 double delta_p = m_Pcurrent - m_Pref;
99 const vector<double>& g_RT = gibbs_RT_ref();
100 for (size_t k = 0; k < m_kk; k++) {
101 double xx = std::max(SmallNumber, moleFraction(k));
102 mu[k] = RT() * (g_RT[k] + log(xx))
103 + delta_p * m_speciesMolarVolume[k];
104 }
105}
106
108{
109 const vector<double>& _h = enthalpy_RT_ref();
110 scale(_h.begin(), _h.end(), hbar, RT());
111}
112
114{
115 const vector<double>& _s = entropy_R_ref();
116 for (size_t k = 0; k < m_kk; k++) {
117 double xx = std::max(SmallNumber, moleFraction(k));
118 sbar[k] = GasConstant * (_s[k] - log(xx));
119 }
120}
121
122void LatticePhase::getPartialMolarCp(double* cpbar) const
123{
124 getCp_R(cpbar);
125 for (size_t k = 0; k < m_kk; k++) {
126 cpbar[k] *= GasConstant;
127 }
128}
129
131{
132 getStandardVolumes(vbar);
133}
134
136{
137 const vector<double>& gibbsrt = gibbs_RT_ref();
138 scale(gibbsrt.begin(), gibbsrt.end(), mu0, RT());
139}
140
141void LatticePhase::getPureGibbs(double* gpure) const
142{
143 const vector<double>& gibbsrt = gibbs_RT_ref();
144 double delta_p = (m_Pcurrent - m_Pref);
145 for (size_t k = 0; k < m_kk; k++) {
146 gpure[k] = RT() * gibbsrt[k] + delta_p * m_speciesMolarVolume[k];
147 }
148}
149
150void LatticePhase::getEnthalpy_RT(double* hrt) const
151{
152 const vector<double>& _h = enthalpy_RT_ref();
153 double delta_prt = (m_Pcurrent - m_Pref) / RT();
154 for (size_t k = 0; k < m_kk; k++) {
155 hrt[k] = _h[k] + delta_prt * m_speciesMolarVolume[k];
156 }
157}
158
159void LatticePhase::getEntropy_R(double* sr) const
160{
161 const vector<double>& _s = entropy_R_ref();
162 std::copy(_s.begin(), _s.end(), sr);
163}
164
165void LatticePhase::getGibbs_RT(double* grt) const
166{
167 const vector<double>& gibbsrt = gibbs_RT_ref();
168 double delta_prt = (m_Pcurrent - m_Pref) / RT();
169 for (size_t k = 0; k < m_kk; k++) {
170 grt[k] = gibbsrt[k] + delta_prt * m_speciesMolarVolume[k];
171 }
172}
173
174void LatticePhase::getGibbs_ref(double* g) const
175{
177 for (size_t k = 0; k < m_kk; k++) {
178 g[k] *= RT();
179 }
180}
181
182void LatticePhase::getCp_R(double* cpr) const
183{
184 const vector<double>& _cpr = cp_R_ref();
185 std::copy(_cpr.begin(), _cpr.end(), cpr);
186}
187
188void LatticePhase::getStandardVolumes(double* vbar) const
189{
190 copy(m_speciesMolarVolume.begin(), m_speciesMolarVolume.end(), vbar);
191}
192
193const vector<double>& LatticePhase::enthalpy_RT_ref() const
194{
196 return m_h0_RT;
197}
198
199const vector<double>& LatticePhase::gibbs_RT_ref() const
200{
202 return m_g0_RT;
203}
204
205void LatticePhase::getGibbs_RT_ref(double* grt) const
206{
208 for (size_t k = 0; k < m_kk; k++) {
209 grt[k] = m_g0_RT[k];
210 }
211}
212
213const vector<double>& LatticePhase::entropy_R_ref() const
214{
216 return m_s0_R;
217}
218
219const vector<double>& LatticePhase::cp_R_ref() const
220{
222 return m_cp0_R;
223}
224
225bool LatticePhase::addSpecies(shared_ptr<Species> spec)
226{
227 bool added = ThermoPhase::addSpecies(spec);
228 if (added) {
229 if (m_kk == 1) {
231 }
232 m_h0_RT.push_back(0.0);
233 m_g0_RT.push_back(0.0);
234 m_cp0_R.push_back(0.0);
235 m_s0_R.push_back(0.0);
236 double mv = 1.0 / m_site_density;
237 if (spec->input.hasKey("equation-of-state")) {
238 auto& eos = spec->input["equation-of-state"].getMapWhere(
239 "model", "constant-volume");
240 if (eos.hasKey("density")) {
241 mv = molecularWeight(m_kk-1) / eos.convert("density", "kg/m^3");
242 } else if (eos.hasKey("molar-density")) {
243 mv = 1.0 / eos.convert("molar-density", "kmol/m^3");
244 } else if (eos.hasKey("molar-volume")) {
245 mv = eos.convert("molar-volume", "m^3/kmol");
246 }
247 }
248 m_speciesMolarVolume.push_back(mv);
249 }
250 return added;
251}
252
253void LatticePhase::setSiteDensity(double sitedens)
254{
255 m_site_density = sitedens;
256 for (size_t k = 0; k < m_kk; k++) {
257 if (species(k)->input.hasKey("equation-of-state")) {
258 auto& eos = species(k)->input["equation-of-state"].getMapWhere(
259 "model", "constant-volume");
260 if (eos.hasKey("molar-volume") || eos.hasKey("density")
261 || eos.hasKey("molar-density")) {
262 continue;
263 }
264 }
266 }
267}
268
270{
271 double tnow = temperature();
272 if (m_tlast != tnow) {
273 m_spthermo.update(tnow, &m_cp0_R[0], &m_h0_RT[0], &m_s0_R[0]);
274 m_tlast = tnow;
275 for (size_t k = 0; k < m_kk; k++) {
276 m_g0_RT[k] = m_h0_RT[k] - m_s0_R[k];
277 }
278 m_tlast = tnow;
279 }
280}
281
283{
284 if (m_input.hasKey("site-density")) {
285 setSiteDensity(m_input.convert("site-density", "kmol/m^3"));
286 }
287}
288
290{
292 phaseNode["site-density"].setQuantity(m_site_density, "kmol/m^3");
293}
294
295void LatticePhase::getSpeciesParameters(const string& name, AnyMap& speciesNode) const
296{
298 size_t k = speciesIndex(name);
299 // Output volume information in a form consistent with the input
300 const auto S = species(k);
301 if (S->input.hasKey("equation-of-state")) {
302 auto& eosIn = S->input["equation-of-state"].getMapWhere(
303 "model", "constant-volume");
304 auto& eosOut = speciesNode["equation-of-state"].getMapWhere(
305 "model", "constant-volume", true);
306
307 if (eosIn.hasKey("density")) {
308 eosOut["model"] = "constant-volume";
309 eosOut["density"].setQuantity(
310 molecularWeight(k) / m_speciesMolarVolume[k], "kg/m^3");
311 } else if (eosIn.hasKey("molar-density")) {
312 eosOut["model"] = "constant-volume";
313 eosOut["molar-density"].setQuantity(1.0 / m_speciesMolarVolume[k],
314 "kmol/m^3");
315 } else if (eosIn.hasKey("molar-volume")) {
316 eosOut["model"] = "constant-volume";
317 eosOut["molar-volume"].setQuantity(m_speciesMolarVolume[k],
318 "m^3/kmol");
319 }
320 }
321 // Otherwise, species volume is determined by the phase-level site density
322}
323
324}
Header for a simple thermodynamics model of a bulk phase derived from ThermoPhase,...
Declaration for class Cantera::Species.
Headers for the factory class that can create known ThermoPhase objects (see Thermodynamic Properties...
A map of string keys to values whose type can vary at runtime.
Definition AnyMap.h:432
bool hasKey(const string &key) const
Returns true if the map contains an item named key.
Definition AnyMap.cpp:1477
double convert(const string &key, const string &units) const
Convert the item stored by the given key to the units specified in units.
Definition AnyMap.cpp:1595
const vector< double > & entropy_R_ref() const
Returns a reference to the dimensionless reference state Entropy vector.
double enthalpy_mole() const override
Return the Molar Enthalpy. Units: J/kmol.
double logStandardConc(size_t k=0) const override
Natural logarithm of the standard concentration of the kth species.
void getPartialMolarEnthalpies(double *hbar) const override
Returns an array of partial molar enthalpies for the species in the mixture.
void getChemPotentials(double *mu) const override
Get the species chemical potentials. Units: J/kmol.
double m_site_density
Site Density of the lattice solid.
double pressure() const override
Pressure. Units: Pa.
vector< double > m_g0_RT
Temporary storage for the reference state Gibbs energies.
void getSpeciesParameters(const string &name, AnyMap &speciesNode) const override
Get phase-specific parameters of a Species object such that an identical one could be reconstructed a...
void getEntropy_R(double *sr) const override
Get the array of nondimensional Entropy functions for the species standard states at the current T an...
vector< double > m_h0_RT
Reference state enthalpies / RT.
void getGibbs_ref(double *g) const override
Returns the vector of the Gibbs function of the reference state at the current temperature of the sol...
double m_Pref
Reference state pressure.
void getStandardChemPotentials(double *mu) const override
Get the array of chemical potentials at unit activity for the species at their standard states at the...
void getCp_R(double *cpr) const override
Get the nondimensional Heat Capacities at constant pressure for the species standard states at the cu...
void getParameters(AnyMap &phaseNode) const override
Store the parameters of a ThermoPhase object such that an identical one could be reconstructed using ...
void initThermo() override
Initialize the ThermoPhase object after all species have been set up.
void getActivityConcentrations(double *c) const override
This method returns an array of generalized concentrations.
void setPressure(double p) override
Set the internally stored pressure (Pa) at constant temperature and composition.
const vector< double > & gibbs_RT_ref() const
Returns a reference to the dimensionless reference state Gibbs free energy vector.
void getPartialMolarVolumes(double *vbar) const override
Return an array of partial molar volumes for the species in the mixture.
double cv_mole() const override
Molar heat capacity at constant volume of the solution.
void getPureGibbs(double *gpure) const override
Get the Gibbs functions for the standard state of the species at the current T and P of the solution.
void getEnthalpy_RT(double *hrt) const override
Get the nondimensional Enthalpy functions for the species standard states at their standard states at...
vector< double > m_s0_R
Temporary storage for the reference state entropies at the current temperature.
void getGibbs_RT(double *grt) const override
Get the nondimensional Gibbs functions for the species standard states at the current T and P of the ...
double entropy_mole() const override
Molar entropy of the solution. Units: J/kmol/K.
void setSiteDensity(double sitedens)
Set the density of lattice sites [kmol/m^3].
vector< double > m_speciesMolarVolume
Vector of molar volumes for each species in the solution.
void getStandardVolumes(double *vol) const override
Get the molar volumes of the species standard states at the current T and P of the solution.
double cp_mole() const override
Molar heat capacity at constant pressure of the solution.
Units standardConcentrationUnits() const override
Returns the units of the "standard concentration" for this phase.
void getPartialMolarCp(double *cpbar) const override
Returns an array of partial molar Heat Capacities at constant pressure of the species in the solution...
void compositionChanged() override
Apply changes to the state which are needed after the composition changes.
double gibbs_mole() const override
Molar Gibbs function of the solution. Units: J/kmol.
double standardConcentration(size_t k=0) const override
Return the standard concentration for the kth species.
vector< double > m_cp0_R
Temporary storage for the reference state heat capacities.
double calcDensity()
Calculate the density of the mixture using the partial molar volumes and mole fractions as input.
bool addSpecies(shared_ptr< Species > spec) override
Add a Species to this Phase.
void _updateThermo() const
Update the species reference state thermodynamic functions.
void getGibbs_RT_ref(double *grt) const override
Returns the vector of nondimensional Gibbs Free Energies of the reference state at the current temper...
void getActivityCoefficients(double *ac) const override
Get the array of non-dimensional activity coefficients at the current solution temperature,...
LatticePhase(const string &inputFile="", const string &id="")
Full constructor for a lattice phase.
void getPartialMolarEntropies(double *sbar) const override
Returns an array of partial molar entropies of the species in the solution.
const vector< double > & cp_R_ref() const
Returns a reference to the dimensionless reference state Heat Capacity vector.
double m_Pcurrent
The current pressure.
virtual void update(double T, double *cp_R, double *h_RT, double *s_R) const
Compute the reference-state properties for all species.
virtual double molarDensity() const
Molar density (kmol/m^3).
Definition Phase.cpp:576
void assignDensity(const double density_)
Set the internally stored constant density (kg/m^3) of the phase.
Definition Phase.cpp:597
size_t m_kk
Number of species in the phase.
Definition Phase.h:855
double temperature() const
Temperature (K).
Definition Phase.h:563
double meanMolecularWeight() const
The mean molecular weight. Units: (kg/kmol)
Definition Phase.h:656
void getMoleFractions(double *const x) const
Get the species mole fraction vector.
Definition Phase.cpp:434
double sum_xlogx() const
Evaluate .
Definition Phase.cpp:626
size_t speciesIndex(const string &name) const
Returns the index of a species named 'name' within the Phase object.
Definition Phase.cpp:129
double moleFraction(size_t k) const
Return the mole fraction of a single species.
Definition Phase.cpp:439
virtual void compositionChanged()
Apply changes to the state which are needed after the composition changes.
Definition Phase.cpp:923
double mean_X(const double *const Q) const
Evaluate the mole-fraction-weighted mean of an array Q.
Definition Phase.cpp:616
double molecularWeight(size_t k) const
Molecular weight of species k.
Definition Phase.cpp:383
shared_ptr< Species > species(const string &name) const
Return the Species object for the named species.
Definition Phase.cpp:874
string name() const
Return the name of the phase.
Definition Phase.cpp:20
virtual void getParameters(AnyMap &phaseNode) const
Store the parameters of a ThermoPhase object such that an identical one could be reconstructed using ...
double RT() const
Return the Gas Constant multiplied by the current temperature.
double m_tlast
last value of the temperature processed by reference state
void initThermoFile(const string &inputFile, const string &id)
Initialize a ThermoPhase object using an input file.
virtual void getSpeciesParameters(const string &name, AnyMap &speciesNode) const
Get phase-specific parameters of a Species object such that an identical one could be reconstructed a...
MultiSpeciesThermo m_spthermo
Pointer to the calculation manager for species reference-state thermodynamic properties.
virtual double refPressure() const
Returns the reference pressure in Pa.
bool addSpecies(shared_ptr< Species > spec) override
Add a Species to this Phase.
AnyMap m_input
Data supplied via setParameters.
const AnyMap & input() const
Access input data associated with the phase description.
A representation of the units associated with a dimensional quantity.
Definition Units.h:35
void scale(InputIter begin, InputIter end, OutputIter out, S scale_factor)
Multiply elements of an array by a scale factor.
Definition utilities.h:104
const double GasConstant
Universal Gas Constant [J/kmol/K].
Definition ct_defs.h:120
Namespace for the Cantera kernel.
Definition AnyMap.cpp:595
const double SmallNumber
smallest number to compare to zero.
Definition ct_defs.h:158
Contains declarations for string manipulation functions within Cantera.
Various templated functions that carry out common vector and polynomial operations (see Templated Arr...