diff --git a/src/composition/private/composition.cpp b/src/composition/private/composition.cpp index 0fefc7b..822d67d 100644 --- a/src/composition/private/composition.cpp +++ b/src/composition/private/composition.cpp @@ -459,4 +459,25 @@ Composition Composition::subset(const std::vector& symbols, std::st } } return subsetComposition; +} + +void Composition::setCompositionMode(bool massFracMode) { + if (!m_finalized) { + LOG_ERROR(m_logger, "Composition has not been finalized. Mode cannot be set unless composition is finalized."); + throw std::runtime_error("Composition has not been finalized (Consider running .finalize()). The mode cannot be set unless the composition is finalized."); + } + + bool okay = true; + for (auto& [_, entry] : m_compositions) { + if (massFracMode) { + okay = entry.setMassFracMode(m_meanParticleMass); + } else { + okay = entry.setNumberFracMode(m_specificNumberDensity); + } + if (!okay) { + LOG_ERROR(m_logger, "Composition mode could not be set."); + throw std::runtime_error("Composition mode could not be set."); + } + } + m_massFracMode = massFracMode; } \ No newline at end of file diff --git a/src/composition/public/composition.h b/src/composition/public/composition.h index 7335efb..6893ab7 100644 --- a/src/composition/public/composition.h +++ b/src/composition/public/composition.h @@ -403,6 +403,12 @@ namespace composition{ */ Composition subset(const std::vector& symbols, std::string method="norm") const; + /** + * @brief Sets the composition mode. + * @param massFracMode True if mass fraction mode, false if number fraction mode. + */ + void setCompositionMode(bool massFracMode); + /** * @brief Overloaded output stream operator for Composition. * @param os The output stream. diff --git a/tests/composition/compositionTest.cpp b/tests/composition/compositionTest.cpp index 5d6da06..4dc9ae6 100644 --- a/tests/composition/compositionTest.cpp +++ b/tests/composition/compositionTest.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -138,4 +139,26 @@ TEST_F(compositionTest, getComposition) { EXPECT_DOUBLE_EQ(compositionEntry.first.mass_fraction(), 0.6); EXPECT_DOUBLE_EQ(compositionEntry.second.meanParticleMass, 1.4382769310381101); EXPECT_DOUBLE_EQ(compositionEntry.second.specificNumberDensity, 1.0/1.4382769310381101); +} + +TEST_F(compositionTest, setCompositionMode) { + Config::getInstance().loadConfig(EXAMPLE_FILENAME); + composition::Composition comp; + comp.registerSymbol("H-1"); + comp.registerSymbol("He-4"); + comp.setMassFraction("H-1", 0.6); + comp.setMassFraction("He-4", 0.4); + EXPECT_NO_THROW(comp.finalize()); + + EXPECT_DOUBLE_EQ(comp.getMassFraction("H-1"), 0.6); + EXPECT_DOUBLE_EQ(comp.getMassFraction("He-4"), 0.4); + + EXPECT_NO_THROW(comp.setCompositionMode(false)); + + EXPECT_NO_THROW(comp.setNumberFraction("H-1", 0.9)); + EXPECT_NO_THROW(comp.setNumberFraction("He-4", 0.1)); + + EXPECT_THROW(comp.setCompositionMode(true), std::runtime_error); + EXPECT_NO_THROW(comp.finalize()); + EXPECT_NO_THROW(comp.setCompositionMode(true)); } \ No newline at end of file