Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reaction rate factories #1061

Merged
merged 19 commits into from
Aug 17, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
50e9d8f
[Kinetics] Implement ReactionRateBase::newMultiRate
ischoegl Jun 14, 2021
a612446
[Kinetics] Implement newRate factory constructor
ischoegl Jun 15, 2021
b5553d5
[Kinetics] Switch rate constructors to factories
ischoegl Jun 15, 2021
1e85246
[Kinetics] Ensure that ReactionRate type matches reaction specifications
ischoegl Jun 15, 2021
3bce625
[Kinetics] Add type information to ReactionRate serialization
ischoegl Jun 15, 2021
ff7a24f
[Kinetics] Use RateFactory creation for ReactionRate in Python
ischoegl Jun 15, 2021
36cfe54
[Kinetics] Enforce reaction rate types
ischoegl Jun 16, 2021
d5d13b7
[Kinetics] Address formatting comments
ischoegl Jul 15, 2021
6e99387
[Kinetics] Rename RateFactory to ReactionRateFactory
ischoegl Jul 15, 2021
bf51e90
[Kinetics] Deprecate Reaction.fromYaml
ischoegl Jul 15, 2021
b2ffade
[Kinetics] Make reaction.pyx more consistent/readable
ischoegl Jul 15, 2021
f39dd8a
[Kinetics] Remove kinetics argument from newReactionRate instantiation
ischoegl Jul 17, 2021
a890c5e
[Kinetics] Ensure that reaction rate units are updated
ischoegl Jul 17, 2021
791eb02
[Kinetics] Enforce correct units for pre-exponential factor
ischoegl Jul 22, 2021
1194ffe
[Kinetics] Remove standalone sentinel and calls to default constructor
ischoegl Aug 12, 2021
4022e79
[Kinetics] Use same nomenclature for Reaction and ReactionRate types
ischoegl Aug 12, 2021
26961c9
[Kinetics] Remove unnecessary specializations for getParameters
ischoegl Aug 12, 2021
799d6d8
[Python] Update ReactionRate __repr__ output
ischoegl Aug 12, 2021
39d4577
[Kinetics] Remove redundant return statements
ischoegl Aug 17, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion include/cantera/kinetics/MultiRate.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ class MultiRateBase

//! A class template handling all reaction rates specific to `BulkKinetics`.
template <class RateType, class DataType>
class MultiBulkRates final : public MultiRateBase
class MultiBulkRate final : public MultiRateBase
{
public:
virtual void add(const size_t rxn_index,
Expand Down
8 changes: 1 addition & 7 deletions include/cantera/kinetics/Reaction.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,9 +142,7 @@ class Reaction
}

//! Set reaction rate pointer
void setRate(shared_ptr<ReactionRateBase> rate) {
m_rate = rate;
}
void setRate(shared_ptr<ReactionRateBase> rate);

//! Get pointer to third-body
shared_ptr<ThirdBody> thirdBody() {
Expand Down Expand Up @@ -497,7 +495,6 @@ class ElementaryReaction3 : public Reaction
virtual std::string type() const {
return "elementary";
}
virtual void getParameters(AnyMap& reactionNode) const;
};


Expand Down Expand Up @@ -542,7 +539,6 @@ class PlogReaction3 : public Reaction
virtual std::string type() const {
return "pressure-dependent-Arrhenius";
}
virtual void getParameters(AnyMap& reactionNode) const;
};


Expand All @@ -560,8 +556,6 @@ class ChebyshevReaction3 : public Reaction
virtual std::string type() const {
return "Chebyshev";
}

virtual void getParameters(AnyMap& reactionNode) const;
};


