Cantera  3.0.0
Loading...
Searching...
No Matches
IdealSolidSolnPhase.cpp
Go to the documentation of this file.
1/**
2 * @file IdealSolidSolnPhase.cpp Implementation file for an ideal solid
3 * solution model with incompressible thermodynamics (see @ref
4 * thermoprops and @link Cantera::IdealSolidSolnPhase
5 * IdealSolidSolnPhase@endlink).
6 */
7
8// This file is part of Cantera. See License.txt in the top-level directory or
9// at https://cantera.org/license.txt for license and copyright information.
10
16
17namespace Cantera
18{
19
20IdealSolidSolnPhase::IdealSolidSolnPhase(const string& inputFile, const string& id_)
21{
22 initThermoFile(inputFile, id_);
23}
24
25// Molar Thermodynamic Properties of the Solution
26
28{
29 double htp = RT() * mean_X(enthalpy_RT_ref());
30 return htp + (pressure() - m_Pref)/molarDensity();
31}
32
34{
35 return GasConstant * (mean_X(entropy_R_ref()) - sum_xlogx());
36}
37
39{
40 double Pv = (pressure() - m_Pref)/molarDensity();
41 return RT() * (mean_X(gibbs_RT_ref()) + sum_xlogx()) + Pv;
42}
43
45{
46 return GasConstant * mean_X(cp_R_ref());
47}
48
49// Mechanical Equation of State
50
52{
53 // Calculate the molarVolume of the solution (m**3 kmol-1)
54 double v_mol = mean_X(m_speciesMolarVolume);
55
56 // Set the density in the parent object directly, by calling the
57 // Phase::assignDensity() function.
59}
60
62{
63 m_Pcurrent = p;
65}
66
68{
71}
72
73// Chemical Potentials and Activities
74
76{
77 if (m_formGC == 0) {
78 return Units(1.0); // dimensionless
79 } else {
80 // kmol/m^3 for bulk phases
81 return Units(1.0, 0, -static_cast<double>(nDim()), 0, 0, 0, 1);
82 }
83}
84
86{
88 switch (m_formGC) {
89 case 0:
90 break;
91 case 1:
92 for (size_t k = 0; k < m_kk; k++) {
93 c[k] /= m_speciesMolarVolume[k];
94 }
95 break;
96 case 2:
97 for (size_t k = 0; k < m_kk; k++) {
98 c[k] /= m_speciesMolarVolume[m_kk-1];
99 }
100 break;
101 }
102}
103
105{
106 switch (m_formGC) {
107 case 0:
108 return 1.0;
109 case 1:
110 return 1.0 / m_speciesMolarVolume[k];
111 case 2:
112 return 1.0/m_speciesMolarVolume[m_kk-1];
113 }
114 return 0.0;
115}
116
118{
119 for (size_t k = 0; k < m_kk; k++) {
120 ac[k] = 1.0;
121 }
122}
123
125{
126 double delta_p = m_Pcurrent - m_Pref;
127 const vector<double>& g_RT = gibbs_RT_ref();
128 for (size_t k = 0; k < m_kk; k++) {
129 double xx = std::max(SmallNumber, moleFraction(k));
130 mu[k] = RT() * (g_RT[k] + log(xx))
131 + delta_p * m_speciesMolarVolume[k];
132 }
133}
134
136{
137 warn_deprecated("IdealSolidSolnPhase::getChemPotentials_RT",
138 "To be removed after Cantera 3.0. Use getChemPotentials instead.");
139 double delta_pdRT = (m_Pcurrent - m_Pref) / (temperature() * GasConstant);
140 const vector<double>& g_RT = gibbs_RT_ref();
141 for (size_t k = 0; k < m_kk; k++) {
142 double xx = std::max(SmallNumber, moleFraction(k));
143 mu[k] = (g_RT[k] + log(xx))
144 + delta_pdRT * m_speciesMolarVolume[k];
145 }
146}
147
148// Partial Molar Properties
149
151{
152 const vector<double>& _h = enthalpy_RT_ref();
153 double delta_p = m_Pcurrent - m_Pref;
154 for (size_t k = 0; k < m_kk; k++) {
155 hbar[k] = _h[k]*RT() + delta_p * m_speciesMolarVolume[k];
156 }
157 // scale(_h.begin(), _h.end(), hbar, RT());
158}
159
161{
162 const vector<double>& _s = entropy_R_ref();
163 for (size_t k = 0; k < m_kk; k++) {
164 double xx = std::max(SmallNumber, moleFraction(k));
165 sbar[k] = GasConstant * (_s[k] - log(xx));
166 }
167}
168
170{
171 getCp_R(cpbar);
172 for (size_t k = 0; k < m_kk; k++) {
173 cpbar[k] *= GasConstant;
174 }
175}
176
178{
179 getStandardVolumes(vbar);
180}
181
182// Properties of the Standard State of the Species in the Solution
183
184void IdealSolidSolnPhase::getPureGibbs(double* gpure) const
185{
186 const vector<double>& gibbsrt = gibbs_RT_ref();
187 double delta_p = (m_Pcurrent - m_Pref);
188 for (size_t k = 0; k < m_kk; k++) {
189 gpure[k] = RT() * gibbsrt[k] + delta_p * m_speciesMolarVolume[k];
190 }
191}
192
193void IdealSolidSolnPhase::getGibbs_RT(double* grt) const
194{
195 const vector<double>& gibbsrt = gibbs_RT_ref();
196 double delta_prt = (m_Pcurrent - m_Pref)/ RT();
197 for (size_t k = 0; k < m_kk; k++) {
198 grt[k] = gibbsrt[k] + delta_prt * m_speciesMolarVolume[k];
199 }
200}
201
203{
204 const vector<double>& _h = enthalpy_RT_ref();
205 double delta_prt = (m_Pcurrent - m_Pref) / RT();
206 for (size_t k = 0; k < m_kk; k++) {
207 hrt[k] = _h[k] + delta_prt * m_speciesMolarVolume[k];
208 }
209}
210
212{
213 const vector<double>& _s = entropy_R_ref();
214 copy(_s.begin(), _s.end(), sr);
215}
216
218{
219 const vector<double>& _h = enthalpy_RT_ref();
220 double prefrt = m_Pref / RT();
221 for (size_t k = 0; k < m_kk; k++) {
222 urt[k] = _h[k] - prefrt * m_speciesMolarVolume[k];
223 }
224}
225
226void IdealSolidSolnPhase::getCp_R(double* cpr) const
227{
228 const vector<double>& _cpr = cp_R_ref();
229 copy(_cpr.begin(), _cpr.end(), cpr);
230}
231
233{
234 copy(m_speciesMolarVolume.begin(), m_speciesMolarVolume.end(), vol);
235}
236
237// Thermodynamic Values for the Species Reference States
238
240{
242 for (size_t k = 0; k != m_kk; k++) {
243 hrt[k] = m_h0_RT[k];
244 }
245}
246
248{
250 for (size_t k = 0; k != m_kk; k++) {
251 grt[k] = m_g0_RT[k];
252 }
253}
254
256{
258 double tmp = RT();
259 for (size_t k = 0; k != m_kk; k++) {
260 g[k] = tmp * m_g0_RT[k];
261 }
262}
263
265{
266 const vector<double>& _h = enthalpy_RT_ref();
267 double prefrt = m_Pref / RT();
268 for (size_t k = 0; k < m_kk; k++) {
269 urt[k] = _h[k] - prefrt * m_speciesMolarVolume[k];
270 }
271}
272
274{
276 for (size_t k = 0; k != m_kk; k++) {
277 er[k] = m_s0_R[k];
278 }
279}
280
281void IdealSolidSolnPhase::getCp_R_ref(double* cpr) const
282{
284 for (size_t k = 0; k != m_kk; k++) {
285 cpr[k] = m_cp0_R[k];
286 }
287}
288
289const vector<double>& IdealSolidSolnPhase::enthalpy_RT_ref() const
290{
292 return m_h0_RT;
293}
294
295const vector<double>& IdealSolidSolnPhase::entropy_R_ref() const
296{
298 return m_s0_R;
299}
300
301// Utility Functions
302
303bool IdealSolidSolnPhase::addSpecies(shared_ptr<Species> spec)
304{
305 bool added = ThermoPhase::addSpecies(spec);
306 if (added) {
307 if (m_kk == 1) {
308 // Obtain the reference pressure by calling the ThermoPhase function
309 // refPressure, which in turn calls the species thermo reference
310 // pressure function of the same name.
312 }
313
314 m_h0_RT.push_back(0.0);
315 m_g0_RT.push_back(0.0);
316 m_expg0_RT.push_back(0.0);
317 m_cp0_R.push_back(0.0);
318 m_s0_R.push_back(0.0);
319 m_pp.push_back(0.0);
320 if (spec->input.hasKey("equation-of-state")) {
321 auto& eos = spec->input["equation-of-state"].getMapWhere("model", "constant-volume");
322 double mv;
323 if (eos.hasKey("density")) {
324 mv = molecularWeight(m_kk-1) / eos.convert("density", "kg/m^3");
325 } else if (eos.hasKey("molar-density")) {
326 mv = 1.0 / eos.convert("molar-density", "kmol/m^3");
327 } else if (eos.hasKey("molar-volume")) {
328 mv = eos.convert("molar-volume", "m^3/kmol");
329 } else {
330 throw CanteraError("IdealSolidSolnPhase::addSpecies",
331 "equation-of-state entry for species '{}' is missing "
332 "'density', 'molar-volume', or 'molar-density' "
333 "specification", spec->name);
334 }
335 m_speciesMolarVolume.push_back(mv);
336 } else {
337 throw CanteraError("IdealSolidSolnPhase::addSpecies",
338 "Molar volume not specified for species '{}'", spec->name);
339 }
340 if (ready()) {
341 calcDensity();
342 }
343 }
344 return added;
345}
346
348{
349 if (m_input.hasKey("standard-concentration-basis")) {
350 setStandardConcentrationModel(m_input["standard-concentration-basis"].asString());
351 }
353}
354
356{
358 if (m_formGC == 1) {
359 phaseNode["standard-concentration-basis"] = "species-molar-volume";
360 } else if (m_formGC == 2) {
361 phaseNode["standard-concentration-basis"] = "solvent-molar-volume";
362 }
363}
364
366 AnyMap& speciesNode) const
367{
369 size_t k = speciesIndex(name);
370 const auto S = species(k);
371 auto& eosNode = speciesNode["equation-of-state"].getMapWhere(
372 "model", "constant-volume", true);
373 // Output volume information in a form consistent with the input
374 if (S->input.hasKey("equation-of-state")) {
375 auto& eosIn = S->input["equation-of-state"];
376 if (eosIn.hasKey("density")) {
377 eosNode["density"].setQuantity(
378 molecularWeight(k) / m_speciesMolarVolume[k], "kg/m^3");
379 } else if (eosIn.hasKey("molar-density")) {
380 eosNode["molar-density"].setQuantity(1.0 / m_speciesMolarVolume[k],
381 "kmol/m^3");
382 } else {
383 eosNode["molar-volume"].setQuantity(m_speciesMolarVolume[k],
384 "m^3/kmol");
385 }
386 } else {
387 eosNode["molar-volume"].setQuantity(m_speciesMolarVolume[k],
388 "m^3/kmol");
389 }
390}
391
393{
394 const vector<double>& grt = gibbs_RT_ref();
395
396 // Within the method, we protect against inf results if the exponent is too
397 // high.
398 //
399 // If it is too low, we set the partial pressure to zero. This capability is
400 // needed by the elemental potential method.
401 double pres = 0.0;
402 double m_p0 = refPressure();
403 for (size_t k = 0; k < m_kk; k++) {
404 double tmp = -grt[k] + mu_RT[k];
405 if (tmp < -600.) {
406 m_pp[k] = 0.0;
407 } else if (tmp > 500.0) {
408 // Protect against inf results if the exponent is too high
409 double tmp2 = tmp / 500.;
410 tmp2 *= tmp2;
411 m_pp[k] = m_p0 * exp(500.) * tmp2;
412 } else {
413 m_pp[k] = m_p0 * exp(tmp);
414 }
415 pres += m_pp[k];
416 }
417 // set state
418 setMoleFractions(m_pp.data());
419 setPressure(pres);
420}
421
423{
424 if (caseInsensitiveEquals(model, "unity")) {
425 m_formGC = 0;
426 } else if (caseInsensitiveEquals(model, "species-molar-volume")
427 || caseInsensitiveEquals(model, "molar_volume")) {
428 m_formGC = 1;
429 } else if (caseInsensitiveEquals(model, "solvent-molar-volume")
430 || caseInsensitiveEquals(model, "solvent_volume")) {
431 m_formGC = 2;
432 } else {
433 throw CanteraError("IdealSolidSolnPhase::setStandardConcentrationModel",
434 "Unknown standard concentration model '{}'", model);
435 }
436}
437
439{
440 return m_speciesMolarVolume[k];
441}
442
444{
445 copy(m_speciesMolarVolume.begin(), m_speciesMolarVolume.end(), smv);
446}
447
449{
450 double tnow = temperature();
451 if (m_tlast != tnow) {
452
453 // Update the thermodynamic functions of the reference state.
454 m_spthermo.update(tnow, m_cp0_R.data(), m_h0_RT.data(), m_s0_R.data());
455 m_tlast = tnow;
456 for (size_t k = 0; k < m_kk; k++) {
457 m_g0_RT[k] = m_h0_RT[k] - m_s0_R[k];
458 }
459 m_tlast = tnow;
460 }
461}
462
463} // end namespace Cantera
Header file for an ideal solid solution model with incompressible thermodynamics (see Thermodynamic P...
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:427
bool hasKey(const string &key) const
Returns true if the map contains an item named key.
Definition AnyMap.cpp:1423
Base class for exceptions thrown by Cantera classes.
const vector< double > & entropy_R_ref() const
Returns a reference to the vector of nondimensional enthalpies of the reference state at the current ...
double enthalpy_mole() const override
Molar enthalpy of the solution.
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.
double pressure() const override
Pressure.
vector< double > m_g0_RT
Vector containing the species reference Gibbs functions at T = m_tlast.
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 nondimensional Entropies for the species standard states at the current T and P of the soluti...
vector< double > m_h0_RT
Vector containing the species reference enthalpies at T = m_tlast.
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 speciesMolarVolume(int k) const
Report the molar volume of species k.
vector< double > m_pp
Temporary array used in equilibrium calculations.
double m_Pref
Value of the reference pressure for all species in this phase.
void getCp_R(double *cpr) const override
Get the nondimensional heat capacity at constant pressure function for the species standard states at...
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 the array of generalized concentrations.
void getSpeciesMolarVolumes(double *smv) const
Fill in a return vector containing the species molar volumes.
void setPressure(double p) override
Set the pressure at constant temperature.
const vector< double > & gibbs_RT_ref() const
Returns a reference to the vector of nondimensional enthalpies of the reference state at the current ...
void getPartialMolarVolumes(double *vbar) const override
returns an array of partial molar volumes of the species in the solution.
void getPureGibbs(double *gpure) const override
Get the Gibbs functions for the pure species at the current T and P of the solution.
double standardConcentration(size_t k) const override
The standard concentration used to normalize the generalized concentration.
void setStandardConcentrationModel(const string &model)
Set the form for the standard and generalized concentrations.
void getIntEnergy_RT_ref(double *urt) const override
Returns the vector of nondimensional internal Energies of the reference state at the current temperat...
void getEnthalpy_RT(double *hrt) const override
Get the array of nondimensional Enthalpy functions for the standard state species at the current T an...
void getEntropy_R_ref(double *er) const override
Returns the vector of nondimensional entropies of the reference state at the current temperature of t...
vector< double > m_s0_R
Vector containing the species reference entropies at T = m_tlast.
void getGibbs_RT(double *grt) const override
Get the nondimensional Gibbs function for the species standard states at the current T and P of the s...
double entropy_mole() const override
Molar entropy of the solution.
int m_formGC
The standard concentrations can have one of three different forms: 0 = 'unity', 1 = 'species-molar-vo...
vector< double > m_speciesMolarVolume
Vector of molar volumes for each species in the solution.
void getCp_R_ref(double *cprt) const override
Returns the vector of nondimensional constant pressure heat capacities of the reference state at the ...
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.
void getIntEnergy_RT(double *urt) const override
Returns the vector of nondimensional Internal Energies of the standard state species at the current T...
Units standardConcentrationUnits() const override
Returns the units of the "standard concentration" for this phase.
IdealSolidSolnPhase(const string &infile="", const string &id="")
Construct and initialize an IdealSolidSolnPhase ThermoPhase object directly from an input file.
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 free energy of the solution.
vector< double > m_cp0_R
Vector containing the species reference constant pressure heat capacities at T = m_tlast.
bool addSpecies(shared_ptr< Species > spec) override
Add a Species to this Phase.
virtual void _updateThermo() const
This function gets called for every call to functions in this class.
void setToEquilState(const double *mu_RT) override
This method is used by the ChemEquil equilibrium solver.
void getChemPotentials_RT(double *mu) const override
Get the array of non-dimensional species solution chemical potentials at the current T and P .
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 species activity coefficients.
vector< double > m_expg0_RT
Vector containing the species reference exp(-G/RT) functions at T = m_tlast.
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 vector of nondimensional enthalpies of the reference state at the current ...
double m_Pcurrent
m_Pcurrent = The current pressure Since the density isn't a function of pressure, but only of the mol...
void getEnthalpy_RT_ref(double *hrt) const override
Returns the vector of nondimensional enthalpies of the reference state at the current temperature of ...
virtual void calcDensity()
Calculate the density of the mixture using the partial molar volumes and mole fractions as input.
const vector< double > & enthalpy_RT_ref() const
Returns a reference to the vector of nondimensional enthalpies of the reference state at the current ...
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:689
void assignDensity(const double density_)
Set the internally stored constant density (kg/m^3) of the phase.
Definition Phase.cpp:718
virtual void setMoleFractions(const double *const x)
Set the mole fractions to the specified values.
Definition Phase.cpp:304
size_t m_kk
Number of species in the phase.
Definition Phase.h:947
size_t nDim() const
Returns the number of spatial dimensions (1, 2, or 3)
Definition Phase.h:646
double temperature() const
Temperature (K).
Definition Phase.h:662
double meanMolecularWeight() const
The mean molecular weight. Units: (kg/kmol)
Definition Phase.h:760
void getMoleFractions(double *const x) const
Get the species mole fraction vector.
Definition Phase.cpp:540
double sum_xlogx() const
Evaluate .
Definition Phase.cpp:747
size_t speciesIndex(const string &name) const
Returns the index of a species named 'name' within the Phase object.
Definition Phase.cpp:138
double moleFraction(size_t k) const
Return the mole fraction of a single species.
Definition Phase.cpp:545
virtual void compositionChanged()
Apply changes to the state which are needed after the composition changes.
Definition Phase.cpp:1026
double mean_X(const double *const Q) const
Evaluate the mole-fraction-weighted mean of an array Q.
Definition Phase.cpp:737
virtual bool ready() const
Returns a bool indicating whether the object is ready for use.
Definition Phase.cpp:1006
double molecularWeight(size_t k) const
Molecular weight of species k.
Definition Phase.cpp:482
shared_ptr< Species > species(const string &name) const
Return the Species object for the named species.
Definition Phase.cpp:977
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
virtual void initThermo()
Initialize the ThermoPhase object after all species have been set up.
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.
A representation of the units associated with a dimensional quantity.
Definition Units.h:35
bool caseInsensitiveEquals(const string &input, const string &test)
Case insensitive equality predicate.
const double GasConstant
Universal Gas Constant [J/kmol/K].
Definition ct_defs.h:120
Namespace for the Cantera kernel.
Definition AnyMap.cpp:564
const double SmallNumber
smallest number to compare to zero.
Definition ct_defs.h:158
void warn_deprecated(const string &source, const AnyBase &node, const string &message)
A deprecation warning for syntax in an input file.
Definition AnyMap.cpp:1926
Contains declarations for string manipulation functions within Cantera.
Various templated functions that carry out common vector and polynomial operations (see Templated Arr...