fourdst::libcomposition v2.0.1
Robust atomic species information library
Loading...
Searching...
No Matches
utils.cpp
Go to the documentation of this file.
6#include "fourdst/logging/logging.h"
7
8#include <numeric>
9#include <ranges>
10#include <vector>
11#include <set>
12#include <string>
13
14#include "quill/LogMacros.h"
15
16namespace {
17 std::optional<fourdst::atomic::Species> getSpecies(const std::string& symbol) {
18 if (!fourdst::atomic::species.contains(symbol)) {
19 return std::nullopt;
20 }
21 return fourdst::atomic::species.at(symbol);
22 }
23
24 quill::Logger* getLogger() {
25 static quill::Logger* logger = fourdst::logging::LogManager::getInstance().getLogger("log");
26 return logger;
27 }
28
29 void throw_unknown_symbol(const std::string& symbol) {
30 LOG_ERROR(getLogger(), "Symbol {} is not a valid species symbol (not in the species database)", symbol);
31 throw fourdst::composition::exceptions::UnknownSymbolError("Symbol " + symbol + " is not a valid species symbol (not in the species database)");
32 }
33}
34
35namespace fourdst::composition {
37 const std::set<atomic::Species> &species,
38 const std::vector<double> &massFractions
39 ) {
40 const double sum = std::accumulate(
41 massFractions.begin(),
42 massFractions.end(),
43 0.0
44 );
45
46 if (std::abs(sum - 1.0) > 1e-10) {
48 "Mass fractions must sum to 1.0, got " + std::to_string(sum)
49 );
50 }
51
52 if (species.size() != massFractions.size()) {
54 "The number of species and mass fractions must be equal. Got " +
55 std::to_string(species.size()) + " species and " +
56 std::to_string(massFractions.size()) + " mass fractions."
57 );
58 }
59
61
62 for (const auto& [sp, xi] : std::views::zip(species, massFractions)) {
63 composition.registerSpecies(sp);
64 composition.setMolarAbundance(sp, xi/sp.mass());
65 }
66
67 return composition;
68 }
69
70 Composition buildCompositionFromMassFractions(const std::vector<atomic::Species> &species, const std::vector<double> &massFractions) {
71 return buildCompositionFromMassFractions(std::set<atomic::Species>(species.begin(), species.end()), massFractions);
72 }
73
74 Composition buildCompositionFromMassFractions(const std::vector<std::string> &symbols, const std::vector<double> &massFractions) {
75 std::set<atomic::Species> species;
76 for (const auto& symbol : symbols) {
77 auto result = getSpecies(symbol);
78 if (!result) {
79 throw_unknown_symbol(symbol);
80 }
81 species.insert(result.value());
82 }
83 return buildCompositionFromMassFractions(species, massFractions);
84 }
85}
Manages a collection of chemical species and their abundances.
Definition composition.h:97
Exception thrown when a composition is in an invalid or inconsistent state.
Exception thrown when an unknown symbol is encountered.
static const std::unordered_map< std::string, const Species & > species
Map of species names to their corresponding Species objects.
Definition species.h:3579
Utilities and types for representing and manipulating chemical compositions.
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:74