fourdst::libcomposition v2.4.9
Robust atomic species information library
Loading...
Searching...
No Matches
fourdst::composition Namespace Reference

Utilities and types for representing and manipulating chemical compositions. More...

Namespaces

namespace  detail
 
namespace  exceptions
 
namespace  io
 
namespace  utils
 

Classes

struct  CanonicalComposition
 Represents the canonical (X, Y, Z) composition of stellar material. More...
 
class  Composition
 Manages a collection of chemical species and their abundances. More...
 
class  CompositionAbstract
 Abstract base class for chemical composition representations. More...
 
class  CompositionDecorator
 
class  MaskedComposition
 

Functions

bool operator== (const Composition &a, const Composition &b) noexcept
 
Composition get_composition_record (const std::string &metal_fraction_scheme, const std::string &isotopic_percentage_scheme, double initial_z, double initial_y)
 Constructs a stellar Composition from a named solar metal-fraction scheme and isotopic-percentage table, scaled to the supplied bulk hydrogen and helium mass fractions.
 
Composition get_composition_record (io::SolarCompositions metal_fraction_scheme, io::IsotopicPercentages isotopic_percentage_scheme, double initial_z, double initial_y)
 Enum-based overload of get_composition_record().
 
Composition buildCompositionFromMassFractions (const std::vector< std::string > &symbols, const std::vector< double > &massFractions)
 Build a Composition object from symbols and their corresponding mass fractions.
 
Composition buildCompositionFromMassFractions (const std::vector< atomic::Species > &species, const std::vector< double > &massFractions)
 Build a Composition object from species and their corresponding mass fractions.
 
Composition buildCompositionFromMassFractions (const std::set< atomic::Species > &species, const std::vector< double > &massFractions)
 Build a Composition object from species in a set and their corresponding mass fractions.
 
Composition buildCompositionFromMassFractions (const std::unordered_map< atomic::Species, double > &massFractionsMap)
 Build a Composition object from a map of species to mass fractions.
 
Composition buildCompositionFromMassFractions (const std::unordered_map< std::string, double > &massFractions)
 Build a Composition object from a map of species to mass fractions.
 
Composition buildCompositionFromMassFractions (std::map< atomic::Species, double > massFractions)
 Build a Composition object from a map of species to mass fractions.
 
Composition buildCompositionFromMassFractions (std::map< std::string, double > massFractions)
 Build a Composition object from a map of species to mass fractions.
 
std::optional< fourdst::atomic::SpeciesgetSpecies (const std::string &symbol)
 
std::ostream & operator<< (std::ostream &os, const Composition &composition)
 

Detailed Description

Utilities and types for representing and manipulating chemical compositions.

The composition module provides a small, but expressive, API for constructing and querying material compositions used throughout the 4D-STAR codebase. A Composition represents a collection of atomic species together with their molar abundances. From these molar abundances the module can compute derived quantities such as mass fractions, number fractions, canonical (X, Y, Z) composition, mean particle mass, and the electron abundance (Y_e).

Key concepts:

  • Species and Symbols: Atomic isotopes are represented by the strongly-typed fourdst::atomic::Species values (see fourdst/atomic/species.h). Each species also has a human-readable string symbol (e.g. "H-1", "He-4") used by some constructors and convenience overloads.
  • Molar abundances: The Composition API accepts and stores molar abundances (absolute mole counts). Many derived quantities (mass fraction, number fraction, mean particle mass) are computed from these molar abundances.
  • Canonical composition: A CanonicalComposition (X, Y, Z) is provided which groups mass fractions into hydrogen (X), helium (Y), and metals (Z). A lightweight struct CanonicalComposition holds these values and provides an ostream operator for easy logging and testing.
  • Caching: The concrete Composition implementation caches computed vectors and scalars to avoid repeated work. The cache is invalidated automatically when molar abundances or registered species are changed.