Expand Down
27 changes: 23 additions & 4 deletions include/cantera/kinetics/ReactionRate.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ namespace Cantera
{

class Func1;
class MultiRateBase;

//! Abstract base class for reaction rate definitions
/**
Expand All @@ -43,6 +44,9 @@ class ReactionRateBase
//! Identifier of reaction type
virtual std::string type() const = 0;

//! Create multi-rate evaluator
virtual unique_ptr<MultiRateBase> newMultiRate() const = 0;

//! Update reaction rate data based on temperature
//! @param T temperature [K]
virtual void update(double T) = 0;
Expand Down Expand Up @@ -104,6 +108,10 @@ class ReactionRateBase
//! @param rate_units Description of units used for rate parameters
virtual void setParameters(const AnyMap& node, const Units& rate_units);

//! Set rate units
//! @param rate_units Description of units used for rate parameters
virtual void setUnits(const Units& rate_units);

protected:
//! Get parameters
//! Store the parameters of a ReactionRate needed to reconstruct an identical
Expand Down Expand Up @@ -250,7 +258,9 @@ class ArrheniusRate final : public ReactionRate<ArrheniusData>, public Arrhenius
virtual void getParameters(AnyMap& rateNode,
const Units& rate_units) const override;

virtual std::string type() const override { return "ArrheniusRate"; }
virtual std::string type() const override { return "Arrhenius"; }

virtual unique_ptr<MultiRateBase> newMultiRate() const override;

//! Update information specific to reaction
static bool usesUpdate() { return false; }
Expand Down Expand Up @@ -312,7 +322,12 @@ class PlogRate final : public ReactionRate<PlogData>, public Plog
//! @param node AnyMap containing rate information
PlogRate(const AnyMap& node);

virtual std::string type() const override { return "PlogRate"; }
virtual std::string type() const override
{
return "pressure-dependent-Arrhenius";
}

virtual unique_ptr<MultiRateBase> newMultiRate() const override;

virtual void setParameters(const AnyMap& node, const Units& rate_units) override;
virtual void getParameters(AnyMap& rateNode,
Expand Down Expand Up @@ -393,7 +408,9 @@ class ChebyshevRate3 final : public ReactionRate<ChebyshevData>, public Chebyshe
//! @param node AnyMap containing rate information
ChebyshevRate3(const AnyMap& node);

virtual std::string type() const override { return "ChebyshevRate"; }
virtual std::string type() const override { return "Chebyshev"; }

virtual unique_ptr<MultiRateBase> newMultiRate() const override;

virtual void setParameters(const AnyMap& node, const Units& rate_units) override;
virtual void getParameters(AnyMap& rateNode,
Expand Down Expand Up @@ -433,7 +450,9 @@ class CustomFunc1Rate final : public ReactionRate<CustomFunc1Data>
//! @param rate_units Description of units used for rate parameters
CustomFunc1Rate(const AnyMap& rate, const Units& rate_units) {}

virtual std::string type() const override { return "custom-function"; }
virtual std::string type() const override { return "custom-rate-function"; }

virtual unique_ptr<MultiRateBase> newMultiRate() const override;

virtual void setParameters(const AnyMap& node, const Units& rate_units) override {
units = rate_units;
Expand Down
88 changes: 88 additions & 0 deletions include/cantera/kinetics/ReactionRateFactory.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/**
* @file ReactionRateFactory.h
* Factory class for reaction rate objects. Used by classes that implement kinetics
* (see \ref reactionGroup and class \link Cantera::Rate Rate\endlink).
*/

// This file is part of Cantera. See License.txt in the top-level directory or
// at https://cantera.org/license.txt for license and copyright information.

#ifndef CT_NEWRATE_H
#define CT_NEWRATE_H

#include "cantera/base/FactoryBase.h"
#include "cantera/kinetics/ReactionRate.h"

namespace Cantera
{

class Kinetics;
class Units;

/**
* Factory class to construct reaction rate calculators.
* The reaction factory is accessed through the static method factory:
*
* @code
* Rate* f = ReactionRateFactory::factory()->newReactionRate(type, c)
* @endcode
*
* @ingroup reactionGroup
*/
class ReactionRateFactory
: public Factory<ReactionRateBase, const AnyMap&, const Units&>
{
public:
/**
* Return a pointer to the factory. On the first call, a new instance is
* created. Since there is no need to instantiate more than one factory,
* on all subsequent calls, a pointer to the existing factory is returned.
*/
static ReactionRateFactory* factory() {
std::unique_lock<std::mutex> lock(rate_mutex);
if (!s_factory) {
s_factory = new ReactionRateFactory;
}
return s_factory;
}

virtual void deleteFactory() {
std::unique_lock<std::mutex> lock(rate_mutex);
delete s_factory;
s_factory = 0;
}

private:
//! Pointer to the single instance of the factory
static ReactionRateFactory* s_factory;

//! default constructor, which is defined as private
ReactionRateFactory();

//! Mutex for use when calling the factory
static std::mutex rate_mutex;
};


//! Create a new empty ReactionRateBase object
/*!
* @param type string identifying type of reaction rate.
*/
shared_ptr<ReactionRateBase> newReactionRate(const std::string& type);

//! Create a new Rate object using the specified parameters
/*!
* @param rate_node AnyMap node describing reaction rate.
* @param rate_units Unit system of the reaction rate
*/
shared_ptr<ReactionRateBase> newReactionRate(
const AnyMap& rate_node, const Units& rate_units);

//! Create a new Rate object using the specified parameters
/*!
* @param rate_node AnyMap node describing reaction rate.
*/
shared_ptr<ReactionRateBase> newReactionRate(const AnyMap& rate_node);

}
#endif
27 changes: 9 additions & 18 deletions interfaces/cython/cantera/_cantera.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,10 @@ cdef extern from "cantera/kinetics/ReactionFactory.h" namespace "Cantera":
cdef shared_ptr[CxxReaction] CxxNewReaction "newReaction" (XML_Node&) except +translate_exception
cdef shared_ptr[CxxReaction] CxxNewReaction "newReaction" (CxxAnyMap&, CxxKinetics&) except +translate_exception

cdef extern from "cantera/kinetics/ReactionRateFactory.h" namespace "Cantera":
cdef shared_ptr[CxxReactionRateBase] CxxNewReactionRate "newReactionRate" (string) except +translate_exception
cdef shared_ptr[CxxReactionRateBase] CxxNewReactionRate "newReactionRate" (CxxAnyMap&) except +translate_exception

cdef extern from "cantera/kinetics/Reaction.h" namespace "Cantera":
cdef vector[shared_ptr[CxxReaction]] CxxGetReactions "getReactions" (XML_Node&) except +translate_exception
cdef vector[shared_ptr[CxxReaction]] CxxGetReactions "getReactions" (CxxAnyValue&, CxxKinetics&) except +translate_exception
Expand Down Expand Up @@ -1146,27 +1150,14 @@ cdef class ThermoPhase(_SolutionBase):
cdef class InterfacePhase(ThermoPhase):
cdef CxxSurfPhase* surf

cdef class _ReactionRate:
cdef shared_ptr[CxxReactionRateBase] _base
cdef CxxReactionRateBase* base

cdef class ArrheniusRate(_ReactionRate):
cdef CxxArrheniusRate* rate
@staticmethod
cdef wrap(shared_ptr[CxxReactionRateBase])

cdef class PlogRate(_ReactionRate):
cdef CxxPlogRate* rate
@staticmethod
cdef wrap(shared_ptr[CxxReactionRateBase])

cdef class ChebyshevRate(_ReactionRate):
cdef CxxChebyshevRate3* rate
cdef class ReactionRate:
cdef shared_ptr[CxxReactionRateBase] _rate
cdef CxxReactionRateBase* rate
@staticmethod
cdef wrap(shared_ptr[CxxReactionRateBase])

cdef class CustomRate(_ReactionRate):
cdef CxxCustomFunc1Rate* rate
cdef class CustomRate(ReactionRate):
cdef CxxCustomFunc1Rate* cxx_object(self)
cdef Func1 _rate_func

cdef class Reaction:
Expand Down
Loading