diff --git a/include/cantera/kinetics/Arrhenius.h b/include/cantera/kinetics/Arrhenius.h index 400dc0e2ba1..c1a798f79a2 100644 --- a/include/cantera/kinetics/Arrhenius.h +++ b/include/cantera/kinetics/Arrhenius.h @@ -44,7 +44,7 @@ class ArrheniusBase //! Constructor based on AnyValue content ArrheniusBase(const AnyValue& rate, - const UnitSystem& units, const Units& rate_units) + const UnitSystem& units, const UnitsVector& rate_units) { setParameters(rate, units, rate_units); } @@ -56,11 +56,17 @@ class ArrheniusBase * @param rate_units Unit definitions specific to rate information */ virtual void setParameters(const AnyValue& rate, - const UnitSystem& units, const Units& rate_units); + const UnitSystem& units, const UnitsVector& rate_units); - //! Get parameters - //! Store the parameters of a ReactionRate needed to reconstruct an identical - virtual void getParameters(AnyMap& node, const Units& units) const; + //! Return parameters + /*! + * @param node AnyValue containing rate information + */ + virtual void getParameters(AnyMap& node) const; + + //! Return parameters - required for legacy framework + //! @todo: merge with single-parameter version after removal of old framework + virtual void getParameters(AnyMap& node, const Units& rate_units) const; //! Validate the reaction rate expression virtual void validate(const std::string& equation); @@ -87,10 +93,24 @@ class ArrheniusBase size_t rate_index; //!< Reaction rate index within kinetics evaluator + void setRateUnits(const UnitsVector& rate_units) { + m_rate_units = Units::product(rate_units); + if (rate_units.size()>1) { + m_order = 0; + for (size_t i = 2; i < rate_units.size(); ++i) { + m_order -= rate_units[i].second; + } + } else { + m_order = NAN; + } + } + protected: double m_A; //!< Pre-exponential factor double m_b; //!< Temperature exponent double m_Ea_R; //!< Activation energy (in temperature units) + double m_order; //!< Reaction order + Units m_rate_units; //!< Reaction rate units }; @@ -115,7 +135,7 @@ class Arrhenius3 : public ArrheniusBase using ArrheniusBase::setParameters; //! Constructor based on AnyMap content - Arrhenius3(const AnyMap& node, const Units& rate_units) { + Arrhenius3(const AnyMap& node, const UnitsVector& rate_units) { setParameters(node, rate_units); } @@ -129,9 +149,9 @@ class Arrhenius3 : public ArrheniusBase * @param node AnyMap containing rate information * @param rate_units Unit definitions specific to rate information */ - virtual void setParameters(const AnyMap& node, const Units& rate_units); + virtual void setParameters(const AnyMap& node, const UnitsVector& rate_units); - virtual void getParameters(AnyMap& node, const Units& units) const; + virtual void getParameters(AnyMap& node) const; //! Update information specific to reaction const static bool usesUpdate() { @@ -219,7 +239,7 @@ class BlowersMasel3 : public ArrheniusBase BlowersMasel3(double A, double b, double Ea0, double w); //! Constructor based on AnyMap content - BlowersMasel3(const AnyMap& node, const Units& rate_units) { + BlowersMasel3(const AnyMap& node, const UnitsVector& rate_units) { setParameters(node, rate_units); } @@ -229,16 +249,16 @@ class BlowersMasel3 : public ArrheniusBase } virtual void setParameters(const AnyValue& rate, - const UnitSystem& units, const Units& rate_units); + const UnitSystem& units, const UnitsVector& rate_units); //! Perform object setup based on AnyMap node information /*! * @param node AnyMap containing rate information * @param rate_units Unit definitions specific to rate information */ - virtual void setParameters(const AnyMap& node, const Units& rate_units); + virtual void setParameters(const AnyMap& node, const UnitsVector& rate_units); - virtual void getParameters(AnyMap& node, const Units& units) const; + virtual void getParameters(AnyMap& node) const; //! Update information specific to reaction const static bool usesUpdate() { diff --git a/include/cantera/kinetics/Falloff.h b/include/cantera/kinetics/Falloff.h index 3a8eba65c96..03f6e5c7893 100644 --- a/include/cantera/kinetics/Falloff.h +++ b/include/cantera/kinetics/Falloff.h @@ -132,7 +132,7 @@ class Falloff //! Perform object setup based on AnyMap node information //! @param node AnyMap containing rate information //! @param rate_units unit definitions specific to rate information - virtual void setParameters(const AnyMap& node, const Units& rate_units); + virtual void setParameters(const AnyMap& node, const UnitsVector& rate_units); //! Get the values of the parameters for this object. *params* must be an //! array of at least nParameters() elements. @@ -141,14 +141,9 @@ class Falloff */ virtual void getParameters(double* params) const {} - /** - * @todo deprecate; only used by legacy framework - */ - virtual void getParameters(AnyMap& reactionNode) const {} - //! Store the falloff-related parameters needed to reconstruct an identical //! Reaction using the newReaction(AnyMap&, Kinetics&) function. - virtual void getParameters(AnyMap& rateNode, const Units& rate_units) const; + virtual void getParameters(AnyMap& reactionNode) const; //! Flag indicating that information specific to reaction rate is required const static bool usesUpdate() { @@ -315,7 +310,7 @@ class Troe : public Falloff return 4; } - virtual void setParameters(const AnyMap& node, const Units& rate_units); + virtual void setParameters(const AnyMap& node, const UnitsVector& rate_units); //! Sets params to contain, in order, \f[ (A, T_3, T_1, T_2) \f] /** @@ -325,8 +320,6 @@ class Troe : public Falloff virtual void getParameters(AnyMap& reactionNode) const; - virtual void getParameters(AnyMap& rateNode, const Units& rate_units) const; - protected: //! parameter a in the 4-parameter Troe falloff function. Dimensionless double m_a; @@ -402,7 +395,7 @@ class SRI : public Falloff return 5; } - virtual void setParameters(const AnyMap& node, const Units& rate_units); + virtual void setParameters(const AnyMap& node, const UnitsVector& rate_units); //! Sets params to contain, in order, \f[ (a, b, c, d, e) \f] /** @@ -412,8 +405,6 @@ class SRI : public Falloff virtual void getParameters(AnyMap& reactionNode) const; - virtual void getParameters(AnyMap& rateNode, const Units& rate_units) const; - protected: //! parameter a in the 5-parameter SRI falloff function. Dimensionless. double m_a; @@ -495,7 +486,7 @@ class Tsang : public Falloff return 2; } - virtual void setParameters(const AnyMap& node, const Units& rate_units); + virtual void setParameters(const AnyMap& node, const UnitsVector& rate_units); //! Sets params to contain, in order, \f[ (A, B) \f] /** @@ -505,8 +496,6 @@ class Tsang : public Falloff virtual void getParameters(AnyMap& reactionNode) const; - virtual void getParameters(AnyMap& rateNode, const Units& rate_units) const; - protected: //! parameter a in the Tsang F_cent formulation. Dimensionless double m_a; diff --git a/include/cantera/kinetics/ReactionRate.h b/include/cantera/kinetics/ReactionRate.h index 325f039d8a4..e0e7933fa90 100644 --- a/include/cantera/kinetics/ReactionRate.h +++ b/include/cantera/kinetics/ReactionRate.h @@ -126,8 +126,8 @@ class RateTemplate : public ReactionRate, public RateType //! Constructor using AnyMap content //! @param node AnyMap containing rate information //! @param rate_units unit definitions used for rate information - RateTemplate(const AnyMap& node, const Units& rate_units=Units(0.)) { - setParameters(node, rate_units); + RateTemplate(const AnyMap& node, const UnitsVector& units={}) { + setParameters(node, units); } virtual const std::string type() const override { @@ -135,13 +135,13 @@ class RateTemplate : public ReactionRate, public RateType return RateType::type(); } - virtual void setParameters(const AnyMap& node, const Units& rate_units) override { - ReactionRateBase::setParameters(node, rate_units); - RateType::setParameters(node, rate_units); + virtual void setParameters(const AnyMap& node, const UnitsVector& units) override { + ReactionRateBase::setParameters(node, units); + RateType::setParameters(node, units); } - virtual void getParameters(AnyMap& node, const Units& rate_units) const override { - RateType::getParameters(node, rate_units); + virtual void getParameters(AnyMap& node) const override { + RateType::getParameters(node); } virtual unique_ptr newMultiRate() const override { @@ -240,8 +240,8 @@ class PlogRate final : public ReactionRate, public Plog //! Constructor using AnyMap content //! @param node AnyMap containing rate information - //! @param rate_units unit definitions used for rate information - PlogRate(const AnyMap& node, const Units& rate_units=Units(0.)); + //! @param units Description of units used for rate parameters + PlogRate(const AnyMap& node, const UnitsVector& units={}); virtual const std::string type() const override { return "pressure-dependent-Arrhenius"; @@ -249,9 +249,8 @@ class PlogRate final : public ReactionRate, public Plog virtual unique_ptr newMultiRate() const override; - virtual void setParameters(const AnyMap& node, const Units& rate_units) override; - virtual void getParameters(AnyMap& rateNode, - const Units& rate_units) const override; + virtual void setParameters(const AnyMap& node, const UnitsVector& units) override; + virtual void getParameters(AnyMap& rateNode) const override; //! Update information specific to reaction static bool usesUpdate() { return true; } @@ -324,16 +323,15 @@ class ChebyshevRate3 final : public ReactionRate, public Chebyshe //! Constructor using AnyMap content //! @param node AnyMap containing rate information - //! @param rate_units unit definitions used for rate information - ChebyshevRate3(const AnyMap& node, const Units& rate_units=Units(0.)); + //! @param units Description of units used for rate parameters + ChebyshevRate3(const AnyMap& node, const UnitsVector& rate_units={}); virtual const std::string type() const override { return "Chebyshev"; } virtual unique_ptr newMultiRate() const override; - virtual void setParameters(const AnyMap& node, const Units& rate_units) override; - virtual void getParameters(AnyMap& rateNode, - const Units& rate_units) const override; + virtual void setParameters(const AnyMap& node, const UnitsVector& units) override; + virtual void getParameters(AnyMap& rateNode) const override; //! Update information specific to reaction static bool usesUpdate() { return true; } @@ -347,6 +345,9 @@ class ChebyshevRate3 final : public ReactionRate, public Chebyshe } virtual void validate(const std::string& equation) override; + +protected: + Units m_rate_units; //!< Reaction rate units }; @@ -366,15 +367,15 @@ class CustomFunc1Rate final : public ReactionRate //! Constructor does nothing, as there is no formalized parameterization //! @param node AnyMap object containing reaction rate specification - //! @param rate_units Description of units used for rate parameters - CustomFunc1Rate(const AnyMap& rate, const Units& rate_units) {} + //! @param units Description of units used for rate parameters + CustomFunc1Rate(const AnyMap& rate, const UnitsVector& units) {} virtual const std::string type() const override { return "custom-rate-function"; } virtual unique_ptr newMultiRate() const override; - virtual void setParameters(const AnyMap& node, const Units& rate_units) override { - units = rate_units; + virtual void setParameters(const AnyMap& node, const UnitsVector& units) override { + ReactionRateBase::setParameters(node, units); } //! Update information specific to reaction diff --git a/include/cantera/kinetics/ReactionRateBase.h b/include/cantera/kinetics/ReactionRateBase.h index 0cd303fc01a..c312b99977a 100644 --- a/include/cantera/kinetics/ReactionRateBase.h +++ b/include/cantera/kinetics/ReactionRateBase.h @@ -36,7 +36,7 @@ class Kinetics; class ReactionRateBase { public: - ReactionRateBase() : units(0.), m_idx(npos) {} + ReactionRateBase() : m_idx(npos) {} virtual ~ReactionRateBase() {} public: @@ -94,32 +94,18 @@ class ReactionRateBase //! Return the parameters such that an identical Reaction could be reconstructed //! using the newReaction() function. Behavior specific to derived classes is //! handled by the getParameters() method. - //! @param rate_units units used for rate parameters - AnyMap parameters(const Units& rate_units) const { + AnyMap parameters() const { AnyMap out; - getParameters(out, rate_units); + getParameters(out); return out; } - //! Return parameters using original unit system - AnyMap parameters() const { - return parameters(units); - } - //! Set parameters //! @param node AnyMap object containing reaction rate specification - //! @param rate_units Description of units used for rate parameters - virtual void setParameters(const AnyMap& node, const Units& rate_units) { - units = rate_units; + virtual void setParameters(const AnyMap& node, const UnitsVector& units) { input = node; } - //! Set rate units - //! @param rate_units Description of units used for rate parameters - virtual void setUnits(const Units& rate_units) { - units = rate_units; - } - //! Reaction rate index within kinetics evaluator size_t rateIndex() const { return m_idx; @@ -134,7 +120,7 @@ class ReactionRateBase //! Get parameters //! Store the parameters of a ReactionRate needed to reconstruct an identical //! object. Does not include user-defined fields available in the #input map. - virtual void getParameters(AnyMap& rateNode, const Units& rate_units) const { + virtual void getParameters(AnyMap& rateNode) const { throw NotImplementedError("ReactionRate::getParameters", "Not implemented by '{}' object.", type()); } @@ -142,11 +128,6 @@ class ReactionRateBase //! Input data used for specific models AnyMap input; - //! The units of the rate constant. These are determined by the units of the - //! standard concentration of the reactant species' phases of the phase - //! where the reaction occurs. - Units units; - size_t m_idx; //!< Index of reaction rate within kinetics evaluator }; diff --git a/include/cantera/kinetics/RxnRates.h b/include/cantera/kinetics/RxnRates.h index 57b5abe628a..68305db694a 100644 --- a/include/cantera/kinetics/RxnRates.h +++ b/include/cantera/kinetics/RxnRates.h @@ -34,7 +34,7 @@ class Units; * k_f = A T^b \exp (-E/RT) * \f] */ -class Arrhenius2 : public ArrheniusBase +class Arrhenius2 final : public ArrheniusBase { public: //! Default constructor. @@ -335,7 +335,7 @@ class Plog void setParameters(const std::vector& rates, const UnitSystem& units, const Units& rate_units); - void getParameters(AnyMap& rateNode, const Units& rate_units) const; + void getParameters(AnyMap& rateNode, const Units& rate_units=Units(0.)) const; //! Set up Plog object /*! diff --git a/src/kinetics/Arrhenius.cpp b/src/kinetics/Arrhenius.cpp index 2e9c32dcea1..d00368b1b5c 100644 --- a/src/kinetics/Arrhenius.cpp +++ b/src/kinetics/Arrhenius.cpp @@ -15,6 +15,8 @@ ArrheniusBase::ArrheniusBase() , m_A(NAN) , m_b(NAN) , m_Ea_R(NAN) + , m_order(NAN) + , m_rate_units(Units(0.)) { } @@ -24,20 +26,28 @@ ArrheniusBase::ArrheniusBase(double A, double b, double Ea) , m_A(A) , m_b(b) , m_Ea_R(Ea / GasConstant) + , m_order(NAN) + , m_rate_units(Units(0.)) { } void ArrheniusBase::setParameters( - const AnyValue& rate, const UnitSystem& units, const Units& rate_units) + const AnyValue& rate, const UnitSystem& units, const UnitsVector& rate_units) { if (rate.empty()) { m_A = NAN; m_b = NAN; m_Ea_R = NAN; - } else if (rate.is()) { + m_order = NAN; + m_rate_units = Units(0.); + return; + } + + setRateUnits(rate_units); + if (rate.is()) { auto& rate_map = rate.as(); - if (rate_units.factor() == 0) { + if (m_rate_units.factor() == 0) { // A zero rate units factor is used as a sentinel to detect // stand-alone reaction rate objects if (rate_map["A"].is()) { @@ -47,7 +57,7 @@ void ArrheniusBase::setParameters( } m_A = rate_map["A"].asDouble(); } else { - m_A = units.convert(rate_map["A"], rate_units); + m_A = units.convert(rate_map["A"], m_rate_units); } m_b = rate_map["b"].asDouble(); if (rate_map.hasKey("Ea")) { @@ -57,12 +67,17 @@ void ArrheniusBase::setParameters( } } else { auto& rate_vec = rate.asVector(3); - m_A = units.convert(rate_vec[0], rate_units); + m_A = units.convert(rate_vec[0], m_rate_units); m_b = rate_vec[1].asDouble(); m_Ea_R = units.convertActivationEnergy(rate_vec[2], "K"); } } +void ArrheniusBase::getParameters(AnyMap& node) const +{ + getParameters(node, m_rate_units); +} + void ArrheniusBase::getParameters(AnyMap& node, const Units& rate_units) const { if (std::isnan(m_A)) { @@ -92,7 +107,7 @@ void ArrheniusBase::validate(const std::string& equation) } } -void Arrhenius3::setParameters(const AnyMap& node, const Units& rate_units) +void Arrhenius3::setParameters(const AnyMap& node, const UnitsVector& rate_units) { allow_negative_pre_exponential_factor = node.getBool("negative-A", false); if (!node.hasKey("rate-constant")) { @@ -103,13 +118,13 @@ void Arrhenius3::setParameters(const AnyMap& node, const Units& rate_units) ArrheniusBase::setParameters(node["rate-constant"], node.units(), rate_units); } -void Arrhenius3::getParameters(AnyMap& rateNode, const Units& rate_units) const +void Arrhenius3::getParameters(AnyMap& rateNode) const { if (allow_negative_pre_exponential_factor) { rateNode["negative-A"] = true; } AnyMap node; - ArrheniusBase::getParameters(node, rate_units); + ArrheniusBase::getParameters(node); if (!node.empty()) { // Arrhenius object is configured rateNode["rate-constant"] = std::move(node); @@ -133,28 +148,34 @@ BlowersMasel3::BlowersMasel3(double A, double b, double Ea0, double w) } void BlowersMasel3::setParameters( - const AnyValue& rate, const UnitSystem& units, const Units& rate_units) + const AnyValue& rate, const UnitSystem& units, const UnitsVector& rate_units) { if (rate.empty()) { m_A = NAN; m_b = NAN; m_Ea0_R = NAN; m_w_R = NAN; - } else if (rate.is()) { + m_order = NAN; + m_rate_units = Units(0.); + return; + } + + if (rate.is()) { ArrheniusBase::setParameters(rate, units, rate_units); auto& rate_map = rate.as(); m_Ea0_R = units.convertActivationEnergy(rate_map["Ea0"], "K"); m_w_R = units.convertActivationEnergy(rate_map["w"], "K"); } else { + setRateUnits(rate_units); auto& rate_vec = rate.asVector(4); - m_A = units.convert(rate_vec[0], rate_units); + m_A = units.convert(rate_vec[0], m_rate_units); m_b = rate_vec[1].asDouble(); m_Ea0_R = units.convertActivationEnergy(rate_vec[2], "K"); m_w_R = units.convertActivationEnergy(rate_vec[3], "K"); } } -void BlowersMasel3::setParameters(const AnyMap& node, const Units& rate_units) +void BlowersMasel3::setParameters(const AnyMap& node, const UnitsVector& rate_units) { allow_negative_pre_exponential_factor = node.getBool("negative-A", false); if (!node.hasKey("rate-constant")) { @@ -164,14 +185,13 @@ void BlowersMasel3::setParameters(const AnyMap& node, const Units& rate_units) BlowersMasel3::setParameters(node["rate-constant"], node.units(), rate_units); } -void BlowersMasel3::getParameters(AnyMap& rateNode, - const Units& rate_units) const +void BlowersMasel3::getParameters(AnyMap& rateNode) const { if (allow_negative_pre_exponential_factor) { rateNode["negative-A"] = true; } AnyMap node; - ArrheniusBase::getParameters(node, rate_units); + ArrheniusBase::getParameters(node); if (!node.empty()) { // object is configured node.erase("Ea"); diff --git a/src/kinetics/Falloff.cpp b/src/kinetics/Falloff.cpp index 1167321486e..6bcef6878c4 100644 --- a/src/kinetics/Falloff.cpp +++ b/src/kinetics/Falloff.cpp @@ -57,21 +57,27 @@ void Falloff::getData(vector_fp& c) const c.clear(); } -void Falloff::setParameters(const AnyMap& node, const Units& rate_units) +void Falloff::setParameters(const AnyMap& node, const UnitsVector& rate_units) { if (node["type"] == "chemically-activated") { m_chemicallyActivated = true; } allow_negative_pre_exponential_factor = node.getBool("negative-A", false); if (node.hasKey("low-P-rate-constant")) { - m_lowRate = ArrheniusBase(node["low-P-rate-constant"], node.units(), rate_units); + m_lowRate = ArrheniusBase( + node["low-P-rate-constant"], node.units(), rate_units); + } + UnitsVector low_rate_units = rate_units; + if (low_rate_units.size()) { + low_rate_units.pop_back(); } if (node.hasKey("high-P-rate-constant")) { - m_highRate = ArrheniusBase(node["high-P-rate-constant"], node.units(), rate_units); + m_highRate = ArrheniusBase( + node["high-P-rate-constant"], node.units(), low_rate_units); } } -void Falloff::getParameters(AnyMap& rateNode, const Units& rate_units) const +void Falloff::getParameters(AnyMap& rateNode) const { if (m_chemicallyActivated) { rateNode["type"] = "chemically-activated"; @@ -82,12 +88,12 @@ void Falloff::getParameters(AnyMap& rateNode, const Units& rate_units) const rateNode["negative-A"] = true; } AnyMap node; - m_lowRate.getParameters(node, rate_units); + m_lowRate.getParameters(node); if (!node.empty()) { rateNode["low-P-rate-constant"] = std::move(node); } node.clear(); - m_highRate.getParameters(node, rate_units); + m_highRate.getParameters(node); if (!node.empty()) { rateNode["high-P-rate-constant"] = std::move(node); } @@ -189,7 +195,7 @@ double Troe::F(double pr, const double* work) const return pow(10.0, lgf); } -void Troe::setParameters(const AnyMap& node, const Units& rate_units) +void Troe::setParameters(const AnyMap& node, const UnitsVector& rate_units) { Falloff::setParameters(node, rate_units); auto& f = node["Troe"].as(); @@ -216,6 +222,7 @@ void Troe::getParameters(double* params) const { void Troe::getParameters(AnyMap& reactionNode) const { + Falloff::getParameters(reactionNode); AnyMap params; if (!std::isnan(m_a)) { params["A"] = m_a; @@ -229,12 +236,6 @@ void Troe::getParameters(AnyMap& reactionNode) const reactionNode["Troe"] = std::move(params); } -void Troe::getParameters(AnyMap& rateNode, const Units& rate_units) const -{ - Falloff::getParameters(rateNode, rate_units); - getParameters(rateNode); -} - void SRI::setData(const vector_fp& c) { if (c.size() != 3 && c.size() != 5) { @@ -289,7 +290,7 @@ double SRI::F(double pr, const double* work) const return pow(*work, xx) * work[1]; } -void SRI::setParameters(const AnyMap& node, const Units& rate_units) +void SRI::setParameters(const AnyMap& node, const UnitsVector& rate_units) { Falloff::setParameters(node, rate_units); auto& f = node["SRI"].as(); @@ -321,6 +322,7 @@ void SRI::getParameters(double* params) const void SRI::getParameters(AnyMap& reactionNode) const { + Falloff::getParameters(reactionNode); AnyMap params; if (!std::isnan(m_a)) { params["A"] = m_a; @@ -335,12 +337,6 @@ void SRI::getParameters(AnyMap& reactionNode) const reactionNode["SRI"] = std::move(params); } -void SRI::getParameters(AnyMap& rateNode, const Units& rate_units) const -{ - Falloff::getParameters(rateNode, rate_units); - getParameters(rateNode); -} - void Tsang::setData(const vector_fp& c) { if (c.size() != 1 && c.size() != 2) { @@ -383,7 +379,7 @@ double Tsang::F(double pr, const double* work) const return pow(10.0, lgf); } -void Tsang::setParameters(const AnyMap& node, const Units& rate_units) +void Tsang::setParameters(const AnyMap& node, const UnitsVector& rate_units) { Falloff::setParameters(node, rate_units); auto& f = node["Tsang"].as(); @@ -404,6 +400,7 @@ void Tsang::getParameters(double* params) const { void Tsang::getParameters(AnyMap& reactionNode) const { + Falloff::getParameters(reactionNode); AnyMap params; if (!std::isnan(m_a)) { params["A"] = m_a; @@ -413,10 +410,4 @@ void Tsang::getParameters(AnyMap& reactionNode) const reactionNode["Tsang"] = std::move(params); } -void Tsang::getParameters(AnyMap& rateNode, const Units& rate_units) const -{ - Falloff::getParameters(rateNode, rate_units); - getParameters(rateNode); -} - } diff --git a/src/kinetics/Reaction.cpp b/src/kinetics/Reaction.cpp index f589b1183bd..01e6663a557 100644 --- a/src/kinetics/Reaction.cpp +++ b/src/kinetics/Reaction.cpp @@ -159,7 +159,7 @@ void Reaction::getParameters(AnyMap& reactionNode) const } if (m_rate) { - reactionNode.update(m_rate->parameters(rate_units)); + reactionNode.update(m_rate->parameters()); } } @@ -268,11 +268,6 @@ void Reaction::calculateRateCoeffUnits(const Kinetics& kin) rate_units *= phase.standardConcentrationUnits().pow(-stoich.second); } } - - if (m_rate) { - // Ensure that reaction rate object is updated - m_rate->setUnits(rate_units); - } } UnitsVector Reaction::calculateRateCoeffUnits3(const Kinetics& kin) diff --git a/src/kinetics/ReactionRate.cpp b/src/kinetics/ReactionRate.cpp index 14a08910472..f7a596bb805 100644 --- a/src/kinetics/ReactionRate.cpp +++ b/src/kinetics/ReactionRate.cpp @@ -16,9 +16,9 @@ PlogRate::PlogRate(const std::multimap& rates) { } -PlogRate::PlogRate(const AnyMap& node, const Units& rate_units) +PlogRate::PlogRate(const AnyMap& node, const UnitsVector& units) { - setParameters(node, rate_units); + setParameters(node, units); } unique_ptr PlogRate::newMultiRate() const @@ -26,11 +26,12 @@ unique_ptr PlogRate::newMultiRate() const return unique_ptr(new MultiBulkRate); } -void PlogRate::setParameters(const AnyMap& node, const Units& rate_units) +void PlogRate::setParameters(const AnyMap& node, const UnitsVector& units) { // @TODO implementation of Plog::setParameters should be transferred here // when the Plog class is removed from RxnRates.h after Cantera 2.6 - ReactionRateBase::setParameters(node, rate_units); + ReactionRateBase::setParameters(node, units); + auto rate_units = Units::product(units); if (!node.hasKey("rate-constants")) { Plog::setParameters(std::vector (), node.units(), rate_units); return; @@ -40,11 +41,11 @@ void PlogRate::setParameters(const AnyMap& node, const Units& rate_units) node.units(), rate_units); } -void PlogRate::getParameters(AnyMap& rateNode, const Units& rate_units) const +void PlogRate::getParameters(AnyMap& rateNode) const { // @TODO implementation of Plog::getParameters should be transferred here // when the Plog class is removed from RxnRates.h after Cantera 2.6 - Plog::getParameters(rateNode, rate_units); + Plog::getParameters(rateNode); rateNode["type"] = type(); } @@ -54,9 +55,9 @@ ChebyshevRate3::ChebyshevRate3(double Tmin, double Tmax, double Pmin, double Pma { } -ChebyshevRate3::ChebyshevRate3(const AnyMap& node, const Units& rate_units) +ChebyshevRate3::ChebyshevRate3(const AnyMap& node, const UnitsVector& units) { - setParameters(node, rate_units); + setParameters(node, units); } unique_ptr ChebyshevRate3::newMultiRate() const @@ -65,24 +66,24 @@ unique_ptr ChebyshevRate3::newMultiRate() const new MultiBulkRate); } -void ChebyshevRate3::setParameters(const AnyMap& node, const Units& rate_units) +void ChebyshevRate3::setParameters(const AnyMap& node, const UnitsVector& units) { - ReactionRateBase::setParameters(node, rate_units); + ReactionRateBase::setParameters(node, units); + m_rate_units = Units::product(units); if (!node.hasKey("data")) { - Chebyshev::setParameters(AnyMap(), node.units(), rate_units); + Chebyshev::setParameters(AnyMap(), node.units(), m_rate_units); return; } // @TODO implementation of Chebyshev::setParameters should be transferred here // when the Chebyshev class is removed from RxnRates.h after Cantera 2.6 - Chebyshev::setParameters(node, node.units(), rate_units); + Chebyshev::setParameters(node, node.units(), m_rate_units); } -void ChebyshevRate3::getParameters(AnyMap& rateNode, - const Units& rate_units) const +void ChebyshevRate3::getParameters(AnyMap& rateNode) const { // @TODO implementation of Chebyshev::getParameters should be transferred here // when the Chebyshev class is removed from RxnRates.h after Cantera 2.6 - Chebyshev::getParameters(rateNode, rate_units); + Chebyshev::getParameters(rateNode, m_rate_units); rateNode["type"] = type(); } diff --git a/src/kinetics/RxnRates.cpp b/src/kinetics/RxnRates.cpp index 10788f12500..0d4b9ea4709 100644 --- a/src/kinetics/RxnRates.cpp +++ b/src/kinetics/RxnRates.cpp @@ -35,7 +35,9 @@ Arrhenius2::Arrhenius2(const AnyValue& rate, void Arrhenius2::setParameters(const AnyValue& rate, const UnitSystem& units, const Units& rate_units) { - ArrheniusBase::setParameters(rate, units, rate_units); + UnitsVector units_vector; + units_vector.emplace_back(rate_units, 1.); + ArrheniusBase::setParameters(rate, units, units_vector); if (m_A <= 0.0) { m_logA = -1.0E300; } else { @@ -157,7 +159,7 @@ void Plog::getParameters(AnyMap& rateNode, const Units& rate_units) const for (const auto& r : getRates()) { AnyMap rateNode_; rateNode_["P"].setQuantity(r.first, "Pa"); - r.second.getParameters(rateNode_, rate_units); + r.second.getParameters(rateNode_); rateList.push_back(std::move(rateNode_)); } rateNode["rate-constants"] = std::move(rateList);