Main types and functions

  • Composition: The primary concrete class for building and interrogating compositions. It implements the CompositionAbstract interface and exposes methods to register symbols/species, set molar abundances, and query all commonly-needed derived quantities. Multiple constructors are provided for convenience (from vectors/sets of symbols or species, with optional molar-abundance initialization).

    Important member functions include:

    • registerSymbol / registerSpecies (single or many overloads)
    • setMolarAbundance (many overloads accepting symbols or species)
    • getMolarAbundance, getMassFraction, getNumberFraction (symbol and species overloads)
    • getMassFractionVector, getNumberFractionVector, getMolarAbundanceVector
    • getMeanParticleMass, getElectronAbundance
    • getCanonicalComposition
    • Iteration support (begin/end) which iterates species from lightest to heaviest because species ordering is defined by atomic mass.
  • CompositionAbstract: A compact abstract interface implemented by Composition which guarantees the presence of all getter/query methods. This allows other components to accept composition-like objects without depending on the concrete implementation.
  • Utilities (fourdst::composition::buildCompositionFromMassFractions): Convenience helpers exist to construct a Composition from mass fractions (instead of molar abundances). Those helpers validate that the provided mass fractions sum to unity within a tight tolerance and convert them into the corresponding molar abundances before returning a populated Composition.
  • Exceptions (namespace fourdst::composition::exceptions): The module defines a small hierarchy of exceptions for error handling:
    • CompositionError: Base class for composition-related errors.
    • InvalidCompositionError: Thrown when the composition is inconsistent or when mass fractions fail validation.
    • UnregisteredSymbolError: Thrown when an operation requires a symbol that hasn't been registered on the Composition object.
    • UnknownSymbolError: Thrown when a provided string symbol does not map to any known atomic species in the atomic species database.

Usage examples

Example 1 – basic construction and queries:

using namespace fourdst::composition;
comp.registerSymbol("H-1");
comp.registerSymbol("He-4");
comp.setMolarAbundance("H-1", 1.0);
comp.setMolarAbundance("He-4", 0.5);
double X_h1 = comp.getMassFraction("H-1");
double meanA = comp.getMeanParticleMass();
std::cout << canon << std::endl; // prints X, Y, Z
Manages a collection of chemical species and their abundances.
Definition composition.h:99
void setMolarAbundance(const std::string &symbol, const double &molar_abundance)
Sets the molar abundance for a given symbol.
void registerSymbol(const std::string &symbol)
Registers a new symbol for inclusion in the composition.
std::unordered_map< atomic::Species, double > getMassFraction() const noexcept override
Gets the mass fractions of all species in the composition.
CanonicalComposition getCanonicalComposition() const
Compute the canonical composition (X, Y, Z) of the composition.
double getMeanParticleMass() const noexcept override
Compute the mean particle mass of the composition.
Utilities and types for representing and manipulating chemical compositions.
Represents the canonical (X, Y, Z) composition of stellar material.
Definition composition.h:46

Example 2 – constructing from mass fractions:

#include "fourdst/composition/utils.h"
std::vector<std::string> symbols = {"H-1", "He-4", "C-12"};
std::vector<double> massFractions = {0.70, 0.28, 0.02};
Composition comp = buildCompositionFromMassFractions(symbols, massFractions);
Composition buildCompositionFromMassFractions(const std::vector< std::string > &symbols, const std::vector< double > &massFractions)
Build a Composition object from symbols and their corresponding mass fractions.
Definition utils.cpp:77

Notes and remarks

  • Molar abundances are the canonical input for the Composition class. When passing mass fractions, use the buildCompositionFromMassFractions helper which performs the safe conversion and validation.
  • Many methods throw exceptions from the fourdst::composition::exceptions namespace on invalid usage (unknown symbols, unregistered species, or invalid abundance values). Callers should catch and handle these where appropriate.
  • Floating point results (mass/number fractions, mean particle mass, Y_e) are computed as doubles and may have small numerical round-off. Callers comparing values in tests should use an appropriate tolerance.

See also

Function Documentation

◆ buildCompositionFromMassFractions() [1/7]

Composition fourdst::composition::buildCompositionFromMassFractions ( const std::set< atomic::Species > & species,
const std::vector< double > & massFractions )

Build a Composition object from species in a set and their corresponding mass fractions.

Parameters
speciesThe species to register.
massFractionsThe corresponding mass fractions for each species.
Returns
A Composition object constructed from the provided species and mass fractions.
Exceptions
exceptions::InvalidCompositionErrorif the provided mass fractions do not sum to within one part in 10^10 of 1.0.
exceptions::InvalidCompositionErrorif the number of species does not match the number of mass fractions.
Note
This is the version of the function which the other overloads ultimately call.

Definition at line 29 of file utils.cpp.

◆ buildCompositionFromMassFractions() [2/7]

Composition fourdst::composition::buildCompositionFromMassFractions ( const std::unordered_map< atomic::Species, double > & massFractionsMap)

Build a Composition object from a map of species to mass fractions.

Parameters
massFractionsMapThe map of species to their corresponding mass fractions.
Returns
A Composition object constructed from the provided species and mass fractions.
Exceptions
exceptions::InvalidCompositionErrorif the provided mass fractions do not sum to within one part in 10^10 of 1.0.

Definition at line 100 of file utils.cpp.

◆ buildCompositionFromMassFractions() [3/7]

