Cantera  3.1.0
Loading...
Searching...
No Matches
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{
39 return GasConstant * mean_X(cp_R_ref());
40}
41
43{
44 return cp_mole();
45}
46
48{
51}
52
54{
55 m_Pcurrent = p;
57}
58
60{
63}
64
66{
67 return Units(1.0);
68}
69
71{
73}
74
76{
77 for (size_t k = 0; k < m_kk; k++) {
78 ac[k] = 1.0;
79 }
80}
81
83{
84 return 1.0;
85}
86
87double LatticePhase::logStandardConc(size_t k) const
88{
89 return 0.0;
90}
91
92void LatticePhase::getChemPotentials(double* mu) const
93{
94 double delta_p = m_Pcurrent - m_Pref;
95 const vector<double>& g_RT = gibbs_RT_ref();
96 for (size_t k = 0; k < m_kk; k++) {
97 double xx = std::max(SmallNumber, moleFraction(k));
98 mu[k] = RT() * (g_RT[k] + log(xx))
99 + delta_p * m_speciesMolarVolume[k];
100 }
101}
102
104{
105 const vector<double>& _h = enthalpy_RT_ref();
106 scale(_h.begin(), _h.end(), hbar, RT());
107}
108
110{
111 const vector<double>& _s = entropy_R_ref();
112 for (size_t k = 0; k < m_kk; k++) {
113 double xx = std::max(SmallNumber, moleFraction(k));
114 sbar[k] = GasConstant * (_s[k] - log(xx));
115 }
116}
117
118void LatticePhase::getPartialMolarCp(double* cpbar) const
119{
120 getCp_R(cpbar);
121 for (size_t k = 0; k < m_kk; k++) {
122 cpbar[k] *= GasConstant;
123 }
124}
125
127{
128 getStandardVolumes(vbar);
129}
130
132{
133 const vector<double>& gibbsrt = gibbs_RT_ref();
134 scale(gibbsrt.begin(), gibbsrt.end(), mu0, RT());
135}
136
137void LatticePhase::getPureGibbs(double* gpure) const
138{
139 const vector<double>& gibbsrt = gibbs_RT_ref();
140 double delta_p = (m_Pcurrent - m_Pref);
141 for (size_t k = 0; k < m_kk; k++) {
142 gpure[k] = RT() * gibbsrt[k] + delta_p * m_speciesMolarVolume[k];
143 }
144}
145
146void LatticePhase::getEnthalpy_RT(double* hrt) const
147{
148 const vector<double>& _h = enthalpy_RT_ref();
149 double delta_prt = (m_Pcurrent - m_Pref) / RT();
150 for (size_t k = 0; k < m_kk; k++) {
151 hrt[k] = _h[k] + delta_prt * m_speciesMolarVolume[k];
152 }
153}
154
155void LatticePhase::getEntropy_R(double* sr) const
156{
157 const vector<double>& _s = entropy_R_ref();
158 std::copy(_s.begin(), _s.end(), sr);
159}
160
161void LatticePhase::getGibbs_RT(double* grt) const
162{
163 const vector<double>& gibbsrt = gibbs_RT_ref();
164 double delta_prt = (m_Pcurrent - m_Pref) / RT();
165 for (size_t k = 0; k < m_kk; k++) {
166 grt[k] = gibbsrt[k] + delta_prt * m_speciesMolarVolume[k];
167 }
168}
169
170void LatticePhase::getGibbs_ref(double* g) const
171{
173 for (size_t k = 0; k < m_kk; k++) {
174 g[k] *= RT();
175 }
176}
177
178void LatticePhase::getCp_R(double* cpr) const
179{
180 const vector<double>& _cpr = cp_R_ref();
181 std::copy(_cpr.begin(), _cpr.end(), cpr);
182}
183
184void LatticePhase::getStandardVolumes(double* vbar) const
185{
186 copy(m_speciesMolarVolume.begin(), m_speciesMolarVolume.end(), vbar);
187}
188
189const vector<double>& LatticePhase::enthalpy_RT_ref() const
190{
192 return m_h0_RT;
193}
194
195const vector<double>& LatticePhase::gibbs_RT_ref() const
196{
198 return m_g0_RT;
199}
200
201void LatticePhase::getGibbs_RT_ref(double* grt) const
202{
204 for (size_t k = 0; k < m_kk; k++) {
205 grt[k] = m_g0_RT[k];
206 }
207}
208
209const vector<double>& LatticePhase::entropy_R_ref() const
210{
212 return m_s0_R;
213}
214
215const vector<double>& LatticePhase::cp_R_ref() const
216{
218 return m_cp0_R;
219}
220
221bool LatticePhase::addSpecies(shared_ptr<Species> spec)
222{
223 bool added = ThermoPhase::addSpecies(spec);
224 if (added) {
225 if (m_kk == 1) {
227 }
228 m_h0_RT.push_back(0.0);
229 m_g0_RT.push_back(0.0);
230 m_cp0_R.push_back(0.0);
231 m_s0_R.push_back(0.0);
232 double mv = 1.0 / m_site_density;
233 if (spec->input.hasKey("equation-of-state")) {
234 auto& eos = spec->input["equation-of-state"].getMapWhere(
235 "model", "constant-volume");
236 if (eos.hasKey("density")) {
237 mv = molecularWeight(m_kk-1) / eos.convert("density", "kg/m^3");
238 } else if (eos.hasKey("molar-density")) {
239 mv = 1.0 / eos.convert("molar-density", "kmol/m^3");
240 } else if (eos.hasKey("molar-volume")) {
241 mv = eos.convert("molar-volume", "m^3/kmol");
242 }
243 }
244 m_speciesMolarVolume.push_back(mv);
245 }
246 return added;
247}
248
249void LatticePhase::setSiteDensity(double sitedens)
250{
251 m_site_density = sitedens;
252 for (size_t k = 0; k < m_kk; k++) {
253 if (species(k)->input.hasKey("equation-of-state")) {
254 auto& eos = species(k)->input["equation-of-state"].getMapWhere(
255 "model", "constant-volume");
256 if (eos.hasKey("molar-volume") || eos.hasKey("density")
257 || eos.hasKey("molar-density")) {
258 continue;
259 }
260 }
262 }
263}
264
266{
267 double tnow = temperature();
268 if (m_tlast != tnow) {
269 m_spthermo.update(tnow, &m_cp0_R[0], &m_h0_RT[0], &m_s0_R[0]);
270 m_tlast = tnow;
271 for (size_t k = 0; k < m_kk; k++) {
272 m_g0_RT[k] = m_h0_RT[k] - m_s0_R[k];
273 }
274 m_tlast = tnow;
275 }
276}
277
279{
280 if (m_input.hasKey("site-density")) {
281 setSiteDensity(m_input.convert("site-density", "kmol/m^3"));
282 }
283}
284
286{
288 phaseNode["site-density"].setQuantity(m_site_density, "kmol/m^3");
289}
290
291void LatticePhase::getSpeciesParameters(const string& name, AnyMap& speciesNode) const
292{
294 size_t k = speciesIndex(name);
295 // Output volume information in a form consistent with the input
296 const auto S = species(k);
297 if (S->input.hasKey("equation-of-state")) {
298 auto& eosIn = S->input["equation-of-state"].getMapWhere(
299 "model", "constant-volume");
300 auto& eosOut = speciesNode["equation-of-state"].getMapWhere(
301 "model", "constant-volume", true);
302
303 if (eosIn.hasKey("density")) {
304 eosOut["model"] = "constant-volume";
305 eosOut["density"].setQuantity(
306 molecularWeight(k) / m_speciesMolarVolume[k], "kg/m^3");
307 } else if (eosIn.hasKey("molar-density")) {
308 eosOut["model"] = "constant-volume";
309 eosOut["molar-density"].setQuantity(1.0 / m_speciesMolarVolume[k],
310 "kmol/m^3");
311 } else if (eosIn.hasKey("molar-volume")) {
312 eosOut["model"] = "constant-volume";
313 eosOut["molar-volume"].setQuantity(m_speciesMolarVolume[k],
314 "m^3/kmol");
315 }
316 }
317 // Otherwise, species volume is determined by the phase-level site density
318}
319
320}
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:431
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 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:854
double temperature() const
Temperature (K).
Definition Phase.h:562
double meanMolecularWeight() const
The mean molecular weight. Units: (kg/kmol)
Definition Phase.h:655
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:922
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:873
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...