Cantera 2.6.0
StoichSubstance.cpp
Go to the documentation of this file.
1/**
2 * @file StoichSubstance.cpp
3 * Definition file for the StoichSubstance class, which represents a fixed-composition
4 * incompressible substance (see \ref thermoprops and
5 * class \link Cantera::StoichSubstance StoichSubstance\endlink)
6 */
7
8// This file is part of Cantera. See License.txt in the top-level directory or
9// at https://cantera.org/license.txt for license and copyright information.
10
14#include "cantera/base/ctml.h"
15
16namespace Cantera
17{
18
19// ---- Constructors -------
20
21StoichSubstance::StoichSubstance(const std::string& infile, const std::string& id_)
22{
23 initThermoFile(infile, id_);
24}
25
26StoichSubstance::StoichSubstance(XML_Node& xmlphase, const std::string& id_)
27{
28 importPhase(xmlphase, this);
29}
30
31// ----- Mechanical Equation of State ------
32
33doublereal StoichSubstance::pressure() const
34{
35 return m_press;
36}
37
39{
40 m_press = p;
41}
42
44{
45 return 0.0;
46}
47
49{
50 return 0.0;
51}
52
53// ---- Chemical Potentials and Activities ----
54
56{
57 return Units(1.0);
58}
59
61{
62 c[0] = 1.0;
63}
64
66{
67 return 1.0;
68}
69
70doublereal StoichSubstance::logStandardConc(size_t k) const
71{
72 return 0.0;
73}
74
75// Properties of the Standard State of the Species in the Solution
76
78{
79 getGibbs_RT(mu0);
80 mu0[0] *= RT();
81}
82
83void StoichSubstance::getEnthalpy_RT(doublereal* hrt) const
84{
86 doublereal presCorrect = (m_press - m_p0) / molarDensity();
87 hrt[0] += presCorrect / RT();
88}
89
90void StoichSubstance::getEntropy_R(doublereal* sr) const
91{
93}
94
95void StoichSubstance::getGibbs_RT(doublereal* grt) const
96{
97 getEnthalpy_RT(grt);
98 grt[0] -= m_s0_R;
99}
100
101void StoichSubstance::getCp_R(doublereal* cpr) const
102{
104 cpr[0] = m_cp0_R;
105}
106
107void StoichSubstance::getIntEnergy_RT(doublereal* urt) const
108{
110 urt[0] = m_h0_RT - m_p0 / molarDensity() / RT();
111}
112
113// ---- Thermodynamic Values for the Species Reference States ----
114
115void StoichSubstance::getIntEnergy_RT_ref(doublereal* urt) const
116{
118 urt[0] = m_h0_RT - m_p0 / molarDensity() / RT();
119}
120
121// ---- Initialization and Internal functions
122
124{
125 // Make sure there is one and only one species in this phase.
126 if (m_kk != 1) {
127 throw CanteraError("StoichSubstance::initThermo",
128 "stoichiometric substances may only contain one species.");
129 }
130
131 if (species(0)->input.hasKey("equation-of-state")) {
132 auto& eos = species(0)->input["equation-of-state"].getMapWhere(
133 "model", "constant-volume");
134 if (eos.hasKey("density")) {
135 assignDensity(eos.convert("density", "kg/m^3"));
136 } else if (eos.hasKey("molar-density")) {
138 eos.convert("molar-density", "kmol/m^3"));
139 } else if (eos.hasKey("molar-volume")) {
141 eos.convert("molar-volume", "m^3/kmol"));
142 } else {
143 throw InputFileError("StoichSubstance::initThermo", eos,
144 "equation-of-state entry for species '{}' is missing 'density',"
145 " 'molar-volume' or 'molar-density' specification",
146 speciesName(0));
147 }
148 } else if (m_input.hasKey("density")) {
149 assignDensity(m_input.convert("density", "kg/m^3"));
150 }
151
152 // Store the reference pressure in the variables for the class.
153 m_p0 = refPressure();
154
155 // Call the base class thermo initializer
157}
158
159void StoichSubstance::getSpeciesParameters(const std::string& name,
160 AnyMap& speciesNode) const
161{
163 size_t k = speciesIndex(name);
164 const auto S = species(k);
165 auto& eosNode = speciesNode["equation-of-state"].getMapWhere(
166 "model", "constant-volume", true);
167 // Output volume information in a form consistent with the input
168 if (S->input.hasKey("equation-of-state")) {
169 auto& eosIn = S->input["equation-of-state"];
170 if (eosIn.hasKey("density")) {
171 eosNode["density"].setQuantity(density(), "kg/m^3");
172 } else if (eosIn.hasKey("molar-density")) {
173 eosNode["molar-density"].setQuantity(density() / meanMolecularWeight(),
174 "kmol/m^3");
175 } else {
176 eosNode["molar-volume"].setQuantity(meanMolecularWeight() / density(),
177 "m^3/kmol");
178 }
179 } else {
180 eosNode["molar-volume"].setQuantity(meanMolecularWeight() / density(), "m^3/kmol");
181 }
182}
183
184void StoichSubstance::initThermoXML(XML_Node& phaseNode, const std::string& id_)
185{
186 // Find the Thermo XML node
187 if (!phaseNode.hasChild("thermo")) {
188 throw CanteraError("StoichSubstance::initThermoXML",
189 "no thermo XML node");
190 }
191 XML_Node& tnode = phaseNode.child("thermo");
192 std::string model = tnode["model"];
193 if (model != "StoichSubstance" && model != "StoichSubstanceSSTP") {
194 throw CanteraError("StoichSubstance::initThermoXML",
195 "thermo model attribute must be StoichSubstance");
196 }
197 double dens = getFloat(tnode, "density", "toSI");
198 assignDensity(dens);
199 SingleSpeciesTP::initThermoXML(phaseNode, id_);
200}
201
202void StoichSubstance::setParameters(int n, doublereal* const c)
203{
204 assignDensity(c[0]);
205}
206
207void StoichSubstance::getParameters(int& n, doublereal* const c) const
208{
209 n = 1;
210 c[0] = density();
211}
212
214{
215 std::string model = eosdata["model"];
216 if (model != "StoichSubstance" && model != "StoichSubstanceSSTP") {
217 throw CanteraError("StoichSubstance::setParametersFromXML",
218 "thermo model attribute must be StoichSubstance");
219 }
220 assignDensity(getFloat(eosdata, "density", "toSI"));
221}
222
223}
Declaration for class Cantera::Species.
Header file for the StoichSubstance class, which represents a fixed-composition incompressible substa...
Headers for the factory class that can create known ThermoPhase objects (see Thermodynamic Properties...
A map of string keys to values whose type can vary at runtime.
Definition: AnyMap.h:399
double convert(const std::string &key, const std::string &units) const
Convert the item stored by the given key to the units specified in units.
Definition: AnyMap.cpp:1508
bool hasKey(const std::string &key) const
Returns true if the map contains an item named key.
Definition: AnyMap.cpp:1406
Base class for exceptions thrown by Cantera classes.
Definition: ctexceptions.h:61
Error thrown for problems processing information contained in an AnyMap or AnyValue.
Definition: AnyMap.h:702
double molarDensity() const
Molar density (kmol/m^3).
Definition: Phase.cpp:671
void assignDensity(const double density_)
Set the internally stored constant density (kg/m^3) of the phase.
Definition: Phase.cpp:698
std::string name() const
Return the name of the phase.
Definition: Phase.cpp:70
size_t m_kk
Number of species in the phase.
Definition: Phase.h:943
std::string speciesName(size_t k) const
Name of the species with index k.
Definition: Phase.cpp:200
doublereal meanMolecularWeight() const
The mean molecular weight. Units: (kg/kmol)
Definition: Phase.h:751
virtual double density() const
Density (kg/m^3).
Definition: Phase.h:679
size_t speciesIndex(const std::string &name) const
Returns the index of a species named 'name' within the Phase object.
Definition: Phase.cpp:187
shared_ptr< Species > species(const std::string &name) const
Return the Species object for the named species.
Definition: Phase.cpp:950
doublereal m_press
The current pressure of the solution (Pa). It gets initialized to 1 atm.
double m_h0_RT
Dimensionless enthalpy at the (mtlast, m_p0)
double m_s0_R
Dimensionless entropy at the (mtlast, m_p0)
virtual void getEntropy_R_ref(doublereal *er) const
Returns the vector of nondimensional entropies of the reference state at the current temperature of t...
double m_cp0_R
Dimensionless heat capacity at the (mtlast, m_p0)
virtual void getEnthalpy_RT_ref(doublereal *hrt) const
Returns the vector of nondimensional enthalpies of the reference state at the current temperature of ...
virtual void getGibbs_RT(doublereal *grt) const
Get the nondimensional Gibbs functions for the species in their standard states at the current T and ...
virtual doublereal pressure() const
Report the Pressure. Units: Pa.
StoichSubstance(const std::string &infile="", const std::string &id="")
Construct and initialize a StoichSubstance ThermoPhase object directly from an ASCII input file.
virtual void initThermoXML(XML_Node &phaseNode, const std::string &id)
Import and initialize a ThermoPhase object using an XML tree.
virtual doublereal logStandardConc(size_t k=0) const
Natural logarithm of the standard concentration of the kth species.
virtual void getActivityConcentrations(doublereal *c) const
This method returns an array of generalized concentrations.
virtual doublereal thermalExpansionCoeff() const
Return the volumetric thermal expansion coefficient. Units: 1/K.
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 getStandardChemPotentials(doublereal *mu0) const
Get the array of chemical potentials at unit activity for the species at their standard states at the...
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 setPressure(doublereal p)
Set the pressure at constant temperature. Units: Pa.
virtual void initThermo()
Initialize the ThermoPhase object after all species have been set up.
virtual void getIntEnergy_RT_ref(doublereal *urt) const
Returns the vector of nondimensional internal Energies of the reference state at the current temperat...
virtual void getIntEnergy_RT(doublereal *urt) const
Returns the vector of nondimensional Internal Energies of the standard state species at the current T...
virtual Units standardConcentrationUnits() const
Returns the units of the "standard concentration" for this phase.
virtual void setParametersFromXML(const XML_Node &eosdata)
Set equation of state parameter values from XML entries.
virtual void getSpeciesParameters(const std::string &name, AnyMap &speciesNode) const
Get phase-specific parameters of a Species object such that an identical one could be reconstructed a...
virtual void setParameters(int n, doublereal *const c)
Set the equation of state parameters.
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 getParameters(int &n, doublereal *const c) const
Get the equation of state parameters in a vector.
virtual doublereal isothermalCompressibility() const
Returns the isothermal compressibility. Units: 1/Pa.
virtual doublereal standardConcentration(size_t k=0) const
Return the standard concentration for the kth species.
doublereal RT() const
Return the Gas Constant multiplied by the current temperature.
Definition: ThermoPhase.h:782
void initThermoFile(const std::string &inputFile, const std::string &id)
virtual void initThermoXML(XML_Node &phaseNode, const std::string &id)
Import and initialize a ThermoPhase object using an XML tree.
virtual doublereal refPressure() const
Returns the reference pressure in Pa.
Definition: ThermoPhase.h:150
virtual void initThermo()
Initialize the ThermoPhase object after all species have been set up.
AnyMap m_input
Data supplied via setParameters.
Definition: ThermoPhase.h:1898
const AnyMap & input() const
Access input data associated with the phase description.
virtual void getSpeciesParameters(const std::string &name, AnyMap &speciesNode) const
Get phase-specific parameters of a Species object such that an identical one could be reconstructed a...
Definition: ThermoPhase.h:1726
A representation of the units associated with a dimensional quantity.
Definition: Units.h:30
Class XML_Node is a tree-based representation of the contents of an XML file.
Definition: xml.h:103
bool hasChild(const std::string &ch) const
Tests whether the current node has a child node with a particular name.
Definition: xml.cpp:529
XML_Node & child(const size_t n) const
Return a changeable reference to the n'th child of the current node.
Definition: xml.cpp:547
CTML ("Cantera Markup Language") is the variant of XML that Cantera uses to store data.
void importPhase(XML_Node &phase, ThermoPhase *th)
Import a phase information into an empty ThermoPhase object.
Namespace for the Cantera kernel.
Definition: AnyMap.h:29
doublereal getFloat(const XML_Node &parent, const std::string &name, const std::string &type="")
Get a floating-point value from a child element.
Definition: ctml.cpp:166