From 36849783f5a9a10d4e5b92f8c7f20671bea165fa Mon Sep 17 00:00:00 2001 From: Emily Boudreaux Date: Wed, 22 Oct 2025 10:12:59 -0400 Subject: [PATCH] perf(CompositionEntry): made symbol and isotope std::optional for comopsition entry so that construction can be cheaper --- .../include/fourdst/composition/composition.h | 5 +++-- src/composition/lib/composition.cpp | 21 ++++++++----------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/composition/include/fourdst/composition/composition.h b/src/composition/include/fourdst/composition/composition.h index 5ffdaa6..0be32ea 100644 --- a/src/composition/include/fourdst/composition/composition.h +++ b/src/composition/include/fourdst/composition/composition.h @@ -25,6 +25,7 @@ #include #include +#include #include "fourdst/config/config.h" #include "fourdst/logging/logging.h" @@ -82,8 +83,8 @@ namespace fourdst::composition { * fraction or number fraction). It manages the state and conversions for that single entry. */ struct CompositionEntry { - std::string m_symbol; ///< The chemical symbol of the species (e.g., "H-1", "Fe-56"). - atomic::Species m_isotope; ///< The `atomic::Species` object containing detailed isotope data. + std::optional m_symbol = std::nullopt; ///< The chemical symbol of the species (e.g., "H-1", "Fe-56"). + std::optional m_isotope = std::nullopt; ///< The `atomic::Species` object containing detailed isotope data. bool m_massFracMode = true; ///< The mode of the composition entry. True if mass fraction, false if number fraction. double m_massFraction = 0.0; ///< The mass fraction of the species. Valid only if `m_massFracMode` is true. diff --git a/src/composition/lib/composition.cpp b/src/composition/lib/composition.cpp index 396f144..79c5956 100644 --- a/src/composition/lib/composition.cpp +++ b/src/composition/lib/composition.cpp @@ -66,10 +66,7 @@ namespace { namespace fourdst::composition { - CompositionEntry::CompositionEntry() : - m_symbol("H-1"), - m_isotope(fourdst::atomic::species.at("H-1")), - m_initialized(false) {} + CompositionEntry::CompositionEntry() = default; CompositionEntry::CompositionEntry( const std::string& symbol, @@ -96,7 +93,7 @@ namespace fourdst::composition { } std::string CompositionEntry::symbol() const { - return m_symbol; + return m_symbol.value(); } double CompositionEntry::mass_fraction() const { @@ -104,7 +101,7 @@ namespace fourdst::composition { throw exceptions::CompositionModeError("Composition entry is in number fraction mode."); } // X_i = (moles_i / mass_total) * (mass_i / moles_i) = m_molesPerMass * A_i - return m_molesPerMass * m_isotope.mass(); + return m_molesPerMass * m_isotope->mass(); } double CompositionEntry::number_fraction() const { @@ -128,7 +125,7 @@ namespace fourdst::composition { } atomic::Species CompositionEntry::isotope() const { - return m_isotope; + return m_isotope.value(); } void CompositionEntry::setMassFraction( @@ -138,10 +135,10 @@ namespace fourdst::composition { throw exceptions::CompositionModeError("Composition entry is in number fraction mode."); } // Set the invariant from the given mass fraction - if (m_isotope.mass() == 0.0) { + if (m_isotope->mass() == 0.0) { m_molesPerMass = 0.0; } else { - m_molesPerMass = mass_fraction / m_isotope.mass(); + m_molesPerMass = mass_fraction / m_isotope->mass(); } } @@ -705,7 +702,7 @@ namespace fourdst::composition { for (const auto &val: m_compositions | std::views::values) { // Sum of (X_i * Z_i / A_i) - zSum += (val.mass_fraction() * val.m_isotope.z())/val.m_isotope.a(); + zSum += (val.mass_fraction() * val.m_isotope->z())/val.m_isotope->a(); } // = * sum(X_i * Z_i / A_i) @@ -725,7 +722,7 @@ namespace fourdst::composition { double Ye = 0.0; for (const auto &val: m_compositions | std::views::values) { - Ye += (val.mass_fraction() * val.m_isotope.z())/val.m_isotope.a(); + Ye += (val.mass_fraction() * val.m_isotope->z())/val.m_isotope->a(); } m_cache.Ye = Ye; return Ye; @@ -1071,7 +1068,7 @@ namespace fourdst::composition { std::ostream& os, const CompositionEntry& entry ) { - os << "<" << entry.m_symbol << " : m_frac = " << entry.mass_fraction() << ">"; + os << "<" << entry.m_symbol.value() << " : m_frac = " << entry.mass_fraction() << ">"; return os; }