26 double X_o_cutoff_default = 0.20;
27 double gamma_o_min_default = 0.00001;
28 double gamma_k_min_default = 10.0;
29 double slopefCut_default = 0.6;
30 double slopegCut_default = 0.0;
31 double cCut_default = .05;
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)
105 return Units(1.0, 0, -
static_cast<double>(
nDim()), 0, 0, 0, 1);
114 for (
size_t k = 0; k <
m_kk; k++) {
119 for (
size_t k = 0; k <
m_kk; k++) {
136 throw CanteraError(
"IdealMolalSoln::standardConcentration",
137 "m_formGC is set to an incorrect value. \
138 Allowed values are 0, 1, and 2");
150 for (
size_t k = 0; k <
m_kk; k++) {
157 ac[0] = exp((xmolSolvent - 1.0)/xmolSolvent);
163 for (
size_t k = 1; k <
m_kk; k++) {
174 for (
size_t k = 0; k <
m_kk; k++) {
181 acMolality[0] = exp((xmolSolvent - 1.0)/xmolSolvent) / xmolSolvent;
185 for (
size_t k = 0; k <
m_kk; k++) {
186 acMolality[k] = exp(acMolality[k]);
208 for (
size_t k = 1; k <
m_kk; k++) {
210 mu[k] +=
RT() * log(xx);
216 mu[0] += (
RT() * (xmolSolvent - 1.0) / xx);
222 for (
size_t k = 1; k <
m_kk; k++) {
234 for (
size_t k = 0; k <
m_kk; k++) {
242 for (
size_t k = 0; k <
m_kk; k++) {
252 for (
size_t k = 1; k <
m_kk; k++) {
257 sbar[0] -= (
GasConstant * (xmolSolvent - 1.0) / xmolSolvent);
266 for (
size_t k = 1; k <
m_kk; k++) {
286 for (
size_t k = 0; k <
m_kk; k++) {
317 IMS_cCut_ = cutoff.getDouble(
"c_0", cCut_default);
322 for (
size_t k = 0; k <
nSpecies(); k++) {
337 phaseNode[
"standard-concentration-basis"] =
"unity";
339 phaseNode[
"standard-concentration-basis"] =
"species-molar-volume";
344 cutoff[
"model"] =
"poly";
346 cutoff[
"model"] =
"polyexp";
358 if (IMS_cCut_ != cCut_default) {
359 cutoff[
"c_0"] = IMS_cCut_;
369 phaseNode[
"cutoff"] = std::move(cutoff);
384 throw CanteraError(
"IdealMolalSoln::setStandardConcentrationModel",
385 "Unknown standard concentration model '{}'", model);
399 "Unknown cutoff model '{}'", model);
415 for (
size_t k = 1; k <
m_kk; k++) {
422 for (
size_t k = 1; k <
m_kk; k++) {
429 for (
size_t k = 1; k <
m_kk; k++) {
437 double xminus2 = xminus * xminus;
438 double xminus3 = xminus2 * xminus;
442 double h2 = 3.5 * xminus2 /
IMS_X_o_cutoff_ - 2.0 * xminus3 / x_o_cut2;
443 double h2_prime = 7.0 * xminus /
IMS_X_o_cutoff_ - 6.0 * xminus2 / x_o_cut2;
445 double h1 = (1.0 - 3.0 * xminus2 / x_o_cut2 + 2.0 * xminus3/ x_o_cut3);
446 double h1_prime = (- 6.0 * xminus / x_o_cut2 + 6.0 * xminus2/ x_o_cut3);
452 double h1_f = h1 * alpha;
453 double h1_f_prime = h1_prime * alpha;
455 double f = h2 + h1_f;
456 double f_prime = h2_prime + h1_f_prime;
458 double g = h2 + h1_g;
459 double g_prime = h2_prime + h1_g_prime;
461 double tmp = (xmolSolvent/ g * g_prime + (1.0-xmolSolvent) / f * f_prime);
462 double lngammak = -1.0 - log(f) + tmp * xmolSolvent;
463 double lngammao =-log(g) - tmp * (1.0-xmolSolvent);
465 tmp = log(xmolSolvent) + lngammak;
466 for (
size_t k = 1; k <
m_kk; k++) {
474 for (
size_t k = 1; k <
m_kk; k++) {
480 double xoverc = xmolSolvent/IMS_cCut_;
481 double eterm = std::exp(-xoverc);
483 double fptmp = IMS_bfCut_ - IMS_afCut_ / IMS_cCut_ - IMS_bfCut_*xoverc
484 + 2.0*IMS_dfCut_*xmolSolvent - IMS_dfCut_*xmolSolvent*xoverc;
485 double f_prime = 1.0 + eterm*fptmp;
486 double f = xmolSolvent + IMS_efCut_ + eterm * (IMS_afCut_ + xmolSolvent * (IMS_bfCut_ + IMS_dfCut_*xmolSolvent));
488 double gptmp = IMS_bgCut_ - IMS_agCut_ / IMS_cCut_ - IMS_bgCut_*xoverc
489 + 2.0*IMS_dgCut_*xmolSolvent - IMS_dgCut_*xmolSolvent*xoverc;
490 double g_prime = 1.0 + eterm*gptmp;
491 double g = xmolSolvent + IMS_egCut_ + eterm * (IMS_agCut_ + xmolSolvent * (IMS_bgCut_ + IMS_dgCut_*xmolSolvent));
493 double tmp = (xmolSolvent / g * g_prime + (1.0 - xmolSolvent) / f * f_prime);
494 double lngammak = -1.0 - log(f) + tmp * xmolSolvent;
495 double lngammao =-log(g) - tmp * (1.0-xmolSolvent);
497 tmp = log(xx) + lngammak;
498 for (
size_t k = 1; k <
m_kk; k++) {
510 bool converged =
false;
511 for (
int its = 0; its < 100 && !converged; its++) {
512 double oldV = IMS_efCut_;
515 IMS_dfCut_ = ((- IMS_afCut_/IMS_cCut_ + IMS_bfCut_ - IMS_bfCut_*
IMS_X_o_cutoff_/IMS_cCut_)
520 IMS_efCut_ = - eterm * (tmp);
521 if (fabs(IMS_efCut_ - oldV) < 1.0E-14) {
527 "failed to converge on the f polynomial");
530 double f_0 = IMS_afCut_ + IMS_efCut_;
531 double f_prime_0 = 1.0 - IMS_afCut_ / IMS_cCut_ + IMS_bfCut_;
533 for (
int its = 0; its < 100 && !converged; its++) {
534 double oldV = IMS_egCut_;
536 IMS_agCut_ = exp(lng_0) - IMS_egCut_;
538 IMS_dgCut_ = ((- IMS_agCut_/IMS_cCut_ + IMS_bgCut_ - IMS_bgCut_*
IMS_X_o_cutoff_/IMS_cCut_)
543 IMS_egCut_ = - eterm * (tmp);
544 if (fabs(IMS_egCut_ - oldV) < 1.0E-14) {
550 "failed to converge on the g polynomial");
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.
size_t size() const
Returns the number of elements in this map.
bool hasKey(const string &key) const
Returns true if the map contains an item named key.
Base class for exceptions thrown by Cantera classes.
void calcIMSCutoffParams_()
Calculate parameters for cutoff treatments of activity coefficients.
double enthalpy_mole() const override
Molar enthalpy of the solution. Units: J/kmol.
double thermalExpansionCoeff() const override
The thermal expansion coefficient. Units: 1/K.
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 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
int IMS_typeCutoff_
Cutoff type.
IdealMolalSoln(const string &inputFile="", const string &id="")
Constructor for phase initialization.
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.
vector< double > m_tmpV
vector of size m_kk, used as a temporary holding area.
void getActivityConcentrations(double *c) const override
This method returns an array of generalized concentrations.
void getPartialMolarVolumes(double *vbar) const override
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.
double entropy_mole() const override
Molar entropy of the solution. Units: J/kmol/K.
void calcDensity() override
Calculate the density of the mixture using the partial molar volumes and mole fractions as input.
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 cp_mole() const override
Molar heat capacity of the solution at constant pressure. Units: J/kmol/K.
void getActivities(double *ac) const override
Get the array of non-dimensional activities at the current solution temperature, pressure,...
double IMS_X_o_cutoff_
value of the solute mole fraction that centers the cutoff polynomials for the cutoff =1 process;
Units standardConcentrationUnits() const override
Returns the units of the "standard concentration" for this phase.
void getPartialMolarCp(double *cpbar) const override
Partial molar heat capacity of the solution:. UnitsL J/kmol/K.
double gibbs_mole() const override
Molar Gibbs function for the solution: Units J/kmol.
double standardConcentration(size_t k=0) const override
Return the standard concentration for the kth species.
void getPartialMolarIntEnergies(double *hbar) const override
Returns an array of partial molar internal energies for the species in the mixture.
void s_updateIMS_lnMolalityActCoeff() const
This function will be called to update the internally stored natural logarithm of the molality activi...
void getMolalityActivityCoefficients(double *acMolality) const override
Get the array of non-dimensional molality-based activity coefficients at the current solution tempera...
void getPartialMolarEntropies(double *sbar) const override
Returns an array of partial molar entropies of the species in the solution.
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.
virtual double molarVolume() const
Return the molar volume at standard state.
void assignDensity(const double density_)
Set the internally stored constant density (kg/m^3) of the phase.
size_t nSpecies() const
Returns the number of species in the phase.
size_t m_kk
Number of species in the phase.
size_t nDim() const
Returns the number of spatial dimensions (1, 2, or 3)
double meanMolecularWeight() const
The mean molecular weight. Units: (kg/kmol)
double moleFraction(size_t k) const
Return the mole fraction of a single species.
double mean_X(const double *const Q) const
Evaluate the mole-fraction-weighted mean of an array Q.
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.
virtual bool addSpecies(shared_ptr< Species > spec)
Add a Species to this Phase.
void getEntropy_R(double *sr) const override
Get the array of nondimensional Entropy functions for the standard state species at the current T and...
virtual void _updateStandardStateThermo() const
Updates the standard state thermodynamic functions at the current T and P of the solution.
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 getEnthalpy_RT(double *hrt) const override
Get the nondimensional Enthalpy functions for the species at their standard states at the current T a...
void getStandardVolumes(double *vol) const override
Get the molar volumes of the species standard states at the current T and P 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...
bool caseInsensitiveEquals(const string &input, const string &test)
Case insensitive equality predicate.
const double GasConstant
Universal Gas Constant [J/kmol/K].
Namespace for the Cantera kernel.
const double SmallNumber
smallest number to compare to zero.
Contains declarations for string manipulation functions within Cantera.