[Kinetics] Fix 'skip_undeclared_species' behavior

This commit is contained in:
Ray Speth 2015-05-05 17:43:05 -04:00
parent 982846acf7
commit 14b2e8f5cf
10 changed files with 53 additions and 35 deletions

View file

@ -56,7 +56,7 @@ public:
void updateKc();
virtual void addReaction(ReactionData& r);
virtual void addReaction(shared_ptr<Reaction> r);
virtual bool addReaction(shared_ptr<Reaction> r);
};
}

View file

@ -35,7 +35,7 @@ public:
bool doIrreversible = false);
virtual void addReaction(ReactionData& r);
virtual void addReaction(shared_ptr<Reaction> r);
virtual bool addReaction(shared_ptr<Reaction> r);
virtual void init();
virtual void finalize();
virtual bool ready() const;

View file

@ -53,7 +53,7 @@ public:
//! @{
virtual void init();
virtual void addReaction(ReactionData& r);
virtual void addReaction(shared_ptr<Reaction> r);
virtual bool addReaction(shared_ptr<Reaction> r);
virtual void finalize();
virtual bool ready() const;
//@}

View file

@ -210,7 +210,7 @@ public:
virtual void init();
virtual void addReaction(ReactionData& r);
virtual void addReaction(shared_ptr<Reaction> r);
virtual bool addReaction(shared_ptr<Reaction> r);
virtual void finalize();
virtual bool ready() const;
//! @}

View file

@ -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<Reaction> r);
virtual bool addReaction(shared_ptr<Reaction> r);
/**
* Return the Reaction object for reaction *i*.

View file

@ -157,16 +157,19 @@ void AqueousKinetics::addReaction(ReactionData& r)
BulkKinetics::addReaction(r);
}
void AqueousKinetics::addReaction(shared_ptr<Reaction> r)
bool AqueousKinetics::addReaction(shared_ptr<Reaction> r)
{
bool added = BulkKinetics::addReaction(r);
if (!added) {
return false;
}
if (r->reaction_type == ELEMENTARY_RXN) {
addElementaryReaction(dynamic_cast<ElementaryReaction&>(*r));
} else {
throw CanteraError("AqueousKinetics::addReaction",
"Invalid reaction type: " + int2str(r->reaction_type));
}
BulkKinetics::addReaction(r);
return true;
}
}

View file

@ -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<Reaction> r)
bool BulkKinetics::addReaction(shared_ptr<Reaction> 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<Reaction> 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()

View file

@ -267,8 +267,14 @@ void GasKinetics::addReaction(ReactionData& r)
BulkKinetics::addReaction(r);
}
void GasKinetics::addReaction(shared_ptr<Reaction> r)
bool GasKinetics::addReaction(shared_ptr<Reaction> 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<ElementaryReaction&>(*r));
@ -290,9 +296,7 @@ void GasKinetics::addReaction(shared_ptr<Reaction> 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<size_t, double> 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<size_t, double> 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()

View file

@ -894,8 +894,14 @@ void InterfaceKinetics::addReaction(ReactionData& r)
}
}
void InterfaceKinetics::addReaction(shared_ptr<Reaction> r_base)
bool InterfaceKinetics::addReaction(shared_ptr<Reaction> r_base)
{
size_t i = nReactions();
bool added = Kinetics::addReaction(r_base);
if (!added) {
return false;
}
InterfaceReaction& r = dynamic_cast<InterfaceReaction&>(*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<Reaction> 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<Reaction> 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<Reaction> 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<Reaction> 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<Reaction> 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<bool>(nPhases(), false));
m_rxnPhaseIsProduct.push_back(std::vector<bool>(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<Reaction> r_base)
size_t p = speciesPhaseIndex(k);
m_rxnPhaseIsProduct[i][p] = true;
}
return true;
}

View file

@ -653,7 +653,7 @@ void Kinetics::addReaction(ReactionData& r) {
m_ropnet.push_back(0.0);
}
void Kinetics::addReaction(shared_ptr<Reaction> r)
bool Kinetics::addReaction(shared_ptr<Reaction> r)
{
r->validate();
@ -672,7 +672,7 @@ void Kinetics::addReaction(shared_ptr<Reaction> 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<Reaction> 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<Reaction> r)
m_ropf.push_back(0.0);
m_ropr.push_back(0.0);
m_ropnet.push_back(0.0);
return true;
}
shared_ptr<Reaction> Kinetics::reaction(size_t i)