Cantera  3.1.0a1
SurfPhase.cpp
Go to the documentation of this file.
1 /**
2  * @file SurfPhase.cpp
3  * Definitions for a simple thermodynamic model of a surface phase
4  * derived from ThermoPhase, assuming an ideal solution model
5  * (see @ref thermoprops and class
6  * @link Cantera::SurfPhase SurfPhase@endlink).
7  */
8 
9 // This file is part of Cantera. See License.txt in the top-level directory or
10 // at https://cantera.org/license.txt for license and copyright information.
11 
15 #include "cantera/thermo/Species.h"
17 #include "cantera/base/utilities.h"
18 
19 namespace Cantera
20 {
21 
22 SurfPhase::SurfPhase(const string& infile, const string& id_)
23 {
24  setNDim(2);
25  initThermoFile(infile, id_);
26 }
27 
29 {
30  if (m_n0 <= 0.0) {
31  return 0.0;
32  }
33  _updateThermo();
34  return mean_X(m_h0);
35 }
36 
38 {
39  return enthalpy_mole();
40 }
41 
43 {
44  _updateThermo();
45  double s = 0.0;
46  for (size_t k = 0; k < m_kk; k++) {
47  s += moleFraction(k) * (m_s0[k] -
48  GasConstant * log(std::max(concentration(k) * size(k)/m_n0, SmallNumber)));
49  }
50  return s;
51 }
52 
53 double SurfPhase::cp_mole() const
54 {
55  _updateThermo();
56  return mean_X(m_cp0);
57 }
58 
59 double SurfPhase::cv_mole() const
60 {
61  return cp_mole();
62 }
63 
64 void SurfPhase::getPartialMolarEnthalpies(double* hbar) const
65 {
66  getEnthalpy_RT(hbar);
67  for (size_t k = 0; k < m_kk; k++) {
68  hbar[k] *= RT();
69  }
70 }
71 
72 void SurfPhase::getPartialMolarEntropies(double* sbar) const
73 {
74  getEntropy_R(sbar);
76  for (size_t k = 0; k < m_kk; k++) {
77  sbar[k] -= log(std::max(m_work[k], SmallNumber)) - logStandardConc(k);
78  sbar[k] *= GasConstant;
79  }
80 }
81 
82 void SurfPhase::getPartialMolarCp(double* cpbar) const
83 {
84  getCp_R(cpbar);
85  for (size_t k = 0; k < m_kk; k++) {
86  cpbar[k] *= GasConstant;
87  }
88 }
89 
90 // HKM 9/1/11 The partial molar volumes returned here are really partial molar areas.
91 // Partial molar volumes for this phase should actually be equal to zero.
92 void SurfPhase::getPartialMolarVolumes(double* vbar) const
93 {
94  getStandardVolumes(vbar);
95 }
96 
97 void SurfPhase::getStandardChemPotentials(double* mu0) const
98 {
99  _updateThermo();
100  copy(m_mu0.begin(), m_mu0.end(), mu0);
101 }
102 
103 void SurfPhase::getChemPotentials(double* mu) const
104 {
105  _updateThermo();
106  copy(m_mu0.begin(), m_mu0.end(), mu);
108  for (size_t k = 0; k < m_kk; k++) {
109  mu[k] += RT() * (log(std::max(m_work[k], SmallNumber)) - logStandardConc(k));
110  }
111 }
112 
114 {
116 }
117 
118 double SurfPhase::standardConcentration(size_t k) const
119 {
120  return m_n0/size(k);
121 }
122 
123 double SurfPhase::logStandardConc(size_t k) const
124 {
125  return m_logn0 - m_logsize[k];
126 }
127 
128 void SurfPhase::getPureGibbs(double* g) const
129 {
130  _updateThermo();
131  copy(m_mu0.begin(), m_mu0.end(), g);
132 }
133 
134 void SurfPhase::getGibbs_RT(double* grt) const
135 {
136  _updateThermo();
137  scale(m_mu0.begin(), m_mu0.end(), grt, 1.0/RT());
138 }
139 
140 void SurfPhase::getEnthalpy_RT(double* hrt) const
141 {
142  _updateThermo();
143  scale(m_h0.begin(), m_h0.end(), hrt, 1.0/RT());
144 }
145 
146 void SurfPhase::getEntropy_R(double* sr) const
147 {
148  _updateThermo();
149  scale(m_s0.begin(), m_s0.end(), sr, 1.0/GasConstant);
150 }
151 
152 void SurfPhase::getCp_R(double* cpr) const
153 {
154  _updateThermo();
155  scale(m_cp0.begin(), m_cp0.end(), cpr, 1.0/GasConstant);
156 }
157 
158 void SurfPhase::getStandardVolumes(double* vol) const
159 {
160  for (size_t k = 0; k < m_kk; k++) {
161  vol[k] = 0.0;
162  }
163 }
164 
165 void SurfPhase::getGibbs_RT_ref(double* grt) const
166 {
167  getGibbs_RT(grt);
168 }
169 
170 void SurfPhase::getEnthalpy_RT_ref(double* hrt) const
171 {
172  getEnthalpy_RT(hrt);
173 }
174 
175 void SurfPhase::getEntropy_R_ref(double* sr) const
176 {
177  getEntropy_R(sr);
178 }
179 
180 void SurfPhase::getCp_R_ref(double* cprt) const
181 {
182  getCp_R(cprt);
183 }
184 
185 bool SurfPhase::addSpecies(shared_ptr<Species> spec)
186 {
187  bool added = ThermoPhase::addSpecies(spec);
188  if (added) {
189  m_h0.push_back(0.0);
190  m_s0.push_back(0.0);
191  m_cp0.push_back(0.0);
192  m_mu0.push_back(0.0);
193  m_work.push_back(0.0);
194  m_speciesSize.push_back(spec->size);
195  m_logsize.push_back(log(spec->size));
196  if (m_kk == 1) {
197  vector<double> cov{1.0};
198  setCoverages(cov.data());
199  }
200  }
201  return added;
202 }
203 
205 {
206  if (n0 <= 0.0) {
207  throw CanteraError("SurfPhase::setSiteDensity",
208  "Site density must be positive. Got {}", n0);
209  }
210  m_n0 = n0;
212  m_logn0 = log(m_n0);
213 }
214 
215 void SurfPhase::setCoverages(const double* theta)
216 {
217  double sum = 0.0;
218  for (size_t k = 0; k < m_kk; k++) {
219  sum += theta[k] / size(k);
220  }
221  if (sum <= 0.0) {
222  throw CanteraError("SurfPhase::setCoverages",
223  "Sum of Coverage fractions is zero or negative");
224  }
225  for (size_t k = 0; k < m_kk; k++) {
226  m_work[k] = theta[k] / (sum * size(k));
227  }
228  setMoleFractions(m_work.data());
229 }
230 
231 void SurfPhase::setCoveragesNoNorm(const double* theta)
232 {
233  double sum = 0.0;
234  double sum2 = 0.0;
235  for (size_t k = 0; k < m_kk; k++) {
236  sum += theta[k] / size(k);
237  sum2 += theta[k];
238  }
239  if (sum <= 0.0) {
240  throw CanteraError("SurfPhase::setCoverages",
241  "Sum of Coverage fractions is zero or negative");
242  }
243  for (size_t k = 0; k < m_kk; k++) {
244  m_work[k] = theta[k] * sum2 / (sum * size(k));
245  }
247 }
248 
249 void SurfPhase::getCoverages(double* theta) const
250 {
251  double sum_X = 0.0;
252  double sum_X_s = 0.0;
253  getMoleFractions(theta);
254  for (size_t k = 0; k < m_kk; k++) {
255  sum_X += theta[k];
256  sum_X_s += theta[k] * size(k);
257  }
258  for (size_t k = 0; k < m_kk; k++) {
259  theta[k] *= size(k) * sum_X / sum_X_s;
260  }
261 }
262 
263 void SurfPhase::setCoveragesByName(const string& cov)
264 {
266 }
267 
269 {
270  vector<double> cv(m_kk, 0.0);
271  bool ifound = false;
272  for (size_t k = 0; k < m_kk; k++) {
273  double c = getValue(cov, speciesName(k), 0.0);
274  if (c > 0.0) {
275  ifound = true;
276  cv[k] = c;
277  }
278  }
279  if (!ifound) {
280  throw CanteraError("SurfPhase::setCoveragesByName",
281  "Input coverages are all zero or negative");
282  }
283  setCoverages(cv.data());
284 }
285 
286 void SurfPhase::setState(const AnyMap& state) {
287  if (state.hasKey("coverages")) {
288  if (state["coverages"].is<string>()) {
289  setCoveragesByName(state["coverages"].asString());
290  } else {
291  setCoveragesByName(state["coverages"].asMap<double>());
292  }
293  }
294  ThermoPhase::setState(state);
295 }
296 
298 {
301 }
302 
303 void SurfPhase::_updateThermo(bool force) const
304 {
305  double tnow = temperature();
306  if (m_tlast != tnow || force) {
307  m_spthermo.update(tnow, m_cp0.data(), m_h0.data(), m_s0.data());
308  m_tlast = tnow;
309  for (size_t k = 0; k < m_kk; k++) {
310  m_h0[k] *= GasConstant * tnow;
311  m_s0[k] *= GasConstant;
312  m_cp0[k] *= GasConstant;
313  m_mu0[k] = m_h0[k] - tnow*m_s0[k];
314  }
315  m_tlast = tnow;
316  }
317 }
318 
320 {
321  if (m_input.hasKey("site-density")) {
322  // Units are kmol/m^2 for surface phases or kmol/m for edge phases
323  setSiteDensity(m_input.convert("site-density",
324  Units(1.0, 0, -static_cast<double>(m_ndim), 0, 0, 0, 1)));
325  }
326 }
327 
328 void SurfPhase::getParameters(AnyMap& phaseNode) const
329 {
330  ThermoPhase::getParameters(phaseNode);
331  phaseNode["site-density"].setQuantity(
332  m_n0, Units(1.0, 0, -static_cast<double>(m_ndim), 0, 0, 0, 1));
333 }
334 
335 EdgePhase::EdgePhase(const string& infile, const string& id_)
336 {
337  setNDim(1);
338  initThermoFile(infile, id_);
339 }
340 
341 }
Declarations for the EdgePhase ThermoPhase object, which models the interface between two surfaces (s...
Declaration for class Cantera::Species.
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.
Definition: AnyMap.h:427
bool hasKey(const string &key) const
Returns true if the map contains an item named key.
Definition: AnyMap.cpp:1423
double convert(const string &key, const string &units) const
Convert the item stored by the given key to the units specified in units.
Definition: AnyMap.cpp:1535
Base class for exceptions thrown by Cantera classes.
Definition: ctexceptions.h:66
EdgePhase(const string &infile="", const string &id="")
Construct and initialize an EdgePhase directly from an input file.
Definition: SurfPhase.cpp:335
virtual void update(double T, double *cp_R, double *h_RT, double *s_R) const
Compute the reference-state properties for all species.
virtual void getConcentrations(double *const c) const
Get the species concentrations (kmol/m^3).
Definition: Phase.cpp:482
void assignDensity(const double density_)
Set the internally stored constant density (kg/m^3) of the phase.
Definition: Phase.cpp:597
virtual void setMoleFractions(const double *const x)
Set the mole fractions to the specified values.
Definition: Phase.cpp:289
void setNDim(size_t ndim)
Set the number of spatial dimensions (1, 2, or 3).
Definition: Phase.h:553
size_t m_kk
Number of species in the phase.
Definition: Phase.h:842
size_t m_ndim
Dimensionality of the phase.
Definition: Phase.h:846
double temperature() const
Temperature (K).
Definition: Phase.h:562
double meanMolecularWeight() const
The mean molecular weight. Units: (kg/kmol)
Definition: Phase.h:655
virtual double concentration(const size_t k) const
Concentration of species k.
Definition: Phase.cpp:476
string speciesName(size_t k) const
Name of the species with index k.
Definition: Phase.cpp:142
void getMoleFractions(double *const x) const
Get the species mole fraction vector.
Definition: Phase.cpp:434
double moleFraction(size_t k) const
Return the mole fraction of a single species.
Definition: Phase.cpp:439
virtual void compositionChanged()
Apply changes to the state which are needed after the composition changes.
Definition: Phase.cpp:905
double mean_X(const double *const Q) const
Evaluate the mole-fraction-weighted mean of an array Q.
Definition: Phase.cpp:616
const vector< string > & speciesNames() const
Return a const reference to the vector of species names.
Definition: Phase.cpp:148
virtual void setMoleFractions_NoNorm(const double *const x)
Set the mole fractions to the specified values without normalizing.
Definition: Phase.cpp:321
SurfPhase(const string &infile="", const string &id="")
Construct and initialize a SurfPhase ThermoPhase object directly from an input file.
Definition: SurfPhase.cpp:22
void getStandardChemPotentials(double *mu0) const override
Get the array of chemical potentials at unit activity for the species at their standard states at the...
Definition: SurfPhase.cpp:97
void getPureGibbs(double *g) const override
Get the Gibbs functions for the standard state of the species at the current T and P of the solution.
Definition: SurfPhase.cpp:128
double enthalpy_mole() const override
Return the Molar Enthalpy. Units: J/kmol.
Definition: SurfPhase.cpp:28
void setSiteDensity(double n0)
Set the site density of the surface phase (kmol m-2)
Definition: SurfPhase.cpp:204
double logStandardConc(size_t k=0) const override
Natural logarithm of the standard concentration of the kth species.
Definition: SurfPhase.cpp:123
void setState(const AnyMap &state) override
Set the state using an AnyMap containing any combination of properties supported by the thermodynamic...
Definition: SurfPhase.cpp:286
void getPartialMolarEnthalpies(double *hbar) const override
Returns an array of partial molar enthalpies for the species in the mixture.
Definition: SurfPhase.cpp:64
void getChemPotentials(double *mu) const override
Get the species chemical potentials. Units: J/kmol.
Definition: SurfPhase.cpp:103
void getEntropy_R(double *sr) const override
Get the array of nondimensional Entropy functions for the standard state species at the current T and...
Definition: SurfPhase.cpp:146
vector< double > m_logsize
vector storing the log of the size of each species.
Definition: SurfPhase.h:342
vector< double > m_work
Temporary work array.
Definition: SurfPhase.h:335
void getCp_R(double *cpr) const override
Get the nondimensional Heat Capacities at constant pressure for the species standard states at the cu...
Definition: SurfPhase.cpp:152
void getParameters(AnyMap &phaseNode) const override
Store the parameters of a ThermoPhase object such that an identical one could be reconstructed using ...
Definition: SurfPhase.cpp:328
void initThermo() override
Initialize the ThermoPhase object after all species have been set up.
Definition: SurfPhase.cpp:319
void getActivityConcentrations(double *c) const override
Return a vector of activity concentrations for each species.
Definition: SurfPhase.cpp:113
double m_n0
Surface site density (kmol m-2)
Definition: SurfPhase.h:311
double size(size_t k) const
Returns the number of sites occupied by one molecule of species k.
Definition: SurfPhase.h:221
vector< double > m_h0
Temporary storage for the reference state enthalpies.
Definition: SurfPhase.h:323
void getPartialMolarVolumes(double *vbar) const override
Return an array of partial molar volumes for the species in the mixture.
Definition: SurfPhase.cpp:92
double cv_mole() const override
Molar heat capacity at constant volume. Units: J/kmol/K.
Definition: SurfPhase.cpp:59
vector< double > m_s0
Temporary storage for the reference state entropies.
Definition: SurfPhase.h:326
void setCoverages(const double *theta)
Set the surface site fractions to a specified state.
Definition: SurfPhase.cpp:215
vector< double > m_cp0
Temporary storage for the reference state heat capacities.
Definition: SurfPhase.h:329
vector< double > m_speciesSize
Vector of species sizes (number of sites occupied). length m_kk.
Definition: SurfPhase.h:314
void getEnthalpy_RT(double *hrt) const override
Get the nondimensional Enthalpy functions for the species at their standard states at the current T a...
Definition: SurfPhase.cpp:140
void getEntropy_R_ref(double *er) const override
Returns the vector of nondimensional entropies of the reference state at the current temperature of t...
Definition: SurfPhase.cpp:175
void getGibbs_RT(double *grt) const override
Get the nondimensional Gibbs functions for the species in their standard states at the current T and ...
Definition: SurfPhase.cpp:134
double intEnergy_mole() const override
Return the Molar Internal Energy. Units: J/kmol.
Definition: SurfPhase.cpp:37
double entropy_mole() const override
Return the Molar Entropy. Units: J/kmol-K.
Definition: SurfPhase.cpp:42
void _updateThermo(bool force=false) const
Update the species reference state thermodynamic functions.
Definition: SurfPhase.cpp:303
void getCp_R_ref(double *cprt) const override
Returns the vector of nondimensional constant pressure heat capacities of the reference state at the ...
Definition: SurfPhase.cpp:180
void getStandardVolumes(double *vol) const override
Get the molar volumes of the species standard states at the current T and P of the solution.
Definition: SurfPhase.cpp:158
void setCoveragesNoNorm(const double *theta)
Set the surface site fractions to a specified state.
Definition: SurfPhase.cpp:231
void getCoverages(double *theta) const
Return a vector of surface coverages.
Definition: SurfPhase.cpp:249
double cp_mole() const override
Molar heat capacity at constant pressure. Units: J/kmol/K.
Definition: SurfPhase.cpp:53
void getPartialMolarCp(double *cpbar) const override
Return an array of partial molar heat capacities for the species in the mixture.
Definition: SurfPhase.cpp:82
void compositionChanged() override
Apply changes to the state which are needed after the composition changes.
Definition: SurfPhase.cpp:297
double standardConcentration(size_t k=0) const override
Return the standard concentration for the kth species.
Definition: SurfPhase.cpp:118
vector< double > m_mu0
Temporary storage for the reference state Gibbs energies.
Definition: SurfPhase.h:332
bool addSpecies(shared_ptr< Species > spec) override
Add a Species to this Phase.
Definition: SurfPhase.cpp:185
void setCoveragesByName(const string &cov)
Set the coverages from a string of colon-separated name:value pairs.
Definition: SurfPhase.cpp:263
void getGibbs_RT_ref(double *grt) const override
Returns the vector of nondimensional Gibbs Free Energies of the reference state at the current temper...
Definition: SurfPhase.cpp:165
double m_logn0
log of the surface site density
Definition: SurfPhase.h:317
void getPartialMolarEntropies(double *sbar) const override
Returns an array of partial molar entropies of the species in the solution.
Definition: SurfPhase.cpp:72
void getEnthalpy_RT_ref(double *hrt) const override
Returns the vector of nondimensional enthalpies of the reference state at the current temperature of ...
Definition: SurfPhase.cpp:170
virtual void getParameters(AnyMap &phaseNode) const
Store the parameters of a ThermoPhase object such that an identical one could be reconstructed using ...
virtual void setState(const AnyMap &state)
Set the state using an AnyMap containing any combination of properties supported by the thermodynamic...
double RT() const
Return the Gas Constant multiplied by the current temperature.
Definition: ThermoPhase.h:1062
double m_tlast
last value of the temperature processed by reference state
Definition: ThermoPhase.h:1985
void initThermoFile(const string &inputFile, const string &id)
Initialize a ThermoPhase object using an input file.
MultiSpeciesThermo m_spthermo
Pointer to the calculation manager for species reference-state thermodynamic properties.
Definition: ThermoPhase.h:1962
bool addSpecies(shared_ptr< Species > spec) override
Add a Species to this Phase.
AnyMap m_input
Data supplied via setParameters.
Definition: ThermoPhase.h:1966
A representation of the units associated with a dimensional quantity.
Definition: Units.h:35
Composition parseCompString(const string &ss, const vector< string > &names)
Parse a composition string into a map consisting of individual key:composition pairs.
Definition: stringUtils.cpp:58
void scale(InputIter begin, InputIter end, OutputIter out, S scale_factor)
Multiply elements of an array by a scale factor.
Definition: utilities.h:104
const double GasConstant
Universal Gas Constant [J/kmol/K].
Definition: ct_defs.h:120
Namespace for the Cantera kernel.
Definition: AnyMap.cpp:564
const double SmallNumber
smallest number to compare to zero.
Definition: ct_defs.h:158
const U & getValue(const map< T, U > &m, const T &key, const U &default_val)
Const accessor for a value in a map.
Definition: utilities.h:190
map< string, double > Composition
Map from string names to doubles.
Definition: ct_defs.h:177
Contains declarations for string manipulation functions within Cantera.
Various templated functions that carry out common vector and polynomial operations (see Templated Arr...