feat(composition): added ability to change composition modes

This commit is contained in:
2025-03-25 13:01:22 -04:00
parent 95e4d10c59
commit e850f78831
3 changed files with 50 additions and 0 deletions

View File

@@ -460,3 +460,24 @@ Composition Composition::subset(const std::vector<std::string>& 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;
}

View File

@@ -403,6 +403,12 @@ namespace composition{
*/
Composition subset(const std::vector<std::string>& 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.

View File

@@ -1,4 +1,5 @@
#include <gtest/gtest.h>
#include <stdexcept>
#include <string>
#include <algorithm>
@@ -139,3 +140,25 @@ TEST_F(compositionTest, getComposition) {
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));
}