GridFire 0.0.1a
General Purpose Nuclear Network
Loading...
Searching...
No Matches
reaction.h
Go to the documentation of this file.
1#pragma once
2
3#include <string_view>
4
5#include "fourdst/composition/atomicSpecies.h"
6#include "fourdst/logging/logging.h"
7#include "quill/Logger.h"
8#include <unordered_map>
9#include <vector>
10#include <unordered_set>
11
12
13#include "cppad/cppad.hpp"
14
33 double a0;
34 double a1;
35 double a2;
36 double a3;
37 double a4;
38 double a5;
39 double a6;
40
47 friend std::ostream& operator<<(std::ostream& os, const RateCoefficientSet& r) {
48 os << "[" << r.a0 << ", " << r.a1 << ", " << r.a2 << ", "
49 << r.a3 << ", " << r.a4 << ", " << r.a5 << ", " << r.a6 << "]";
50 return os;
51 }
52 };
53
71 class Reaction {
72 public:
76 virtual ~Reaction() = default;
77
91 const std::string_view id,
92 const std::string_view peName,
93 const int chapter,
94 const std::vector<fourdst::atomic::Species> &reactants,
95 const std::vector<fourdst::atomic::Species> &products,
96 const double qValue,
97 const std::string_view label,
98 const RateCoefficientSet &sets,
99 const bool reverse = false);
100
106 [[nodiscard]] virtual double calculate_rate(const double T9) const;
107
113 [[nodiscard]] virtual CppAD::AD<double> calculate_rate(const CppAD::AD<double> T9) const;
114
119 [[nodiscard]] virtual std::string_view peName() const { return m_peName; }
120
125 [[nodiscard]] int chapter() const { return m_chapter; }
126
131 [[nodiscard]] std::string_view sourceLabel() const { return m_sourceLabel; }
132
137 [[nodiscard]] const RateCoefficientSet& rateCoefficients() const { return m_rateCoefficients; }
138
144 [[nodiscard]] bool contains(const fourdst::atomic::Species& species) const;
145
151 [[nodiscard]] bool contains_reactant(const fourdst::atomic::Species& species) const;
152
158 [[nodiscard]] bool contains_product(const fourdst::atomic::Species& species) const;
159
164 [[nodiscard]] std::unordered_set<fourdst::atomic::Species> all_species() const;
165
170 [[nodiscard]] std::unordered_set<fourdst::atomic::Species> reactant_species() const;
171
176 [[nodiscard]] std::unordered_set<fourdst::atomic::Species> product_species() const;
177
182 [[nodiscard]] size_t num_species() const;
183
189 [[nodiscard]] int stoichiometry(const fourdst::atomic::Species& species) const;
190
195 [[nodiscard]] std::unordered_map<fourdst::atomic::Species, int> stoichiometry() const;
196
201 [[nodiscard]] std::string_view id() const { return m_id; }
202
207 [[nodiscard]] double qValue() const { return m_qValue; }
208
213 [[nodiscard]] const std::vector<fourdst::atomic::Species>& reactants() const { return m_reactants; }
214
219 [[nodiscard]] const std::vector<fourdst::atomic::Species>& products() const { return m_products; }
220
225 [[nodiscard]] bool is_reverse() const { return m_reverse; }
226
231 [[nodiscard]] double excess_energy() const;
232
238 bool operator==(const Reaction& other) const { return m_id == other.m_id; }
239
245 bool operator!=(const Reaction& other) const { return !(*this == other); }
246
253 [[nodiscard]] uint64_t hash(uint64_t seed = 0) const;
254
255 protected:
256 quill::Logger* m_logger = fourdst::logging::LogManager::getInstance().getLogger("log");
257 std::string m_id;
258 std::string m_peName;
260 double m_qValue = 0.0;
261 std::vector<fourdst::atomic::Species> m_reactants;
262 std::vector<fourdst::atomic::Species> m_products;
263 std::string m_sourceLabel;
265 bool m_reverse = false;
266 private:
275 template <typename T>
276 [[nodiscard]] T calculate_rate(const T T9) const {
277 const T T913 = CppAD::pow(T9, 1.0/3.0);
278 const T T953 = CppAD::pow(T9, 5.0/3.0);
279 const T logT9 = CppAD::log(T9);
280 const T exponent = m_rateCoefficients.a0 +
281 m_rateCoefficients.a1 / T9 +
282 m_rateCoefficients.a2 / T913 +
283 m_rateCoefficients.a3 * T913 +
284 m_rateCoefficients.a4 * T9 +
285 m_rateCoefficients.a5 * T953 +
286 m_rateCoefficients.a6 * logT9;
287 return CppAD::exp(exponent);
288 }
289 };
290
308 public:
313 explicit ReactionSet(std::vector<Reaction> reactions);
314
319 ReactionSet(const ReactionSet& other);
320
326 ReactionSet& operator=(const ReactionSet& other);
327
331 virtual ~ReactionSet() = default;
332
337 virtual void add_reaction(Reaction reaction);
338
343 virtual void remove_reaction(const Reaction& reaction);
344
350 [[nodiscard]] bool contains(const std::string_view& id) const;
351
357 [[nodiscard]] bool contains(const Reaction& reaction) const;
358
363 [[nodiscard]] virtual size_t size() const { return m_reactions.size(); }
364
368 void clear();
369
375 [[nodiscard]] bool contains_species(const fourdst::atomic::Species& species) const;
376
382 [[nodiscard]] bool contains_reactant(const fourdst::atomic::Species& species) const;
383
389 [[nodiscard]] bool contains_product(const fourdst::atomic::Species& species) const;
390
397 [[nodiscard]] virtual const Reaction& operator[](size_t index) const;
398
405 [[nodiscard]] const Reaction& operator[](const std::string_view& id) const;
406
412 bool operator==(const ReactionSet& other) const;
413
419 bool operator!=(const ReactionSet& other) const;
420
429 [[nodiscard]] uint64_t hash(uint64_t seed = 0) const;
430
435 auto begin() { return m_reactions.begin(); }
436 [[nodiscard]] auto begin() const { return m_reactions.cbegin(); }
437 auto end() { return m_reactions.end(); }
438 [[nodiscard]] auto end() const { return m_reactions.cend(); }
440 private:
441 quill::Logger* m_logger = fourdst::logging::LogManager::getInstance().getLogger("log");
442 std::vector<Reaction> m_reactions;
443 std::string m_id;
444 std::unordered_map<std::string, Reaction> m_reactionNameMap;
445
446 };
447
448
459 class LogicalReaction final : public Reaction {
460 public:
466 explicit LogicalReaction(const std::vector<Reaction> &reactions);
467
474 void add_reaction(const Reaction& reaction);
475
480 [[nodiscard]] size_t size() const { return m_rates.size(); }
481
486 [[nodiscard]] std::vector<std::string> sources() const { return m_sources; }
487
493 [[nodiscard]] double calculate_rate(const double T9) const override;
494
500 [[nodiscard]] CppAD::AD<double> calculate_rate(const CppAD::AD<double> T9) const override;
501
506 auto begin() { return m_rates.begin(); }
507 [[nodiscard]] auto begin() const { return m_rates.cbegin(); }
508 auto end() { return m_rates.end(); }
509 [[nodiscard]] auto end() const { return m_rates.cend(); }
511
512 private:
513 std::vector<std::string> m_sources;
514 std::vector<RateCoefficientSet> m_rates;
515
516 private:
525 template <typename T>
526 [[nodiscard]] T calculate_rate(const T T9) const {
527 T sum = static_cast<T>(0.0);
528 const T T913 = CppAD::pow(T9, 1.0/3.0);
529 const T T953 = CppAD::pow(T9, 5.0/3.0);
530 const T logT9 = CppAD::log(T9);
531 // ReSharper disable once CppUseStructuredBinding
532 for (const auto& rate : m_rates) {
533 const T exponent = rate.a0 +
534 rate.a1 / T9 +
535 rate.a2 / T913 +
536 rate.a3 * T913 +
537 rate.a4 * T9 +
538 rate.a5 * T953 +
539 rate.a6 * logT9;
540 sum += CppAD::exp(exponent);
541 }
542 return sum;
543 }
544 };
545
554 class LogicalReactionSet final : public ReactionSet {
555 public:
560
567 explicit LogicalReactionSet(const ReactionSet& reactionSet);
568
573 auto begin() { return m_reactions.begin(); }
574 [[nodiscard]] auto begin() const { return m_reactions.cbegin(); }
575 auto end() { return m_reactions.end(); }
576 [[nodiscard]] auto end() const { return m_reactions.cend(); }
578
583 [[nodiscard]] size_t size() const { return m_reactions.size(); }
584
590 [[nodiscard]] const LogicalReaction& operator[](size_t index) const { return m_reactions[index]; }
591 private:
592 quill::Logger* m_logger = fourdst::logging::LogManager::getInstance().getLogger("log");
593 std::vector<LogicalReaction> m_reactions;
594 std::string m_id;
595 std::unordered_map<std::string, LogicalReaction> m_reactionNameMap;
596 };
597
598}
599
Represents a "logical" reaction that aggregates rates from multiple sources.
Definition reaction.h:459
T calculate_rate(const T T9) const
Template implementation for calculating the total reaction rate.
Definition reaction.h:526
void add_reaction(const Reaction &reaction)
Adds another Reaction source to this logical reaction.
Definition reaction.cpp:317
double calculate_rate(const double T9) const override
Calculates the total reaction rate by summing all source rates.
Definition reaction.cpp:339
LogicalReaction(const std::vector< Reaction > &reactions)
Constructs a LogicalReaction from a vector of Reaction objects.
Definition reaction.cpp:288
std::vector< std::string > m_sources
List of source labels.
Definition reaction.h:513
std::vector< RateCoefficientSet > m_rates
List of rate coefficient sets from each source.
Definition reaction.h:514
std::vector< std::string > sources() const
Gets the list of source labels for the aggregated rates.
Definition reaction.h:486
size_t size() const
Gets the number of source rates contributing to this logical reaction.
Definition reaction.h:480
const LogicalReaction & operator[](size_t index) const
Accesses a logical reaction by its index.
Definition reaction.h:590
std::vector< LogicalReaction > m_reactions
Definition reaction.h:593
size_t size() const
Gets the number of logical reactions in the set.
Definition reaction.h:583
std::unordered_map< std::string, LogicalReaction > m_reactionNameMap
Maps reaction IDs to LogicalReaction objects for quick lookup.
Definition reaction.h:595
LogicalReactionSet()=delete
Deleted default constructor.
Represents a single nuclear reaction from a specific data source.
Definition reaction.h:71
std::string m_sourceLabel
Source label for the rate data (e.g., "wc12w", "st08").
Definition reaction.h:263
std::unordered_set< fourdst::atomic::Species > product_species() const
Gets a set of all unique product species.
Definition reaction.cpp:85
bool contains_product(const fourdst::atomic::Species &species) const
Checks if the reaction involves a given species as a product.
Definition reaction.cpp:61
std::string_view id() const
Gets the unique identifier of the reaction.
Definition reaction.h:201
bool m_reverse
Flag indicating if this is a reverse reaction rate.
Definition reaction.h:265
const std::vector< fourdst::atomic::Species > & reactants() const
Gets the vector of reactant species.
Definition reaction.h:213
int m_chapter
Chapter number from the REACLIB database, defining the reaction structure.
Definition reaction.h:259
size_t num_species() const
Gets the number of unique species involved in the reaction.
Definition reaction.cpp:108
bool operator!=(const Reaction &other) const
Compares this reaction with another for inequality.
Definition reaction.h:245
std::string_view sourceLabel() const
Gets the source label for the rate data.
Definition reaction.h:131
std::vector< fourdst::atomic::Species > m_products
Products of the reaction.
Definition reaction.h:262
double m_qValue
Q-value of the reaction in MeV.
Definition reaction.h:260
std::string m_id
Unique identifier for the reaction (e.g., "h1+h1=>h2+e+nu").
Definition reaction.h:257
int chapter() const
Gets the REACLIB chapter number.
Definition reaction.h:125
std::string m_peName
Name of the reaction in (projectile, ejectile) notation (e.g. "p(p,g)d").
Definition reaction.h:258
T calculate_rate(const T T9) const
Template implementation for calculating the reaction rate.
Definition reaction.h:276
const std::vector< fourdst::atomic::Species > & products() const
Gets the vector of product species.
Definition reaction.h:219
quill::Logger * m_logger
Definition reaction.h:256
virtual std::string_view peName() const
Gets the reaction name in (projectile, ejectile) notation.
Definition reaction.h:119
std::unordered_set< fourdst::atomic::Species > all_species() const
Gets a set of all unique species involved in the reaction.
Definition reaction.cpp:70
Reaction(const std::string_view id, const std::string_view peName, const int chapter, const std::vector< fourdst::atomic::Species > &reactants, const std::vector< fourdst::atomic::Species > &products, const double qValue, const std::string_view label, const RateCoefficientSet &sets, const bool reverse=false)
Constructs a Reaction object.
Definition reaction.cpp:19
std::unordered_set< fourdst::atomic::Species > reactant_species() const
Gets a set of all unique reactant species.
Definition reaction.cpp:77
const RateCoefficientSet & rateCoefficients() const
Gets the set of rate coefficients.
Definition reaction.h:137
std::vector< fourdst::atomic::Species > m_reactants
Reactants of the reaction.
Definition reaction.h:261
double excess_energy() const
Calculates the excess energy from the mass difference of reactants and products.
Definition reaction.cpp:123
RateCoefficientSet m_rateCoefficients
The seven rate coefficients.
Definition reaction.h:264
bool is_reverse() const
Checks if this is a reverse reaction rate.
Definition reaction.h:225
int stoichiometry(const fourdst::atomic::Species &species) const
Calculates the stoichiometric coefficient for a given species.
virtual ~Reaction()=default
Virtual destructor.
bool contains(const fourdst::atomic::Species &species) const
Checks if the reaction involves a given species as a reactant or product.
Definition reaction.cpp:47
bool contains_reactant(const fourdst::atomic::Species &species) const
Checks if the reaction involves a given species as a reactant.
Definition reaction.cpp:52
double qValue() const
Gets the Q-value of the reaction.
Definition reaction.h:207
bool operator==(const Reaction &other) const
Compares this reaction with another for equality based on their IDs.
Definition reaction.h:238
std::unordered_map< fourdst::atomic::Species, int > stoichiometry() const
Gets a map of all species to their stoichiometric coefficients.
Definition reaction.cpp:112
virtual double calculate_rate(const double T9) const
Calculates the reaction rate for a given temperature.
Definition reaction.cpp:39
uint64_t hash(uint64_t seed=0) const
Computes a hash for the reaction based on its ID.
Definition reaction.cpp:136
A collection of Reaction objects.
Definition reaction.h:307
virtual void remove_reaction(const Reaction &reaction)
Removes a reaction from the set.
Definition reaction.cpp:181
bool contains_reactant(const fourdst::atomic::Species &species) const
Checks if any reaction in the set contains the given species as a reactant.
Definition reaction.cpp:225
uint64_t hash(uint64_t seed=0) const
Computes a hash for the entire set.
Definition reaction.cpp:270
virtual const Reaction & operator[](size_t index) const
Accesses a reaction by its index.
Definition reaction.cpp:243
bool contains_product(const fourdst::atomic::Species &species) const
Checks if any reaction in the set contains the given species as a product.
Definition reaction.cpp:234
bool operator==(const ReactionSet &other) const
Compares this set with another for equality.
Definition reaction.cpp:259
bool operator!=(const ReactionSet &other) const
Compares this set with another for inequality.
Definition reaction.cpp:266
bool contains_species(const fourdst::atomic::Species &species) const
Checks if any reaction in the set involves the given species.
Definition reaction.cpp:216
virtual ~ReactionSet()=default
Virtual destructor.
virtual size_t size() const
Gets the number of reactions in the set.
Definition reaction.h:363
void clear()
Removes all reactions from the set.
Definition reaction.cpp:211
std::vector< Reaction > m_reactions
Definition reaction.h:442
ReactionSet & operator=(const ReactionSet &other)
Copy assignment operator.
Definition reaction.cpp:166
virtual void add_reaction(Reaction reaction)
Adds a reaction to the set.
Definition reaction.cpp:175
std::unordered_map< std::string, Reaction > m_reactionNameMap
Maps reaction IDs to Reaction objects for quick lookup.
Definition reaction.h:444
bool contains(const std::string_view &id) const
Checks if the set contains a reaction with the given ID.
Definition reaction.cpp:193
ReactionSet(std::vector< Reaction > reactions)
Constructs a ReactionSet from a vector of reactions.
Definition reaction.cpp:140
Holds the seven coefficients for the REACLIB rate equation.
Definition reaction.h:32
friend std::ostream & operator<<(std::ostream &os, const RateCoefficientSet &r)
Overloads the stream insertion operator for easy printing.
Definition reaction.h:47