Cantera  3.1.0a1
BulkKinetics.h
Go to the documentation of this file.
1 /**
2  * @file BulkKinetics.h
3  */
4 
5 // This file is part of Cantera. See License.txt in the top-level directory or
6 // at https://cantera.org/license.txt for license and copyright information.
7 
8 #ifndef CT_BULKKINETICS_H
9 #define CT_BULKKINETICS_H
10 
11 #include "Kinetics.h"
12 #include "MultiRate.h"
13 #include "ThirdBodyCalc.h"
14 
15 namespace Cantera
16 {
17 
18 //! Specialization of Kinetics for chemistry in a single bulk phase
19 //! @ingroup kineticsmgr
20 class BulkKinetics : public Kinetics
21 {
22 public:
23  //! @name Constructors and General Information
24  //! @{
25  BulkKinetics();
26 
27  string kineticsType() const override {
28  return "bulk";
29  }
30 
31  bool isReversible(size_t i) override;
32  //! @}
33 
34  //! @name Reaction Mechanism Setup Routines
35  //! @{
36  bool addReaction(shared_ptr<Reaction> r, bool resize=true) override;
37  void addThirdBody(shared_ptr<Reaction> r);
38  void modifyReaction(size_t i, shared_ptr<Reaction> rNew) override;
39  void resizeSpecies() override;
40  void resizeReactions() override;
41  void setMultiplier(size_t i, double f) override;
42  void invalidateCache() override;
43  //! @}
44 
45  //! @name Reaction rate constants, rates of progress, and thermodynamic properties
46  //! @{
47  void getFwdRateConstants(double* kfwd) override;
48  void getEquilibriumConstants(double* kc) override;
49  void getRevRateConstants(double* krev, bool doIrreversible=false) override;
50 
51  void getDeltaGibbs(double* deltaG) override;
52  void getDeltaEnthalpy(double* deltaH) override;
53  void getDeltaEntropy(double* deltaS) override;
54 
55  void getDeltaSSGibbs(double* deltaG) override;
56  void getDeltaSSEnthalpy(double* deltaH) override;
57  void getDeltaSSEntropy(double* deltaS) override;
58  //! @}
59 
60  //! @name Derivatives of rate constants and rates of progress
61  //! @{
62  void getDerivativeSettings(AnyMap& settings) const override;
63  void setDerivativeSettings(const AnyMap& settings) override;
64  void getFwdRateConstants_ddT(double* dkfwd) override;
65  void getFwdRatesOfProgress_ddT(double* drop) override;
66  void getRevRatesOfProgress_ddT(double* drop) override;
67  void getNetRatesOfProgress_ddT(double* drop) override;
68  void getFwdRateConstants_ddP(double* dkfwd) override;
69  void getFwdRatesOfProgress_ddP(double* drop) override;
70  void getRevRatesOfProgress_ddP(double* drop) override;
71  void getNetRatesOfProgress_ddP(double* drop) override;
72  void getFwdRateConstants_ddC(double* dkfwd) override;
73  void getFwdRatesOfProgress_ddC(double* drop) override;
74  void getRevRatesOfProgress_ddC(double* drop) override;
75  void getNetRatesOfProgress_ddC(double* drop) override;
76  Eigen::SparseMatrix<double> fwdRatesOfProgress_ddX() override;
77  Eigen::SparseMatrix<double> revRatesOfProgress_ddX() override;
78  Eigen::SparseMatrix<double> netRatesOfProgress_ddX() override;
79  Eigen::SparseMatrix<double> fwdRatesOfProgress_ddCi() override;
80  Eigen::SparseMatrix<double> revRatesOfProgress_ddCi() override;
81  Eigen::SparseMatrix<double> netRatesOfProgress_ddCi() override;
82  //! @}
83 
84  //! @name Rate calculation intermediate methods
85  //! @{
86 
87  void updateROP() override;
88 
89  void getThirdBodyConcentrations(double* concm) override;
90  const vector<double>& thirdBodyConcentrations() const override {
91  return m_concm;
92  }
93 
94  //! @}
95 
96 protected:
97  //! @name Internal service methods
98  //!
99  //! @note These methods are for internal use, and seek to avoid code duplication
100  //! while evaluating terms used for rate constants, rates of progress, and
101  //! their derivatives.
102  //! @{
103 
104  //! Multiply rate with third-body collider concentrations
105  void processThirdBodies(double* rop);
106 
107  //! Multiply rate with inverse equilibrium constant
108  void applyEquilibriumConstants(double* rop);
109 
110  //! Multiply rate with scaled temperature derivatives of the inverse
111  //! equilibrium constant
112  /*!
113  * This (scaled) derivative is handled by a finite difference.
114  */
115  void applyEquilibriumConstants_ddT(double* drkcn);
116 
117  //! Process temperature derivative
118  //! @param in rate expression used for the derivative calculation
119  //! @param drop pointer to output buffer
120  void process_ddT(const vector<double>& in, double* drop);
121 
122  //! Process pressure derivative
123  //! @param in rate expression used for the derivative calculation
124  //! @param drop pointer to output buffer
125  void process_ddP(const vector<double>& in, double* drop);
126 
127  //! Process concentration (molar density) derivative
128  //! @param stoich stoichiometry manager
129  //! @param in rate expression used for the derivative calculation
130  //! @param drop pointer to output buffer
131  //! @param mass_action boolean indicating whether law of mass action applies
132  void process_ddC(StoichManagerN& stoich, const vector<double>& in,
133  double* drop, bool mass_action=true);
134 
135  //! Process derivatives
136  //! @param stoich stoichiometry manager
137  //! @param in rate expression used for the derivative calculation
138  //! @param ddX true: w.r.t mole fractions false: w.r.t species concentrations
139  //! @return a sparse matrix of derivative contributions for each reaction of
140  //! dimensions nTotalReactions by nTotalSpecies
141  Eigen::SparseMatrix<double> calculateCompositionDerivatives(
142  StoichManagerN& stoich, const vector<double>& in, bool ddX=true);
143 
144  //! Helper function ensuring that all rate derivatives can be calculated
145  //! @param name method name used for error output
146  //! @throw CanteraError if ideal gas assumption does not hold
147  void assertDerivativesValid(const string& name);
148 
149  //! @}
150 
151  //! Vector of rate handlers
152  vector<unique_ptr<MultiRateBase>> m_bulk_rates;
153  map<string, size_t> m_bulk_types; //!< Mapping of rate handlers
154 
155  vector<size_t> m_revindex; //!< Indices of reversible reactions
156  vector<size_t> m_irrev; //!< Indices of irreversible reactions
157 
158  //! Difference between the global reactants order and the global products
159  //! order. Of type "double" to account for the fact that we can have real-
160  //! valued stoichiometries.
161  vector<double> m_dn;
162 
163  ThirdBodyCalc m_multi_concm; //!< used with MultiRate evaluator
164 
165  //! Third body concentrations
166  vector<double> m_concm;
167 
168  //! Activity concentrations, as calculated by ThermoPhase::getActivityConcentrations
169  vector<double> m_act_conc;
170 
171  //! Physical concentrations, as calculated by ThermoPhase::getConcentrations
172  vector<double> m_phys_conc;
173 
174  //! Derivative settings
176  bool m_jac_skip_falloff;
177  double m_jac_rtol_delta;
178 
179  bool m_ROP_ok = false;
180 
181  //! Buffers for partial rop results with length nReactions()
182  vector<double> m_rbuf0;
183  vector<double> m_rbuf1;
184  vector<double> m_rbuf2;
185  vector<double> m_kf0; //!< Forward rate constants without perturbation
186  vector<double> m_sbuf0;
187  vector<double> m_state;
188  vector<double> m_grt; //!< Standard chemical potentials for each species
189 };
190 
191 }
192 
193 #endif
Base class for kinetics managers and also contains the kineticsmgr module documentation (see Kinetics...
A map of string keys to values whose type can vary at runtime.
Definition: AnyMap.h:427
Specialization of Kinetics for chemistry in a single bulk phase.
Definition: BulkKinetics.h:21
bool addReaction(shared_ptr< Reaction > r, bool resize=true) override
Add a single reaction to the mechanism.
void getNetRatesOfProgress_ddC(double *drop) override
Calculate derivatives for net rates-of-progress with respect to molar concentration at constant tempe...
Eigen::SparseMatrix< double > netRatesOfProgress_ddX() override
Calculate derivatives for net rates-of-progress with respect to species mole fractions at constant te...
void getNetRatesOfProgress_ddP(double *drop) override
Calculate derivatives for net rates-of-progress with respect to pressure at constant temperature,...
string kineticsType() const override
Identifies the Kinetics manager type.
Definition: BulkKinetics.h:27
Eigen::SparseMatrix< double > revRatesOfProgress_ddCi() override
Calculate derivatives for forward rates-of-progress with respect to species concentration at constant...
void getFwdRateConstants(double *kfwd) override
Return the forward rate constants.
void getDeltaSSGibbs(double *deltaG) override
Return the vector of values for the reaction standard state Gibbs free energy change.
map< string, size_t > m_bulk_types
Mapping of rate handlers.
Definition: BulkKinetics.h:153
Eigen::SparseMatrix< double > fwdRatesOfProgress_ddX() override
Calculate derivatives for forward rates-of-progress with respect to species mole fractions at constan...
void getDeltaGibbs(double *deltaG) override
Return the vector of values for the reaction Gibbs free energy change.
vector< double > m_phys_conc
Physical concentrations, as calculated by ThermoPhase::getConcentrations.
Definition: BulkKinetics.h:172
Eigen::SparseMatrix< double > revRatesOfProgress_ddX() override
Calculate derivatives for reverse rates-of-progress with respect to species mole fractions at constan...
bool isReversible(size_t i) override
True if reaction i has been declared to be reversible.
void getFwdRatesOfProgress_ddT(double *drop) override
Calculate derivatives for forward rates-of-progress with respect to temperature at constant pressure,...
void assertDerivativesValid(const string &name)
Helper function ensuring that all rate derivatives can be calculated.
void getFwdRatesOfProgress_ddP(double *drop) override
Calculate derivatives for forward rates-of-progress with respect to pressure at constant temperature,...
void getFwdRateConstants_ddT(double *dkfwd) override
Calculate derivatives for forward rate constants with respect to temperature at constant pressure,...
void setMultiplier(size_t i, double f) override
Set the multiplier for reaction i to f.
void getDeltaSSEntropy(double *deltaS) override
Return the vector of values for the change in the standard state entropies for each reaction.
vector< double > m_dn
Difference between the global reactants order and the global products order.
Definition: BulkKinetics.h:161
bool m_jac_skip_third_bodies
Derivative settings.
Definition: BulkKinetics.h:175
void getDeltaSSEnthalpy(double *deltaH) override
Return the vector of values for the change in the standard state enthalpies of reaction.
Eigen::SparseMatrix< double > calculateCompositionDerivatives(StoichManagerN &stoich, const vector< double > &in, bool ddX=true)
Process derivatives.
void resizeSpecies() override
Resize arrays with sizes that depend on the total number of species.
vector< double > m_grt
Standard chemical potentials for each species.
Definition: BulkKinetics.h:188
vector< double > m_act_conc
Activity concentrations, as calculated by ThermoPhase::getActivityConcentrations.
Definition: BulkKinetics.h:169
void getRevRateConstants(double *krev, bool doIrreversible=false) override
Return the reverse rate constants.
void getEquilibriumConstants(double *kc) override
Return a vector of Equilibrium constants.
void getNetRatesOfProgress_ddT(double *drop) override
Calculate derivatives for net rates-of-progress with respect to temperature at constant pressure,...
vector< size_t > m_revindex
Indices of reversible reactions.
Definition: BulkKinetics.h:155
void processThirdBodies(double *rop)
Multiply rate with third-body collider concentrations.
void applyEquilibriumConstants(double *rop)
Multiply rate with inverse equilibrium constant.
void getDerivativeSettings(AnyMap &settings) const override
Retrieve derivative settings.
void process_ddT(const vector< double > &in, double *drop)
Process temperature derivative.
void getDeltaEnthalpy(double *deltaH) override
Return the vector of values for the reactions change in enthalpy.
vector< unique_ptr< MultiRateBase > > m_bulk_rates
Vector of rate handlers.
Definition: BulkKinetics.h:152
const vector< double > & thirdBodyConcentrations() const override
Provide direct access to current third-body concentration values.
Definition: BulkKinetics.h:90
void getRevRatesOfProgress_ddT(double *drop) override
Calculate derivatives for reverse rates-of-progress with respect to temperature at constant pressure,...
Eigen::SparseMatrix< double > fwdRatesOfProgress_ddCi() override
Calculate derivatives for forward rates-of-progress with respect to species concentration at constant...
void modifyReaction(size_t i, shared_ptr< Reaction > rNew) override
Modify the rate expression associated with a reaction.
void getFwdRatesOfProgress_ddC(double *drop) override
Calculate derivatives for forward rates-of-progress with respect to molar concentration at constant t...
void process_ddC(StoichManagerN &stoich, const vector< double > &in, double *drop, bool mass_action=true)
Process concentration (molar density) derivative.
void process_ddP(const vector< double > &in, double *drop)
Process pressure derivative.
void getFwdRateConstants_ddP(double *dkfwd) override
Calculate derivatives for forward rate constants with respect to pressure at constant temperature,...
void getRevRatesOfProgress_ddP(double *drop) override
Calculate derivatives for reverse rates-of-progress with respect to pressure at constant temperature,...
void getRevRatesOfProgress_ddC(double *drop) override
Calculate derivatives for reverse rates-of-progress with respect to molar concentration at constant t...
vector< double > m_rbuf0
Buffers for partial rop results with length nReactions()
Definition: BulkKinetics.h:182
vector< size_t > m_irrev
Indices of irreversible reactions.
Definition: BulkKinetics.h:156
ThirdBodyCalc m_multi_concm
used with MultiRate evaluator
Definition: BulkKinetics.h:163
void applyEquilibriumConstants_ddT(double *drkcn)
Multiply rate with scaled temperature derivatives of the inverse equilibrium constant.
void resizeReactions() override
Finalize Kinetics object and associated objects.
Eigen::SparseMatrix< double > netRatesOfProgress_ddCi() override
Calculate derivatives for net rates-of-progress with respect to species concentration at constant tem...
void getThirdBodyConcentrations(double *concm) override
Return a vector of values of effective concentrations of third-body collision partners of any reactio...
void getDeltaEntropy(double *deltaS) override
Return the vector of values for the reactions change in entropy.
vector< double > m_concm
Third body concentrations.
Definition: BulkKinetics.h:166
vector< double > m_kf0
Forward rate constants without perturbation.
Definition: BulkKinetics.h:185
void setDerivativeSettings(const AnyMap &settings) override
Set/modify derivative settings.
void getFwdRateConstants_ddC(double *dkfwd) override
Calculate derivatives for forward rate constants with respect to molar concentration at constant temp...
Public interface for kinetics managers.
Definition: Kinetics.h:125
This class handles operations involving the stoichiometric coefficients on one side of a reaction (re...
Calculate and apply third-body effects on reaction rates, including non- unity third-body efficiencie...
Definition: ThirdBodyCalc.h:20
Namespace for the Cantera kernel.
Definition: AnyMap.cpp:564