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