From 601571014b5c15043e8f55522c80ebd563ffe111 Mon Sep 17 00:00:00 2001 From: Ingmar Schoegl Date: Tue, 30 Mar 2021 13:55:56 -0500 Subject: [PATCH] [Kinetics] tweak performance of MultiRate --- include/cantera/kinetics/MultiRate.h | 26 +++++++++++++------------- include/cantera/kinetics/Reaction.h | 4 ---- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/include/cantera/kinetics/MultiRate.h b/include/cantera/kinetics/MultiRate.h index 9d5799c2bab..f8256fa8eee 100644 --- a/include/cantera/kinetics/MultiRate.h +++ b/include/cantera/kinetics/MultiRate.h @@ -70,7 +70,7 @@ class MultiBulkRates final : public MultiRateBase virtual ReactionRateBase& rate(size_t rxn_index) override { size_t j = m_indices[rxn_index]; - return static_cast(m_rates[j]); + return static_cast(m_rxn_rates.at(j).second); } virtual void add(const size_t rxn_index, @@ -85,17 +85,16 @@ class MultiBulkRates final : public MultiRateBase "Reaction rate is already linked to a reaction rate " "evaluator. Re-linked reaction rates are not allowed"); } - size_t j = m_rates.size(); + size_t j = m_rxn_rates.size(); m_indices[rxn_index] = j; - m_rates.push_back(static_cast(*rate)); - m_rxn.push_back(rxn_index); + m_rxn_rates.emplace_back(rxn_index, static_cast(*rate)); // keep link to original object m_bases.push_back(rate); } virtual bool replace(const size_t rxn_index, shared_ptr rate) override { - if (!m_rates.size()) { + if (!m_rxn_rates.size()) { throw CanteraError("MultiBulkRate::replace", "Invalid operation: cannot replace rate object " "in empty rate handler."); @@ -103,7 +102,7 @@ class MultiBulkRates final : public MultiRateBase throw CanteraError("MultiBulkRate::replace", "Invalid operation: cannot replace rate object of type '{}' " "with a new rate of type '{}'.", - m_rates[0].type(), rate->type()); + m_rxn_rates.at(0).second.type(), rate->type()); } else if (rate->linked()) { // ensure there are no dangling objects (unlikely) throw CanteraError("MultiBulkRate::replace", @@ -112,7 +111,7 @@ class MultiBulkRates final : public MultiRateBase } if (m_indices.find(rxn_index) != m_indices.end()) { size_t j = m_indices[rxn_index]; - m_rates[j] = static_cast(*rate); + m_rxn_rates.at(j).second = static_cast(*rate); // release evaluator from previously used rate object and update m_bases[j]->releaseEvaluator(); m_bases[j] = rate; @@ -123,8 +122,8 @@ class MultiBulkRates final : public MultiRateBase virtual void getRateConstants(const ThermoPhase& bulk, double* kf, double* concm) const override { - for (size_t i = 0; i < m_rates.size(); i++) { - kf[m_rxn[i]] = m_rates[i].eval(m_shared, concm[m_rxn[i]]); + for (const auto& rxn : m_rxn_rates) { + kf[rxn.first] = rxn.second.eval(m_shared, concm[rxn.first]); } } @@ -135,8 +134,8 @@ class MultiBulkRates final : public MultiRateBase // update reaction-specific data for each reaction. This loop // is efficient as all function calls are de-virtualized, and // all of the rate objects are contiguous in memory - for (size_t i = 0; i < m_rates.size(); i++) { - m_rates[i].update(m_shared, concm[m_rxn[i]]); + for (auto& rxn : m_rxn_rates) { + rxn.second.update(m_shared, concm[rxn.first]); } } } @@ -145,8 +144,9 @@ class MultiBulkRates final : public MultiRateBase //! Raw pointers to reaction rate objects managed by Reaction object std::vector> m_bases; - std::vector m_rates; //!< Reaction rate objects - std::vector m_rxn; //!< Index within overall rate vector + //! Vector of pairs of reaction rates indices and reaction rates + std::vector> m_rxn_rates; + std::map m_indices; //!< Mapping of indices DataType m_shared; }; diff --git a/include/cantera/kinetics/Reaction.h b/include/cantera/kinetics/Reaction.h index 1b7d1a97dfb..d4830fd8a3d 100644 --- a/include/cantera/kinetics/Reaction.h +++ b/include/cantera/kinetics/Reaction.h @@ -341,10 +341,6 @@ class Reaction3 : public Reaction virtual void setParameters(const AnyMap& node, const Kinetics& kin); //! Get pointer to third-body - shared_ptr thirdBody() { - return m_third_body; - } - shared_ptr thirdBody() const { return m_third_body; }