diff --git a/include/cantera/kinetics/AqueousKinetics.h b/include/cantera/kinetics/AqueousKinetics.h index d61ce37d8..879eb7eac 100644 --- a/include/cantera/kinetics/AqueousKinetics.h +++ b/include/cantera/kinetics/AqueousKinetics.h @@ -56,7 +56,7 @@ public: void updateKc(); virtual void addReaction(ReactionData& r); - virtual void addReaction(shared_ptr r); + virtual bool addReaction(shared_ptr r); }; } diff --git a/include/cantera/kinetics/BulkKinetics.h b/include/cantera/kinetics/BulkKinetics.h index 025b9f469..720327a4b 100644 --- a/include/cantera/kinetics/BulkKinetics.h +++ b/include/cantera/kinetics/BulkKinetics.h @@ -35,7 +35,7 @@ public: bool doIrreversible = false); virtual void addReaction(ReactionData& r); - virtual void addReaction(shared_ptr r); + virtual bool addReaction(shared_ptr r); virtual void init(); virtual void finalize(); virtual bool ready() const; diff --git a/include/cantera/kinetics/GasKinetics.h b/include/cantera/kinetics/GasKinetics.h index 824da902b..de39b2806 100644 --- a/include/cantera/kinetics/GasKinetics.h +++ b/include/cantera/kinetics/GasKinetics.h @@ -53,7 +53,7 @@ public: //! @{ virtual void init(); virtual void addReaction(ReactionData& r); - virtual void addReaction(shared_ptr r); + virtual bool addReaction(shared_ptr r); virtual void finalize(); virtual bool ready() const; //@} diff --git a/include/cantera/kinetics/InterfaceKinetics.h b/include/cantera/kinetics/InterfaceKinetics.h index 21d2dce02..7e7a81daa 100644 --- a/include/cantera/kinetics/InterfaceKinetics.h +++ b/include/cantera/kinetics/InterfaceKinetics.h @@ -210,7 +210,7 @@ public: virtual void init(); virtual void addReaction(ReactionData& r); - virtual void addReaction(shared_ptr r); + virtual bool addReaction(shared_ptr r); virtual void finalize(); virtual bool ready() const; //! @} diff --git a/include/cantera/kinetics/Kinetics.h b/include/cantera/kinetics/Kinetics.h index 7d4174cb7..40748a609 100644 --- a/include/cantera/kinetics/Kinetics.h +++ b/include/cantera/kinetics/Kinetics.h @@ -803,8 +803,9 @@ public: * base class method in addition to handling their own specialized behavior. * * @param r Pointer to the Reaction object to be added. + * @return `true` if the reaction is added or `false` if it was skipped */ - virtual void addReaction(shared_ptr r); + virtual bool addReaction(shared_ptr r); /** * Return the Reaction object for reaction *i*. diff --git a/src/kinetics/AqueousKinetics.cpp b/src/kinetics/AqueousKinetics.cpp index 986985107..9d04de622 100644 --- a/src/kinetics/AqueousKinetics.cpp +++ b/src/kinetics/AqueousKinetics.cpp @@ -157,16 +157,19 @@ void AqueousKinetics::addReaction(ReactionData& r) BulkKinetics::addReaction(r); } -void AqueousKinetics::addReaction(shared_ptr r) +bool AqueousKinetics::addReaction(shared_ptr r) { + bool added = BulkKinetics::addReaction(r); + if (!added) { + return false; + } if (r->reaction_type == ELEMENTARY_RXN) { addElementaryReaction(dynamic_cast(*r)); } else { throw CanteraError("AqueousKinetics::addReaction", "Invalid reaction type: " + int2str(r->reaction_type)); } - - BulkKinetics::addReaction(r); + return true; } } diff --git a/src/kinetics/BulkKinetics.cpp b/src/kinetics/BulkKinetics.cpp index 97f63e829..6f43be179 100644 --- a/src/kinetics/BulkKinetics.cpp +++ b/src/kinetics/BulkKinetics.cpp @@ -117,6 +117,7 @@ void BulkKinetics::getRevRateConstants(doublereal* krev, bool doIrreversible) void BulkKinetics::addReaction(ReactionData& r) { + Kinetics::addReaction(r); m_dn.push_back(accumulate(r.pstoich.begin(), r.pstoich.end(), 0.0) - accumulate(r.rstoich.begin(), r.rstoich.end(), 0.0)); @@ -125,11 +126,14 @@ void BulkKinetics::addReaction(ReactionData& r) } else { m_irrev.push_back(nReactions()); } - Kinetics::addReaction(r); } -void BulkKinetics::addReaction(shared_ptr r) +bool BulkKinetics::addReaction(shared_ptr r) { + bool added = Kinetics::addReaction(r); + if (!added) { + return false; + } double dn = 0.0; for (Composition::const_iterator iter = r->products.begin(); iter != r->products.end(); @@ -145,11 +149,11 @@ void BulkKinetics::addReaction(shared_ptr r) m_dn.push_back(dn); if (r->reversible) { - m_revindex.push_back(nReactions()); + m_revindex.push_back(nReactions()-1); } else { - m_irrev.push_back(nReactions()); + m_irrev.push_back(nReactions()-1); } - Kinetics::addReaction(r); + return true; } void BulkKinetics::addElementaryReaction(ReactionData& r) @@ -159,7 +163,7 @@ void BulkKinetics::addElementaryReaction(ReactionData& r) void BulkKinetics::addElementaryReaction(ElementaryReaction& r) { - m_rates.install(nReactions(), r.rate); + m_rates.install(nReactions()-1, r.rate); } void BulkKinetics::init() diff --git a/src/kinetics/GasKinetics.cpp b/src/kinetics/GasKinetics.cpp index abd131b0e..c78541f93 100644 --- a/src/kinetics/GasKinetics.cpp +++ b/src/kinetics/GasKinetics.cpp @@ -267,8 +267,14 @@ void GasKinetics::addReaction(ReactionData& r) BulkKinetics::addReaction(r); } -void GasKinetics::addReaction(shared_ptr r) +bool GasKinetics::addReaction(shared_ptr r) { + // operations common to all reaction types + bool added = BulkKinetics::addReaction(r); + if (!added) { + return false; + } + switch (r->reaction_type) { case ELEMENTARY_RXN: addElementaryReaction(dynamic_cast(*r)); @@ -290,9 +296,7 @@ void GasKinetics::addReaction(shared_ptr r) throw CanteraError("GasKinetics::addReaction", "Unknown reaction type specified: " + int2str(r->reaction_type)); } - - // operations common to all reaction types - BulkKinetics::addReaction(r); + return true; } void GasKinetics::addFalloffReaction(ReactionData& r) @@ -348,7 +352,7 @@ void GasKinetics::addFalloffReaction(FalloffReaction& r) m_rfn_low.push_back(0.0); // add this reaction number to the list of falloff reactions - m_fallindx.push_back(nReactions()); + m_fallindx.push_back(nReactions()-1); // install the enhanced third-body concentration calculator map efficiencies; @@ -369,7 +373,7 @@ void GasKinetics::addFalloffReaction(FalloffReaction& r) void GasKinetics::addThreeBodyReaction(ThirdBodyReaction& r) { - m_rates.install(nReactions(), r.rate); + m_rates.install(nReactions()-1, r.rate); map efficiencies; for (Composition::const_iterator iter = r.third_body.efficiencies.begin(); iter != r.third_body.efficiencies.end(); @@ -383,18 +387,18 @@ void GasKinetics::addThreeBodyReaction(ThirdBodyReaction& r) "' while adding reaction '" + r.equation() + "'"); } } - m_3b_concm.install(nReactions(), efficiencies, + m_3b_concm.install(nReactions()-1, efficiencies, r.third_body.default_efficiency); } void GasKinetics::addPlogReaction(PlogReaction& r) { - m_plog_rates.install(nReactions(), r.rate); + m_plog_rates.install(nReactions()-1, r.rate); } void GasKinetics::addChebyshevReaction(ChebyshevReaction& r) { - m_cheb_rates.install(nReactions(), r.rate); + m_cheb_rates.install(nReactions()-1, r.rate); } void GasKinetics::init() diff --git a/src/kinetics/InterfaceKinetics.cpp b/src/kinetics/InterfaceKinetics.cpp index 40cab562a..5919c59d6 100644 --- a/src/kinetics/InterfaceKinetics.cpp +++ b/src/kinetics/InterfaceKinetics.cpp @@ -894,8 +894,14 @@ void InterfaceKinetics::addReaction(ReactionData& r) } } -void InterfaceKinetics::addReaction(shared_ptr r_base) +bool InterfaceKinetics::addReaction(shared_ptr r_base) { + size_t i = nReactions(); + bool added = Kinetics::addReaction(r_base); + if (!added) { + return false; + } + InterfaceReaction& r = dynamic_cast(*r_base); // Create a SurfaceArrhenius rate calculator and set the coverage dependencies double A_rate = r.rate.preExponentialFactor(); @@ -966,7 +972,7 @@ void InterfaceKinetics::addReaction(shared_ptr r_base) } } } - m_sticking_orders.push_back(make_pair(m_ii, surface_order)); + m_sticking_orders.push_back(make_pair(i, surface_order)); } SurfaceArrhenius rate(A_rate, b_rate, r.rate.activationEnergy_R()); @@ -982,7 +988,7 @@ void InterfaceKinetics::addReaction(shared_ptr r_base) rate.addCoverageDependence(k, iter->second.a, iter->second.m, iter->second.E); } - m_rates.install(m_ii, rate); + m_rates.install(i, rate); // Store activation energy m_E.push_back(rate.activationEnergy_R()); @@ -991,7 +997,7 @@ void InterfaceKinetics::addReaction(shared_ptr r_base) if (re) { m_has_electrochem_rxns = true; m_beta.push_back(re->beta); - m_ctrxn.push_back(m_ii); + m_ctrxn.push_back(i); if (re->exchange_current_density_formulation) { m_has_exchange_current_density_formulation = true; m_ctrxn_ecdf.push_back(1); @@ -1032,7 +1038,7 @@ void InterfaceKinetics::addReaction(shared_ptr r_base) determineFwdOrdersBV(*re, fwdFullorders); RxnOrders* ro = new RxnOrders(); ro->fill(fwdFullorders); - m_ctrxn_FwdOrdersList_[m_ii] = ro; + m_ctrxn_FwdOrdersList_[i] = ro; } } else { m_ctrxn_ROPOrdersList_.push_back(0); @@ -1051,18 +1057,16 @@ void InterfaceKinetics::addReaction(shared_ptr r_base) } if (r.reversible) { - m_revindex.push_back(nReactions()); + m_revindex.push_back(i); m_nrev++; } else { - m_irrev.push_back(nReactions()); + m_irrev.push_back(i); m_nirrev++; } - Kinetics::addReaction(r_base); m_rxnPhaseIsReactant.push_back(std::vector(nPhases(), false)); m_rxnPhaseIsProduct.push_back(std::vector(nPhases(), false)); - size_t i = m_ii - 1; for (Composition::const_iterator iter = r.reactants.begin(); iter != r.reactants.end(); ++iter) { @@ -1077,6 +1081,7 @@ void InterfaceKinetics::addReaction(shared_ptr r_base) size_t p = speciesPhaseIndex(k); m_rxnPhaseIsProduct[i][p] = true; } + return true; } diff --git a/src/kinetics/Kinetics.cpp b/src/kinetics/Kinetics.cpp index 64626f04e..7b4aeeb1c 100644 --- a/src/kinetics/Kinetics.cpp +++ b/src/kinetics/Kinetics.cpp @@ -653,7 +653,7 @@ void Kinetics::addReaction(ReactionData& r) { m_ropnet.push_back(0.0); } -void Kinetics::addReaction(shared_ptr r) +bool Kinetics::addReaction(shared_ptr r) { r->validate(); @@ -672,7 +672,7 @@ void Kinetics::addReaction(shared_ptr r) ++iter) { if (kineticsSpeciesIndex(iter->first) == npos) { if (m_skipUndeclaredSpecies) { - return; + return false; } else { throw CanteraError("Kinetics::addReaction", "Reaction '" + r->equation() + "' contains the undeclared species '" + @@ -685,7 +685,7 @@ void Kinetics::addReaction(shared_ptr r) ++iter) { if (kineticsSpeciesIndex(iter->first) == npos) { if (m_skipUndeclaredSpecies) { - return; + return false; } else { throw CanteraError("Kinetics::addReaction", "Reaction '" + r->equation() + "' contains the undeclared species '" + @@ -767,6 +767,7 @@ void Kinetics::addReaction(shared_ptr r) m_ropf.push_back(0.0); m_ropr.push_back(0.0); m_ropnet.push_back(0.0); + return true; } shared_ptr Kinetics::reaction(size_t i)