fourdst::libcomposition v1.5.2
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"
32
44 double X = 0.0;
45 double Y = 0.0;
46 double Z = 0.0;
47
54 friend std::ostream& operator<<(std::ostream& os, const CanonicalComposition& composition) {
55 os << "<CanonicalComposition: "
56 << "X = " << composition.X << ", "
57 << "Y = " << composition.Y << ", "
58 << "Z = " << composition.Z << ">";
59 return os;
60 }
61 };
62
72
73 // Overload the output stream operator for GlobalComposition
74 friend std::ostream& operator<<(std::ostream& os, const GlobalComposition& comp);
75 };
76
84 std::string m_symbol;
86 bool m_massFracMode = true;
87
88 double m_massFraction = 0.0;
89 double m_numberFraction = 0.0;
90 double m_relAbundance = 0.0;
91
92 bool m_initialized = false;
93
98
110 explicit CompositionEntry(const std::string& symbol, bool massFracMode=true);
111
117
124 void setSpecies(const std::string& symbol);
125
130 [[nodiscard]] std::string symbol() const;
131
138 [[nodiscard]] double mass_fraction() const;
139
145 [[nodiscard]] double mass_fraction(double meanMolarMass) const;
146
153 [[nodiscard]] double number_fraction() const;
154
160 [[nodiscard]] double number_fraction(double totalMoles) const;
161
166 [[nodiscard]] double rel_abundance() const;
167
172 [[nodiscard]] atomic::Species isotope() const;
173
178 [[nodiscard]] bool getMassFracMode() const;
179
186 void setMassFraction(double mass_fraction);
187
195
201 bool setMassFracMode(double meanMolarMass);
202
208 bool setNumberFracMode(double totalMoles);
209
216 friend std::ostream& operator<<(std::ostream& os, const CompositionEntry& entry);
217 };
218
259 private:
260 fourdst::config::Config& m_config = fourdst::config::Config::getInstance();
261 fourdst::logging::LogManager& m_logManager = fourdst::logging::LogManager::getInstance();
262 quill::Logger* m_logger = m_logManager.getLogger("log");
263
264 bool m_finalized = false;
266 double m_meanParticleMass = 0.0;
267 bool m_massFracMode = true;
268
269 std::set<std::string> m_registeredSymbols;
270 std::unordered_map<std::string, CompositionEntry> m_compositions;
271
277 static bool isValidSymbol(const std::string& symbol);
278
284 [[nodiscard]] bool isValidComposition(const std::vector<double>& fractions) const;
285
291 void validateComposition(const std::vector<double>& fractions) const;
292
298 bool finalizeMassFracMode(bool norm);
299
305 bool finalizeNumberFracMode(bool norm);
306
307 public:
311 Composition() = default;
312
316 ~Composition() = default;
317
327 bool finalize(bool norm=false);
328
342 explicit Composition(const std::vector<std::string>& symbols);
343
354 explicit Composition(const std::set<std::string>& symbols);
355
373 Composition(const std::vector<std::string>& symbols, const std::vector<double>& fractions, bool massFracMode=true);
374
380
386 Composition& operator=(Composition const& other);
387
402 void registerSymbol(const std::string& symbol, bool massFracMode=true);
403
417 void registerSymbol(const std::vector<std::string>& symbols, bool massFracMode=true);
418
432 void registerSpecies(const fourdst::atomic::Species& species, bool massFracMode=true);
433
434
449 void registerSpecies(const std::vector<fourdst::atomic::Species>& species, bool massFracMode=true);
450
451
456 [[nodiscard]] std::set<std::string> getRegisteredSymbols() const;
457
462 [[nodiscard]] std::set<fourdst::atomic::Species> getRegisteredSpecies() const;
463
480 double setMassFraction(const std::string& symbol, const double& mass_fraction);
481
491 std::vector<double> setMassFraction(const std::vector<std::string>& symbols, const std::vector<double>& mass_fractions);
492
502 double setMassFraction(const fourdst::atomic::Species& species, const double& mass_fraction);
503
511 std::vector<double> setMassFraction(const std::vector<fourdst::atomic::Species>& species, const std::vector<double>& mass_fractions);
512
523 double setNumberFraction(const std::string& symbol, const double& number_fraction);
524
533 std::vector<double> setNumberFraction(const std::vector<std::string>& symbols, const std::vector<double>& number_fractions);
534
544 double setNumberFraction(const fourdst::atomic::Species& species, const double& number_fraction);
545
553 std::vector<double> setNumberFraction(const std::vector<fourdst::atomic::Species>& species, const std::vector<double>& number_fractions);
554
567 [[nodiscard]] Composition mix(const Composition& other, double fraction) const;
568
575 [[nodiscard]] std::unordered_map<std::string, double> getMassFraction() const;
576
585 [[nodiscard]] double getMassFraction(const std::string& symbol) const;
586
595 [[nodiscard]] double getMassFraction(const fourdst::atomic::Species& species) const;
596
605 [[nodiscard]] double getNumberFraction(const std::string& symbol) const;
606
615 [[nodiscard]] double getNumberFraction(const fourdst::atomic::Species& species) const;
616
623 [[nodiscard]] std::unordered_map<std::string, double> getNumberFraction() const;
624
633 [[nodiscard]] double getMolarAbundance(const std::string& symbol) const;
634
643 [[nodiscard]] double getMolarAbundance(const fourdst::atomic::Species& species) const;
644
653 [[nodiscard]] std::pair<CompositionEntry, GlobalComposition> getComposition(const std::string& symbol) const;
654
663 [[nodiscard]] std::pair<CompositionEntry, GlobalComposition> getComposition(const fourdst::atomic::Species& species) const;
664
671 [[nodiscard]] std::pair<std::unordered_map<std::string, CompositionEntry>, GlobalComposition> getComposition() const;
672
679 [[nodiscard]] double getMeanParticleMass() const;
680
687 [[nodiscard]] double getMeanAtomicNumber() const;
688
698 [[nodiscard]] Composition subset(const std::vector<std::string>& symbols, const std::string& method="norm") const;
699
705 [[nodiscard]] bool hasSymbol(const std::string& symbol) const;
706
714 [[nodiscard]] bool contains(const fourdst::atomic::Species& isotope) const;
715
724 void setCompositionMode(bool massFracMode);
725
735 [[nodiscard]] CanonicalComposition getCanonicalComposition(bool harsh=false) const;
736
743 friend std::ostream& operator<<(std::ostream& os, const Composition& composition);
744
753 Composition operator+(const Composition& other) const;
754
759 auto begin() {
760 return m_compositions.begin();
761 }
762
767 auto begin() const {
768 return m_compositions.cbegin();
769 }
770
775 auto end() {
776 return m_compositions.end();
777 }
778
783 auto end() const {
784 return m_compositions.cend();
785 }
786
787 };
788}; // namespace fourdst::composition
void setCompositionMode(bool massFracMode)
Sets the composition mode (mass fraction vs. number fraction).
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< fourdst::atomic::Species > getRegisteredSpecies() const
Get a set of all species that are registered in the composition.
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.
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.
double getMeanParticleMass() const
Compute the mean particle mass of the composition.
bool m_massFracMode
True if mass fraction mode, false if number fraction mode.
double getMolarAbundance(const std::string &symbol) const
Gets the molar abundance (X_i / A_i) for a given symbol.
fourdst::logging::LogManager & m_logManager
bool hasSymbol(const std::string &symbol) const
Checks if a symbol is registered in the composition.
bool finalize(bool norm=false)
Finalizes the composition, making it ready for querying.
std::unordered_map< std::string, double > getNumberFraction() const
Gets the number fractions of all species in the composition.
double setNumberFraction(const std::string &symbol, const double &number_fraction)
Sets the number fraction for a given symbol.
std::set< std::string > getRegisteredSymbols() const
Gets the registered symbols.
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.
fourdst::config::Config & m_config
static bool isValidSymbol(const std::string &symbol)
Checks if the given symbol is valid by checking against the global species database.
double getMeanAtomicNumber() const
Compute the mean atomic number of the composition.
bool m_finalized
True if the composition is finalized.
~Composition()=default
Default destructor.
std::unordered_map< std::string, CompositionEntry > m_compositions
The compositions.
auto begin()
Returns an iterator to the beginning of the composition map.
CanonicalComposition getCanonicalComposition(bool harsh=false) const
Gets the current canonical composition (X, Y, Z).
bool contains(const fourdst::atomic::Species &isotope) const
Checks if a given isotope is present in the composition.
std::unordered_map< std::string, double > getMassFraction() const
Gets the mass fractions of all species in the composition.
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.
auto end() const
Returns a const iterator to the end of the composition map.
Represents an atomic species (isotope) with its fundamental physical properties.
Represents the canonical (X, Y, Z) composition of stellar material.
Definition composition.h:43
friend std::ostream & operator<<(std::ostream &os, const CanonicalComposition &composition)
Overloads the stream insertion operator for easy printing.
Definition composition.h:54
double Y
Mass fraction of Helium.
Definition composition.h:45
double X
Mass fraction of Hydrogen.
Definition composition.h:44
double Z
Mass fraction of Metals.
Definition composition.h:46
double m_relAbundance
The relative abundance, used internally for conversions. For mass fraction mode, this is X_i / A_i; f...
Definition composition.h:90
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:86
double m_numberFraction
The number fraction (mole fraction) of the species. Valid only if m_massFracMode is false.
Definition composition.h:89
double number_fraction() const
Gets the number fraction of the species.
bool m_initialized
True if the composition entry has been initialized with a valid species.
Definition composition.h:92
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.
bool setNumberFracMode(double totalMoles)
Switches the mode to number fraction mode.
atomic::Species m_isotope
The atomic::Species object containing detailed isotope data.
Definition composition.h:85
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:84
double m_massFraction
The mass fraction of the species. Valid only if m_massFracMode is true.
Definition composition.h:88
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:69
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:70
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:71