1 //! @file ReactionRate.cpp
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 #include "cantera/kinetics/ReactionRate.h"
7 #include "cantera/kinetics/MultiRate.h"
8 #include "cantera/base/Array.h"
9 #include "cantera/numerics/Func1.h"
10
11 namespace Cantera
12 {
13
setParameters(const AnyMap & node,const Units & rate_units)14 void ReactionRateBase::setParameters(const AnyMap& node, const Units& rate_units)
15 {
16 units = rate_units;
17 input = node;
18 }
19
setUnits(const Units & rate_units)20 void ReactionRateBase::setUnits(const Units& rate_units)
21 {
22 units = rate_units;
23 }
24
parameters(const Units & rate_units) const25 AnyMap ReactionRateBase::parameters(const Units& rate_units) const
26 {
27 AnyMap out;
28 getParameters(out, rate_units);
29 return out;
30 }
31
parameters() const32 AnyMap ReactionRateBase::parameters() const
33 {
34 AnyMap out;
35 getParameters(out, units);
36 return out;
37 }
38
ArrheniusRate()39 ArrheniusRate::ArrheniusRate()
40 : Arrhenius(NAN, NAN, NAN)
41 , allow_negative_pre_exponential_factor(false)
42 {
43 }
44
ArrheniusRate(double A,double b,double E)45 ArrheniusRate::ArrheniusRate(double A, double b, double E)
46 : Arrhenius(A, b, E / GasConstant)
47 , allow_negative_pre_exponential_factor(false)
48 {
49 }
50
ArrheniusRate(const AnyMap & node,const Units & rate_units)51 ArrheniusRate::ArrheniusRate(const AnyMap& node, const Units& rate_units)
52 {
53 setParameters(node, rate_units);
54 }
55
ArrheniusRate(const AnyMap & node)56 ArrheniusRate::ArrheniusRate(const AnyMap& node)
57 {
58 setParameters(node, Units(1.));
59 }
60
ArrheniusRate(const Arrhenius & arr,bool allow_negative_A)61 ArrheniusRate::ArrheniusRate(const Arrhenius& arr, bool allow_negative_A)
62 : Arrhenius(arr.preExponentialFactor(),
63 arr.temperatureExponent(),
64 arr.activationEnergy_R())
65 , allow_negative_pre_exponential_factor(allow_negative_A)
66 {
67 }
68
newMultiRate() const69 unique_ptr<MultiRateBase> ArrheniusRate::newMultiRate() const
70 {
71 return unique_ptr<MultiRateBase>(new MultiBulkRate<ArrheniusRate, ArrheniusData>);
72 }
73
setParameters(const AnyMap & node,const Units & rate_units)74 void ArrheniusRate::setParameters(const AnyMap& node, const Units& rate_units)
75 {
76 ReactionRateBase::setParameters(node, rate_units);
77 allow_negative_pre_exponential_factor = node.getBool("negative-A", false);
78 if (!node.hasKey("rate-constant")) {
79 Arrhenius::setParameters(AnyValue(), node.units(), rate_units);
80 return;
81 }
82
83 Arrhenius::setParameters(node["rate-constant"], node.units(), rate_units);
84 }
85
getParameters(AnyMap & rateNode,const Units & rate_units) const86 void ArrheniusRate::getParameters(AnyMap& rateNode,
87 const Units& rate_units) const
88 {
89 if (allow_negative_pre_exponential_factor) {
90 rateNode["negative-A"] = true;
91 }
92 AnyMap node;
93 Arrhenius::getParameters(node, rate_units);
94 if (!node.empty()) {
95 // Arrhenius object is configured
96 rateNode["rate-constant"] = std::move(node);
97 }
98 }
99
validate(const std::string & equation)100 void ArrheniusRate::validate(const std::string& equation)
101 {
102 if (!allow_negative_pre_exponential_factor && preExponentialFactor() < 0) {
103 throw CanteraError("ArrheniusRate::validate",
104 "Undeclared negative pre-exponential factor found in reaction '"
105 + equation + "'");
106 }
107 }
108
PlogRate(const std::multimap<double,Arrhenius> & rates)109 PlogRate::PlogRate(const std::multimap<double, Arrhenius>& rates)
110 : Plog(rates)
111 {
112 }
113
PlogRate(const AnyMap & node,const Units & rate_units)114 PlogRate::PlogRate(const AnyMap& node, const Units& rate_units)
115 {
116 setParameters(node, rate_units);
117 }
118
PlogRate(const AnyMap & node)119 PlogRate::PlogRate(const AnyMap& node)
120 {
121 setParameters(node, Units(1.));
122 }
123
newMultiRate() const124 unique_ptr<MultiRateBase> PlogRate::newMultiRate() const
125 {
126 return unique_ptr<MultiRateBase>(new MultiBulkRate<PlogRate, PlogData>);
127 }
128
setParameters(const AnyMap & node,const Units & rate_units)129 void PlogRate::setParameters(const AnyMap& node, const Units& rate_units)
130 {
131 // @TODO implementation of Plog::setParameters should be transferred here
132 // when the Plog class is removed from RxnRates.h after Cantera 2.6
133 ReactionRateBase::setParameters(node, rate_units);
134 if (!node.hasKey("rate-constants")) {
135 Plog::setParameters(std::vector<AnyMap> (), node.units(), rate_units);
136 return;
137 }
138
139 Plog::setParameters(node.at("rate-constants").asVector<AnyMap>(),
140 node.units(), rate_units);
141 }
142
getParameters(AnyMap & rateNode,const Units & rate_units) const143 void PlogRate::getParameters(AnyMap& rateNode, const Units& rate_units) const
144 {
145 // @TODO implementation of Plog::getParameters should be transferred here
146 // when the Plog class is removed from RxnRates.h after Cantera 2.6
147 Plog::getParameters(rateNode, rate_units);
148 rateNode["type"] = type();
149 }
150
ChebyshevRate3(double Tmin,double Tmax,double Pmin,double Pmax,const Array2D & coeffs)151 ChebyshevRate3::ChebyshevRate3(double Tmin, double Tmax, double Pmin, double Pmax,
152 const Array2D& coeffs)
153 : Chebyshev(Tmin, Tmax, Pmin, Pmax, coeffs)
154 {
155 }
156
ChebyshevRate3(const AnyMap & node,const Units & rate_units)157 ChebyshevRate3::ChebyshevRate3(const AnyMap& node, const Units& rate_units)
158 {
159 setParameters(node, rate_units);
160 }
161
ChebyshevRate3(const AnyMap & node)162 ChebyshevRate3::ChebyshevRate3(const AnyMap& node)
163 {
164 setParameters(node, Units(1.));
165 }
166
newMultiRate() const167 unique_ptr<MultiRateBase> ChebyshevRate3::newMultiRate() const
168 {
169 return unique_ptr<MultiRateBase>(
170 new MultiBulkRate<ChebyshevRate3, ChebyshevData>);
171 }
172
setParameters(const AnyMap & node,const Units & rate_units)173 void ChebyshevRate3::setParameters(const AnyMap& node, const Units& rate_units)
174 {
175 ReactionRateBase::setParameters(node, rate_units);
176 if (!node.hasKey("data")) {
177 Chebyshev::setParameters(AnyMap(), node.units(), rate_units);
178 return;
179 }
180 // @TODO implementation of Chebyshev::setParameters should be transferred here
181 // when the Chebyshev class is removed from RxnRates.h after Cantera 2.6
182 Chebyshev::setParameters(node, node.units(), rate_units);
183 }
184
getParameters(AnyMap & rateNode,const Units & rate_units) const185 void ChebyshevRate3::getParameters(AnyMap& rateNode,
186 const Units& rate_units) const
187 {
188 // @TODO implementation of Chebyshev::getParameters should be transferred here
189 // when the Chebyshev class is removed from RxnRates.h after Cantera 2.6
190 Chebyshev::getParameters(rateNode, rate_units);
191 rateNode["type"] = type();
192 }
193
validate(const std::string & equation)194 void ChebyshevRate3::validate(const std::string& equation)
195 {
196 }
197
CustomFunc1Rate()198 CustomFunc1Rate::CustomFunc1Rate() : m_ratefunc(0) {}
199
newMultiRate() const200 unique_ptr<MultiRateBase> CustomFunc1Rate::newMultiRate() const
201 {
202 return unique_ptr<MultiRateBase>(
203 new MultiBulkRate<CustomFunc1Rate, CustomFunc1Data>);
204 }
205
setRateFunction(shared_ptr<Func1> f)206 void CustomFunc1Rate::setRateFunction(shared_ptr<Func1> f)
207 {
208 m_ratefunc = f;
209 }
210
eval(const CustomFunc1Data & shared_data,double concm) const211 double CustomFunc1Rate::eval(const CustomFunc1Data& shared_data,
212 double concm) const
213 {
214 if (m_ratefunc) {
215 return m_ratefunc->eval(shared_data.m_temperature);
216 }
217 return NAN;
218 }
219
220 }
221