Composition fourdst::composition::buildCompositionFromMassFractions ( const std::unordered_map< std::string, double > & massFractions)

Build a Composition object from a map of species to mass fractions.

Parameters
massFractionsThe map of species to their corresponding mass fractions.
Returns
A Composition object constructed from the provided species and mass fractions.
Exceptions
exceptions::InvalidCompositionErrorif the provided mass fractions do not sum to within one part in 10^10 of 1.0.

Definition at line 163 of file utils.cpp.

◆ buildCompositionFromMassFractions() [4/7]

Composition fourdst::composition::buildCompositionFromMassFractions ( const std::vector< atomic::Species > & species,
const std::vector< double > & massFractions )

Build a Composition object from species and their corresponding mass fractions.

Parameters
speciesThe species to register.
massFractionsThe corresponding mass fractions for each species.
Returns
A Composition object constructed from the provided species and mass fractions.
Exceptions
exceptions::InvalidCompositionErrorif the provided mass fractions do not sum to within one part in 10^10 of 1.0.
exceptions::InvalidCompositionErrorif the number of species does not match the number of mass fractions.

Definition at line 63 of file utils.cpp.

◆ buildCompositionFromMassFractions() [5/7]

Composition fourdst::composition::buildCompositionFromMassFractions ( const std::vector< std::string > & symbols,
const std::vector< double > & massFractions )

Build a Composition object from symbols and their corresponding mass fractions.

Parameters
symbolsThe symbols to register.
massFractionsThe corresponding mass fractions for each symbol.
Returns
A Composition object constructed from the provided symbols and mass fractions.
Exceptions
exceptions::UnknownSymbolErrorif any symbol is invalid. Symbols are invalid if they are not registered at compile time in the atomic species database (fourdst/atomic/species.h).
exceptions::InvalidCompositionErrorif the provided mass fractions do not sum to within one part in 10^10 of 1.0.
exceptions::InvalidCompositionErrorif the number of symbols does not match the number of mass fractions.

Definition at line 77 of file utils.cpp.

◆ buildCompositionFromMassFractions() [6/7]

Composition fourdst::composition::buildCompositionFromMassFractions ( std::map< atomic::Species, double > massFractions)

Build a Composition object from a map of species to mass fractions.

Parameters
massFractionsThe map of species to their corresponding mass fractions.
Returns
A Composition object constructed from the provided species and mass fractions.
Exceptions
exceptions::InvalidCompositionErrorif the provided mass fractions do not sum to within one part in 10^10 of 1.0.

Definition at line 120 of file utils.cpp.

◆ buildCompositionFromMassFractions() [7/7]

Composition fourdst::composition::buildCompositionFromMassFractions ( std::map< std::string, double > massFractions)

Build a Composition object from a map of species to mass fractions.

Parameters
massFractionsThe map of species to their corresponding mass fractions.
Returns
A Composition object constructed from the provided species and mass fractions.
Exceptions
exceptions::InvalidCompositionErrorif the provided mass fractions do not sum to within one part in 10^10 of 1.0.

Definition at line 134 of file utils.cpp.

◆ get_composition_record() [1/2]

Composition fourdst::composition::get_composition_record ( const std::string & metal_fraction_scheme,
const std::string & isotopic_percentage_scheme,
double initial_z,
double initial_y )
nodiscard

Constructs a stellar Composition from a named solar metal-fraction scheme and isotopic-percentage table, scaled to the supplied bulk hydrogen and helium mass fractions.

Available metal fraction schemes (extracted from MESA chem_def.f90):

  • AG89 (Anders & Grevesse 1989)
  • GN93 (Grevesse & Noels 1993)
  • GS98 (Grevesse & Sauval 1998)
  • L03 (Lodders 2003)
  • AGS05 (Asplund, Grevesse & Sauval 2005)
  • AGSS09 (Asplund et al. 2009)
  • A09_Przybilla
  • MB22_photospheric
  • AAG21_photospheric
  • L09 (Lodders 2009)

Available isotopic percentage schemes:

  • L03_data (Lodders 2003)
  • L09_data (Lodders 2009)

