24#include <unordered_map>
28#include <unordered_set>
30#include "fourdst/config/config.h"
31#include "fourdst/logging/logging.h"
57 os <<
"<CanonicalComposition: "
58 <<
"X = " << composition.
X <<
", "
59 <<
"Y = " << composition.
Y <<
", "
60 <<
"Z = " << composition.
Z <<
">";
114 std::optional<double>
Ye;
146 static quill::Logger* logger = logging::LogManager::getInstance().getLogger(
"log");
178 explicit Composition(
const std::vector<std::string>& symbols);
193 explicit Composition(
const std::vector<atomic::Species>& species);
205 explicit Composition(
const std::set<std::string>& symbols);
220 explicit Composition(
const std::set<atomic::Species>& species);
222 explicit Composition(
const std::unordered_set<std::string>& symbols);
223 explicit Composition(
const std::unordered_set<atomic::Species>& species);
240 Composition(
const std::vector<std::string>& symbols,
const std::vector<double>& molarAbundances);
256 Composition(
const std::vector<atomic::Species>& species,
const std::vector<double>& molarAbundances);
273 Composition(
const std::set<std::string>& symbols,
const std::vector<double>& molarAbundances);
275 explicit Composition(
const std::unordered_map<std::string, double>& symbolMolarAbundances);
276 explicit Composition(
const std::map<std::string, double>& symbolMolarAbundances);
278 explicit Composition(
const std::unordered_map<atomic::Species, double>& speciesMolarAbundances);
279 explicit Composition(
const std::map<atomic::Species, double>& speciesMolarAbundances);
373 void registerSpecies(
const std::vector<atomic::Species>& species)
noexcept;
388 [[nodiscard]]
bool contains(
const std::string& symbol)
const override;
394 [[nodiscard]]
size_t size() const noexcept override;
413 const
std::
string& symbol,
414 const
double& molar_abundance
437 const atomic::Species& species,
438 const
double& molar_abundance
457 const
std::vector<
std::
string>& symbols,
458 const
std::vector<
double>& molar_abundances
480 const
std::vector<atomic::Species>& species,
481 const
std::vector<
double>& molar_abundances
501 const
std::set<
std::
string>& symbols,
502 const
std::vector<
double>& molar_abundances
525 const
std::set<atomic::Species>& species,
526 const
std::vector<
double>& molar_abundances
555 [[nodiscard]]
std::unordered_map<atomic::Species,
double>
getMassFraction() const noexcept override;
584 [[nodiscard]]
double getMassFraction(const atomic::Species& species) const override;
612 [[nodiscard]]
double getNumberFraction(const atomic::Species& species) const override;
620 [[nodiscard]]
std::unordered_map<atomic::Species,
double>
getNumberFraction() const noexcept override;
643 [[nodiscard]]
double getMolarAbundance(const atomic::Species& species) const override;
730 [[nodiscard]]
size_t getSpeciesIndex(const atomic::Species& species) const override;
749 friend
std::ostream& operator<<(
std::ostream& os, const
Composition& composition);
768 [[nodiscard]]
std::map<atomic::Species,
double>::iterator
begin()
override {
789 [[nodiscard]] std::map<atomic::Species, double>::const_iterator
begin()
const override {
810 [[nodiscard]] std::map<atomic::Species, double>::iterator
end()
override {
831 [[nodiscard]] std::map<atomic::Species, double>::const_iterator
end()
const override {
838 if (a.size() != b.size())
return false;
841 if (a.getRegisteredSpecies() != b.getRegisteredSpecies())
845 for (
auto itA = a.begin(), itB = b.begin();
846 itA != a.end() && itB != b.end(); ++itA, ++itB) {
847 if (itA->first != itB->first)
849 if (itA->second != itB->second)
Abstract base class for chemical composition representations.
Manages a collection of chemical species and their abundances.
CompositionCache m_cache
Cache for computed properties to avoid redundant calculations.
~Composition() override=default
Default destructor.
size_t getSpeciesIndex(const std::string &symbol) const override
get the index in the sorted vector representation for a given symbol
std::map< atomic::Species, double >::const_iterator end() const override
Returns a const iterator to the end of the molar abundance map.
bool contains(const atomic::Species &species) const noexcept override
Checks if a given species is present in the composition.
std::unordered_map< atomic::Species, double > getNumberFraction() const noexcept override
Gets the number fractions of all species in the composition.
Composition()=default
Default constructor.
void setMolarAbundance(const std::string &symbol, const double &molar_abundance)
Sets the molar abundance for a given symbol.
const std::set< atomic::Species > & getRegisteredSpecies() const noexcept override
Get a set of all species that are registered in the composition.
void registerSpecies(const atomic::Species &species) noexcept
Registers a new species by extracting its symbol.
void registerSymbol(const std::string &symbol)
Registers a new symbol for inclusion in the composition.
std::set< std::string > getRegisteredSymbols() const noexcept override
Gets the registered symbols.
std::set< atomic::Species > m_registeredSpecies
Set of registered species in the composition.
static quill::Logger * getLogger()
Gets the logger instance for the Composition class. This is static to ensure that all composition obj...
Composition & operator=(Composition const &other)
Assignment operator.
std::unique_ptr< CompositionAbstract > clone() const override
std::map< atomic::Species, double >::const_iterator begin() const override
Returns a const iterator to the beginning of the molar abundance map.
std::map< atomic::Species, double >::iterator begin() override
Returns an iterator to the beginning of the molar abundance map.
std::map< atomic::Species, double >::iterator end() override
Returns an iterator to the end of the molar abundance map.
double getElectronAbundance() const noexcept override
Compute the electron abundance of the composition.
size_t size() const noexcept override
Gets the number of registered species in the composition.
std::unordered_map< atomic::Species, double > getMassFraction() const noexcept override
Gets the mass fractions of all species in the composition.
std::map< atomic::Species, double > m_molarAbundances
Map of species to their molar abundances.
CanonicalComposition getCanonicalComposition() const
Compute the canonical composition (X, Y, Z) of the composition.
std::vector< double > getMolarAbundanceVector() const noexcept override
Get a uniform vector representation of the molar abundances stored in the composition object sorted s...
double getMolarAbundance(const std::string &symbol) const override
Gets the molar abundances of all species in the composition.
std::vector< double > getNumberFractionVector() const noexcept override
Get a uniform vector representation of the number fractions stored in the composition object sorted s...
atomic::Species getSpeciesAtIndex(size_t index) const override
Get the species at a given index in the sorted vector representation.
std::vector< double > getMassFractionVector() const noexcept override
Get a uniform vector representation of the mass fraction stored in the composition object sorted such...
double getMeanParticleMass() const noexcept override
Compute the mean particle mass of the composition.
Utilities and types for representing and manipulating chemical compositions.
bool operator==(const Composition &a, const Composition &b) noexcept
Represents an atomic species (isotope) with its fundamental physical properties.
Represents the canonical (X, Y, Z) composition of stellar material.
friend std::ostream & operator<<(std::ostream &os, const CanonicalComposition &composition)
Overloads the stream insertion operator for easy printing.
double Y
Mass fraction of Helium.
double X
Mass fraction of Hydrogen.
double Z
Mass fraction of Metals.
Caches computed properties of the composition to avoid redundant calculations.
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< std::vector< double > > molarAbundances
Cached vector of molar abundances.
std::optional< std::vector< std::string > > sortedSymbols
Cached vector of sorted species (by mass).
void clear()
Clears all cached values.
std::optional< std::vector< double > > massFractions
Cached vector of mass fractions.
std::optional< double > Ye
Cached electron abundance.
bool is_clear() const
Checks if the cache is clear (i.e., all cached values are empty).