Cantera  3.2.0
Loading...
Searching...
No Matches
ChebyshevRate.h
Go to the documentation of this file.
1//! @file ChebyshevRate.h
2
3// This file is part of Cantera. See License.txt in the top-level directory or
4// at https://cantera.org/license.txt for license and copyright information.
5
6#ifndef CT_CHEBYSHEV_H
7#define CT_CHEBYSHEV_H
8
12#include "cantera/base/Array.h"
13#include "cantera/base/global.h"
14
15namespace Cantera
16{
17
18//! Data container holding shared data specific to ChebyshevRate
19/**
20 * The data container `ChebyshevData` holds precalculated data common to
21 * all `ChebyshevRate` objects.
22 */
23struct ChebyshevData : public ReactionData
24{
25 ChebyshevData() = default;
26
27 void update(double T) override;
28
29 void update(double T, double P) override {
31 pressure = P;
32 log10P = std::log10(P);
33 }
34
35 bool update(const ThermoPhase& phase, const Kinetics& kin) override;
36
38
39 //! Perturb pressure of data container
40 /**
41 * The method is used for the evaluation of numerical derivatives.
42 * @param deltaP relative pressure perturbation
43 */
44 void perturbPressure(double deltaP);
45
46 void restore() override;
47
48 void invalidateCache() override {
50 pressure = NAN;
51 }
52
53 double pressure = NAN; //!< pressure
54 double log10P = 0.0; //!< base 10 logarithm of pressure
55
56protected:
57 double m_pressure_buf = -1.0; //!< buffered pressure
58};
59
60//! Pressure-dependent rate expression where the rate coefficient is expressed
61//! as a bivariate Chebyshev polynomial in temperature and pressure.
62/*!
63 * The rate constant can be written as:
64 * @f[
65 * \log_{10} k(T,P) = \sum_{t=1}^{N_T} \sum_{p=1}^{N_P} \alpha_{tp}
66 * \phi_t(\tilde{T}) \phi_p(\tilde{P})
67 * @f]
68 * where @f$ \alpha_{tp} @f$ are the constants defining the rate, @f$ \phi_n(x) @f$
69 * is the Chebyshev polynomial of the first kind of degree *n* evaluated at
70 * *x*, and
71 * @f[
72 * \tilde{T} \equiv \frac{2T^{-1} - T_\mathrm{min}^{-1} - T_\mathrm{max}^{-1}}
73 * {T_\mathrm{max}^{-1} - T_\mathrm{min}^{-1}}
74 * @f]
75 * @f[
76 * \tilde{P} \equiv \frac{2 \log_{10} P - \log_{10} P_\mathrm{min} - \log_{10} P_\mathrm{max}}
77 * {\log_{10} P_\mathrm{max} - \log_{10} P_\mathrm{min}}
78 * @f]
79 * are reduced temperature and reduced pressures which map the ranges
80 * @f$ (T_\mathrm{min}, T_\mathrm{max}) @f$ and
81 * @f$ (P_\mathrm{min}, P_\mathrm{max}) @f$ to (-1, 1).
82 *
83 * A ChebyshevRate rate expression is specified in terms of the coefficient matrix
84 * @f$ \alpha @f$ and the temperature and pressure ranges. Note that the
85 * Chebyshev polynomials are not defined outside the interval (-1,1), and
86 * therefore extrapolation of rates outside the range of temperatures and
87 * pressures for which they are defined is strongly discouraged.
88 *
89 * @ingroup otherRateGroup
90 */
91class ChebyshevRate final : public ReactionRate
92{
93public:
94 //! Default constructor.
95 ChebyshevRate() = default;
96
97 //! Constructor directly from coefficient array
98 /*!
99 * @param Tmin Minimum temperature [K]
100 * @param Tmax Maximum temperature [K]
101 * @param Pmin Minimum pressure [Pa]
102 * @param Pmax Maximum pressure [Pa]
103 * @param coeffs Coefficient array dimensioned `nT` by `nP` where `nT` and
104 * `nP` are the number of temperatures and pressures used in the fit,
105 * respectively.
106 */
107 ChebyshevRate(double Tmin, double Tmax, double Pmin, double Pmax,
108 const Array2D& coeffs);
109
110 ChebyshevRate(const AnyMap& node, const UnitStack& rate_units={});
111
112 unique_ptr<MultiRateBase> newMultiRate() const override {
113 return make_unique<MultiRate<ChebyshevRate, ChebyshevData>>();
114 }
115
116 const string type() const override { return "Chebyshev"; }
117
118 //! Perform object setup based on AnyMap node information
119 /*!
120 * @param node AnyMap containing rate information
121 * @param rate_units Unit definitions specific to rate information
122 */
123 void setParameters(const AnyMap& node, const UnitStack& rate_units) override;
124
125 void getParameters(AnyMap& rateNode) const override;
126
127 void validate(const string& equation, const Kinetics& kin) override;
128
129 //! Update information specific to reaction
130 /*!
131 * @param shared_data data shared by all reactions of a given type
132 */
133 void updateFromStruct(const ChebyshevData& shared_data) {
134 if (shared_data.log10P != m_log10P) {
135 m_log10P = shared_data.log10P;
136 double Pr = (2 * shared_data.log10P + PrNum_) * PrDen_;
137 double Cnm1 = Pr;
138 double Cn = 1;
139 double Cnp1;
140 for (size_t i = 0; i < m_coeffs.nRows(); i++) {
141 dotProd_[i] = m_coeffs(i, 0);
142 }
143 for (size_t j = 1; j < m_coeffs.nColumns(); j++) {
144 Cnp1 = 2 * Pr * Cn - Cnm1;
145 for (size_t i = 0; i < m_coeffs.nRows(); i++) {
146 dotProd_[i] += Cnp1 * m_coeffs(i, j);
147 }
148 Cnm1 = Cn;
149 Cn = Cnp1;
150 }
151 }
152 }
153
154 //! Evaluate reaction rate
155 /*!
156 * @param shared_data data shared by all reactions of a given type
157 */
158 double evalFromStruct(const ChebyshevData& shared_data) {
159 double Tr = (2 * shared_data.recipT + TrNum_) * TrDen_;
160 double Cnm1 = Tr;
161 double Cn = 1;
162 double Cnp1;
163 double logk = dotProd_[0];
164 for (size_t i = 1; i < m_coeffs.nRows(); i++) {
165 Cnp1 = 2 * Tr * Cn - Cnm1;
166 logk += Cnp1 * dotProd_[i];
167 Cnm1 = Cn;
168 Cn = Cnp1;
169 }
170 return std::pow(10, logk);
171 }
172
173 //! Set limits for ChebyshevRate object
174 /*!
175 * @param Tmin Minimum temperature [K]
176 * @param Tmax Maximum temperature [K]
177 * @param Pmin Minimum pressure [Pa]
178 * @param Pmax Maximum pressure [Pa]
179 */
180 void setLimits(double Tmin, double Tmax, double Pmin, double Pmax);
181
182 //! Minimum valid temperature [K]
183 double Tmin() const {
184 return Tmin_;
185 }
186
187 //! Maximum valid temperature [K]
188 double Tmax() const {
189 return Tmax_;
190 }
191
192 //! Minimum valid pressure [Pa]
193 double Pmin() const {
194 return Pmin_;
195 }
196
197 //! Maximum valid pressure [Pa]
198 double Pmax() const {
199 return Pmax_;
200 }
201
202 //! Number of points in the pressure direction
203 size_t nPressure() const {
204 return m_coeffs.nColumns();
205 }
206
207 //! Number of points in the temperature direction
208 size_t nTemperature() const {
209 return m_coeffs.nRows();
210 }
211
212 //! Access Chebyshev coefficients as 2-dimensional array with temperature and
213 //! pressure dimensions corresponding to rows and columns, respectively.
214 const Array2D& data() const {
215 return m_coeffs;
216 }
217
218 //! Set the Chebyshev coefficients as 2-dimensional array.
219 void setData(const Array2D& coeffs);
220
221protected:
222 double m_log10P = NAN; //!< value detecting updates
223 double Tmin_, Tmax_; //!< valid temperature range
224 double Pmin_, Pmax_; //!< valid pressure range
225 double TrNum_, TrDen_; //!< terms appearing in the reduced temperature
226 double PrNum_, PrDen_; //!< terms appearing in the reduced pressure
227
228 Array2D m_coeffs; //!<< coefficient array
229 vector<double> dotProd_; //!< dot product of coeffs with the reduced pressure polynomial
230};
231
232}
233
234#endif
Header file for class Cantera::Array2D.
A map of string keys to values whose type can vary at runtime.
Definition AnyMap.h:431
A class for 2D arrays stored in column-major (Fortran-compatible) form.
Definition Array.h:32
void getParameters(AnyMap &rateNode) const override
Get parameters.
const Array2D & data() const
Access Chebyshev coefficients as 2-dimensional array with temperature and pressure dimensions corresp...
unique_ptr< MultiRateBase > newMultiRate() const override
Create a rate evaluator for reactions of a particular derived type.
double Tmax_
valid temperature range
void setParameters(const AnyMap &node, const UnitStack &rate_units) override
Perform object setup based on AnyMap node information.
double TrDen_
terms appearing in the reduced temperature
void updateFromStruct(const ChebyshevData &shared_data)
Update information specific to reaction.
double Pmin() const
Minimum valid pressure [Pa].
double Tmin() const
Minimum valid temperature [K].
void validate(const string &equation, const Kinetics &kin) override
Validate the reaction rate expression.
vector< double > dotProd_
dot product of coeffs with the reduced pressure polynomial
void setData(const Array2D &coeffs)
Set the Chebyshev coefficients as 2-dimensional array.
double Tmax() const
Maximum valid temperature [K].
ChebyshevRate()=default
Default constructor.
Array2D m_coeffs
< coefficient array
double Pmax_
valid pressure range
size_t nPressure() const
Number of points in the pressure direction.
double evalFromStruct(const ChebyshevData &shared_data)
Evaluate reaction rate.
double Pmax() const
Maximum valid pressure [Pa].
double PrDen_
terms appearing in the reduced pressure
const string type() const override
String identifying reaction rate specialization.
double m_log10P
value detecting updates
void setLimits(double Tmin, double Tmax, double Pmin, double Pmax)
Set limits for ChebyshevRate object.
size_t nTemperature() const
Number of points in the temperature direction.
Public interface for kinetics managers.
Definition Kinetics.h:126
Base class for a phase with thermodynamic properties.
This file contains definitions for utility functions and text for modules, inputfiles and logging,...
Namespace for the Cantera kernel.
Definition AnyMap.cpp:595
Data container holding shared data specific to ChebyshevRate.
void perturbPressure(double deltaP)
Perturb pressure of data container.
double m_pressure_buf
buffered pressure
double log10P
base 10 logarithm of pressure
void update(double T) override
Update data container based on temperature T
void restore() override
Restore data container after a perturbation.
void invalidateCache() override
Force shared data and reaction rates to be updated next time.
void update(double T, double P) override
Update data container based on temperature T and an extra parameter.
double pressure
pressure
double recipT
inverse of temperature
virtual void update(double T)
Update data container based on temperature T
virtual void invalidateCache()
Force shared data and reaction rates to be updated next time.
Unit aggregation utility.
Definition Units.h:105