12 #ifndef CD_KMCSingleStateReactionImplem_H
13 #define CD_KMCSingleStateReactionImplem_H
17 #include <CD_NamespaceHeader.H>
19 template <
typename State,
typename T>
21 const std::list<size_t>& a_products) noexcept
23 m_reactants = a_reactants;
24 m_products = a_products;
26 this->computeStateChanges();
29 template <
typename State,
typename T>
33 template <
typename State,
typename T>
38 for (
const auto& r : m_reactants) {
39 if (m_stateChange.find(r) == m_stateChange.end()) {
40 m_stateChange.emplace(r, -1);
48 for (
const auto& p : m_products) {
49 if (m_stateChange.find(p) == m_stateChange.end()) {
50 m_stateChange.emplace(p, +1);
70 m_propensityFactor = 1.0;
72 std::map<size_t, size_t> reactantNumbers;
73 for (
const auto& r : m_reactants) {
74 if (reactantNumbers.find(r) == reactantNumbers.end()) {
75 reactantNumbers.emplace(r, 1);
82 for (
const auto& rn : reactantNumbers) {
83 m_propensityFactor *= 1.0 / factorial(rn.second);
87 template <
typename State,
typename T>
94 template <
typename State,
typename T>
98 return a_state[a_reactant];
101 template <
typename State,
typename T>
105 Real A = m_rate * m_propensityFactor;
109 for (
const auto& r : m_reactants) {
118 template <
typename State,
typename T>
124 for (
const auto& s : m_stateChange) {
126 const size_t rI = s.first;
127 const T nuIJ = s.second;
130 Lj =
std::min(Lj, a_state[rI] / std::abs(nuIJ));
137 template <
typename State,
typename T>
138 inline std::list<size_t>
144 template <
typename State,
typename T>
150 if (m_stateChange.find(a_particleReactant) != m_stateChange.end()) {
151 nuIJ = m_stateChange.at(a_particleReactant);
157 template <
typename State,
typename T>
161 for (
const auto& s : m_stateChange) {
162 a_state[s.first] += a_numReactions * s.second;
166 #include <CD_NamespaceFooter.H>
Declaration of a simple reaction type for advancing "single states" in Kinetic Monte Carlo codes.
std::list< size_t > getReactants() const noexcept
Get the reactants involved in the reaction.
Definition: CD_KMCSingleStateReactionImplem.H:139
virtual ~KMCSingleStateReaction()
Destructor.
Definition: CD_KMCSingleStateReactionImplem.H:30
Real propensity(const State &a_state) const noexcept
Compute the propensity function for this reaction type.
Definition: CD_KMCSingleStateReactionImplem.H:103
T population(const size_t &a_reactant, const State &a_state) const noexcept
Get the population of the reactant in the input state.
Definition: CD_KMCSingleStateReactionImplem.H:96
T getStateChange(const size_t a_reactant) const noexcept
Get the state change due to a change in the input reactant species.
Definition: CD_KMCSingleStateReactionImplem.H:146
void computeStateChanges() noexcept
Compute state change.
Definition: CD_KMCSingleStateReactionImplem.H:35
T computeCriticalNumberOfReactions(const State &a_state) const noexcept
Compute the number of times the reaction can fire before exhausting one of the reactants.
Definition: CD_KMCSingleStateReactionImplem.H:120
void advanceState(State &a_state, const T &a_numReactions) const noexcept
Advance the incoming state with the number of reactions.
Definition: CD_KMCSingleStateReactionImplem.H:159
KMCSingleStateReaction()=default
Disallowed constructor. Use the full constructor.
Real & rate() const noexcept
Get modifiable reaction rate.
Definition: CD_KMCSingleStateReactionImplem.H:89
Real max(const Real &a_input) noexcept
Get the maximum of the input, reduced over MPI ranks (in the Chombo communicator)
Definition: CD_ParallelOpsImplem.H:176
Real min(const Real &a_input) noexcept
Get the minimum of the input, reduced over MPI ranks (in the Chombo communicator)
Definition: CD_ParallelOpsImplem.H:58