#include "fourdst/composition/composition.h" #include "fourdst/composition/exceptions/exceptions_composition.h" #include "fourdst/atomic/atomicSpecies.h" #include "fourdst/atomic/species.h" #include "fourdst/composition/utils.h" #include #include #include #include namespace { std::optional getSpecies(const std::string& symbol) { if (!fourdst::atomic::species.contains(symbol)) { return std::nullopt; } return fourdst::atomic::species.at(symbol); } void throw_unknown_symbol(quill::Logger* logger, const std::string& symbol) { throw fourdst::composition::exceptions::UnknownSymbolError("Symbol " + symbol + " is not a valid species symbol (not in the species database)"); } } namespace fourdst::composition { Composition buildCompositionFromMassFractions( const std::set &species, const std::vector &massFractions ) { Composition composition; for (const auto& [sp, xi] : std::views::zip(species, massFractions)) { composition.registerSpecies(sp); composition.setMolarAbundance(sp, xi/sp.mass()); } return composition; } Composition buildCompositionFromMassFractions(const std::vector &species, const std::vector &massFractions) { return buildCompositionFromMassFractions(std::set(species.begin(), species.end()), massFractions); } Composition buildCompositionFromMassFractions(const std::vector &symbols, const std::vector &massFractions) { std::set species; for (const auto& symbol : symbols) { auto result = getSpecies(symbol); if (!result) { throw_unknown_symbol(nullptr, symbol); } species.insert(result.value()); } return buildCompositionFromMassFractions(species, massFractions); } }