27double X_o_cutoff_default = 0.20;
28double gamma_o_min_default = 0.00001;
29double gamma_k_min_default = 10.0;
30double slopefCut_default = 0.6;
31double slopegCut_default = 0.0;
32double cCut_default = .05;
39 const std::string& id_) :
43 IMS_X_o_cutoff_(X_o_cutoff_default),
44 IMS_gamma_o_min_(gamma_o_min_default),
45 IMS_gamma_k_min_(gamma_k_min_default),
46 IMS_slopefCut_(slopefCut_default),
47 IMS_slopegCut_(slopegCut_default),
48 IMS_cCut_(cCut_default),
65 IMS_X_o_cutoff_(X_o_cutoff_default),
66 IMS_gamma_o_min_(gamma_o_min_default),
67 IMS_gamma_k_min_(gamma_k_min_default),
68 IMS_slopefCut_(slopefCut_default),
69 IMS_slopegCut_(slopegCut_default),
70 IMS_cCut_(cCut_default),
140 return Units(1.0, 0, -
static_cast<double>(
nDim()), 0, 0, 0, 1);
149 for (
size_t k = 0; k <
m_kk; k++) {
154 for (
size_t k = 0; k <
m_kk; k++) {
171 throw CanteraError(
"IdealMolalSoln::standardConcentration",
172 "m_formGC is set to an incorrect value. \
173 Allowed values are 0, 1, and 2");
185 for (
size_t k = 0; k <
m_kk; k++) {
192 ac[0] = exp((xmolSolvent - 1.0)/xmolSolvent);
198 for (
size_t k = 1; k <
m_kk; k++) {
209 for (
size_t k = 0; k <
m_kk; k++) {
216 acMolality[0] = exp((xmolSolvent - 1.0)/xmolSolvent) / xmolSolvent;
220 for (
size_t k = 0; k <
m_kk; k++) {
221 acMolality[k] = exp(acMolality[k]);
243 for (
size_t k = 1; k <
m_kk; k++) {
245 mu[k] +=
RT() * log(xx);
251 mu[0] += (
RT() * (xmolSolvent - 1.0) / xx);
257 for (
size_t k = 1; k <
m_kk; k++) {
269 for (
size_t k = 0; k <
m_kk; k++) {
279 for (
size_t k = 1; k <
m_kk; k++) {
284 sbar[0] -= (
GasConstant * (xmolSolvent - 1.0) / xmolSolvent);
293 for (
size_t k = 1; k <
m_kk; k++) {
313 for (
size_t k = 0; k <
m_kk; k++) {
335 if (id_.size() > 0 && phaseNode.
id() != id_) {
337 "phasenode and Id are incompatible");
341 if (!phaseNode.
hasChild(
"thermo")) {
343 "no thermo XML node");
348 if (thermoNode.
hasChild(
"standardConc")) {
353 if (thermoNode.
hasChild(
"activityCoefficients")) {
355 std::string modelString = acNode.
attrib(
"model");
356 if (modelString !=
"IdealMolalSoln") {
358 "unknown ActivityCoefficient model: " + modelString);
360 if (acNode.
hasChild(
"idealMolalSolnCutoff")) {
362 modelString = ccNode.
attrib(
"model");
363 if (modelString !=
"") {
365 if (ccNode.
hasChild(
"gamma_o_limit")) {
368 if (ccNode.
hasChild(
"gamma_k_limit")) {
371 if (ccNode.
hasChild(
"X_o_cutoff")) {
375 IMS_cCut_ =
getFloat(ccNode,
"c_0_param");
377 if (ccNode.
hasChild(
"slope_f_limit")) {
380 if (ccNode.
hasChild(
"slope_g_limit")) {
403 IMS_cCut_ = cutoff.getDouble(
"c_0", cCut_default);
408 for (
size_t k = 0; k <
nSpecies(); k++) {
423 phaseNode[
"standard-concentration-basis"] =
"unity";
425 phaseNode[
"standard-concentration-basis"] =
"species-molar-volume";
430 cutoff[
"model"] =
"poly";
432 cutoff[
"model"] =
"polyexp";
444 if (IMS_cCut_ != cCut_default) {
445 cutoff[
"c_0"] = IMS_cCut_;
455 phaseNode[
"cutoff"] = std::move(cutoff);
470 throw CanteraError(
"IdealMolalSoln::setStandardConcentrationModel",
471 "Unknown standard concentration model '{}'", model);
485 "Unknown cutoff model '{}'", model);
501 for (
size_t k = 1; k <
m_kk; k++) {
508 for (
size_t k = 1; k <
m_kk; k++) {
515 for (
size_t k = 1; k <
m_kk; k++) {
523 double xminus2 = xminus * xminus;
524 double xminus3 = xminus2 * xminus;
528 double h2 = 3.5 * xminus2 /
IMS_X_o_cutoff_ - 2.0 * xminus3 / x_o_cut2;
529 double h2_prime = 7.0 * xminus /
IMS_X_o_cutoff_ - 6.0 * xminus2 / x_o_cut2;
531 double h1 = (1.0 - 3.0 * xminus2 / x_o_cut2 + 2.0 * xminus3/ x_o_cut3);
532 double h1_prime = (- 6.0 * xminus / x_o_cut2 + 6.0 * xminus2/ x_o_cut3);
538 double h1_f = h1 * alpha;
539 double h1_f_prime = h1_prime * alpha;
541 double f = h2 + h1_f;
542 double f_prime = h2_prime + h1_f_prime;
544 double g = h2 + h1_g;
545 double g_prime = h2_prime + h1_g_prime;
547 double tmp = (xmolSolvent/ g * g_prime + (1.0-xmolSolvent) / f * f_prime);
548 double lngammak = -1.0 - log(f) + tmp * xmolSolvent;
549 double lngammao =-log(g) - tmp * (1.0-xmolSolvent);
551 tmp = log(xmolSolvent) + lngammak;
552 for (
size_t k = 1; k <
m_kk; k++) {
560 for (
size_t k = 1; k <
m_kk; k++) {
566 double xoverc = xmolSolvent/IMS_cCut_;
567 double eterm = std::exp(-xoverc);
569 double fptmp = IMS_bfCut_ - IMS_afCut_ / IMS_cCut_ - IMS_bfCut_*xoverc
570 + 2.0*IMS_dfCut_*xmolSolvent - IMS_dfCut_*xmolSolvent*xoverc;
571 double f_prime = 1.0 + eterm*fptmp;
572 double f = xmolSolvent + IMS_efCut_ + eterm * (IMS_afCut_ + xmolSolvent * (IMS_bfCut_ + IMS_dfCut_*xmolSolvent));
574 double gptmp = IMS_bgCut_ - IMS_agCut_ / IMS_cCut_ - IMS_bgCut_*xoverc
575 + 2.0*IMS_dgCut_*xmolSolvent - IMS_dgCut_*xmolSolvent*xoverc;
576 double g_prime = 1.0 + eterm*gptmp;
577 double g = xmolSolvent + IMS_egCut_ + eterm * (IMS_agCut_ + xmolSolvent * (IMS_bgCut_ + IMS_dgCut_*xmolSolvent));
579 double tmp = (xmolSolvent / g * g_prime + (1.0 - xmolSolvent) / f * f_prime);
580 double lngammak = -1.0 - log(f) + tmp * xmolSolvent;
581 double lngammao =-log(g) - tmp * (1.0-xmolSolvent);
583 tmp = log(xx) + lngammak;
584 for (
size_t k = 1; k <
m_kk; k++) {
596 bool converged =
false;
597 for (
int its = 0; its < 100 && !converged; its++) {
598 double oldV = IMS_efCut_;
601 IMS_dfCut_ = ((- IMS_afCut_/IMS_cCut_ + IMS_bfCut_ - IMS_bfCut_*
IMS_X_o_cutoff_/IMS_cCut_)
606 IMS_efCut_ = - eterm * (tmp);
607 if (fabs(IMS_efCut_ - oldV) < 1.0E-14) {
613 "failed to converge on the f polynomial");
616 double f_0 = IMS_afCut_ + IMS_efCut_;
617 double f_prime_0 = 1.0 - IMS_afCut_ / IMS_cCut_ + IMS_bfCut_;
619 for (
int its = 0; its < 100 && !converged; its++) {
620 double oldV = IMS_egCut_;
622 IMS_agCut_ = exp(lng_0) - IMS_egCut_;
624 IMS_dgCut_ = ((- IMS_agCut_/IMS_cCut_ + IMS_bgCut_ - IMS_bgCut_*
IMS_X_o_cutoff_/IMS_cCut_)
629 IMS_egCut_ = - eterm * (tmp);
630 if (fabs(IMS_egCut_ - oldV) < 1.0E-14) {
636 "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 std::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.
IdealMolalSoln(const std::string &inputFile="", const std::string &id="")
Constructor for phase initialization.
void setCutoffModel(const std::string &model)
Set cutoff model. Must be one of 'none', 'poly', or 'polyExp'.
virtual bool addSpecies(shared_ptr< Species > spec)
virtual void getParameters(AnyMap &phaseNode) const
Store the parameters of a ThermoPhase object such that an identical one could be reconstructed using ...
doublereal IMS_slopegCut_
Parameter in the polyExp cutoff treatment.
int IMS_typeCutoff_
Cutoff type.
virtual doublereal cp_mole() const
Molar heat capacity of the solution at constant pressure. Units: J/kmol/K.
virtual void getMolalityActivityCoefficients(doublereal *acMolality) const
virtual void getPartialMolarEnthalpies(doublereal *hbar) const
Returns an array of partial molar enthalpies for the species in the mixture.
virtual void getPartialMolarEntropies(doublereal *sbar) const
Returns an array of partial molar entropies of the species in the solution.
doublereal IMS_slopefCut_
Parameter in the polyExp cutoff treatment.
virtual doublereal enthalpy_mole() const
Molar enthalpy of the solution. Units: J/kmol.
doublereal IMS_X_o_cutoff_
value of the solute mole fraction that centers the cutoff polynomials for the cutoff =1 process;
virtual void getPartialMolarVolumes(doublereal *vbar) const
virtual void getActivityConcentrations(doublereal *c) const
This method returns an array of generalized concentrations.
virtual doublereal thermalExpansionCoeff() const
The thermal expansion coefficient. Units: 1/K.
virtual void getPartialMolarCp(doublereal *cpbar) const
Partial molar heat capacity of the solution:. UnitsL J/kmol/K.
vector_fp m_speciesMolarVolume
Species molar volume .
virtual doublereal entropy_mole() const
Molar entropy of the solution. Units: J/kmol/K.
virtual void initThermo()
doublereal IMS_gamma_o_min_
gamma_o value 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 = 'molar_volume',...
virtual doublereal gibbs_mole() const
Molar Gibbs function for the solution: Units J/kmol.
vector_fp IMS_lnActCoeffMolal_
Logarithm of the molal activity coefficients.
virtual Units standardConcentrationUnits() const
Returns the units of the "standard concentration" for this phase.
doublereal IMS_gamma_k_min_
gamma_k minimum for the cutoff process at the zero solvent point
void setStandardConcentrationModel(const std::string &model)
Set the standard concentration model.
virtual void getChemPotentials(doublereal *mu) const
Get the species chemical potentials: Units: J/kmol.
virtual void initThermoXML(XML_Node &phaseNode, const std::string &id="")
Import and initialize a ThermoPhase object using an XML tree.
void s_updateIMS_lnMolalityActCoeff() const
This function will be called to update the internally stored natural logarithm of the molality activi...
virtual void getActivities(doublereal *ac) const
vector_fp m_tmpV
vector of size m_kk, used as a temporary holding area.
virtual doublereal intEnergy_mole() const
Molar internal energy of the solution: Units: J/kmol.
void calcDensity()
Calculate the density of the mixture using the partial molar volumes and mole fractions as input.
virtual doublereal isothermalCompressibility() const
The isothermal compressibility. Units: 1/Pa.
virtual doublereal standardConcentration(size_t k=0) const
Return the standard concentration for the kth species.
virtual bool addSpecies(shared_ptr< Species > spec)
void setMoleFSolventMin(doublereal xmolSolventMIN)
Sets the minimum mole fraction in the molality formulation.
virtual void initThermo()
doublereal m_xmolSolventMIN
void calcMolalities() const
Calculates the molality of all species and stores the result internally.
vector_fp m_molalities
Current value of the molalities of the species in the phase.
virtual doublereal 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.
doublereal mean_X(const doublereal *const Q) const
Evaluate the mole-fraction-weighted mean of an array Q.
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)
doublereal meanMolecularWeight() const
The mean molecular weight. Units: (kg/kmol)
double moleFraction(size_t k) const
Return the mole fraction of a single species.
doublereal RT() const
Return the Gas Constant multiplied by the current temperature.
void initThermoFile(const std::string &inputFile, const std::string &id)
virtual void initThermoXML(XML_Node &phaseNode, const std::string &id)
Import and initialize a ThermoPhase object using an XML tree.
AnyMap m_input
Data supplied via setParameters.
virtual void getParameters(int &n, doublereal *const c) const
Get the equation of state parameters in a vector.
A representation of the units associated with a dimensional quantity.
virtual void _updateStandardStateThermo() const
Updates the standard state thermodynamic functions at the current T and P of the solution.
virtual void getStandardVolumes(doublereal *vol) const
Get the molar volumes of the species standard states at the current T and P of the solution.
virtual void getCp_R(doublereal *cpr) const
Get the nondimensional Heat Capacities at constant pressure for the species standard states at the cu...
virtual void getEntropy_R(doublereal *sr) const
Get the array of nondimensional Entropy functions for the standard state species at the current T and...
virtual void getStandardChemPotentials(doublereal *mu) const
Get the array of chemical potentials at unit activity for the species at their standard states at the...
virtual void getEnthalpy_RT(doublereal *hrt) const
Get the nondimensional Enthalpy functions for the species at their standard states at the current T a...
Class XML_Node is a tree-based representation of the contents of an XML file.
std::string attrib(const std::string &attr) const
Function returns the value of an attribute.
bool hasChild(const std::string &ch) const
Tests whether the current node has a child node with a particular name.
std::string id() const
Return the id attribute, if present.
XML_Node & child(const size_t n) const
Return a changeable reference to the n'th child of the current node.
CTML ("Cantera Markup Language") is the variant of XML that Cantera uses to store data.
void importPhase(XML_Node &phase, ThermoPhase *th)
Import a phase information into an empty ThermoPhase object.
Namespace for the Cantera kernel.
doublereal getFloat(const XML_Node &parent, const std::string &name, const std::string &type="")
Get a floating-point value from a child element.
bool caseInsensitiveEquals(const std::string &input, const std::string &test)
Case insensitive equality predicate.
const double SmallNumber
smallest number to compare to zero.
const double GasConstant
Universal Gas Constant [J/kmol/K].
Contains declarations for string manipulation functions within Cantera.