fourdst::libcomposition v2.3.1
Robust atomic species information library
Loading...
Searching...
No Matches
composition_masked.cpp
Go to the documentation of this file.
4
5#include <algorithm>
6#include <memory>
7#include <string>
8#include <vector>
9#include <set>
10#include <unordered_map>
11
13
14namespace fourdst::composition {
16 const CompositionAbstract& baseComposition,
17 const std::vector<atomic::Species>& activeSpecies
18 ) :
19 CompositionDecorator(baseComposition.clone()),
20 m_activeSpecies(activeSpecies) {
21
22 std::ranges::sort(m_activeSpecies, [](const auto &a, const auto &b) {
23 return a < b;
24 });
25
26 m_molarAbundances.reserve(m_activeSpecies.size());
27 for (const auto& species : m_activeSpecies) {
28 if (!CompositionDecorator::contains(species)) {
29 m_molarAbundances.push_back(0.0);
30 } else {
32 }
33 }
34
35 }
36
37 bool MaskedComposition::contains(const atomic::Species &species) const noexcept{
38 return std::ranges::contains(m_activeSpecies, species);
39 }
40
41 bool MaskedComposition::contains(const std::string &symbol) const {
42 if (!atomic::species.contains(symbol)) {
43 throw exceptions::UnknownSymbolError("Cannot find species '" + symbol + "' in base composition");
44 }
45 const atomic::Species& species = atomic::species.at(symbol);
46 return contains(species);
47 }
48
49 const std::vector<atomic::Species>& MaskedComposition::getRegisteredSpecies() const noexcept {
50 return m_activeSpecies;
51 }
52
53 std::set<std::string> MaskedComposition::getRegisteredSymbols() const noexcept {
54 std::set<std::string> symbols;
55 for (const auto& species : m_activeSpecies) {
56 symbols.insert(std::string(species.name()));
57 }
58 return symbols;
59 }
60
61 size_t MaskedComposition::size() const noexcept {
62 return m_activeSpecies.size();
63 }
64
65 std::unordered_map<atomic::Species, double> MaskedComposition::getMassFraction() const noexcept {
66 std::unordered_map<atomic::Species, double> massFractions;
67 for (const auto& species : m_activeSpecies) {
68 if (CompositionDecorator::contains(species)) {
69 massFractions[species] = CompositionDecorator::getMassFraction(species);
70 } else {
71 massFractions[species] = 0.0;
72 }
73 }
74 return massFractions;
75 }
76
77 std::unordered_map<atomic::Species, double> MaskedComposition::getNumberFraction() const noexcept {
78 std::unordered_map<atomic::Species, double> numberFractions;
79 for (const auto& species : m_activeSpecies) {
80 if (CompositionDecorator::contains(species)) {
81 numberFractions[species] = CompositionDecorator::getNumberFraction(species);
82 } else {
83 numberFractions[species] = 0.0;
84 }
85 }
86 return numberFractions;
87 }
88
89 double MaskedComposition::getMassFraction(const std::string &symbol) const {
90 if (!contains(symbol)) {
91 throw exceptions::UnregisteredSymbolError("Species '" + symbol + "' is not part of the active species in the MaskedComposition.");
92 }
95 } return 0.0;
96 }
98 if (!contains(species)) {
99 throw exceptions::UnregisteredSymbolError("Species '" + std::string(species.name()) + "' is not part of the active species in the MaskedComposition.");
100 }
101 if (CompositionDecorator::contains(species)) {
103 } return 0.0;
104 }
105 double MaskedComposition::getNumberFraction(const std::string &symbol) const {
106 if (!contains(symbol)) {
107 throw exceptions::UnregisteredSymbolError("Species '" + symbol + "' is not part of the active species in the MaskedComposition.");
108 }
109 if (CompositionDecorator::contains(symbol)) {
111 } return 0.0;
112 }
114 if (!contains(species)) {
115 throw exceptions::UnregisteredSymbolError("Species '" + std::string(species.name()) + "' is not part of the active species in the MaskedComposition.");
116 }
117 if (CompositionDecorator::contains(species)) {
119 } return 0.0;
120 }
121 double MaskedComposition::getMolarAbundance(const std::string &symbol) const {
122 if (!contains(symbol)) {
123 throw exceptions::UnregisteredSymbolError("Species '" + symbol + "' is not part of the active species in the MaskedComposition.");
124 }
125 if (CompositionDecorator::contains(symbol)) {
127 } return 0.0;
128 }
130 if (!contains(species)) {
131 throw exceptions::UnregisteredSymbolError("Species '" + std::string(species.name()) + "' is not part of the active species in the MaskedComposition.");
132 }
133 if (CompositionDecorator::contains(species)) {
135 } return 0.0;
136 }
138 double meanParticleMass = 0.0;
139 for (const auto& species : m_activeSpecies) {
140 if (CompositionDecorator::contains(species)) {
141 const double numberFraction = CompositionDecorator::getNumberFraction(species);
142 const double atomicMass = species.mass();
143 meanParticleMass += numberFraction * atomicMass;
144 }
145 }
146 return meanParticleMass;
147 }
148
150 double Ye = 0.0;
151 for (const auto& species : m_activeSpecies) {
152 if (CompositionDecorator::contains(species)) {
153 Ye += CompositionDecorator::getMolarAbundance(species) * species.z();
154 }
155 }
156 return Ye;
157 }
158
159 std::vector<double> MaskedComposition::getMassFractionVector() const noexcept {
160 std::vector<double> massFractions;
161 massFractions.reserve(m_activeSpecies.size());
162 for (const auto& species : m_activeSpecies) {
163 massFractions.push_back(getMassFraction(species));
164 }
165 return massFractions;
166 }
167
168 std::vector<double> MaskedComposition::getNumberFractionVector() const noexcept {
169 std::vector<double> numberFractions;
170 numberFractions.reserve(m_activeSpecies.size());
171 for (const auto& species : m_activeSpecies) {
172 numberFractions.push_back(getNumberFraction(species));
173 }
174 return numberFractions;
175 }
176
177 std::vector<double> MaskedComposition::getMolarAbundanceVector() const noexcept {
178 std::vector<double> molarAbundances;
179 molarAbundances.reserve(m_activeSpecies.size());
180 for (const auto& species : m_activeSpecies) {
181 molarAbundances.push_back(getMolarAbundance(species));
182 }
183 return molarAbundances;
184 }
185
186 size_t MaskedComposition::getSpeciesIndex(const std::string &symbol) const {
187 if (!contains(symbol)) {
188 throw exceptions::UnregisteredSymbolError("Species '" + symbol + "' is not part of the active species in the MaskedComposition.");
189 }
190 return std::distance(
191 m_activeSpecies.begin(),
192 std::ranges::find_if(m_activeSpecies,
193 [&symbol](const atomic::Species& sp) {
194 return std::string(sp.name()) == symbol;
195 }));
196 }
197
199 return std::distance(
200 m_activeSpecies.begin(),
201 std::ranges::find(m_activeSpecies, species)
202 );
203 }
204
206 if (index >= m_activeSpecies.size()) {
207 throw std::out_of_range("Index " + std::to_string(index) + " is out of bounds for active species of size " + std::to_string(m_activeSpecies.size()) + ".");
208 }
209 auto it = m_activeSpecies.begin();
210 std::advance(it, index);
211 return *it;
212 }
213
214 std::unique_ptr<CompositionAbstract> MaskedComposition::clone() const {
215 return std::make_unique<MaskedComposition>(*m_base_composition, m_activeSpecies);
216 }
217
221
225
229
233
237};
Abstract base class for chemical composition representations.
double getMolarAbundance(const std::string &symbol) const override
Get the molar abundance for a given symbol.
CompositionDecorator(std::unique_ptr< CompositionAbstract > decorator)
std::unordered_map< atomic::Species, double > getNumberFraction() const noexcept override
Get the number fraction for all registered symbols.
std::unique_ptr< CompositionAbstract > m_base_composition
bool contains(const atomic::Species &species) const noexcept override
Check if the composition contains the given species.
std::unordered_map< atomic::Species, double > getMassFraction() const noexcept override
Get the mass fraction for all registered symbols.
bool contains(const atomic::Species &species) const noexcept override
Check if the composition contains the given species.
std::vector< atomic::Species > m_activeSpecies
std::unordered_map< atomic::Species, double > getMassFraction() const noexcept override
Get the mass fraction for all registered symbols.
std::unordered_map< atomic::Species, double > getNumberFraction() const noexcept override
Get the number fraction for all registered symbols.
double getMolarAbundance(const std::string &symbol) const override
Get the molar abundance for a given symbol.
std::unique_ptr< CompositionAbstract > clone() const override
double getElectronAbundance() const noexcept override
Get the electron abundance of the composition.
double getMeanParticleMass() const noexcept override
Get the mean particle mass of the composition.
const std::vector< atomic::Species > & getRegisteredSpecies() const noexcept override
Get all registered atomic species in the composition.
size_t size() const noexcept override
size_t getSpeciesIndex(const std::string &symbol) const override
Get the index of a species by symbol.
std::vector< double > getMassFractionVector() const noexcept override
Get the mass fraction as a vector.
MaskedComposition(const CompositionAbstract &baseComposition, const std::vector< atomic::Species > &activeSpecies)
std::set< std::string > getRegisteredSymbols() const noexcept override
Get all registered chemical symbols in the composition.
std::vector< double > getMolarAbundanceVector() const noexcept override
Get the molar abundance as a vector.
atomic::Species getSpeciesAtIndex(size_t index) const override
Get the species at a given index.
detail::CompositionIterator< true > const_iterator
std::vector< double > getNumberFractionVector() const noexcept override
Get the number fraction as a vector.
detail::CompositionIterator< false > iterator
Exception thrown when an unknown symbol is encountered.
Exception thrown when a symbol is used that has not been registered.
static const std::unordered_map< std::string, const Species & > species
Map of species names to their corresponding Species objects.
Definition species.h:3579
Utilities and types for representing and manipulating chemical compositions.
Represents an atomic species (isotope) with its fundamental physical properties.
std::string_view name() const
Gets the name of the species.
static uint64_t hash_exact(const CompositionT &comp)