31 IMS_X_o_cutoff_(0.20),
32 IMS_gamma_o_min_(0.00001),
33 IMS_gamma_k_min_(10.0),
49 const std::string& id_) :
54 IMS_gamma_o_min_(0.00001),
55 IMS_gamma_k_min_(10.0),
76 IMS_gamma_o_min_(0.00001),
77 IMS_gamma_k_min_(10.0),
146 "Density is not an independent variable");
154 "molarDensity/denisty is not an independent variable");
165 for (
size_t k = 0; k <
m_kk; k++) {
170 for (
size_t k = 0; k <
m_kk; k++) {
201 for (
size_t k = 0; k <
m_kk; k++) {
208 ac[0] = exp((xmolSolvent - 1.0)/xmolSolvent);
214 for (
size_t k = 1; k <
m_kk; k++) {
225 for (
size_t k = 0; k <
m_kk; k++) {
232 acMolality[0] = exp((xmolSolvent - 1.0)/xmolSolvent) / xmolSolvent;
236 for (
size_t k = 0; k <
m_kk; k++) {
237 acMolality[k] = exp(acMolality[k]);
259 for (
size_t k = 1; k <
m_kk; k++) {
261 mu[k] +=
RT() * log(xx);
267 mu[0] += (
RT() * (xmolSolvent - 1.0) / xx);
273 for (
size_t k = 1; k <
m_kk; k++) {
285 for (
size_t k = 0; k <
m_kk; k++) {
295 for (
size_t k = 1; k <
m_kk; k++) {
300 sbar[0] -= (
GasConstant * (xmolSolvent - 1.0) / xmolSolvent);
309 for (
size_t k = 1; k <
m_kk; k++) {
329 for (
size_t k = 0; k <
m_kk; k++) {
351 if (id_.size() > 0 && phaseNode.
id() != id_) {
353 "phasenode and Id are incompatible");
357 if (!phaseNode.
hasChild(
"thermo")) {
359 "no thermo XML node");
364 if (thermoNode.
hasChild(
"standardConc")) {
369 if (thermoNode.
hasChild(
"activityCoefficients")) {
371 std::string modelString = acNode.
attrib(
"model");
372 if (modelString !=
"IdealMolalSoln") {
374 "unknown ActivityCoefficient model: " + modelString);
376 if (acNode.
hasChild(
"idealMolalSolnCutoff")) {
378 modelString = ccNode.
attrib(
"model");
379 if (modelString !=
"") {
381 if (ccNode.
hasChild(
"gamma_o_limit")) {
384 if (ccNode.
hasChild(
"gamma_k_limit")) {
387 if (ccNode.
hasChild(
"X_o_cutoff")) {
391 IMS_cCut_ =
getFloat(ccNode,
"c_0_param");
393 if (ccNode.
hasChild(
"slope_f_limit")) {
396 if (ccNode.
hasChild(
"slope_g_limit")) {
409 for (
size_t k = 0; k <
nSpecies(); k++) {
427 throw CanteraError(
"IdealSolnGasVPSS::setStandardConcentrationModel",
428 "Unknown standard concentration model '{}'", model);
442 "Unknown cutoff model '{}'", model);
458 for (
size_t k = 1; k <
m_kk; k++) {
465 for (
size_t k = 1; k <
m_kk; k++) {
472 for (
size_t k = 1; k <
m_kk; k++) {
480 double xminus2 = xminus * xminus;
481 double xminus3 = xminus2 * xminus;
485 double h2 = 3.5 * xminus2 /
IMS_X_o_cutoff_ - 2.0 * xminus3 / x_o_cut2;
486 double h2_prime = 7.0 * xminus /
IMS_X_o_cutoff_ - 6.0 * xminus2 / x_o_cut2;
488 double h1 = (1.0 - 3.0 * xminus2 / x_o_cut2 + 2.0 * xminus3/ x_o_cut3);
489 double h1_prime = (- 6.0 * xminus / x_o_cut2 + 6.0 * xminus2/ x_o_cut3);
495 double h1_f = h1 * alpha;
496 double h1_f_prime = h1_prime * alpha;
498 double f = h2 + h1_f;
499 double f_prime = h2_prime + h1_f_prime;
501 double g = h2 + h1_g;
502 double g_prime = h2_prime + h1_g_prime;
504 double tmp = (xmolSolvent/ g * g_prime + (1.0-xmolSolvent) / f * f_prime);
505 double lngammak = -1.0 - log(f) + tmp * xmolSolvent;
506 double lngammao =-log(g) - tmp * (1.0-xmolSolvent);
508 tmp = log(xmolSolvent) + lngammak;
509 for (
size_t k = 1; k <
m_kk; k++) {
517 for (
size_t k = 1; k <
m_kk; k++) {
523 double xoverc = xmolSolvent/IMS_cCut_;
524 double eterm = std::exp(-xoverc);
526 double fptmp = IMS_bfCut_ - IMS_afCut_ / IMS_cCut_ - IMS_bfCut_*xoverc
527 + 2.0*IMS_dfCut_*xmolSolvent - IMS_dfCut_*xmolSolvent*xoverc;
528 double f_prime = 1.0 + eterm*fptmp;
529 double f = xmolSolvent + IMS_efCut_ + eterm * (IMS_afCut_ + xmolSolvent * (IMS_bfCut_ + IMS_dfCut_*xmolSolvent));
531 double gptmp = IMS_bgCut_ - IMS_agCut_ / IMS_cCut_ - IMS_bgCut_*xoverc
532 + 2.0*IMS_dgCut_*xmolSolvent - IMS_dgCut_*xmolSolvent*xoverc;
533 double g_prime = 1.0 + eterm*gptmp;
534 double g = xmolSolvent + IMS_egCut_ + eterm * (IMS_agCut_ + xmolSolvent * (IMS_bgCut_ + IMS_dgCut_*xmolSolvent));
536 double tmp = (xmolSolvent / g * g_prime + (1.0 - xmolSolvent) / f * f_prime);
537 double lngammak = -1.0 - log(f) + tmp * xmolSolvent;
538 double lngammao =-log(g) - tmp * (1.0-xmolSolvent);
540 tmp = log(xx) + lngammak;
541 for (
size_t k = 1; k <
m_kk; k++) {
553 bool converged =
false;
554 for (
int its = 0; its < 100 && !converged; its++) {
555 double oldV = IMS_efCut_;
558 IMS_dfCut_ = ((- IMS_afCut_/IMS_cCut_ + IMS_bfCut_ - IMS_bfCut_*
IMS_X_o_cutoff_/IMS_cCut_)
563 IMS_efCut_ = - eterm * (tmp);
564 if (fabs(IMS_efCut_ - oldV) < 1.0E-14) {
569 throw CanteraError(
" IdealMolalSoln::calcCutoffParams_()",
570 " failed to converge on the f polynomial");
573 double f_0 = IMS_afCut_ + IMS_efCut_;
574 double f_prime_0 = 1.0 - IMS_afCut_ / IMS_cCut_ + IMS_bfCut_;
576 for (
int its = 0; its < 100 && !converged; its++) {
577 double oldV = IMS_egCut_;
579 IMS_agCut_ = exp(lng_0) - IMS_egCut_;
581 IMS_dgCut_ = ((- IMS_agCut_/IMS_cCut_ + IMS_bgCut_ - IMS_bgCut_*
IMS_X_o_cutoff_/IMS_cCut_)
586 IMS_egCut_ = - eterm * (tmp);
587 if (fabs(IMS_egCut_ - oldV) < 1.0E-14) {
592 throw CanteraError(
" IdealMolalSoln::calcCutoffParams_()",
593 " failed to converge on the g polynomial");
ThermoPhase object for the ideal molal equation of state (see Thermodynamic Properties and class Idea...
virtual doublereal intEnergy_mole() const
Molar internal energy of the solution: Units: J/kmol.
virtual doublereal standardConcentration(size_t k=0) const
Return the standard concentration for the kth species.
virtual void getPartialMolarVolumes(doublereal *vbar) const
CTML ("Cantera Markup Language") is the variant of XML that Cantera uses to store data...
doublereal IMS_slopefCut_
Parameter in the polyExp cutoff treatment.
doublereal IMS_slopegCut_
Parameter in the polyExp cutoff treatment.
virtual void getPartialMolarEntropies(doublereal *sbar) const
Returns an array of partial molar entropies of the species in the solution.
doublereal moleFraction(size_t k) const
Return the mole fraction of a single species.
IdealMolalSoln()
Constructor.
Headers for the factory class that can create known ThermoPhase objects (see Thermodynamic Properties...
virtual void getActivities(doublereal *ac) const
vector_fp m_tmpV
vector of size m_kk, used as a temporary holding area.
Class XML_Node is a tree-based representation of the contents of an XML file.
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 getMolalityActivityCoefficients(doublereal *acMolality) const
size_t nSpecies() const
Returns the number of species in the phase.
virtual doublereal density() const
Density (kg/m^3).
virtual void getPartialMolarCp(doublereal *cpbar) const
Partial molar heat capacity of the solution:. UnitsL J/kmol/K.
doublereal IMS_gamma_k_min_
gamma_k minimum for the cutoff process at the zero solvent point
doublereal m_xmolSolventMIN
virtual void setDensity(const doublereal rho)
Overridden setDensity() function is necessary because the density is not an independent variable...
virtual bool addSpecies(shared_ptr< Species > spec)
void setStandardConcentrationModel(const std::string &model)
Set the standard concentration model.
virtual void setMolarDensity(const doublereal rho)
Overridden setMolarDensity() function is necessary because the density is not an independent variable...
virtual doublereal cp_mole() const
Molar heat capacity of the solution at constant pressure. Units: J/kmol/K.
doublereal IMS_gamma_o_min_
gamma_o value for the cutoff process at the zero solvent point
doublereal mean_X(const doublereal *const Q) const
Evaluate the mole-fraction-weighted mean of an array Q.
vector_fp m_speciesMolarVolume
Species molar volume .
doublereal RT() const
Return the Gas Constant multiplied by the current temperature.
virtual void getActivityConcentrations(doublereal *c) const
This method returns an array of generalized concentrations.
virtual doublereal molarVolume() const
Return the molar volume at standard state.
doublereal molarDensity() const
Molar density (kmol/m^3).
virtual doublereal entropy_mole() const
Molar entropy of the solution. Units: J/kmol/K.
virtual void initThermoXML(XML_Node &phaseNode, const std::string &id="")
Import and initialize a ThermoPhase object using an XML tree.
virtual doublereal thermalExpansionCoeff() const
The thermal expansion coefficient. Units: 1/K.
virtual void _updateStandardStateThermo() const
Updates the standard state thermodynamic functions at the current T and P of the solution.
bool caseInsensitiveEquals(const std::string &input, const std::string &test)
Case insensitive equality predicate.
virtual void getStandardChemPotentials(doublereal *mu) const
Get the array of chemical potentials at unit activity for the species at their standard states at the...
Base class for exceptions thrown by Cantera classes.
virtual doublereal enthalpy_mole() const
Molar enthalpy of the solution. Units: J/kmol.
virtual bool addSpecies(shared_ptr< Species > spec)
int IMS_typeCutoff_
Cutoff type.
void importPhase(XML_Node &phase, ThermoPhase *th)
Import a phase information into an empty ThermoPhase object.
void s_updateIMS_lnMolalityActCoeff() const
This function will be called to update the internally stored natural logarithm of the molality activi...
bool hasChild(const std::string &ch) const
Tests whether the current node has a child node with a particular name.
XML_Node & child(const size_t n) const
Return a changeable reference to the n'th child of the current node.
void setCutoffModel(const std::string &model)
Set cutoff model. Must be one of 'none', 'poly', or 'polyExp'.
vector_fp m_molalities
Current value of the molalities of the species in the phase.
int m_formGC
The standard concentrations can have one of three different forms: 0 = 'unity', 1 = 'molar_volume'...
virtual void initThermoXML(XML_Node &phaseNode, const std::string &id)
Import and initialize a ThermoPhase object using an XML tree.
const doublereal SmallNumber
smallest number to compare to zero.
std::string attrib(const std::string &attr) const
Function returns the value of an attribute.
virtual doublereal isothermalCompressibility() const
The isothermal compressibility. Units: 1/Pa.
doublereal meanMolecularWeight() const
The mean molecular weight. Units: (kg/kmol)
virtual void initThermo()
virtual void getChemPotentials(doublereal *mu) const
Get the species chemical potentials: Units: J/kmol.
virtual void initThermo()
virtual void getPartialMolarEnthalpies(doublereal *hbar) const
Returns an array of partial molar enthalpies for the species in the mixture.
std::string id() const
Return the id attribute, if present.
void calcDensity()
Calculate the density of the mixture using the partial molar volumes and mole fractions as input...
const doublereal GasConstant
Universal Gas Constant. [J/kmol/K].
Contains declarations for string manipulation functions within Cantera.
doublereal getFloat(const XML_Node &parent, const std::string &name, const std::string &type)
Get a floating-point value from a child element.
size_t m_kk
Number of species in the phase.
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 initThermoFile(const std::string &inputFile, const std::string &id)
void calcMolalities() const
Calculates the molality of all species and stores the result internally.
Namespace for the Cantera kernel.
virtual doublereal gibbs_mole() const
Molar Gibbs function for the solution: Units J/kmol.
void calcIMSCutoffParams_()
Calculate parameters for cutoff treatments of activity coefficients.
doublereal IMS_X_o_cutoff_
value of the solute mole fraction that centers the cutoff polynomials for the cutoff =1 process; ...
virtual void getEnthalpy_RT(doublereal *hrt) const
Get the nondimensional Enthalpy functions for the species at their standard states at the current T a...
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 setDensity(const doublereal density_)
Set the internally stored density (kg/m^3) of the phase.
void setMoleFSolventMin(doublereal xmolSolventMIN)
Sets the minimum mole fraction in the molality formulation.
vector_fp IMS_lnActCoeffMolal_
Logarithm of the molal activity coefficients.