Cantera  4.0.0a1
Loading...
Searching...
No Matches
IdealMolalSoln.cpp
Go to the documentation of this file.
1/**
2 * @file IdealMolalSoln.cpp
3 * ThermoPhase object for the ideal molal equation of
4 * state (see @ref thermoprops
5 * and class @link Cantera::IdealMolalSoln IdealMolalSoln@endlink).
6 *
7 * Definition file for a derived class of ThermoPhase that handles variable
8 * pressure standard state methods for calculating thermodynamic properties that
9 * are further based upon activities on the molality scale. The Ideal molal
10 * solution assumes that all molality-based activity coefficients are equal to
11 * one. This turns out, actually, to be highly nonlinear when the solvent
12 * densities get low.
13 */
14
15// This file is part of Cantera. See License.txt in the top-level directory or
16// at https://cantera.org/license.txt for license and copyright information.
17
20#include "cantera/thermo/PDSS.h"
22
23#include <iostream>
24
25namespace {
26double X_o_cutoff_default = 0.20;
27double gamma_o_min_default = 0.00001;
28double gamma_k_min_default = 10.0;
29double slopefCut_default = 0.6;
30double slopegCut_default = 0.0;
31double cCut_default = .05;
32}
33
34namespace Cantera
35{
36
37IdealMolalSoln::IdealMolalSoln(const string& inputFile, const string& id_) :
38 IMS_X_o_cutoff_(X_o_cutoff_default),
39 IMS_gamma_o_min_(gamma_o_min_default),
40 IMS_gamma_k_min_(gamma_k_min_default),
41 IMS_slopefCut_(slopefCut_default),
42 IMS_slopegCut_(slopegCut_default),
43 IMS_cCut_(cCut_default)
44{
45 initThermoFile(inputFile, id_);
46}
47
49{
51 return mean_X(m_workS);
52}
53
54// ------- Mechanical Equation of State Properties ------------------------
55
57{
58 return 0.0;
59}
60
62{
63 return 0.0;
64}
65
66// ------- Activities and Activity Concentrations
67
69{
70 if (m_formGC == 0) {
71 return Units(1.0); // dimensionless
72 } else {
73 // kmol/m^3 for bulk phases
74 return Units(1.0, 0, -static_cast<double>(nDim()), 0, 0, 0, 1);
75 }
76}
77
79{
80 if (m_formGC != 1) {
81 double c_solvent = standardConcentration();
83 for (size_t k = 0; k < m_kk; k++) {
84 c[k] *= c_solvent;
85 }
86 } else {
88 for (size_t k = 0; k < m_kk; k++) {
89 double c0 = standardConcentration(k);
90 c[k] *= c0;
91 }
92 }
93}
94
96{
97 switch (m_formGC) {
98 case 0:
99 return 1.0;
100 case 1:
101 return 1.0 / m_speciesMolarVolume[k];
102 case 2:
103 return 1.0 / m_speciesMolarVolume[0];
104 default:
105 throw CanteraError("IdealMolalSoln::standardConcentration",
106 "m_formGC is set to an incorrect value. \
107 Allowed values are 0, 1, and 2");
108 }
109}
110
111void IdealMolalSoln::getActivities(span<double> ac) const
112{
113 checkArraySize("IdealMolalSoln::getActivities", ac.size(), m_kk);
115
116 // Update the molality array, m_molalities(). This requires an update due to
117 // mole fractions
118 if (IMS_typeCutoff_ == 0) {
120 for (size_t k = 0; k < m_kk; k++) {
121 ac[k] = m_molalities[k];
122 }
123 double xmolSolvent = moleFraction(0);
124 // Limit the activity coefficient to be finite as the solvent mole
125 // fraction goes to zero.
126 xmolSolvent = std::max(m_xmolSolventMIN, xmolSolvent);
127 ac[0] = exp((xmolSolvent - 1.0)/xmolSolvent);
128 } else {
129
131
132 // Now calculate the array of activities.
133 for (size_t k = 1; k < m_kk; k++) {
134 ac[k] = m_molalities[k] * exp(IMS_lnActCoeffMolal_[k]);
135 }
136 double xmolSolvent = moleFraction(0);
137 ac[0] = exp(IMS_lnActCoeffMolal_[0]) * xmolSolvent;
138 }
139}
140
141void IdealMolalSoln::getMolalityActivityCoefficients(span<double> acMolality) const
142{
143 checkArraySize("IdealMolalSoln::getMolalityActivityCoefficients",
144 acMolality.size(), m_kk);
145 if (IMS_typeCutoff_ == 0) {
146 for (size_t k = 0; k < m_kk; k++) {
147 acMolality[k] = 1.0;
148 }
149 double xmolSolvent = moleFraction(0);
150 // Limit the activity coefficient to be finite as the solvent mole
151 // fraction goes to zero.
152 xmolSolvent = std::max(m_xmolSolventMIN, xmolSolvent);
153 acMolality[0] = exp((xmolSolvent - 1.0)/xmolSolvent) / xmolSolvent;
154 } else {
156 std::copy(IMS_lnActCoeffMolal_.begin(), IMS_lnActCoeffMolal_.end(), acMolality.begin());
157 for (size_t k = 0; k < m_kk; k++) {
158 acMolality[k] = exp(acMolality[k]);
159 }
160 }
161}
162
163// ------ Partial Molar Properties of the Solution -----------------
164
165void IdealMolalSoln::getChemPotentials(span<double> mu) const
166{
167 // First get the standard chemical potentials. This requires updates of
168 // standard state as a function of T and P These are defined at unit
169 // molality.
171
172 // Update the molality array, m_molalities(). This requires an update due to
173 // mole fractions
175
176 // get the solvent mole fraction
177 double xmolSolvent = moleFraction(0);
178
179 if (IMS_typeCutoff_ == 0 || xmolSolvent > 3.* IMS_X_o_cutoff_/2.0) {
180 for (size_t k = 1; k < m_kk; k++) {
181 double xx = std::max(m_molalities[k], SmallNumber);
182 mu[k] += RT() * log(xx);
183 }
184
185 // Do the solvent
186 // -> see my notes
187 double xx = std::max(xmolSolvent, SmallNumber);
188 mu[0] += (RT() * (xmolSolvent - 1.0) / xx);
189 } else {
190 // Update the activity coefficients. This also updates the internal
191 // molality array.
193
194 for (size_t k = 1; k < m_kk; k++) {
195 double xx = std::max(m_molalities[k], SmallNumber);
196 mu[k] += RT() * (log(xx) + IMS_lnActCoeffMolal_[k]);
197 }
198 double xx = std::max(xmolSolvent, SmallNumber);
199 mu[0] += RT() * (log(xx) + IMS_lnActCoeffMolal_[0]);
200 }
201}
202
203void IdealMolalSoln::getPartialMolarEnthalpies(span<double> hbar) const
204{
205 getEnthalpy_RT(hbar);
206 for (size_t k = 0; k < m_kk; k++) {
207 hbar[k] *= RT();
208 }
209}
210
212{
213 getIntEnergy_RT(ubar);
214 for (size_t k = 0; k < m_kk; k++) {
215 ubar[k] *= RT();
216 }
217}
218
219void IdealMolalSoln::getPartialMolarEntropies(span<double> sbar) const
220{
221 getEntropy_R(sbar);
223 if (IMS_typeCutoff_ == 0) {
224 for (size_t k = 1; k < m_kk; k++) {
225 double mm = std::max(SmallNumber, m_molalities[k]);
226 sbar[k] -= GasConstant * log(mm);
227 }
228 double xmolSolvent = moleFraction(0);
229 sbar[0] -= (GasConstant * (xmolSolvent - 1.0) / xmolSolvent);
230 } else {
231 // Update the activity coefficients, This also update the internally
232 // stored molalities.
234
235 // First we will add in the obvious dependence on the T term out front
236 // of the log activity term
237 double mm;
238 for (size_t k = 1; k < m_kk; k++) {
239 mm = std::max(SmallNumber, m_molalities[k]);
240 sbar[k] -= GasConstant * (log(mm) + IMS_lnActCoeffMolal_[k]);
241 }
242 double xmolSolvent = moleFraction(0);
243 mm = std::max(SmallNumber, xmolSolvent);
244 sbar[0] -= GasConstant *(log(mm) + IMS_lnActCoeffMolal_[0]);
245 }
246}
247
248void IdealMolalSoln::getPartialMolarVolumes(span<double> vbar) const
249{
250 getStandardVolumes(vbar);
251}
252
253void IdealMolalSoln::getPartialMolarCp(span<double> cpbar) const
254{
255 // Get the nondimensional Gibbs standard state of the species at the T and P
256 // of the solution.
257 getCp_R(cpbar);
258 for (size_t k = 0; k < m_kk; k++) {
259 cpbar[k] *= GasConstant;
260 }
261}
262
263// -------------- Utilities -------------------------------
264
265bool IdealMolalSoln::addSpecies(shared_ptr<Species> spec)
266{
267 bool added = MolalityVPSSTP::addSpecies(spec);
268 if (added) {
269 m_speciesMolarVolume.push_back(0.0);
270 IMS_lnActCoeffMolal_.push_back(0.0);
271 }
272 return added;
273}
274
276{
278
279 if (m_input.hasKey("standard-concentration-basis")) {
280 setStandardConcentrationModel(m_input["standard-concentration-basis"].asString());
281 }
282 if (m_input.hasKey("cutoff")) {
283 auto& cutoff = m_input["cutoff"].as<AnyMap>();
284 setCutoffModel(cutoff.getString("model", "none"));
285 IMS_gamma_o_min_ = cutoff.getDouble("gamma_o", gamma_o_min_default);
286 IMS_gamma_k_min_ = cutoff.getDouble("gamma_k", gamma_k_min_default);
287 IMS_X_o_cutoff_ = cutoff.getDouble("X_o", X_o_cutoff_default);
288 IMS_cCut_ = cutoff.getDouble("c_0", cCut_default);
289 IMS_slopefCut_ = cutoff.getDouble("slope_f", slopefCut_default);
290 IMS_slopegCut_ = cutoff.getDouble("slope_g", slopegCut_default);
291 }
292
293 for (size_t k = 0; k < nSpecies(); k++) {
294 m_speciesMolarVolume[k] = providePDSS(k)->molarVolume();
295 }
296 if (IMS_typeCutoff_ == 2) {
298 }
299 setMoleFSolventMin(1.0E-5);
300}
301
303{
305
306 // "solvent-molar-volume" (m_formGC == 2) is the default, and can be omitted
307 if (m_formGC == 0) {
308 phaseNode["standard-concentration-basis"] = "unity";
309 } else if (m_formGC == 1) {
310 phaseNode["standard-concentration-basis"] = "species-molar-volume";
311 }
312
313 AnyMap cutoff;
314 if (IMS_typeCutoff_ == 1) {
315 cutoff["model"] = "poly";
316 } else if (IMS_typeCutoff_ == 2) {
317 cutoff["model"] = "polyexp";
318 }
319
320 if (IMS_gamma_o_min_ != gamma_o_min_default) {
321 cutoff["gamma_o"] = IMS_gamma_o_min_;
322 }
323 if (IMS_gamma_k_min_ != gamma_k_min_default) {
324 cutoff["gamma_k"] = IMS_gamma_k_min_;
325 }
326 if (IMS_X_o_cutoff_ != X_o_cutoff_default) {
327 cutoff["X_o"] = IMS_X_o_cutoff_;
328 }
329 if (IMS_cCut_ != cCut_default) {
330 cutoff["c_0"] = IMS_cCut_;
331 }
332 if (IMS_slopefCut_ != slopefCut_default) {
333 cutoff["slope_f"] = IMS_slopefCut_;
334 }
335 if (IMS_slopegCut_ != slopegCut_default) {
336 cutoff["slope_g"] = IMS_slopegCut_;
337 }
338
339 if (cutoff.size()) {
340 phaseNode["cutoff"] = std::move(cutoff);
341 }
342}
343
345{
346 if (caseInsensitiveEquals(model, "unity")) {
347 m_formGC = 0;
348 } else if (caseInsensitiveEquals(model, "species-molar-volume")
349 || caseInsensitiveEquals(model, "molar_volume")) {
350 m_formGC = 1;
351 } else if (caseInsensitiveEquals(model, "solvent-molar-volume")
352 || caseInsensitiveEquals(model, "solvent_volume")) {
353 m_formGC = 2;
354 } else {
355 throw CanteraError("IdealMolalSoln::setStandardConcentrationModel",
356 "Unknown standard concentration model '{}'", model);
357 }
358}
359
360void IdealMolalSoln::setCutoffModel(const string& model)
361{
362 if (caseInsensitiveEquals(model, "none")) {
363 IMS_typeCutoff_ = 0;
364 } else if (caseInsensitiveEquals(model, "poly")) {
365 IMS_typeCutoff_ = 1;
366 } else if (caseInsensitiveEquals(model, "polyexp")) {
367 IMS_typeCutoff_ = 2;
368 } else {
369 throw CanteraError("IdealMolalSoln::setCutoffModel",
370 "Unknown cutoff model '{}'", model);
371 }
372}
373
374// ------------ Private and Restricted Functions ------------------
375
377{
378 // Calculate the molalities. Currently, the molalities may not be current
379 // with respect to the contents of the State objects' data.
381
382 double xmolSolvent = moleFraction(0);
383 double xx = std::max(m_xmolSolventMIN, xmolSolvent);
384
385 if (IMS_typeCutoff_ == 0) {
386 for (size_t k = 1; k < m_kk; k++) {
387 IMS_lnActCoeffMolal_[k]= 0.0;
388 }
389 IMS_lnActCoeffMolal_[0] = - log(xx) + (xx - 1.0)/xx;
390 return;
391 } else if (IMS_typeCutoff_ == 1) {
392 if (xmolSolvent > 3.0 * IMS_X_o_cutoff_/2.0) {
393 for (size_t k = 1; k < m_kk; k++) {
394 IMS_lnActCoeffMolal_[k]= 0.0;
395 }
396 IMS_lnActCoeffMolal_[0] = - log(xx) + (xx - 1.0)/xx;
397 return;
398 } else if (xmolSolvent < IMS_X_o_cutoff_/2.0) {
399 double tmp = log(xx * IMS_gamma_k_min_);
400 for (size_t k = 1; k < m_kk; k++) {
401 IMS_lnActCoeffMolal_[k]= tmp;
402 }
404 return;
405 } else {
406 // If we are in the middle region, calculate the connecting polynomials
407 double xminus = xmolSolvent - IMS_X_o_cutoff_/2.0;
408 double xminus2 = xminus * xminus;
409 double xminus3 = xminus2 * xminus;
410 double x_o_cut2 = IMS_X_o_cutoff_ * IMS_X_o_cutoff_;
411 double x_o_cut3 = x_o_cut2 * IMS_X_o_cutoff_;
412
413 double h2 = 3.5 * xminus2 / IMS_X_o_cutoff_ - 2.0 * xminus3 / x_o_cut2;
414 double h2_prime = 7.0 * xminus / IMS_X_o_cutoff_ - 6.0 * xminus2 / x_o_cut2;
415
416 double h1 = (1.0 - 3.0 * xminus2 / x_o_cut2 + 2.0 * xminus3/ x_o_cut3);
417 double h1_prime = (- 6.0 * xminus / x_o_cut2 + 6.0 * xminus2/ x_o_cut3);
418
419 double h1_g = h1 / IMS_gamma_o_min_;
420 double h1_g_prime = h1_prime / IMS_gamma_o_min_;
421
422 double alpha = 1.0 / (exp(1.0) * IMS_gamma_k_min_);
423 double h1_f = h1 * alpha;
424 double h1_f_prime = h1_prime * alpha;
425
426 double f = h2 + h1_f;
427 double f_prime = h2_prime + h1_f_prime;
428
429 double g = h2 + h1_g;
430 double g_prime = h2_prime + h1_g_prime;
431
432 double tmp = (xmolSolvent/ g * g_prime + (1.0-xmolSolvent) / f * f_prime);
433 double lngammak = -1.0 - log(f) + tmp * xmolSolvent;
434 double lngammao =-log(g) - tmp * (1.0-xmolSolvent);
435
436 tmp = log(xmolSolvent) + lngammak;
437 for (size_t k = 1; k < m_kk; k++) {
438 IMS_lnActCoeffMolal_[k]= tmp;
439 }
440 IMS_lnActCoeffMolal_[0] = lngammao;
441 }
442 } else if (IMS_typeCutoff_ == 2) {
443 // Exponentials - trial 2
444 if (xmolSolvent > IMS_X_o_cutoff_) {
445 for (size_t k = 1; k < m_kk; k++) {
446 IMS_lnActCoeffMolal_[k]= 0.0;
447 }
448 IMS_lnActCoeffMolal_[0] = - log(xx) + (xx - 1.0)/xx;
449 return;
450 } else {
451 double xoverc = xmolSolvent/IMS_cCut_;
452 double eterm = std::exp(-xoverc);
453
454 double fptmp = IMS_bfCut_ - IMS_afCut_ / IMS_cCut_ - IMS_bfCut_*xoverc
455 + 2.0*IMS_dfCut_*xmolSolvent - IMS_dfCut_*xmolSolvent*xoverc;
456 double f_prime = 1.0 + eterm*fptmp;
457 double f = xmolSolvent + IMS_efCut_ + eterm * (IMS_afCut_ + xmolSolvent * (IMS_bfCut_ + IMS_dfCut_*xmolSolvent));
458
459 double gptmp = IMS_bgCut_ - IMS_agCut_ / IMS_cCut_ - IMS_bgCut_*xoverc
460 + 2.0*IMS_dgCut_*xmolSolvent - IMS_dgCut_*xmolSolvent*xoverc;
461 double g_prime = 1.0 + eterm*gptmp;
462 double g = xmolSolvent + IMS_egCut_ + eterm * (IMS_agCut_ + xmolSolvent * (IMS_bgCut_ + IMS_dgCut_*xmolSolvent));
463
464 double tmp = (xmolSolvent / g * g_prime + (1.0 - xmolSolvent) / f * f_prime);
465 double lngammak = -1.0 - log(f) + tmp * xmolSolvent;
466 double lngammao =-log(g) - tmp * (1.0-xmolSolvent);
467
468 tmp = log(xx) + lngammak;
469 for (size_t k = 1; k < m_kk; k++) {
470 IMS_lnActCoeffMolal_[k]= tmp;
471 }
472 IMS_lnActCoeffMolal_[0] = lngammao;
473 }
474 }
475}
476
478{
479 IMS_afCut_ = 1.0 / (std::exp(1.0) * IMS_gamma_k_min_);
480 IMS_efCut_ = 0.0;
481 bool converged = false;
482 for (int its = 0; its < 100 && !converged; its++) {
483 double oldV = IMS_efCut_;
484 IMS_afCut_ = 1.0 / (std::exp(1.0) * IMS_gamma_k_min_) - IMS_efCut_;
485 IMS_bfCut_ = IMS_afCut_ / IMS_cCut_ + IMS_slopefCut_ - 1.0;
486 IMS_dfCut_ = ((- IMS_afCut_/IMS_cCut_ + IMS_bfCut_ - IMS_bfCut_*IMS_X_o_cutoff_/IMS_cCut_)
487 /
489 double tmp = IMS_afCut_ + IMS_X_o_cutoff_*(IMS_bfCut_ + IMS_dfCut_ * IMS_X_o_cutoff_);
490 double eterm = std::exp(-IMS_X_o_cutoff_/IMS_cCut_);
491 IMS_efCut_ = - eterm * (tmp);
492 if (fabs(IMS_efCut_ - oldV) < 1.0E-14) {
493 converged = true;
494 }
495 }
496 if (!converged) {
497 throw CanteraError("IdealMolalSoln::calcCutoffParams_",
498 "failed to converge on the f polynomial");
499 }
500 converged = false;
501 double f_0 = IMS_afCut_ + IMS_efCut_;
502 double f_prime_0 = 1.0 - IMS_afCut_ / IMS_cCut_ + IMS_bfCut_;
503 IMS_egCut_ = 0.0;
504 for (int its = 0; its < 100 && !converged; its++) {
505 double oldV = IMS_egCut_;
506 double lng_0 = -log(IMS_gamma_o_min_) - f_prime_0 / f_0;
507 IMS_agCut_ = exp(lng_0) - IMS_egCut_;
508 IMS_bgCut_ = IMS_agCut_ / IMS_cCut_ + IMS_slopegCut_ - 1.0;
509 IMS_dgCut_ = ((- IMS_agCut_/IMS_cCut_ + IMS_bgCut_ - IMS_bgCut_*IMS_X_o_cutoff_/IMS_cCut_)
510 /
512 double tmp = IMS_agCut_ + IMS_X_o_cutoff_*(IMS_bgCut_ + IMS_dgCut_ *IMS_X_o_cutoff_);
513 double eterm = std::exp(-IMS_X_o_cutoff_/IMS_cCut_);
514 IMS_egCut_ = - eterm * (tmp);
515 if (fabs(IMS_egCut_ - oldV) < 1.0E-14) {
516 converged = true;
517 }
518 }
519 if (!converged) {
520 throw CanteraError("IdealMolalSoln::calcCutoffParams_",
521 "failed to converge on the g polynomial");
522 }
523}
524
525}
ThermoPhase object for the ideal molal equation of state (see Thermodynamic Properties and class Idea...
Declarations for the virtual base class PDSS (pressure dependent standard state) which handles calcul...
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
size_t size() const
Returns the number of elements in this map.
Definition AnyMap.cpp:1728
bool hasKey(const string &key) const
Returns true if the map contains an item named key.
Definition AnyMap.cpp:1477
Base class for exceptions thrown by Cantera classes.
void calcIMSCutoffParams_()
Calculate parameters for cutoff treatments of activity coefficients.
void getMolalityActivityCoefficients(span< double > acMolality) const override
Get the array of non-dimensional molality-based activity coefficients at the current solution tempera...
void getPartialMolarIntEnergies(span< double > hbar) const override
Returns an array of partial molar internal energies for the species in the mixture.
double thermalExpansionCoeff() const override
The thermal expansion coefficient. Units: 1/K.
double IMS_slopegCut_
Parameter in the polyExp cutoff treatment.
double IMS_gamma_o_min_
gamma_o value for the cutoff process at the zero solvent point
void getPartialMolarEnthalpies(span< double > hbar) const override
Returns an array of partial molar enthalpies for the species in the mixture.
int IMS_typeCutoff_
Cutoff type.
IdealMolalSoln(const string &inputFile="", const string &id="")
Constructor for phase initialization.
void getPartialMolarCp(span< double > cpbar) const override
Partial molar heat capacity of the solution:. UnitsL J/kmol/K.
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 getActivities(span< double > ac) const override
Get the array of non-dimensional activities at the current solution temperature, pressure,...
vector< double > IMS_lnActCoeffMolal_
Logarithm of the molal activity coefficients.
void setStandardConcentrationModel(const string &model)
Set the standard concentration model.
double IMS_slopefCut_
Parameter in the polyExp cutoff treatment.
double isothermalCompressibility() const override
The isothermal compressibility. Units: 1/Pa.
double intEnergy_mole() const override
Molar internal energy of the solution: Units: J/kmol.
void setCutoffModel(const string &model)
Set cutoff model. Must be one of 'none', 'poly', or 'polyExp'.
double IMS_gamma_k_min_
gamma_k minimum for the cutoff process at the zero solvent point
int m_formGC
The standard concentrations can have one of three different forms: 0 = 'unity', 1 = 'species-molar-vo...
vector< double > m_speciesMolarVolume
Species molar volume .
double IMS_X_o_cutoff_
value of the solute mole fraction that centers the cutoff polynomials for the cutoff =1 process;
void getPartialMolarVolumes(span< double > vbar) const override
For this solution, the partial molar volumes are equal to the constant species molar volumes.
Units standardConcentrationUnits() const override
Returns the units of the "standard concentration" for this phase.
void getPartialMolarEntropies(span< double > sbar) const override
Returns an array of partial molar entropies of the species in the solution.
double standardConcentration(size_t k=0) const override
Return the standard concentration for the kth species.
bool addSpecies(shared_ptr< Species > spec) override
Add a Species to this Phase.
void getChemPotentials(span< double > mu) const override
Get the species chemical potentials: Units: J/kmol.
void getActivityConcentrations(span< double > c) const override
This method returns an array of generalized concentrations.
void s_updateIMS_lnMolalityActCoeff() const
This function will be called to update the internally stored natural logarithm of the molality activi...
void initThermo() override
Initialize the ThermoPhase object after all species have been set up.
double m_xmolSolventMIN
In any molality implementation, it makes sense to have a minimum solvent mole fraction requirement,...
vector< double > m_molalities
Current value of the molalities of the species in the phase.
void setMoleFSolventMin(double xmolSolventMIN)
Sets the minimum mole fraction in the molality formulation.
void calcMolalities() const
Calculates the molality of all species and stores the result internally.
bool addSpecies(shared_ptr< Species > spec) override
Add a Species to this Phase.
virtual double molarVolume() const
Return the molar volume at standard state.
Definition PDSS.cpp:63
vector< double > m_workS
Vector of size m_kk, used as a temporary holding area.
Definition Phase.h:899
size_t nSpecies() const
Returns the number of species in the phase.
Definition Phase.h:246
size_t m_kk
Number of species in the phase.
Definition Phase.h:875
size_t nDim() const
Returns the number of spatial dimensions (1, 2, or 3)
Definition Phase.h:569
double mean_X(span< const double > Q) const
Evaluate the mole-fraction-weighted mean of an array Q.
Definition Phase.cpp:627
double moleFraction(size_t k) const
Return the mole fraction of a single species.
Definition Phase.cpp:447
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.
void initThermoFile(const string &inputFile, const string &id)
Initialize a ThermoPhase object using an input file.
AnyMap m_input
Data supplied via setParameters.
A representation of the units associated with a dimensional quantity.
Definition Units.h:35
void getCp_R(span< double > cpr) const override
Get the nondimensional Heat Capacities at constant pressure for the species standard states at the cu...
void getIntEnergy_RT(span< double > urt) const override
Returns the vector of nondimensional Internal Energies of the standard state species at the current T...
virtual void _updateStandardStateThermo() const
Updates the standard state thermodynamic functions at the current T and P of the solution.
void getStandardChemPotentials(span< double > mu) const override
Get the array of chemical potentials at unit activity for the species at their standard states at the...
void getEnthalpy_RT(span< double > hrt) const override
Get the nondimensional Enthalpy functions for the species at their standard states at the current T a...
void getEntropy_R(span< double > sr) const override
Get the array of nondimensional Entropy functions for the standard state species at the current T and...
void getStandardVolumes(span< double > vol) const override
Get the molar volumes of the species standard states at the current T and P of the solution.
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:123
Namespace for the Cantera kernel.
Definition AnyMap.cpp:595
const double SmallNumber
smallest number to compare to zero.
Definition ct_defs.h:161
void checkArraySize(const char *procedure, size_t available, size_t required)
Wrapper for throwing ArraySizeError.
Contains declarations for string manipulation functions within Cantera.