From 98f27de5364468e90570ed2a4737d7a13f970bde Mon Sep 17 00:00:00 2001 From: Ryan Thomas Wollaeger Date: Sat, 1 Aug 2026 19:29:46 -0600 Subject: [PATCH] Update API for non-CGS scattering variant, for MG changes. --- .../photons/non_cgs_s_photons.hpp | 82 +++++++++++++------ 1 file changed, 58 insertions(+), 24 deletions(-) diff --git a/singularity-opac/photons/non_cgs_s_photons.hpp b/singularity-opac/photons/non_cgs_s_photons.hpp index e9ab9b2..f8deb31 100644 --- a/singularity-opac/photons/non_cgs_s_photons.hpp +++ b/singularity-opac/photons/non_cgs_s_photons.hpp @@ -21,6 +21,7 @@ #include #include +#include namespace singularity { namespace photons { @@ -83,51 +84,84 @@ template class MeanNonCGSUnitsS { public: MeanNonCGSUnitsS() = default; - MeanNonCGSUnitsS(MeanSOpac &&mean_s_opac, const Real time_unit, + MeanNonCGSUnitsS(MeanSOpac &&multigroup_s_opac, const Real time_unit, const Real mass_unit, const Real length_unit, const Real temp_unit) - : mean_s_opac_(std::forward(mean_s_opac)), + : multigroup_s_opac_(std::forward(multigroup_s_opac)), time_unit_(time_unit), mass_unit_(mass_unit), length_unit_(length_unit), temp_unit_(temp_unit), - rho_unit_(mass_unit_ / (length_unit_ * length_unit_ * length_unit_)) {} + rho_unit_(mass_unit_ / (length_unit_ * length_unit_ * length_unit_)), + freq_unit_(1. / time_unit_) {} auto GetOnDevice() { - return MeanNonCGSUnitsS(mean_s_opac_.GetOnDevice(), time_unit_, + return MeanNonCGSUnitsS(multigroup_s_opac_.GetOnDevice(), time_unit_, mass_unit_, length_unit_, temp_unit_); } - inline void Finalize() noexcept { mean_s_opac_.Finalize(); } + inline void Finalize() noexcept { multigroup_s_opac_.Finalize(); } PORTABLE_INLINE_FUNCTION - int nlambda() const noexcept { return mean_s_opac_.nlambda(); } + bool HasGroupBounds() const noexcept { + return multigroup_s_opac_.HasGroupBounds(); + } + + PORTABLE_INLINE_FUNCTION RuntimePhysicalConstants + GetRuntimePhysicalConstants() const { + return multigroup_s_opac_.GetRuntimePhysicalConstants(); + } PORTABLE_INLINE_FUNCTION - Real PlanckMeanTotalScatteringCoefficient(const Real rho, - const Real temp) const { - const Real alpha = mean_s_opac_.PlanckMeanTotalScatteringCoefficient( - rho_unit_ * rho, temp_unit_ * temp); - // alpha output in units of 1/cm. Want to convert out of CGS. - // multiplication by length_unit converts length to cm. - // division converts length from cm to unit system. - // thus multiplication converts (1/cm) to unit system. + Real PlanckGroupScatteringCoefficient(const Real rho, + const Real temp, + const int group) const { + return ScatteringCoefficient(rho, temp, group, Planck); + } + + PORTABLE_INLINE_FUNCTION + Real RosselandGroupScatteringCoefficient(const Real rho, + const Real temp, + const int group) const { + return ScatteringCoefficient(rho, temp, group, Rosseland); + } + + PORTABLE_INLINE_FUNCTION + Real ScatteringCoefficient(const Real rho, const Real temp, const int group, + const int gmode = Rosseland) const { + const Real alpha = multigroup_s_opac_.ScatteringCoefficient( + rho_unit_ * rho, temp_unit_ * temp, group, gmode); return alpha * length_unit_; } PORTABLE_INLINE_FUNCTION - Real RosselandMeanTotalScatteringCoefficient(const Real rho, - const Real temp) const { - const Real alpha = mean_s_opac_.RosselandMeanTotalScatteringCoefficient( - rho_unit_ * rho, temp_unit_ * temp); - // alpha output in units of 1/cm. Want to convert out of CGS. - // multiplication by length_unit converts length to cm. - // division converts length from cm to unit system. - // thus multiplication converts (1/cm) to unit system. + int GroupOfNu(const Real nu) const { + return multigroup_s_opac_.GroupOfNu(nu * freq_unit_); + } + + PORTABLE_INLINE_FUNCTION + Real PlanckGroupScatteringCoefficientFromNu(const Real rho, const Real temp, + const Real nu) const { + return ScatteringCoefficientFromNu(rho, temp, nu, Planck); + } + + PORTABLE_INLINE_FUNCTION + Real RosselandGroupScatteringCoefficientFromNu(const Real rho, + const Real temp, + const Real nu) const { + return ScatteringCoefficientFromNu(rho, temp, nu, Rosseland); + } + + PORTABLE_INLINE_FUNCTION + Real ScatteringCoefficientFromNu(const Real rho, const Real temp, + const Real nu, + const int gmode = Rosseland) const { + const Real alpha = multigroup_s_opac_.ScatteringCoefficientFromNu( + rho_unit_ * rho, temp_unit_ * temp, nu * freq_unit_, gmode); return alpha * length_unit_; } private: - MeanSOpac mean_s_opac_; + MeanSOpac multigroup_s_opac_; Real time_unit_, mass_unit_, length_unit_, temp_unit_; - Real rho_unit_; + Real rho_unit_, freq_unit_; }; } // namespace photons