28 m_speciesFrozen(false),
29 m_elementsFrozen(false),
45 m_speciesFrozen(false) ,
46 m_elementsFrozen(false),
166 for (
size_t i = 0; i <
m_mm; i++) {
187 "Elements::entropy298",
188 "Entropy at 298 K of element is unknown");
224 for (
size_t m = 0; m <
m_mm; m++) {
235 for (
size_t k = 0; k <
m_kk; k++) {
309 doublereal norm = 0.0;
314 for (
size_t k = 0; k <
m_kk; k++) {
315 double xk = std::max(x[k], 0.0);
325 const doublereal invSum = 1.0/sum;
326 for (
size_t k=0; k <
m_kk; k++) {
334 for (
size_t k=0; k <
m_kk; k++) {
347 doublereal rmmw = 1.0/
m_mmw;
350 m_y.begin(), multiplies<double>());
359 for (
size_t k = 0; k < kk; k++) {
376 for (
size_t k = 0; k <
m_kk; k++) {
377 m_y[k] = std::max(y[k], 0.0);
379 doublereal norm = accumulate(
m_y.begin(),
m_y.end(), 0.0);
383 m_ym.begin(), multiplies<double>());
390 doublereal sum = 0.0;
391 copy(y, y +
m_kk,
m_y.begin());
393 multiplies<double>());
394 sum = accumulate(
m_ym.begin(),
m_ym.end(), 0.0);
404 for (
size_t k = 0; k < kk; k++) {
493 if (weights.size() < mw.size()) {
494 weights.resize(mw.size());
496 copy(mw.begin(), mw.end(), weights.begin());
502 copy(mw.begin(), mw.end(), weights);
514 for (
size_t k = 0; k < kk; k++) {
563 copy(
m_y.begin(),
m_y.end(), y);
580 doublereal sum = 0.0, norm = 0.0;
581 for (
size_t k = 0; k !=
m_kk; ++k) {
582 double ck = std::max(conc[k], 0.0);
589 doublereal rsum = 1.0/sum;
590 for (
size_t k = 0; k !=
m_kk; ++k) {
615 doublereal cdens = 0.0;
616 for (
size_t k = 0; k < kk; k++) {
625 return m_mmw*std::inner_product(
m_ym.begin(),
m_ym.end(), Q, 0.0);
645 if (weight == -12345.0) {
668 doublereal weight =
fpValue(e[
"atomicWt"]);
669 string symbol = e[
"name"];
674 int atomic_number, doublereal entropy298,
677 if (weight == -12345.0) {
715 "Duplicate Elements (" + symbol +
") have different weights");
722 doublereal weight = 0.0;
728 anum = atoi(
stripws(e[
"atomicNumber"]).c_str());
730 string symbol = e[
"name"];
748 if (! phase.
hasChild(
"elementArray")) {
750 "phase xml node doesn't have \"elementArray\" XML Node");
753 vector<string> enames;
757 string element_database =
"elements.xml";
759 element_database = elements[
"datasrc"];
769 local_db = &root.
child(
"ctml/elementData");
773 int nel =
static_cast<int>(enames.size());
777 for (i = 0; i < nel; i++) {
790 throw CanteraError(
"addElementsFromXML",
"no data for element "
807 doublereal weight,
int atomicNumber,
808 doublereal entropy298,
int elem_type)
820 throw CanteraError(
"Phase::addElementAfterFreeze()",
"confused");
825 for (
size_t k = 0; k <
m_kk; k++) {
826 size_t m_old = m_mm - 1;
827 for (
size_t m = 0; m < m_old; m++) {
836 void Phase::addSpecies(
const std::string& name_,
const doublereal* comp,
837 doublereal charge_, doublereal size_)
847 for (
size_t m = 0; m < ne; m++) {
848 compNew[m] = comp[m];
852 if (charge_ != 0.0) {
854 if (eindex !=
npos) {
855 doublereal ecomp = compNew[eindex];
856 if (fabs(charge_ + ecomp) > 0.001) {
858 throw CanteraError(
"Phase::addSpecies",
859 "Input charge and element E compositions differ "
860 "for species " + name_);
864 compNew[eindex] = -charge_;
873 compNew[ne - 1] = - charge_;
876 for (
size_t m = 0; m < ne; m++) {
878 wt += compNew[m] * aw[m];
885 doublereal charge_, doublereal size_)
887 for (
size_t k = 0; k <
m_kk; k++) {
890 for (
size_t i = 0; i <
m_mm; i++) {
893 "Duplicate species have different "
894 "compositions: " + name_);
899 "Duplicate species have different "
900 "charges: " + name_);
904 "Duplicate species have different "
910 addSpecies(name_, comp, charge_, size_);
925 copy(mw.begin(), mw.end(),
m_molwts.begin());
926 for (
size_t k = 0; k <
m_kk; k++) {
929 "negative molecular weight for species number "
952 bool Phase::ready()
const
Phase()
Default constructor.
std::map< std::string, doublereal > compositionMap
Map connecting a string name with a double.
doublereal fpValue(const std::string &val)
Translate a string into one doublereal value.
doublereal nAtoms(size_t k, size_t m) const
Number of atoms of element m in species k.
virtual void setMoleFractions_NoNorm(const doublereal *const x)
Set the mole fractions to the specified values without normalizing.
XML_Node * findByAttr(const std::string &attr, const std::string &val, int depth=100000) const
This routine carries out a recursive search for an XML node based on an attribute of each XML node...
doublereal molecularWeight(size_t k) const
Molecular weight of species k.
vector_fp m_y
species mass fractions
void setState_RY(doublereal rho, doublereal *y)
Set the density (kg/m^3) and mass fractions.
std::vector< std::string > m_elementNames
element names
virtual doublereal density() const
Density (kg/m^3).
std::string int2str(const int n, const std::string &fmt)
Convert an int to a string using a format converter.
doublereal LookupWtElements(const std::string &ename)
Function to look up an atomic weight This function looks up the argument string in the database above...
void restoreState(const vector_fp &state)
Restore a state saved on a previous call to saveState.
XML_Node * get_XML_File(const std::string &file, int debug)
Return a pointer to the XML tree for a Cantera input file.
bool m_elementsFrozen
If this is true, then no elements may be added to the object.
void setState_TRY(doublereal t, doublereal dens, const doublereal *y)
Set the internally stored temperature (K), density, and mass fractions.
size_t nElements() const
Number of elements.
vector_fp m_atomicWeights
element atomic weights (kg kmol-1)
void getMassFractions(doublereal *const y) const
Get the species mass fractions.
const size_t npos
index returned by functions to indicate "no position"
vector_fp m_speciesCharge
Vector of species charges. length m_kk.
Header file for class Phase.
vector_fp m_entropy298
Entropy at 298.15 K and 1 bar of stable state pure elements (J kmol-1)
doublereal atomicWeight(size_t m) const
Atomic weight of element m.
Class XML_Node is a tree-based representation of the contents of an XML file.
vector_fp m_speciesSize
Vector of species sizes.
doublereal m_mmw
mean molecular weight of the mixture (kg kmol-1)
Base class for phases of matter.
void addElement(const std::string &symbol, doublereal weight=-12345.0)
Add an element.
#define CT_ELEM_TYPE_ABSPOS
Normal element constraint consisting of positive coefficients for the formula matrix.
#define CT_ELEM_TYPE_ELECTRONCHARGE
This refers to conservation of electrons.
doublereal molarDensity() const
Molar density (kmol/m^3).
void getMoleFractionsByName(compositionMap &x) const
Get the mole fractions by name.
Unary operator to multiply the argument by a constant.
void getMoleFractions(doublereal *const x) const
Get the species mole fraction vector.
void checkElementIndex(size_t m) const
Check that the specified element index is in range Throws an exception if m is greater than nElements...
void getConcentrations(doublereal *const c) const
Get the species concentrations (kmol/m^3).
std::string name() const
Return the name of the phase.
std::string m_name
Name of the phase.
void checkElementArraySize(size_t mm) const
Check that an array size is at least nElements() Throws an exception if mm is less than nElements()...
doublereal concentration(const size_t k) const
Concentration of species k.
#define AssertThrowMsg(expr, procedure, message)
Assertion must be true or an error is thrown.
doublereal sum_xlogQ(doublereal *const Q) const
Evaluate .
XML_Node & child(const size_t n) const
Return a changeable reference to the n'th child of the current node.
doublereal entropyElement298(size_t m) const
Entropy of the element in its standard state at 298 K and 1 bar.
void checkSpeciesIndex(size_t k) const
Check that the specified species index is in range Throws an exception if k is greater than nSpecies(...
void setName(const std::string &nm)
Sets the string name for the phase.
doublereal mean_X(const doublereal *const Q) const
Evaluate the mole-fraction-weighted mean of an array Q.
const vector_fp & atomicWeights() const
Return a read-only reference to the vector of atomic weights.
void setMassFractionsByName(compositionMap &yMap)
Set the species mass fractions by name.
int m_stateNum
State Change variable.
size_t m_ndim
Dimensionality of the phase.
size_t speciesIndex(const std::string &name) const
Returns the index of a species named 'name' within the Phase object.
std::vector< std::string > m_speciesNames
Vector of the species names.
void setState_TRX(doublereal t, doublereal dens, const doublereal *x)
Set the internally stored temperature (K), density, and mole fractions.
void getAtoms(size_t k, double *atomArray) const
Get a vector containing the atomic composition of species k.
bool elementsFrozen()
True if freezeElements has been called.
std::string stripws(const std::string &s)
Strip the leading and trailing white space from a string.
void addUniqueElement(const std::string &symbol, doublereal weight=-12345.0, int atomicNumber=0, doublereal entropy298=ENTROPY298_UNKNOWN, int elem_type=CT_ELEM_TYPE_ABSPOS)
Add an element, checking for uniqueness The uniqueness is checked by comparing the string symbol...
doublereal molarVolume() const
Molar volume (m^3/kmol).
doublereal sum_xlogx() const
Evaluate .
int atomicNumber(size_t m) const
Atomic number of element m.
doublereal chargeDensity() const
Charge density [C/m^3].
const doublereal * massFractions() const
Return a const pointer to the mass fraction array.
std::string id() const
Return the string id for the phase.
Base class for exceptions thrown by Cantera classes.
doublereal sum_xlogQ(InputIter1 begin, InputIter1 end, InputIter2 Q_begin)
Compute .
void setState_TNX(doublereal t, doublereal n, const doublereal *x)
Set the internally stored temperature (K), molar density (kmol/m^3), and mole fractions.
void setMoleFractionsByName(compositionMap &xMap)
Set the species mole fractions by name.
compositionMap parseCompString(const std::string &ss, const std::vector< std::string > &names)
Parse a composition string into a map consisting of individual key:composition pairs.
Exception class to indicate a fixed set of elements.
void addElementsFromXML(const XML_Node &phase)
Add all elements referenced in an XML_Node tree.
virtual void setConcentrations(const doublereal *const conc)
Set the concentrations to the specified values within the phase.
virtual void setMoleFractions(const doublereal *const x)
Set the mole fractions to the specified values There is no restriction on the sum of the mole fractio...
virtual ~Phase()
Destructor.
std::string parseSpeciesName(const std::string &nameStr, std::string &phaseName)
Parse a name string, separating out the phase name from the species name.
bool hasChild(const std::string &ch) const
Tests whether the current node has a child node with a particular name.
doublereal sum_xlogx(InputIter begin, InputIter end)
Compute .
const std::vector< std::string > & elementNames() const
Return a read-only reference to the vector of element names.
doublereal massFraction(size_t k) const
Return the mass fraction of a single species.
virtual void setMolarDensity(const doublereal molarDensity)
Set the internally stored molar density (kmol/m^3) of the phase.
virtual void freezeSpecies()
Call when finished adding species.
doublereal dot(InputIter x_begin, InputIter x_end, InputIter2 y_begin)
Function that calculates a templated inner product.
#define ENTROPY298_UNKNOWN
Number indicating we don't know the entropy of the element in its most stable state at 298...
virtual void setMassFractions_NoNorm(const doublereal *const y)
Set the mass fractions to the specified values without normalizing.
size_t nSpecies() const
Returns the number of species in the phase.
void setState_TX(doublereal t, doublereal *x)
Set the internally stored temperature (K) and mole fractions.
vector_int m_elem_type
Vector of element types.
const std::vector< std::string > & speciesNames() const
Return a const reference to the vector of species names.
doublereal moleFraction(size_t k) const
Return the mole fraction of a single species.
const vector_fp & molecularWeights() const
Return a const reference to the internal vector of molecular weights.
bool m_speciesFrozen
Boolean indicating whether the number of species has been frozen.
#define AssertTrace(expr)
Assertion must be true or an error is thrown.
doublereal temperature() const
Temperature (K).
void freezeElements()
Prohibit addition of more elements, and prepare to add species.
vector_fp m_molwts
species molecular weights (kg kmol-1)
void setState_TY(doublereal t, doublereal *y)
Set the internally stored temperature (K) and mass fractions.
std::vector< double > vector_fp
Turn on the use of stl vectors for the basic array type within cantera Vector of doubles.
void checkSpeciesArraySize(size_t kk) const
Check that an array size is at least nSpecies() Throws an exception if kk is less than nSpecies()...
size_t elementIndex(const std::string &name) const
Return the index of element named 'name'.
Templates for operations on vector-like objects.
Phase & operator=(const Phase &right)
Assignment operator.
size_t m_mm
Number of elements.
void getStringArray(const Cantera::XML_Node &node, std::vector< std::string > &v)
This function interprets the value portion of an XML element as a string.
virtual void setTemperature(const doublereal temp)
Set the internally stored temperature of the phase (K).
void scale(InputIter begin, InputIter end, OutputIter out, S scale_factor)
Multiply elements of an array by a scale factor.
const doublereal Tiny
Small number to compare differences of mole fractions against.
std::string m_id
ID of the phase.
doublereal m_dens
Density (kg m-3).
vector_fp m_ym
m_ym[k] = mole fraction of species k divided by the mean molecular weight of mixture.
doublereal meanMolecularWeight() const
The mean molecular weight. Units: (kg/kmol)
XML_Node * m_xml
XML node containing the XML info for this phase.
vector_int m_atomicNumbers
element atomic numbers
Contains declarations for string manipulation functions within Cantera.
std::string speciesSPName(int k) const
Returns the expanded species name of a species, including the phase name This is guaranteed to be uni...
void getMolecularWeights(vector_fp &weights) const
Copy the vector of molecular weights into vector weights.
std::string elementName(size_t m) const
Name of the element with index m.
doublereal m_temp
Temperature (K). This is an independent variable.
void saveState(vector_fp &state) const
Save the current internal state of the phase Write to vector 'state' the current internal state...
XML_Node & xml()
Returns a reference to the XML_Node stored for the phase.
virtual void setMassFractions(const doublereal *const y)
Set the mass fractions to the specified values and normalize them.
int elementType(size_t m) const
Return the element constraint type Possible types include:
void init(const vector_fp &mw)
vector_fp m_rmolwts
inverse of species molecular weights (kmol kg-1)
vector_fp m_speciesComp
Atomic composition of the species.
void setState_RX(doublereal rho, doublereal *x)
Set the density (kg/m^3) and mole fractions.
size_t m_kk
Number of species in the phase.
size_t addUniqueElementAfterFreeze(const std::string &symbol, doublereal weight, int atomicNumber, doublereal entropy298=ENTROPY298_UNKNOWN, int elem_type=CT_ELEM_TYPE_ABSPOS)
Add an element after elements have been frozen, checking for uniqueness The uniqueness is checked by ...
An array index is out of range.
int changeElementType(int m, int elem_type)
Change the element type of the mth constraint Reassigns an element type.
void setID(const std::string &id)
Set the string id for the phase.
XML_Node & root() const
Return the root of the current XML_Node tree.
doublereal fpValueCheck(const std::string &val)
Translate a string into one doublereal value, with error checking.
void setState_TR(doublereal t, doublereal rho)
Set the internally stored temperature (K) and density (kg/m^3)
std::string speciesName(size_t k) const
Name of the species with index k.
void addUniqueSpecies(const std::string &name, const doublereal *comp, doublereal charge=0.0, doublereal size=1.0)
Add a species to the phase, checking for uniqueness of the name This routine checks for uniqueness of...
const doublereal * moleFractdivMMW() const
Returns a const pointer to the start of the moleFraction/MW array.
Definitions for the classes that are thrown when Cantera experiences an error condition (also contain...
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...
doublereal mean_Y(const doublereal *const Q) const
Evaluate the mass-fraction-weighted mean of an array Q.
bool hasAttrib(const std::string &a) const
Tests whether the current node has an attribute with a particular name.
doublereal charge(size_t k) const
Dimensionless electrical charge of a single molecule of species k The charge is normalized by the the...