20 MaskellSolidSolnPhase::MaskellSolidSolnPhase() :
27 product_species_index(-1),
28 reactant_species_index(-1)
35 for (
size_t sp = 0; sp <
m_kk; ++sp) {
47 const doublereal fmval = fm(r);
51 doublereal xlogx(doublereal x)
53 return x * std::log(x);
61 const doublereal fmval = fm(r);
62 const doublereal rfm = r * fmval;
63 return s0 +
GasConstant * (xlogx(1-rfm) - xlogx(rfm) - xlogx(1-r-rfm) - xlogx((1-fmval)*r) - xlogx(1-r) - xlogx(r));
76 "Density is not an independent variable");
86 doublereal vtotal = 0.0;
87 for (
size_t i = 0; i <
m_kk; i++) {
88 vtotal += vbar[i] * moleFracs[i];
100 throw CanteraError(
"MaskellSolidSolnPhase::setMolarDensity",
101 "Density is not an independent variable");
112 cached.
value.resize(2);
115 const doublereal pval = p(r);
116 const doublereal rfm = r * fm(r);
117 const doublereal A = (std::pow(1 - rfm, pval) * std::pow(rfm, pval) * std::pow(r - rfm, 1 - pval)) /
118 (std::pow(1 - r - rfm, 1 + pval) * (1 - r));
121 cached.
value[reactant_species_index] = 1 / (A * r * (1-r) ) * std::exp(-B);
123 std::copy(cached.
value.begin(), cached.
value.end(), ac);
130 const doublereal pval = p(r);
131 const doublereal rfm = r * fm(r);
132 const doublereal DgbarDr = pval *
h_mixing +
134 std::log( (std::pow(1 - rfm, pval) * std::pow(rfm, pval) * std::pow(r - rfm, 1 - pval) * r) /
135 (std::pow(1 - r - rfm, 1 + pval) * (1 - r)) );
137 mu[reactant_species_index] =
RT() *
m_g0_RT[reactant_species_index] - DgbarDr;
143 for (
size_t sp=0; sp <
m_kk; ++sp) {
144 mu[sp] *= 1.0 /
RT();
152 throw CanteraError(
"MaskellSolidSolnPhase::getPartialMolarEnthalpies()",
"Not yet implemented.");
157 throw CanteraError(
"MaskellSolidSolnPhase::getPartialMolarEntropies()",
"Not yet implemented.");
162 throw CanteraError(
"MaskellSolidSolnPhase::getPartialMolarCp()",
"Not yet implemented.");
173 for (
size_t sp=0; sp <
m_kk; ++sp) {
189 if (id_.size() > 0 && phaseNode.
id() != id_) {
190 throw CanteraError(
"MaskellSolidSolnPhase::initThermoXML",
191 "phasenode and Id are incompatible");
199 throw CanteraError(
"MaskellSolidSolnPhase::initThermoXML",
200 "Unknown thermo model: " + thNode[
"model"]);
207 throw CanteraError(
"MaskellSolidSolnPhase::initThermoXML",
208 "Mixing enthalpy parameter not specified.");
211 if (thNode.
hasChild(
"product_species")) {
217 throw CanteraError(
"MaskellSolidSolnPhase::initThermoXML",
218 "Unspecified thermo model");
223 throw CanteraError(
"MaskellSolidSolnPhase::initThermoXML",
224 "MaskellSolidSolution model requires exactly 2 species.");
235 throw CanteraError(
"MaskellSolidSolnPhase::setProductSpecies",
236 "Species '{}' not found",
name);
251 for (
size_t k = 0; k <
m_kk; k++) {
257 doublereal MaskellSolidSolnPhase::s()
const 262 doublereal MaskellSolidSolnPhase::fm(
const doublereal r)
const 264 return (1 - std::sqrt(1 - 4*r*(1-r)/s())) / (2*r);
267 doublereal MaskellSolidSolnPhase::p(
const doublereal r)
const 269 const doublereal sval = s();
270 return (1 - 2*r) / std::sqrt(sval*sval - 4 * sval * r + 4 * sval * r * r);
virtual void getActivityCoefficients(doublereal *ac) const
Get the array of non-dimensional molar-based activity coefficients at the current solution temperatur...
doublereal fpValue(const std::string &val)
Translate a string into one doublereal value.
vector_fp m_cp0_R
Vector containing the species reference constant pressure heat capacities at T = m_tlast.
int getId()
Get a unique id for a cached value.
virtual void getChemPotentials(doublereal *mu) const
Get the species chemical potentials. Units: J/kmol.
vector_fp m_h0_RT
Vector containing the species reference enthalpies at T = m_tlast.
MultiSpeciesThermo m_spthermo
Pointer to the calculation manager for species reference-state thermodynamic properties.
virtual void setMolarDensity(const doublereal rho)
Overridden setMolarDensity() function is necessary because the density is not an independent variable...
const doublereal OneAtm
One atmosphere [Pa].
void setProductSpecies(const std::string &name)
Set the product Species. Must be called after species have been added.
doublereal temperature() const
Temperature (K).
size_t speciesIndex(const std::string &name) const
Returns the index of a species named 'name' within the Phase object.
virtual void update(doublereal T, doublereal *cp_R, doublereal *h_RT, doublereal *s_R) const
Compute the reference-state properties for all species.
doublereal moleFraction(size_t k) const
Return the mole fraction of a single species.
Class XML_Node is a tree-based representation of the contents of an XML file.
virtual doublereal density() const
Density (kg/m^3).
virtual doublereal entropy_mole() const
Molar entropy. Units: J/kmol/K.
virtual void getPartialMolarEntropies(doublereal *sbar) const
Returns an array of partial molar entropies of the species in the solution.
doublereal h_mixing
Value of the enthalpy change on mixing due to protons changing from type B to type A configurations...
doublereal mean_X(const doublereal *const Q) const
Evaluate the mole-fraction-weighted mean of an array Q.
doublereal RT() const
Return the Gas Constant multiplied by the current temperature.
Header file for a solid solution model following Maskell, Shaw, and Tye.
virtual void initThermoXML(XML_Node &phaseNode, const std::string &id)
Import and initialize a ThermoPhase object using an XML tree.
virtual void getPureGibbs(doublereal *gpure) const
Get the Gibbs functions for the standard state of the species at the current T and P of the solution...
int product_species_index
Index of the species whose mole fraction defines the extent of reduction r.
virtual void getPartialMolarEnthalpies(doublereal *hbar) const
Returns an array of partial molar enthalpies for the species in the mixture.
CachedScalar getScalar(int id)
Get a reference to a CachedValue object representing a scalar (doublereal) with the given id...
std::string speciesName(size_t k) const
Name of the species with index k.
virtual void calcDensity()
Calculate the density of the mixture using the partial molar volumes and mole fractions as input...
Classes providing support for XML data files.
virtual void getStandardChemPotentials(doublereal *mu) const
Get the array of chemical potentials at unit activity for the species at their standard states at the...
ValueCache m_cache
Cached for saved calculations within each ThermoPhase.
bool caseInsensitiveEquals(const std::string &input, const std::string &test)
Case insensitive equality predicate.
Base class for exceptions thrown by Cantera classes.
int stateMFNumber() const
Return the State Mole Fraction Number.
std::string value() const
Return the value of an XML node as a string.
virtual void setDensity(const doublereal rho)
Overridden setDensity() function is necessary because the density is not an independent variable...
virtual void getPartialMolarCp(doublereal *cpbar) const
Return an array of partial molar heat capacities for the species in the mixture.
void getMoleFractions(doublereal *const x) const
Get the species mole fraction vector.
virtual doublereal pressure() const
Pressure.
bool hasChild(const std::string &ch) const
Tests whether the current node has a child node with a particular name.
vector_fp m_s0_R
Vector containing the species reference entropies at T = m_tlast.
XML_Node & child(const size_t n) const
Return a changeable reference to the n'th child of the current node.
virtual void getChemPotentials_RT(doublereal *mu) const
Get the array of non-dimensional species chemical potentials.
doublereal m_Pcurrent
m_Pcurrent = The current pressure.
virtual void initThermoXML(XML_Node &phaseNode, const std::string &id)
Import and initialize a ThermoPhase object using an XML tree.
std::vector< double > vector_fp
Turn on the use of stl vectors for the basic array type within cantera Vector of doubles.
doublereal meanMolecularWeight() const
The mean molecular weight. Units: (kg/kmol)
void _updateThermo() const
Function to call through to m_spthermo->update and fill m_h0_RT, m_cp0_R, m_g0_RT, m_s0_R.
bool validate(double state1New)
Check whether the currently cached value is valid based on a single state variable.
std::string id() const
Return the id attribute, if present.
const doublereal GasConstant
Universal Gas Constant. [J/kmol/K].
virtual doublereal enthalpy_mole() const
Molar enthalpy. Units: J/kmol.
std::string name() const
Return the name of the phase.
Contains declarations for string manipulation functions within Cantera.
CachedArray getArray(int id)
Get a reference to a CachedValue object representing an array (vector_fp) with the given id...
virtual void getActivityConcentrations(doublereal *c) const
This method returns an array of generalized concentrations.
size_t m_kk
Number of species in the phase.
virtual void getPartialMolarVolumes(doublereal *vbar) const
Return an array of partial molar volumes for the species in the mixture.
T value
The value of the cached property.
virtual void setPressure(doublereal p)
Set the pressure at constant temperature.
Namespace for the Cantera kernel.
vector_fp m_g0_RT
Vector containing the species reference Gibbs functions at T = m_tlast.
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.