22 MaskellSolidSolnPhase::MaskellSolidSolnPhase() :
29 product_species_index(0),
30 reactant_species_index(1)
41 product_species_index(0),
42 reactant_species_index(1)
64 for (
size_t sp = 0; sp <
m_kk; ++sp) {
77 const doublereal fmval = fm(r);
81 doublereal xlogx(doublereal x)
83 return x * std::log(x);
91 const doublereal fmval = fm(r);
92 const doublereal rfm = r * fmval;
93 return s0 +
GasConstant * (xlogx(1-rfm) - xlogx(rfm) - xlogx(1-r-rfm) - xlogx((1-fmval)*r) - xlogx(1-r) - xlogx(r));
111 "Density is not an independent variable");
121 doublereal vtotal = 0.0;
122 for (
size_t i = 0; i <
m_kk; i++) {
123 vtotal += vbar[i] * moleFracs[i];
135 throw CanteraError(
"MaskellSolidSolnPhase::setMolarDensity",
136 "Density is not an independent variable");
149 cached.
value.resize(2);
152 const doublereal pval = p(r);
153 const doublereal rfm = r * fm(r);
154 const doublereal A = (std::pow(1 - rfm, pval) * std::pow(rfm, pval) * std::pow(r - rfm, 1 - pval)) /
155 (std::pow(1 - r - rfm, 1 + pval) * (1 - r));
158 cached.
value[reactant_species_index] = 1 / (A * r * (1-r) ) * std::exp(-B);
160 std::copy(cached.
value.begin(), cached.
value.end(), ac);
167 const doublereal pval = p(r);
168 const doublereal rfm = r * fm(r);
170 const doublereal DgbarDr = pval *
h_mixing +
172 std::log( (std::pow(1 - rfm, pval) * std::pow(rfm, pval) * std::pow(r - rfm, 1 - pval) * r) /
173 (std::pow(1 - r - rfm, 1 + pval) * (1 - r)) );
175 mu[reactant_species_index] = RT *
m_g0_RT[reactant_species_index] - DgbarDr;
182 for (
size_t sp=0; sp <
m_kk; ++sp) {
193 throw CanteraError(
"MaskellSolidSolnPhase::getPartialMolarEnthalpies()",
"Not yet implemented.");
198 throw CanteraError(
"MaskellSolidSolnPhase::getPartialMolarEntropies()",
"Not yet implemented.");
203 throw CanteraError(
"MaskellSolidSolnPhase::getPartialMolarCp()",
"Not yet implemented.");
215 for (
size_t sp=0; sp <
m_kk; ++sp) {
231 if (id_.size() > 0 && phaseNode.
id() != id_) {
232 throw CanteraError(
"MaskellSolidSolnPhase::initThermoXML",
233 "phasenode and Id are incompatible");
242 std::string mString = thNode.
attrib(
"model");
243 if (
lowercase(mString) !=
"maskellsolidsolnphase") {
244 throw CanteraError(
"MaskellSolidSolnPhase::initThermoXML",
245 "Unknown thermo model: " + mString);
254 throw CanteraError(
"MaskellSolidSolnPhase::initThermoXML",
255 "Mixing enthalpy parameter not specified.");
258 if (thNode.
hasChild(
"product_species")) {
259 std::string product_species_name = thNode.
child(
"product_species").
value();
262 throw CanteraError(
"MaskellSolidSolnPhase::initThermoXML",
263 "Species " + product_species_name +
" not found.");
266 reactant_species_index = 1;
268 reactant_species_index = 0;
272 throw CanteraError(
"MaskellSolidSolnPhase::initThermoXML",
273 "Unspecified thermo model");
279 throw CanteraError(
"MaskellSolidSolnPhase::initThermoXML",
280 "MaskellSolidSolution model requires exactly 2 species.");
302 for (
size_t k = 0; k <
m_kk; k++) {
308 doublereal MaskellSolidSolnPhase::s()
const
313 doublereal MaskellSolidSolnPhase::fm(
const doublereal r)
const
315 return (1 - std::sqrt(1 - 4*r*(1-r)/s())) / (2*r);
318 doublereal MaskellSolidSolnPhase::p(
const doublereal r)
const
320 const doublereal sval = s();
321 return (1 - 2*r) / std::sqrt(sval*sval - 4 * sval * r + 4 * sval * r * r);
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.
virtual doublereal entropy_mole() const
Molar entropy of the solution.
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.
virtual doublereal density() const
Density (kg/m^3).
int getId()
Get a unique id for a cached value.
vector_fp m_h0_RT
Vector containing the species reference enthalpies at T = m_tlast.
virtual void setMolarDensity(const doublereal rho)
Overwritten setMolarDensity() function is necessary because the density is not an independent variabl...
const doublereal OneAtm
One atmosphere [Pa].
MaskellSolidSolnPhase & operator=(const MaskellSolidSolnPhase &)
Assignment operator.
std::string attrib(const std::string &attr) const
Function returns the value of an attribute.
virtual doublereal pressure() const
Pressure.
virtual void getStandardVolumes(doublereal *vol) const
Get the molar volumes of each species in their standard states at the current T and P of the solution...
Class XML_Node is a tree-based representation of the contents of an XML file.
int stateMFNumber() const
Return the State Mole Fraction Number.
std::string lowercase(const std::string &s)
Cast a copy of a string to lower case.
void getMoleFractions(doublereal *const x) const
Get the species mole fraction vector.
virtual void getStandardChemPotentials(doublereal *mu) const
Get the array of chemical potentials at unit activity for the species at their standard states at the...
doublereal h_mixing
Value of the enthalpy change on mixing due to protons changing from type B to type A configurations...
virtual void getPartialMolarVolumes(doublereal *vbar) const
returns an array of partial molar volumes of the species in the solution.
XML_Node & child(const size_t n) const
Return a changeable reference to the n'th child of the current node.
VPStandardStateTP & operator=(const VPStandardStateTP &b)
Assignment operator.
Base class for a phase with thermodynamic properties.
Header file for a solid solution model following Maskell, Shaw, and Tye.
virtual void getPartialMolarEnthalpies(doublereal *hbar) const
Returns an array of partial molar enthalpies for the species in the mixture.
doublereal mean_X(const doublereal *const Q) const
Evaluate the mole-fraction-weighted mean of an array Q.
virtual void initThermoXML(XML_Node &phaseNode, const std::string &id)
virtual void getActivityCoefficients(doublereal *ac) const
Get the array of species activity coefficients.
size_t speciesIndex(const std::string &name) const
Returns the index of a species named 'name' within the Phase object.
virtual ThermoPhase * duplMyselfAsThermoPhase() const
virtual void getChemPotentials(doublereal *mu) const
Get the species chemical potentials.
int product_species_index
Index of the species whose mole fraction defines the extent of reduction r.
virtual doublereal enthalpy_mole() const
Molar enthalpy of the solution.
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.
ValueCache m_cache
Cached for saved calculations within each ThermoPhase.
Base class for exceptions thrown by Cantera classes.
virtual void setDensity(const doublereal rho)
Overwritten setDensity() function is necessary because the density is not an independent variable...
bool hasChild(const std::string &ch) const
Tests whether the current node has a child node with a particular name.
virtual void getActivityConcentrations(doublereal *c) const
This method returns the array of generalized concentrations.
virtual void getPartialMolarEntropies(doublereal *sbar) const
Returns an array of partial molar entropies of the species in the solution.
vector_fp m_s0_R
Vector containing the species reference entropies at T = m_tlast.
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...
std::string value() const
Return the value of an XML node as a string.
doublereal m_Pcurrent
m_Pcurrent = The current pressure Since the density isn't a function of pressure, but only of the mol...
doublereal moleFraction(size_t k) const
Return the mole fraction of a single species.
doublereal temperature() const
Temperature (K).
std::string id() const
Return the id attribute, if present.
virtual void getPartialMolarCp(doublereal *cpbar) const
Returns an array of partial molar Heat Capacities at constant pressure of the species in the solution...
std::vector< double > vector_fp
Turn on the use of stl vectors for the basic array type within cantera Vector of doubles.
bool validate(double state1New)
Check whether the currently cached value is valid based on a single state variable.
doublereal meanMolecularWeight() const
The mean molecular weight. Units: (kg/kmol)
const doublereal GasConstant
Universal Gas Constant. [J/kmol/K].
virtual void initThermoXML(XML_Node &phaseNode, const std::string &id)
Initialize a ThermoPhase object, potentially reading activity coefficient information from an XML dat...
Contains declarations for string manipulation functions within Cantera.
#define DATA_PTR(vec)
Creates a pointer to the start of the raw data for a vector.
CachedArray getArray(int id)
Get a reference to a CachedValue object representing an array (vector_fp) with the given id...
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 update(doublereal T, doublereal *cp_R, doublereal *h_RT, doublereal *s_R) const =0
Compute the reference-state properties for all species.
virtual void getChemPotentials_RT(doublereal *mu) const
Get the array of non-dimensional species solution chemical potentials at the current T and P...
T value
The value of the cached property.
virtual void setPressure(doublereal p)
Set the pressure at constant temperature.
SpeciesThermo * m_spthermo
Pointer to the calculation manager for species reference-state thermodynamic properties.
vector_fp m_g0_RT
Vector containing the species reference Gibbs functions at T = m_tlast.
virtual void setDensity(const doublereal density_)
Set the internally stored density (kg/m^3) of the phase Note the density of a phase is an independent...