SERiF 0.0.1a
3+1D Stellar Structure and Evolution
Loading...
Searching...
No Matches
compositionTest.cpp
Go to the documentation of this file.
1#include <gtest/gtest.h>
2#include <stdexcept>
3#include <string>
4#include <algorithm>
5
6#include "atomicSpecies.h"
7#include "species.h"
8#include "composition.h"
9#include "config.h"
10
11std::string EXAMPLE_FILENAME = std::string(getenv("MESON_SOURCE_ROOT")) + "/tests/config/example.yaml";
12
16class compositionTest : public ::testing::Test {};
17
21TEST_F(compositionTest, isotopeMasses) {
22 EXPECT_NO_THROW(serif::atomic::species.at("H-1"));
23 EXPECT_DOUBLE_EQ(serif::atomic::species.at("H-1").mass(), 1.007825031898);
24 EXPECT_DOUBLE_EQ(serif::atomic::species.at("He-3").mass(), 3.0160293219700001);
25 EXPECT_DOUBLE_EQ(serif::atomic::species.at("He-4").mass(),4.0026032541300003);
26}
27
28TEST_F(compositionTest, constructor) {
29 serif::config::Config::getInstance().loadConfig(EXAMPLE_FILENAME);
30 EXPECT_NO_THROW(serif::composition::Composition comp);
31}
32
33TEST_F(compositionTest, registerSymbol) {
34 serif::config::Config::getInstance().loadConfig(EXAMPLE_FILENAME);
36 EXPECT_NO_THROW(comp.registerSymbol("H-1"));
37 EXPECT_NO_THROW(comp.registerSymbol("He-4"));
38 EXPECT_THROW(comp.registerSymbol("H-19"), std::runtime_error);
39 EXPECT_THROW(comp.registerSymbol("He-21"), std::runtime_error);
40
41 std::set<std::string> registeredSymbols = comp.getRegisteredSymbols();
42 EXPECT_TRUE(registeredSymbols.find("H-1") != registeredSymbols.end());
43 EXPECT_TRUE(registeredSymbols.find("He-4") != registeredSymbols.end());
44 EXPECT_TRUE(registeredSymbols.find("H-19") == registeredSymbols.end());
45 EXPECT_TRUE(registeredSymbols.find("He-21") == registeredSymbols.end());
46}
47
48TEST_F(compositionTest, setGetComposition) {
49 serif::config::Config::getInstance().loadConfig(EXAMPLE_FILENAME);
51 comp.registerSymbol("H-1");
52 comp.registerSymbol("He-4");
53
54 EXPECT_DOUBLE_EQ(comp.setMassFraction("H-1", 0.5), 0.0);
55 EXPECT_DOUBLE_EQ(comp.setMassFraction("He-4", 0.5), 0.0);
56 EXPECT_DOUBLE_EQ(comp.setMassFraction("H-1", 0.6), 0.5);
57 EXPECT_DOUBLE_EQ(comp.setMassFraction("He-4", 0.4), 0.5);
58
59 EXPECT_NO_THROW(comp.finalize());
60 EXPECT_DOUBLE_EQ(comp.getMassFraction("H-1"), 0.6);
61
62 EXPECT_THROW(comp.setMassFraction("He-3", 0.3), std::runtime_error);
63
64 EXPECT_NO_THROW(comp.setMassFraction({"H-1", "He-4"}, {0.5, 0.5}));
65 EXPECT_THROW(auto r = comp.getComposition("H-1"), std::runtime_error);
66 EXPECT_TRUE(comp.finalize());
67 EXPECT_DOUBLE_EQ(comp.getComposition("H-1").first.mass_fraction(), 0.5);
68
69 EXPECT_NO_THROW(comp.setMassFraction({"H-1", "He-4"}, {0.6, 0.6}));
70 EXPECT_FALSE(comp.finalize());
71 EXPECT_THROW(auto r = comp.getComposition("H-1"), std::runtime_error);
72}
73
74TEST_F(compositionTest, setGetNumberFraction) {
75 serif::config::Config::getInstance().loadConfig(EXAMPLE_FILENAME);
77 comp.registerSymbol("H-1", false);
78 comp.registerSymbol("He-4", false);
79
80 EXPECT_DOUBLE_EQ(comp.setNumberFraction("H-1", 0.5), 0.0);
81 EXPECT_DOUBLE_EQ(comp.setNumberFraction("He-4", 0.5), 0.0);
82 EXPECT_DOUBLE_EQ(comp.setNumberFraction("H-1", 0.6), 0.5);
83 EXPECT_DOUBLE_EQ(comp.setNumberFraction("He-4", 0.4), 0.5);
84
85 EXPECT_NO_THROW(comp.finalize());
86 EXPECT_DOUBLE_EQ(comp.getNumberFraction("H-1"), 0.6);
87
88 EXPECT_THROW(comp.setNumberFraction("He-3", 0.3), std::runtime_error);
89}
90
92 serif::config::Config::getInstance().loadConfig(EXAMPLE_FILENAME);
94 comp.registerSymbol("H-1");
95 comp.registerSymbol("He-4");
96 comp.setMassFraction("H-1", 0.6);
97 comp.setMassFraction("He-4", 0.4);
98 EXPECT_NO_THROW(comp.finalize());
99
100 std::vector<std::string> symbols = {"H-1"};
101 serif::composition::Composition subsetComp = comp.subset(symbols, "norm");
102 EXPECT_TRUE(subsetComp.finalize());
103 EXPECT_DOUBLE_EQ(subsetComp.getMassFraction("H-1"), 1.0);
104}
105
106TEST_F(compositionTest, finalizeWithNormalization) {
107 serif::config::Config::getInstance().loadConfig(EXAMPLE_FILENAME);
109 comp.registerSymbol("H-1");
110 comp.registerSymbol("He-4");
111 comp.setMassFraction("H-1", 0.3);
112 comp.setMassFraction("He-4", 0.3);
113 EXPECT_TRUE(comp.finalize(true));
114 EXPECT_DOUBLE_EQ(comp.getMassFraction("H-1"), 0.5);
115 EXPECT_DOUBLE_EQ(comp.getMassFraction("He-4"), 0.5);
116}
117
118TEST_F(compositionTest, finalizeWithoutNormalization) {
119 serif::config::Config::getInstance().loadConfig(EXAMPLE_FILENAME);
121 comp.registerSymbol("H-1");
122 comp.registerSymbol("He-4");
123 comp.setMassFraction("H-1", 0.5);
124 comp.setMassFraction("He-4", 0.5);
125 EXPECT_TRUE(comp.finalize(false));
126 EXPECT_DOUBLE_EQ(comp.getMassFraction("H-1"), 0.5);
127 EXPECT_DOUBLE_EQ(comp.getMassFraction("He-4"), 0.5);
128}
129
130TEST_F(compositionTest, getComposition) {
131 serif::config::Config::getInstance().loadConfig(EXAMPLE_FILENAME);
133 comp.registerSymbol("H-1");
134 comp.registerSymbol("He-4");
135 comp.setMassFraction("H-1", 0.6);
136 comp.setMassFraction("He-4", 0.4);
137 EXPECT_NO_THROW(comp.finalize());
138
139 const auto compositionEntry = comp.getComposition("H-1");
140 EXPECT_DOUBLE_EQ(compositionEntry.first.mass_fraction(), 0.6);
141 EXPECT_DOUBLE_EQ(compositionEntry.second.meanParticleMass, 1.4382769310381101);
142 EXPECT_DOUBLE_EQ(compositionEntry.second.specificNumberDensity, 1.0/1.4382769310381101);
143}
144
145TEST_F(compositionTest, setCompositionMode) {
146 serif::config::Config::getInstance().loadConfig(EXAMPLE_FILENAME);
148 comp.registerSymbol("H-1");
149 comp.registerSymbol("He-4");
150 comp.setMassFraction("H-1", 0.6);
151 comp.setMassFraction("He-4", 0.4);
152 EXPECT_NO_THROW(comp.finalize());
153
154 EXPECT_DOUBLE_EQ(comp.getMassFraction("H-1"), 0.6);
155 EXPECT_DOUBLE_EQ(comp.getMassFraction("He-4"), 0.4);
156
157 EXPECT_NO_THROW(comp.setCompositionMode(false));
158
159 EXPECT_NO_THROW(comp.setNumberFraction("H-1", 0.9));
160 EXPECT_NO_THROW(comp.setNumberFraction("He-4", 0.1));
161
162 EXPECT_THROW(comp.setCompositionMode(true), std::runtime_error);
163 EXPECT_NO_THROW(comp.finalize());
164 EXPECT_NO_THROW(comp.setCompositionMode(true));
165}
166
168 serif::config::Config::getInstance().loadConfig(EXAMPLE_FILENAME);
170 comp.registerSymbol("H-1");
171 comp.registerSymbol("He-4");
172 comp.setMassFraction("H-1", 0.6);
173 comp.setMassFraction("He-4", 0.4);
174 EXPECT_NO_THROW(comp.finalize());
175
176 EXPECT_TRUE(comp.hasSymbol("H-1"));
177 EXPECT_TRUE(comp.hasSymbol("He-4"));
178 EXPECT_FALSE(comp.hasSymbol("H-2"));
179 EXPECT_FALSE(comp.hasSymbol("He-3"));
180}
181
183 serif::config::Config::getInstance().loadConfig(EXAMPLE_FILENAME);
185 comp1.registerSymbol("H-1");
186 comp1.registerSymbol("He-4");
187 comp1.setMassFraction("H-1", 0.6);
188 comp1.setMassFraction("He-4", 0.4);
189 EXPECT_NO_THROW(comp1.finalize());
190
192 comp2.registerSymbol("H-1");
193 comp2.registerSymbol("He-4");
194 comp2.setMassFraction("H-1", 0.4);
195 comp2.setMassFraction("He-4", 0.6);
196 EXPECT_NO_THROW(comp2.finalize());
197
198 serif::composition::Composition mixedComp = comp1 + comp2;
199 EXPECT_TRUE(mixedComp.finalize());
200 EXPECT_DOUBLE_EQ(mixedComp.getMassFraction("H-1"), 0.5);
201 EXPECT_DOUBLE_EQ(mixedComp.getMassFraction("He-4"), 0.5);
202
203 serif::composition::Composition mixedComp2 = comp1.mix(comp2, 0.25);
204 EXPECT_TRUE(mixedComp2.finalize());
205 EXPECT_DOUBLE_EQ(mixedComp2.getMassFraction("H-1"), 0.45);
206 EXPECT_DOUBLE_EQ(mixedComp2.getMassFraction("He-4"), 0.55);
207}
Test suite for the composition class.
Manages the composition of elements.
std::unordered_map< std::string, double > getMassFraction() const
Gets the mass fractions of all compositions.
Composition mix(const Composition &other, double fraction) const
Mix two compositions together with a given fraction.
void registerSymbol(const std::string &symbol, bool massFracMode=true)
Registers a new symbol.
bool finalize(bool norm=false)
Finalizes the composition.
double setMassFraction(const std::string &symbol, const double &mass_fraction)
Sets the mass fraction for a given symbol.
std::string EXAMPLE_FILENAME
TEST_F(compositionTest, isotopeMasses)
Test the constructor of the composition class.