Algorithm:

  1. Data loading — The embedded binary StandardMetalFractions is copied into a std::vector<char> and parsed twice: once for metal_fraction_scheme and once for isotopic_percentage_scheme.
  2. Species list — The isotope table is iterated; any isotope whose element appears in the metals list or is "H" / "He" is looked up in the global atomic::species registry by "<Element>-<A>" and added to the list.
  3. H and He mass fractions — Four entries are prepended (H-1, H-2, He-3, He-4) using Anders & Grevesse (1989) solar He3/He4 ratio:
    • X(H-1) = clamp(1 - Z - Y, 0, 1)
    • X(H-2) = 0
    • X(He-3) = Y * xsol_He3 / (xsol_He3 + xsol_He4)
    • X(He-4) = Y * xsol_He4 / (xsol_He3 + xsol_He4) where xsol_He3 = 2.9291e-5 and xsol_He4 = 2.7521e-1.
  4. Atomic-weight weighting — When CompositionData::requires_atomic_weight is true, each metal's number-fraction abundance is multiplied by the atomic mass of its most-abundant isotope (determined from the isotopic table).
  5. Normalisation — Metal fractions are summed and normalised to unity.
  6. Isotope distribution — Per-isotope mass fractions are computed as: X_i = Z_total * f_E * (p_i * m_i) / sum_j(p_j * m_j) where f_E is the normalised metal fraction, p_i the isotopic percentage (0-100 scale), and m_i the isotope's atomic mass.
  7. Renormalisation — Metal mass fractions are rescaled so their sum equals Z_total exactly.
  8. AssemblybuildCompositionFromMassFractions(species, massFracs) builds the final Composition object.
Parameters
[in]metal_fraction_schemeBlock tag of the desired solar metal composition (e.g., "GS98", "AGSS09"). Case-sensitive; must match a BEGIN/END tag in the embedded data exactly.
[in]isotopic_percentage_schemeBlock tag of the isotopic percentage table (e.g., "L03_data", "L09_data").
[in]initial_zTotal metal mass fraction Z (0 <= Z < 1).
[in]initial_yTotal helium mass fraction Y (0 <= Y < 1, with X + Y + Z <= 1 recommended). X(H-1) is clamped to [0, 1] if the constraint is violated.
Returns
Composition Fully populated composition object with per-isotope mass fractions normalised to initial_z and initial_y.
Exceptions
std::out_of_rangeIf a species name derived from the isotopic table is absent from atomic::species, or if either scheme tag is not present in the embedded data.
std::invalid_argumentIf numeric fields in the embedded data are malformed (propagated from std::stod / std::stoi).
Examples
// Grevesse & Sauval (1998) at Z = 0.02, Y = 0.28
fourdst::composition::get_composition_record("GS98", "L03_data", 0.02, 0.28);
double x_h1 = comp.massFraction("H-1");
std::println("X(H-1) = {:.6f}", x_h1); // approx 0.70
Composition get_composition_record(const std::string &metal_fraction_scheme, const std::string &isotopic_percentage_scheme, double initial_z, double initial_y)
Constructs a stellar Composition from a named solar metal-fraction scheme and isotopic-percentage tab...

Definition at line 252 of file standard_compositions.cpp.

◆ get_composition_record() [2/2]

Composition fourdst::composition::get_composition_record ( io::SolarCompositions metal_fraction_scheme,
io::IsotopicPercentages isotopic_percentage_scheme,
double initial_z,
double initial_y )
nodiscard

Enum-based overload of get_composition_record().

Translates strongly-typed enum values to their canonical string representations via SolarCompositions_to_string_map and IsotopicPercentages_to_string_map, then delegates to the string-based overload. This overload is preferred as it prevents scheme name typos.

Parameters
[in]metal_fraction_schemeEnum identifying the desired solar metal composition (e.g., SolarCompositions::GS98).
[in]isotopic_percentage_schemeEnum identifying the isotopic percentage table (e.g., IsotopicPercentages::L03).
[in]initial_zTotal metal mass fraction Z (0 <= Z < 1).
[in]initial_yTotal helium mass fraction Y (0 <= Y < 1).
Returns
Composition Fully populated composition; see the string-based overload for the complete algorithm description.
Exceptions
std::out_of_rangeIf the enum value is absent from its lookup map (should not occur with valid named enum members).
Examples
using namespace fourdst::composition;
using namespace fourdst::composition::io;
// Asplund et al. (2009) at proto-solar Z and Y
0.0134, 0.2485
);
double x_he4 = comp.massFraction("He-4");
std::println("X(He-4) = {:.6f}", x_he4);

Definition at line 390 of file standard_compositions.cpp.

◆ getSpecies()

std::optional< fourdst::atomic::Species > fourdst::composition::getSpecies ( const std::string & symbol)

Definition at line 189 of file utils.cpp.

◆ operator<<()

std::ostream & fourdst::composition::operator<< ( std::ostream & os,
const Composition & composition )
Parameters
osThe output stream.
compositionThe Composition to output.
Returns
The output stream.

Definition at line 746 of file composition.cpp.

◆ operator==()

bool fourdst::composition::operator== ( const Composition & a,
const Composition & b )
inlinenoexcept

Definition at line 858 of file composition.h.