30 const std::set<atomic::Species> &species,
31 const std::vector<double> &massFractions
33 const double sum = std::accumulate(
34 massFractions.begin(),
39 if (std::abs(sum - 1.0) > 1e-10) {
41 "Mass fractions must sum to 1.0, got " + std::to_string(sum)
45 if (species.size() != massFractions.size()) {
47 "The number of species and mass fractions must be equal. Got " +
48 std::to_string(species.size()) +
" species and " +
49 std::to_string(massFractions.size()) +
" mass fractions."
55 for (
const auto& [sp, xi] : std::views::zip(species, massFractions)) {
64 std::set<atomic::Species> speciesSet(species.begin(), species.end());
65 std::vector<double> sortedMassFractions;
67 sortedMassFractions.resize(massFractions.size());
68 for (
const auto& [s, xi] : std::views::zip(species, massFractions)) {
69 const size_t index = std::distance(speciesSet.begin(), speciesSet.find(s));
70 assert (index < sortedMassFractions.size());
71 sortedMassFractions[index] = xi;
78 std::set<atomic::Species> species;
79 for (
const auto& symbol : symbols) {
82 throw_unknown_symbol(symbol);
84 species.insert(result.value());
87 std::vector<double> sortedMassFractions(massFractions.size());
88 for (
const auto& [symbol, xi] : std::views::zip(symbols, massFractions)) {
91 throw_unknown_symbol(symbol);
93 const size_t index = std::distance(species.begin(), species.find(result.value()));
94 assert (index < sortedMassFractions.size());
95 sortedMassFractions[index] = xi;
101 std::set<atomic::Species> species;
102 std::vector<double> massFractions;
104 massFractions.reserve(massFractionsMap.size());
106 for (
const auto &sp: massFractionsMap | std::views::keys) {
110 massFractions.resize(massFractionsMap.size());
111 for (
const auto& [sp, xi] : massFractionsMap) {
112 const size_t index = std::distance(species.begin(), species.find(sp));
113 assert (index < massFractions.size());
114 massFractions[index] = xi;
121 std::set<atomic::Species> species;
122 std::vector<double> massFractionVector;
124 massFractionVector.reserve(massFractions.size());
126 for (
const auto& [sp, xi] : massFractions) {
128 massFractionVector.push_back(xi);
135 std::set<atomic::Species> species;
136 std::vector<double> massFractionVector;
139 for (
const auto &symbol: massFractions | std::views::keys) {
142 throw_unknown_symbol(symbol);
144 species.insert(result.value());
147 massFractionVector.resize(massFractions.size());
149 for (
const auto& [symbol, xi] : massFractions) {
152 throw_unknown_symbol(symbol);
154 const size_t index = std::distance(species.begin(), species.find(result.value()));
155 assert (index < massFractionVector.size());
156 massFractionVector[index] = xi;
164 std::set<atomic::Species> species;
165 std::vector<double> massFractionVector;
167 for (
const auto &symbol: massFractions | std::views::keys) {
170 throw_unknown_symbol(symbol);
172 species.insert(result.value());
175 massFractionVector.resize(massFractions.size());
176 for (
const auto& [sp, xi] : massFractions) {
179 throw_unknown_symbol(sp);
181 const size_t index = std::distance(species.begin(), species.find(result.value()));
182 assert (index < massFractionVector.size());
183 massFractionVector[index] = xi;