fourdst::libcomposition v1.9.0
Robust atomic species information library
Loading...
Searching...
No Matches
composition.h
Go to the documentation of this file.
1/* ***********************************************************************
2//
3// Copyright (C) 2025 -- The 4D-STAR Collaboration
4// File Author: Emily Boudreaux
5// Last Modified: March 26, 2025
6//
7// 4DSSE is free software; you can use it and/or modify
8// it under the terms and restrictions the GNU General Library Public
9// License version 3 (GPLv3) as published by the Free Software Foundation.
10//
11// 4DSSE is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14// See the GNU Library General Public License for more details.
15//
16// You should have received a copy of the GNU Library General Public License
17// along with this software; if not, write to the Free Software
18// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19//
20// *********************************************************************** */
21#pragma once
22
23#include <string>
24#include <unordered_map>
25#include <set>
26
27#include <utility>
28
29#include "fourdst/config/config.h"
30#include "fourdst/logging/logging.h"
33
45 double X = 0.0;
46 double Y = 0.0;
47 double Z = 0.0;
48
55 friend std::ostream& operator<<(std::ostream& os, const CanonicalComposition& composition) {
56 os << "<CanonicalComposition: "
57 << "X = " << composition.X << ", "
58 << "Y = " << composition.Y << ", "
59 << "Z = " << composition.Z << ">";
60 return os;
61 }
62 };
63
73
74 // Overload the output stream operator for GlobalComposition
75 friend std::ostream& operator<<(std::ostream& os, const GlobalComposition& comp);
76 };
77
85 std::string m_symbol;
87 bool m_massFracMode = true;
88
89 double m_massFraction = 0.0;
90 double m_numberFraction = 0.0;
91 double m_relAbundance = 0.0;
92 double m_molesPerMass = 0.0;
94
95
96 bool m_initialized = false;
97
102
114 explicit CompositionEntry(const std::string& symbol, bool massFracMode=true);
115
121
128 void setSpecies(const std::string& symbol);
129
134 [[nodiscard]] std::string symbol() const;
135
142 [[nodiscard]] double mass_fraction() const;
143
150 [[nodiscard]] double number_fraction() const;
151
157 [[nodiscard]] double number_fraction(double totalMolesPerMass) const;
158
163 [[nodiscard]] double rel_abundance() const;
164
169 [[nodiscard]] atomic::Species isotope() const;
170
175 [[nodiscard]] bool getMassFracMode() const;
176
183 void setMassFraction(double mass_fraction);
184
192
198 bool setMassFracMode(double meanMolarMass);
199
205 bool setNumberFracMode(double totalMolesPerMass);
206
213 friend std::ostream& operator<<(std::ostream& os, const CompositionEntry& entry);
214 };
215
256 private:
258 std::optional<GlobalComposition> globalComp;
259 std::optional<CanonicalComposition> canonicalComp;
260 std::optional<std::vector<double>> massFractions;
261 std::optional<std::vector<double>> numberFractions;
262 std::optional<std::vector<double>> molarAbundances;
263 std::optional<std::vector<atomic::Species>> sortedSpecies;
264 std::optional<std::vector<std::string>> sortedSymbols;
265 std::optional<double> Ye;
266
267 void clear() {
268 globalComp = std::nullopt;
269 canonicalComp = std::nullopt;
270 massFractions = std::nullopt;
271 numberFractions = std::nullopt;
272 molarAbundances = std::nullopt;
273 sortedSymbols = std::nullopt;
274 sortedSpecies = std::nullopt;
275 Ye = std::nullopt;
276 }
277
278 [[nodiscard]] bool is_clear() const {
279 return !globalComp.has_value() && !canonicalComp.has_value() && !massFractions.has_value() &&
280 !numberFractions.has_value() && !molarAbundances.has_value() && !sortedSymbols.has_value() &&
281 !Ye.has_value() && !sortedSpecies.has_value();
282 }
283 };
284 private:
285 config::Config& m_config = config::Config::getInstance();
286 logging::LogManager& m_logManager = logging::LogManager::getInstance();
287 quill::Logger* m_logger = m_logManager.getLogger("log");
288
289 bool m_finalized = false;
291 double m_meanParticleMass = 0.0;
292 bool m_massFracMode = true;
293
294 std::set<std::string> m_registeredSymbols;
295 std::unordered_map<std::string, CompositionEntry> m_compositions;
296
298
299
305 static bool isValidSymbol(const std::string& symbol);
306
312 [[nodiscard]] bool isValidComposition(const std::vector<double>& fractions) const;
313
319 void validateComposition(const std::vector<double>& fractions) const;
320
326 bool finalizeMassFracMode(bool norm);
327
333 bool finalizeNumberFracMode(bool norm);
334
335 public:
339 Composition() = default;
340
344 ~Composition() override = default;
345
355 [[nodiscard]] bool finalize(bool norm=false);
356
370 explicit Composition(const std::vector<std::string>& symbols);
371
382 explicit Composition(const std::set<std::string>& symbols);
383
401 Composition(const std::vector<std::string>& symbols, const std::vector<double>& fractions, bool massFracMode=true);
402
408
414 Composition& operator=(Composition const& other);
415
430 void registerSymbol(const std::string& symbol, bool massFracMode=true);
431
445 void registerSymbol(const std::vector<std::string>& symbols, bool massFracMode=true);
446
460 void registerSpecies(const fourdst::atomic::Species& species, bool massFracMode=true);
461
462
477 void registerSpecies(const std::vector<fourdst::atomic::Species>& species, bool massFracMode=true);
478
479
484 [[nodiscard]] std::set<std::string> getRegisteredSymbols() const override;
485
490 [[nodiscard]] std::set<fourdst::atomic::Species> getRegisteredSpecies() const override;
491
508 double setMassFraction(const std::string& symbol, const double& mass_fraction);
509
519 std::vector<double> setMassFraction(const std::vector<std::string>& symbols, const std::vector<double>& mass_fractions);
520
530 double setMassFraction(const fourdst::atomic::Species& species, const double& mass_fraction);
531
539 std::vector<double> setMassFraction(const std::vector<fourdst::atomic::Species>& species, const std::vector<double>& mass_fractions);
540
551 double setNumberFraction(const std::string& symbol, const double& number_fraction);
552
561 std::vector<double> setNumberFraction(const std::vector<std::string>& symbols, const std::vector<double>& number_fractions);
562
572 double setNumberFraction(const fourdst::atomic::Species& species, const double& number_fraction);
573
581 std::vector<double> setNumberFraction(const std::vector<fourdst::atomic::Species>& species, const std::vector<double>& number_fractions);
582
595 [[nodiscard]] Composition mix(const Composition& other, double fraction) const;
596
603 [[nodiscard]] std::unordered_map<std::string, double> getMassFraction() const override;
604
613 [[nodiscard]] double getMassFraction(const std::string& symbol) const override;
614
623 [[nodiscard]] double getMassFraction(const fourdst::atomic::Species& species) const override;
624
633 [[nodiscard]] double getNumberFraction(const std::string& symbol) const override;
634
643 [[nodiscard]] double getNumberFraction(const fourdst::atomic::Species& species) const override;
644
651 [[nodiscard]] std::unordered_map<std::string, double> getNumberFraction() const override;
652
661 [[nodiscard]] double getMolarAbundance(const std::string& symbol) const override;
662
671 [[nodiscard]] double getMolarAbundance(const fourdst::atomic::Species& species) const override;
672
681 [[nodiscard]] std::pair<CompositionEntry, GlobalComposition> getComposition(const std::string& symbol) const;
682
691 [[nodiscard]] std::pair<CompositionEntry, GlobalComposition> getComposition(const fourdst::atomic::Species& species) const;
692
699 [[nodiscard]] std::pair<std::unordered_map<std::string, CompositionEntry>, GlobalComposition> getComposition() const;
700
707 [[nodiscard]] double getMeanParticleMass() const override;
708
715 [[nodiscard]] double getMeanAtomicNumber() const override;
716
723 [[nodiscard]] double getElectronAbundance() const override;
724
734 [[nodiscard]] Composition subset(const std::vector<std::string>& symbols, const std::string& method="norm") const;
735
741 [[nodiscard]] bool hasSymbol(const std::string& symbol) const override;
742
748 [[nodiscard]] bool hasSpecies(const fourdst::atomic::Species &species) const override;
749
757 [[nodiscard]] bool contains(const atomic::Species& isotope) const override;
758
767 void setCompositionMode(bool massFracMode);
768
778 [[nodiscard]] CanonicalComposition getCanonicalComposition(bool harsh=false) const;
779
787 [[nodiscard]] std::vector<double> getMassFractionVector() const override;
788
796 [[nodiscard]] std::vector<double> getNumberFractionVector() const override;
797
805 [[nodiscard]] std::vector<double> getMolarAbundanceVector() const override;
806
817 [[nodiscard]] size_t getSpeciesIndex(const std::string& symbol) const override;
818
829 [[nodiscard]] size_t getSpeciesIndex(const atomic::Species& species) const override;
830
840 [[nodiscard]] atomic::Species getSpeciesAtIndex(size_t index) const override;
841
848 friend std::ostream& operator<<(std::ostream& os, const Composition& composition);
849
858 Composition operator+(const Composition& other) const;
859
864 auto begin() {
865 return m_compositions.begin();
866 }
867
872 [[nodiscard]] auto begin() const {
873 return m_compositions.cbegin();
874 }
875
880 auto end() {
881 return m_compositions.end();
882 }
883
888 [[nodiscard]] auto end() const {
889 return m_compositions.cend();
890 }
891
892 };
893}; // namespace fourdst::composition
Abstract base class for chemical composition representations.
CompositionCache m_cache
Cache for computed properties to avoid redundant calculations.
~Composition() override=default
Default destructor.
void setCompositionMode(bool massFracMode)
Sets the composition mode (mass fraction vs. number fraction).
size_t getSpeciesIndex(const std::string &symbol) const override
get the index in the sorted vector representation for a given symbol
std::pair< std::unordered_map< std::string, CompositionEntry >, GlobalComposition > getComposition() const
Gets all composition entries and the global composition data.
Composition subset(const std::vector< std::string > &symbols, const std::string &method="norm") const
Creates a new Composition object containing a subset of species from this one.
void registerSymbol(const std::string &symbol, bool massFracMode=true)
Registers a new symbol for inclusion in the composition.
Composition()=default
Default constructor.
Composition operator+(const Composition &other) const
Overloads the + operator to mix two compositions with a 50/50 fraction.
friend std::ostream & operator<<(std::ostream &os, const Composition &composition)
Overloaded output stream operator for Composition.
std::set< std::string > m_registeredSymbols
The registered symbols.
Composition mix(const Composition &other, double fraction) const
Mixes this composition with another to produce a new composition.
std::set< std::string > getRegisteredSymbols() const override
Gets the registered symbols.
logging::LogManager & m_logManager
bool finalizeNumberFracMode(bool norm)
Finalizes the composition in number fraction mode.
double setMassFraction(const std::string &symbol, const double &mass_fraction)
Sets the mass fraction for a given symbol.
std::vector< double > getNumberFractionVector() const override
Get a uniform vector representation of the number fractions stored in the composition object sorted s...
double m_meanParticleMass
The mean particle mass of the composition (\sum_{i} \frac{n_i}{m_i}. where n_i is the number fraction...
void registerSpecies(const fourdst::atomic::Species &species, bool massFracMode=true)
Registers a new species by extracting its symbol.
Composition & operator=(Composition const &other)
Assignment operator.
bool hasSpecies(const fourdst::atomic::Species &species) const override
Checks if a species is registered in the composition.
double getElectronAbundance() const override
Compute the electron abundance of the composition.
bool m_massFracMode
True if mass fraction mode, false if number fraction mode.
bool finalize(bool norm=false)
Finalizes the composition, making it ready for querying.
double getMeanParticleMass() const override
Compute the mean particle mass of the composition.
double setNumberFraction(const std::string &symbol, const double &number_fraction)
Sets the number fraction for a given symbol.
bool contains(const atomic::Species &isotope) const override
Checks if a given isotope is present in the composition.
std::vector< double > getMassFractionVector() const override
Get a uniform vector representation of the mass fraction stored in the composition object sorted such...
void validateComposition(const std::vector< double > &fractions) const
Validates the given fractions, throwing an exception on failure.
bool finalizeMassFracMode(bool norm)
Finalizes the composition in mass fraction mode.
static bool isValidSymbol(const std::string &symbol)
Checks if the given symbol is valid by checking against the global species database.
bool m_finalized
True if the composition is finalized.
std::unordered_map< std::string, CompositionEntry > m_compositions
The compositions.
std::unordered_map< std::string, double > getMassFraction() const override
Gets the mass fractions of all species in the composition.
auto begin()
Returns an iterator to the beginning of the composition map.
std::vector< double > getMolarAbundanceVector() const override
Get a uniform vector representation of the molar abundances stored in the composition object sorted s...
bool hasSymbol(const std::string &symbol) const override
Checks if a symbol is registered in the composition.
CanonicalComposition getCanonicalComposition(bool harsh=false) const
Gets the current canonical composition (X, Y, Z).
double getMolarAbundance(const std::string &symbol) const override
Gets the molar abundance (X_i / A_i) for a given symbol.
double m_specificNumberDensity
The specific number density of the composition (\sum_{i} X_i m_i. Where X_i is the number fraction of...
bool isValidComposition(const std::vector< double > &fractions) const
Checks if the given fractions are valid (sum to ~1.0).
auto end()
Returns an iterator to the end of the composition map.
auto begin() const
Returns a const iterator to the beginning of the composition map.
std::unordered_map< std::string, double > getNumberFraction() const override
Gets the number fractions of all species in the composition.
atomic::Species getSpeciesAtIndex(size_t index) const override
Get the species at a given index in the sorted vector representation.
auto end() const
Returns a const iterator to the end of the composition map.
std::set< fourdst::atomic::Species > getRegisteredSpecies() const override
Get a set of all species that are registered in the composition.
double getMeanAtomicNumber() const override
Compute the mean atomic number of the composition.
Represents an atomic species (isotope) with its fundamental physical properties.
Represents the canonical (X, Y, Z) composition of stellar material.
Definition composition.h:44
friend std::ostream & operator<<(std::ostream &os, const CanonicalComposition &composition)
Overloads the stream insertion operator for easy printing.
Definition composition.h:55
double Y
Mass fraction of Helium.
Definition composition.h:46
double X
Mass fraction of Hydrogen.
Definition composition.h:45
double Z
Mass fraction of Metals.
Definition composition.h:47
std::optional< std::vector< atomic::Species > > sortedSpecies
Cached vector of sorted species (by mass).
std::optional< std::vector< double > > numberFractions
Cached vector of number fractions.
std::optional< CanonicalComposition > canonicalComp
Cached canonical composition data.
std::optional< GlobalComposition > globalComp
Cached global composition data.
std::optional< std::vector< double > > molarAbundances
Cached vector of molar abundances.
std::optional< std::vector< std::string > > sortedSymbols
Cached vector of sorted species (by mass).
std::optional< std::vector< double > > massFractions
Cached vector of mass fractions.
std::optional< double > Ye
Cached electron abundance.
bool setNumberFracMode(double totalMolesPerMass)
Switches the mode to number fraction mode.
double m_relAbundance
The relative abundance, used internally for conversions. For mass fraction mode, this is X_i / A_i; f...
Definition composition.h:91
bool getMassFracMode() const
Gets the mode of the composition entry.
CompositionEntry()
Default constructor. Initializes a default entry (H-1), but in an uninitialized state.
bool m_massFracMode
The mode of the composition entry. True if mass fraction, false if number fraction.
Definition composition.h:87
double m_numberFraction
The number fraction (mole fraction) of the species. Valid only if m_massFracMode is false.
Definition composition.h:90
double number_fraction() const
Gets the number fraction of the species.
CompositionEntry(const CompositionEntry &entry)
Copy constructor.
bool m_initialized
True if the composition entry has been initialized with a valid species.
Definition composition.h:96
double m_cachedNumberFraction
Cached number fraction for conversions when in mass fraction mode.
Definition composition.h:93
bool setMassFracMode(double meanMolarMass)
Switches the mode to mass fraction mode.
void setMassFraction(double mass_fraction)
Sets the mass fraction of the species.
std::string symbol() const
Gets the chemical symbol of the species.
void setSpecies(const std::string &symbol)
Sets the species for the composition entry. This can only be done once.
double mass_fraction() const
Gets the mass fraction of the species.
atomic::Species m_isotope
The atomic::Species object containing detailed isotope data.
Definition composition.h:86
void setNumberFraction(double number_fraction)
Sets the number fraction of the species.
double rel_abundance() const
Gets the relative abundance of the species.
std::string m_symbol
The chemical symbol of the species (e.g., "H-1", "Fe-56").
Definition composition.h:85
double m_molesPerMass
Definition composition.h:92
double m_massFraction
The mass fraction of the species. Valid only if m_massFracMode is true.
Definition composition.h:89
friend std::ostream & operator<<(std::ostream &os, const CompositionEntry &entry)
Overloaded output stream operator for CompositionEntry.
atomic::Species isotope() const
Gets the isotope data for the species.
Represents global properties of a finalized composition.
Definition composition.h:70
double specificNumberDensity
The specific number density (moles per unit mass, sum of X_i/M_i), where X_i is mass fraction and M_i...
Definition composition.h:71
friend std::ostream & operator<<(std::ostream &os, const GlobalComposition &comp)
double meanParticleMass
The mean mass per particle (inverse of specific number density). Units: g/mol.
Definition composition.h:72