41#include <boost/algorithm/string.hpp> 
   73    reg(
"HMW-electrolyte", []() { 
return new HMWSoln(); });
 
   95    reg(
"liquid-water-IAPWS95", []() { 
return new WaterSSTP(); });
 
  127    if (!phaseNode.
hasKey(
"kinetics") && phaseNode.
hasKey(
"reactions")) {
 
  129            "Phase entry includes a 'reactions' field but does not " 
  130            "specify a kinetics model.");
 
  132    string model = phaseNode[
"thermo"].asString();
 
  138shared_ptr<ThermoPhase> 
newThermo(
const string& infile, 
const string& 
id)
 
  140    size_t dot = infile.find_last_of(
".");
 
  147    if (extension == 
"cti" || extension == 
"xml") {
 
  149                           "The CTI and XML formats are no longer supported.");
 
  153    AnyMap& phase = root[
"phases"].getMapWhere(
"name", id_);
 
  157void addDefaultElements(ThermoPhase& thermo, 
const vector<string>& element_names) {
 
  158    for (
const auto& symbol : element_names) {
 
  159        thermo.addElement(symbol);
 
  163void addElements(ThermoPhase& thermo, 
const vector<string>& element_names,
 
  164                 const AnyValue& elements, 
bool allow_default)
 
  166    const auto& local_elements = elements.asMap(
"symbol");
 
  167    for (
const auto& symbol : element_names) {
 
  168        if (local_elements.count(symbol)) {
 
  169            auto& element = *local_elements.at(symbol);
 
  170            double weight = element[
"atomic-weight"].asDouble();
 
  171            long int number = element.getInt(
"atomic-number", 0);
 
  173            thermo.addElement(symbol, weight, number, e298);
 
  174        } 
else if (allow_default) {
 
  175            thermo.addElement(symbol);
 
  177            throw InputFileError(
"addElements", elements,
 
  178                                 "Element '{}' not found", symbol);
 
  183void addSpecies(ThermoPhase& thermo, 
const AnyValue& names, 
const AnyValue& species)
 
  185    if (names.is<vector<string>>()) {
 
  187        const auto& species_nodes = species.asMap(
"name");
 
  188        for (
const auto& name : names.asVector<string>()) {
 
  189            if (species_nodes.count(name)) {
 
  190                thermo.addSpecies(
newSpecies(*species_nodes.at(name)));
 
  192                throw InputFileError(
"addSpecies", names, species,
 
  193                    "Could not find a species named '{}'.", name);
 
  196    } 
else if (names == 
"all") {
 
  198        for (
const auto& item : species.asVector<AnyMap>()) {
 
  202        throw InputFileError(
"addSpecies", names,
 
  203            "Could not parse species declaration of type '{}'", names.type_str());
 
  209    thermo.
setName(phaseNode[
"name"].asString());
 
  211    if (phaseNode.
hasKey(
"deprecated")) {
 
  212        string msg = phaseNode[
"deprecated"].asString();
 
  213        string filename = phaseNode.
getString(
"__file__",
 
  214            rootNode.
getString(
"__file__", 
"unknown file"));
 
  215        string method = fmt::format(
"{}/{}", filename, phaseNode[
"name"].asString());
 
  220    if (phaseNode.
hasKey(
"elements")) {
 
  221        if (phaseNode.
getBool(
"skip-undeclared-elements", 
false)) {
 
  227        if (phaseNode[
"elements"].is<vector<string>>()) {
 
  229            if (rootNode.
hasKey(
"elements")) {
 
  230                addElements(thermo, phaseNode[
"elements"].asVector<string>(),
 
  231                            rootNode[
"elements"], 
true);
 
  233                addDefaultElements(thermo, phaseNode[
"elements"].asVector<string>());
 
  235        } 
else if (phaseNode[
"elements"].is<vector<AnyMap>>()) {
 
  239            for (
const auto& elemNode : phaseNode[
"elements"].asVector<
AnyMap>()) {
 
  240                const string& source = elemNode.begin()->first;
 
  241                const auto& names = elemNode.begin()->second.asVector<
string>();
 
  242                const auto& slash = boost::ifind_last(source, 
"/");
 
  244                    string fileName(source.begin(), slash.begin());
 
  245                    string node(slash.end(), source.end());
 
  248                    addElements(thermo, names, elements.
at(node), 
false);
 
  249                } 
else if (rootNode.
hasKey(source)) {
 
  250                    addElements(thermo, names, rootNode.
at(source), 
false);
 
  251                } 
else if (source == 
"default") {
 
  252                    addDefaultElements(thermo, names);
 
  255                        "Could not find elements section named '{}'", source);
 
  260                "Could not parse elements declaration of type '{}'",
 
  261                phaseNode[
"elements"].type_str());
 
  270    if (phaseNode.
hasKey(
"species")) {
 
  271        if (phaseNode[
"species"].is<vector<string>>()) {
 
  274            addSpecies(thermo, phaseNode[
"species"], rootNode[
"species"]);
 
  275        } 
else if (phaseNode[
"species"].is<string>()) {
 
  278            addSpecies(thermo, phaseNode[
"species"], rootNode[
"species"]);
 
  279        } 
else if (phaseNode[
"species"].is<vector<AnyMap>>()) {
 
  283            for (
const auto& speciesNode : phaseNode[
"species"].asVector<
AnyMap>()) {
 
  284                const string& source = speciesNode.begin()->first;
 
  285                const auto& names = speciesNode.begin()->second;
 
  286                const auto& slash = boost::ifind_last(source, 
"/");
 
  289                    string fileName(source.begin(), slash.begin());
 
  290                    string node(slash.end(), source.end());
 
  293                    addSpecies(thermo, names, species[node]);
 
  294                } 
else if (rootNode.
hasKey(source)) {
 
  296                    addSpecies(thermo, names, rootNode[source]);
 
  299                        "Could not find species section named '{}'", source);
 
  304                "Could not parse species declaration of type '{}'",
 
  305                phaseNode[
"species"].type_str());
 
  307    } 
else if (rootNode.
hasKey(
"species")) {
 
  309        addSpecies(thermo, 
AnyValue(
"all"), rootNode[
"species"]);
 
  314        for (
size_t k = 0; k < thermo.
nSpecies(); k++) {
 
  315            unique_ptr<PDSS> pdss;
 
  316            if (!thermo.
species(k)->input.hasKey(
"equation-of-state")) {
 
  318                    "Species '{}' in use by a ThermoPhase model of type '{}'\n" 
  319                    "must define an 'equation-of-state' field.",
 
  323            auto& eos = thermo.
species(k)->input[
"equation-of-state"];
 
  325            for (
auto& node : eos.asVector<
AnyMap>()) {
 
  326                string model = node[
"model"].asString();
 
  328                    pdss.reset(newPDSS(model));
 
  329                    pdss->setParameters(node);
 
  336                    "Could not find an equation-of-state specification " 
  337                    "which defines a known PDSS model.");
 
  339            vpssThermo->installPDSS(k, std::move(pdss));
 
  346    if (phaseNode.
hasKey(
"state")) {
 
  347        auto node = phaseNode[
"state"].as<
AnyMap>();
 
Header file for an binary solution model with tabulated standard state thermodynamic data (see Thermo...
 
Header for a thermodynamics model of a coverage-dependent surface phase derived from SurfPhase,...
 
Headers for the DebyeHuckel ThermoPhase object, which models dilute electrolyte solutions (see Thermo...
 
Declarations for the EdgePhase ThermoPhase object, which models the interface between two surfaces (s...
 
#define ENTROPY298_UNKNOWN
Number indicating we don't know the entropy of the element in its most stable state at 298....
 
Headers for the HMWSoln ThermoPhase object, which models concentrated electrolyte solutions (see Ther...
 
ThermoPhase object for the ideal gas equation of state - workhorse for Cantera (see Thermodynamic Pro...
 
ThermoPhase object for the ideal molal equation of state (see Thermodynamic Properties and class Idea...
 
Header file for an ideal solid solution model with incompressible thermodynamics (see Thermodynamic P...
 
Definition file for a derived class of ThermoPhase that assumes an ideal solution approximation and h...
 
Header for a simple thermodynamics model of a bulk phase derived from ThermoPhase,...
 
Header for a simple thermodynamics model of a bulk solid phase derived from ThermoPhase,...
 
(see Thermodynamic Properties and class MargulesVPSSTP).
 
Header for a general species thermodynamic property manager for a phase (see MultiSpeciesThermo).
 
Header file for class PlasmaPhase.
 
Header for a ThermoPhase class for a pure fluid phase consisting of gas, liquid, mixed-gas-liquid and...
 
(see Thermodynamic Properties and class RedlichKisterVPSSTP).
 
Header for factory functions to build instances of classes that manage the standard-state thermodynam...
 
Declaration for class Cantera::Species.
 
Header file for the StoichSubstance class, which represents a fixed-composition incompressible substa...
 
Header for a simple thermodynamics model of a surface phase derived from ThermoPhase,...
 
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.
 
bool hasKey(const string &key) const
Returns true if the map contains an item named key.
 
bool getBool(const string &key, bool default_) const
If key exists, return it as a bool, otherwise return default_.
 
const string & getString(const string &key, const string &default_) const
If key exists, return it as a string, otherwise return default_.
 
static AnyMap fromYamlFile(const string &name, const string &parent_name="")
Create an AnyMap from a YAML file.
 
const AnyValue & at(const string &key) const
Get the value of the item stored in key.
 
A wrapper for a variable whose type is determined at runtime.
 
Overloads the virtual methods of class IdealSolidSolnPhase to implement tabulated standard state ther...
 
Base class for exceptions thrown by Cantera classes.
 
A thermodynamic model for a coverage-dependent surface phase, applying surface species lateral intera...
 
Class DebyeHuckel represents a dilute liquid electrolyte phase which obeys the Debye Huckel formulati...
 
A thermodynamic phase representing a one dimensional edge between two surfaces.
 
void reg(const string &name, function< ThermoPhase *(Args...)> f)
Register a new object construction function.
 
bool exists(const string &name) const
Returns true if name is registered with this factory.
 
void addDeprecatedAlias(const string &original, const string &alias)
Add a deprecated alias for an existing registered type.
 
Class HMWSoln represents a dilute or concentrated liquid electrolyte phase which obeys the Pitzer for...
 
Class IdealGasPhase represents low-density gases that obey the ideal gas equation of state.
 
This phase is based upon the mixing-rule assumption that all molality-based activity coefficients are...
 
Class IdealSolidSolnPhase represents a condensed phase ideal solution compound.
 
An ideal solution approximation of a phase.
 
A simple thermodynamic model for a bulk phase, assuming a lattice of solid atoms.
 
A phase that is comprised of a fixed additive combination of other lattice phases.
 
MargulesVPSSTP is a derived class of GibbsExcessVPSSTP that employs the Margules approximation for th...
 
static PDSSFactory * factory()
Static function that creates a static instance of the factory.
 
Implementation of a multi-species Peng-Robinson equation of state.
 
size_t nSpecies() const
Returns the number of species in the phase.
 
void ignoreUndefinedElements()
Set behavior when adding a species containing undefined elements to just skip the species.
 
void addUndefinedElements()
Set behavior when adding a species containing undefined elements to add those elements to the phase.
 
string speciesName(size_t k) const
Name of the species with index k.
 
shared_ptr< Species > species(const string &name) const
Return the Species object for the named species.
 
void throwUndefinedElements()
Set the behavior when adding a species containing undefined elements to throw an exception.
 
void setName(const string &nm)
Sets the string name for the phase.
 
Base class for handling plasma properties, specifically focusing on the electron energy distribution.
 
This phase object consists of a single component that can be a gas, a liquid, a mixed gas-liquid flui...
 
RedlichKisterVPSSTP is a derived class of GibbsExcessVPSSTP that employs the Redlich-Kister approxima...
 
Implementation of a multi-species Redlich-Kwong equation of state.
 
Class StoichSubstance represents a stoichiometric (fixed composition) incompressible substance.
 
A simple thermodynamic model for a surface phase, assuming an ideal solution model.
 
Factory class for thermodynamic property managers.
 
void deleteFactory() override
delete the static instance of this factory
 
ThermoFactory()
Private constructors prevents usage.
 
static ThermoFactory * factory()
Static function that creates a static instance of the factory.
 
static std::mutex thermo_mutex
Decl for locking mutex for thermo factory singleton.
 
static ThermoFactory * s_factory
static member of a single instance
 
Base class for a phase with thermodynamic properties.
 
virtual void setParameters(const AnyMap &phaseNode, const AnyMap &rootNode=AnyMap())
Set equation of state parameters from an AnyMap phase description.
 
virtual void setState_TP(double t, double p)
Set the temperature (K) and pressure (Pa)
 
virtual void setState(const AnyMap &state)
Set the state using an AnyMap containing any combination of properties supported by the thermodynamic...
 
string type() const override
String indicating the thermodynamic model implemented.
 
virtual void initThermo()
Initialize the ThermoPhase object after all species have been set up.
 
This is a filter class for ThermoPhase that implements some preparatory steps for efficiently handlin...
 
string toLowerCopy(const string &input)
Convert to lower case.
 
double dot(InputIter x_begin, InputIter x_end, InputIter2 y_begin)
Function that calculates a templated inner product.
 
const double OneAtm
One atmosphere [Pa].
 
shared_ptr< ThermoPhase > newThermo(const AnyMap &phaseNode, const AnyMap &rootNode)
Create a new ThermoPhase object and initialize it.
 
void setupPhase(ThermoPhase &thermo, const AnyMap &phaseNode, const AnyMap &rootNode)
Initialize a ThermoPhase object.
 
shared_ptr< ThermoPhase > newThermoModel(const string &model)
Create a new ThermoPhase instance.
 
Namespace for the Cantera kernel.
 
unique_ptr< Species > newSpecies(const AnyMap &node)
Create a new Species object from an AnyMap specification.
 
void warn_deprecated(const string &source, const AnyBase &node, const string &message)
A deprecation warning for syntax in an input file.
 
Contains const definitions for types of species reference-state thermodynamics managers (see Species ...
 
Contains declarations for string manipulation functions within Cantera.