20 MaskellSolidSolnPhase::MaskellSolidSolnPhase() :
27 product_species_index(0),
28 reactant_species_index(1)
32 MaskellSolidSolnPhase::MaskellSolidSolnPhase(
const MaskellSolidSolnPhase& b) :
39 product_species_index(0),
40 reactant_species_index(1)
45 MaskellSolidSolnPhase&
46 MaskellSolidSolnPhase::operator=(
const MaskellSolidSolnPhase& b)
49 VPStandardStateTP::operator=(b);
62 for (
size_t sp = 0; sp <
m_kk; ++sp) {
74 const doublereal fmval = fm(r);
78 doublereal xlogx(doublereal x)
80 return x * std::log(x);
88 const doublereal fmval = fm(r);
89 const doublereal rfm = r * fmval;
90 return s0 +
GasConstant * (xlogx(1-rfm) - xlogx(rfm) - xlogx(1-r-rfm) - xlogx((1-fmval)*r) - xlogx(1-r) - xlogx(r));
103 "Density is not an independent variable");
113 doublereal vtotal = 0.0;
114 for (
size_t i = 0; i <
m_kk; i++) {
115 vtotal += vbar[i] * moleFracs[i];
127 throw CanteraError(
"MaskellSolidSolnPhase::setMolarDensity",
128 "Density is not an independent variable");
139 cached.
value.resize(2);
142 const doublereal pval = p(r);
143 const doublereal rfm = r * fm(r);
144 const doublereal A = (std::pow(1 - rfm, pval) * std::pow(rfm, pval) * std::pow(r - rfm, 1 - pval)) /
145 (std::pow(1 - r - rfm, 1 + pval) * (1 - r));
148 cached.
value[reactant_species_index] = 1 / (A * r * (1-r) ) * std::exp(-B);
150 std::copy(cached.
value.begin(), cached.
value.end(), ac);
157 const doublereal pval = p(r);
158 const doublereal rfm = r * fm(r);
159 const doublereal DgbarDr = pval *
h_mixing +
161 std::log( (std::pow(1 - rfm, pval) * std::pow(rfm, pval) * std::pow(r - rfm, 1 - pval) * r) /
162 (std::pow(1 - r - rfm, 1 + pval) * (1 - r)) );
164 mu[reactant_species_index] =
RT() *
m_g0_RT[reactant_species_index] - DgbarDr;
170 for (
size_t sp=0; sp <
m_kk; ++sp) {
171 mu[sp] *= 1.0 /
RT();
179 throw CanteraError(
"MaskellSolidSolnPhase::getPartialMolarEnthalpies()",
"Not yet implemented.");
184 throw CanteraError(
"MaskellSolidSolnPhase::getPartialMolarEntropies()",
"Not yet implemented.");
189 throw CanteraError(
"MaskellSolidSolnPhase::getPartialMolarCp()",
"Not yet implemented.");
200 for (
size_t sp=0; sp <
m_kk; ++sp) {
216 if (id_.size() > 0 && phaseNode.
id() != id_) {
217 throw CanteraError(
"MaskellSolidSolnPhase::initThermoXML",
218 "phasenode and Id are incompatible");
225 if (!ba::iequals(thNode[
"model"],
"maskellsolidsolnphase")) {
226 throw CanteraError(
"MaskellSolidSolnPhase::initThermoXML",
227 "Unknown thermo model: " + thNode[
"model"]);
234 throw CanteraError(
"MaskellSolidSolnPhase::initThermoXML",
235 "Mixing enthalpy parameter not specified.");
238 if (thNode.
hasChild(
"product_species")) {
239 std::string product_species_name = thNode.
child(
"product_species").
value();
242 throw CanteraError(
"MaskellSolidSolnPhase::initThermoXML",
243 "Species " + product_species_name +
" not found.");
246 reactant_species_index = 1;
248 reactant_species_index = 0;
252 throw CanteraError(
"MaskellSolidSolnPhase::initThermoXML",
253 "Unspecified thermo model");
258 throw CanteraError(
"MaskellSolidSolnPhase::initThermoXML",
259 "MaskellSolidSolution model requires exactly 2 species.");
276 for (
size_t k = 0; k <
m_kk; k++) {
282 doublereal MaskellSolidSolnPhase::s()
const 287 doublereal MaskellSolidSolnPhase::fm(
const doublereal r)
const 289 return (1 - std::sqrt(1 - 4*r*(1-r)/s())) / (2*r);
292 doublereal MaskellSolidSolnPhase::p(
const doublereal r)
const 294 const doublereal sval = s();
295 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.
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].
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.
Base class for a phase with thermodynamic properties.
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...
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.
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.
MultiSpeciesThermo * m_spthermo
Pointer to the calculation manager for species reference-state thermodynamic properties.
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.
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.
virtual void initThermoXML(XML_Node &phaseNode, const std::string &id)
Import and initialize a ThermoPhase object using an XML tree.
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.
Class MaskellSolidSolnPhase represents a condensed phase non-ideal solution with 2 species following ...
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.
virtual ThermoPhase * duplMyselfAsThermoPhase() const
Duplication routine for objects which inherit from ThermoPhase.
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.