From dfeb8f3496ee38c982e206511ee4825dec232317 Mon Sep 17 00:00:00 2001 From: Konstantin Malanchev Date: Fri, 22 Nov 2024 14:03:36 -0500 Subject: [PATCH] Make a lot of stuff mutable --- cpp/include/freddi_state.hpp | 60 ++++++++++++++++----------------- cpp/include/ns/ns_evolution.hpp | 4 +-- cpp/src/freddi_state.cpp | 34 +++++++++---------- cpp/src/ns/ns_evolution.cpp | 2 +- 4 files changed, 50 insertions(+), 50 deletions(-) diff --git a/cpp/include/freddi_state.hpp b/cpp/include/freddi_state.hpp index cbbba14..e7644c7 100644 --- a/cpp/include/freddi_state.hpp +++ b/cpp/include/freddi_state.hpp @@ -267,11 +267,11 @@ class FreddiState { protected: std::shared_ptr str_; CurrentState current_; - DiskOptionalStructure opt_str_; + mutable DiskOptionalStructure opt_str_; std::unique_ptr wind_; std::shared_ptr disk_irr_source_; RocheLobe star_roche_lobe_; - IrradiatedStar star_; + mutable IrradiatedStar star_; public: FreddiState(const FreddiArguments& args, const wunc_t& wunc); explicit FreddiState(const FreddiState&); @@ -362,19 +362,19 @@ class FreddiState { template double integrate(const vecd& x, const std::function& func) const { return trapz(x, func, region_first(), region_last()); } - template double lazy_integrate(boost::optional& x, const vecd& values) { + template double lazy_integrate(boost::optional& x, const vecd& values) const { if (!x) { x = integrate(values); } return *x; } - template double lazy_integrate(boost::optional &opt, const vecd& x, const std::function& values) { + template double lazy_integrate(boost::optional &opt, const vecd& x, const std::function& values) const { if (!opt) { opt = integrate(x, values); } return *opt; } - template double I_lambda(double lambda) { + template double I_lambda(double lambda) const { const vecd* T; if constexpr(Region == HotRegion) { T = &Tph(); @@ -385,27 +385,27 @@ class FreddiState { } return integrate([T, lambda](const size_t i) -> double { return Spectrum::Planck_lambda((*T)[i], lambda); }); } - double lazy_magnitude(boost::optional& m, double lambda, double F0); - virtual const vecd& Qx(); + double lazy_magnitude(boost::optional& m, double lambda, double F0) const; + virtual const vecd& Qx() const; public: - double Lx(); - double Fx(); - const vecd& W(); - const vecd& Sigma(); - const vecd& Tph(); - const vecd& Tph_vis(); - const vecd& Tph_X(); - const vecd& Tirr(); - const vecd& Kirr(); - const vecd& Height(); + double Lx() const; + double Fx() const; + const vecd& W() const; + const vecd& Sigma() const; + const vecd& Tph() const; + const vecd& Tph_vis() const; + const vecd& Tph_X() const; + const vecd& Tirr() const; + const vecd& Kirr() const; + const vecd& Height() const; double Luminosity(const vecd& T, double nu1, double nu2) const; - inline double magnitude(const double lambda, const double F0) { + inline double magnitude(const double lambda, const double F0) const { return -2.5 * std::log10(I_lambda(lambda) * cosiOverD2() / F0); } - template double flux_region(double lambda) { + template double flux_region(double lambda) const { return I_lambda(lambda) * m::pow<2>(lambda) / GSL_CONST_CGSM_SPEED_OF_LIGHT * cosiOverD2(); } - template double flux_region(const EnergyPassband& passband) { + template double flux_region(const EnergyPassband& passband) const { const double intens = trapz( passband.lambdas, [this, &passband](const size_t i) -> double { @@ -415,18 +415,18 @@ class FreddiState { passband.data.size() - 1); return intens * cosiOverD2() / passband.t_dnu; } - inline double flux(const double lambda) { return flux_region(lambda); } - inline double flux(const EnergyPassband& passband) { return flux_region(passband); } - double flux_star(double lambda, double phase); - double flux_star(const EnergyPassband& passband, double phase); - inline double flux_star(double lambda) { return flux_star(lambda, phase_opt()); } - inline double flux_star(const EnergyPassband& passband) { return flux_star(passband, phase_opt()); } - inline double Mdisk() { return lazy_integrate(opt_str_.Mdisk, Sigma()); } - double Mdot_wind(); + inline double flux(const double lambda) const { return flux_region(lambda); } + inline double flux(const EnergyPassband& passband) const { return flux_region(passband); } + double flux_star(double lambda, double phase) const; + double flux_star(const EnergyPassband& passband, double phase) const; + inline double flux_star(double lambda) const { return flux_star(lambda, phase_opt()); } + inline double flux_star(const EnergyPassband& passband) const { return flux_star(passband, phase_opt()); } + inline double Mdisk() const { return lazy_integrate(opt_str_.Mdisk, Sigma()); } + double Mdot_wind() const; double Sigma_minus(double r) const; double Sigma_plus(double r) const; - double R_cooling_front(double r); - double v_cooling_front(double r); + double R_cooling_front(double r) const; + double v_cooling_front(double r) const; }; #endif //FREDDI_FREDDI_STATE_HPP diff --git a/cpp/include/ns/ns_evolution.hpp b/cpp/include/ns/ns_evolution.hpp index 5e1e69d..cd7ec7b 100644 --- a/cpp/include/ns/ns_evolution.hpp +++ b/cpp/include/ns/ns_evolution.hpp @@ -206,7 +206,7 @@ class FreddiNeutronStarEvolution: public FreddiEvolution { double Fx_ns(); // angular_dist_ns_ public: - inline double angular_dist_ns(const double mu) { return ns_irr_source_->angular_dist(mu); } + inline double angular_dist_ns(const double mu) const { return ns_irr_source_->angular_dist(mu); } // fp_ public: inline double fp(double radius) const { return (*fp_)(*this, radius); } @@ -227,7 +227,7 @@ class FreddiNeutronStarEvolution: public FreddiEvolution { public: FreddiNeutronStarEvolution(const FreddiNeutronStarArguments& args); explicit FreddiNeutronStarEvolution(const FreddiNeutronStarEvolution&) = default; - virtual const vecd& Qx() override; + virtual const vecd& Qx() const override; virtual double Lbol_disk() const override; public: using iterator = EvolutionIterator; diff --git a/cpp/src/freddi_state.cpp b/cpp/src/freddi_state.cpp index b6842e4..5b356f1 100644 --- a/cpp/src/freddi_state.cpp +++ b/cpp/src/freddi_state.cpp @@ -168,7 +168,7 @@ double FreddiState::phase_opt() const { } -double FreddiState::Lx() { +double FreddiState::Lx() const { if (!opt_str_.Lx) { opt_str_.Lx = Luminosity(Tph_X(), args().flux->emin, args().flux->emax) / m::pow<4>(args().flux->colourfactor); } @@ -176,12 +176,12 @@ double FreddiState::Lx() { } -double FreddiState::Fx() { +double FreddiState::Fx() const { return Lx() * angular_dist_disk(cosi()) / (FOUR_M_PI * m::pow<2>(distance())); } -const vecd& FreddiState::W() { +const vecd& FreddiState::W() const { if (!opt_str_.W) { auto x = wunc()(h(), F(), first(), last()); x.resize(Nx(), 0.0); @@ -191,7 +191,7 @@ const vecd& FreddiState::W() { } -const vecd& FreddiState::Sigma() { +const vecd& FreddiState::Sigma() const { if (!opt_str_.Sigma) { vecd x(Nx()); const vecd& WW = W(); @@ -204,7 +204,7 @@ const vecd& FreddiState::Sigma() { } -const vecd& FreddiState::Tph() { +const vecd& FreddiState::Tph() const { if (!opt_str_.Tph) { vecd x(Nx()); const vecd& Tvis = Tph_vis(); @@ -218,7 +218,7 @@ const vecd& FreddiState::Tph() { } -const vecd& FreddiState::Tirr() { +const vecd& FreddiState::Tirr() const { if (!opt_str_.Tirr) { vecd x(Nx()); const vecd& QxQx = Qx(); @@ -231,7 +231,7 @@ const vecd& FreddiState::Tirr() { } -const vecd& FreddiState::Qx() { +const vecd& FreddiState::Qx() const { if (!opt_str_.Qx) { vecd x(Nx()); const vecd& K = Kirr(); @@ -246,7 +246,7 @@ const vecd& FreddiState::Qx() { } -const vecd& FreddiState::Kirr() { +const vecd& FreddiState::Kirr() const { if(!opt_str_.Kirr) { vecd x(Nx()); const vecd& H = Height(); @@ -262,7 +262,7 @@ const vecd& FreddiState::Kirr() { } -const vecd& FreddiState::Height() { +const vecd& FreddiState::Height() const { if (!opt_str_.Height) { vecd x(Nx()); for (size_t i = first(); i <= last(); i++) { @@ -277,7 +277,7 @@ const vecd& FreddiState::Height() { } -const vecd& FreddiState::Tph_vis() { +const vecd& FreddiState::Tph_vis() const { if (!opt_str_.Tph_vis) { vecd x(Nx(), 0.0); for (size_t i = first(); i <= last(); i++) { @@ -289,7 +289,7 @@ const vecd& FreddiState::Tph_vis() { return *opt_str_.Tph_vis; } -const vecd& FreddiState::Tph_X() { +const vecd& FreddiState::Tph_X() const { if (!opt_str_.Tph_X) { vecd x(Nx(), 0.0); const double Mdot = std::fabs((F()[first()+1] - F()[first()]) / (h()[first()+1] - h()[first()])); @@ -328,7 +328,7 @@ const vecd& FreddiState::Tph_X() { */ -double FreddiState::lazy_magnitude(boost::optional& m, double lambda, double F0) { +double FreddiState::lazy_magnitude(boost::optional& m, double lambda, double F0) const { if (!m) { m = magnitude(lambda, F0); } @@ -352,16 +352,16 @@ IrradiatedStar::sources_t FreddiState::star_irr_sources() { } -double FreddiState::flux_star(const double lambda, const double phase) { +double FreddiState::flux_star(const double lambda, const double phase) const { return star_.luminosity({inclination(), phase}, lambda) / (FOUR_M_PI * m::pow<2>(distance())); } -double FreddiState::flux_star(const EnergyPassband& passband, const double phase) { +double FreddiState::flux_star(const EnergyPassband& passband, const double phase) const { return star_.luminosity({inclination(), phase}, passband) / (FOUR_M_PI * m::pow<2>(distance())); } -double FreddiState::Mdot_wind() { +double FreddiState::Mdot_wind() const { auto dMdot_dh = [this](const size_t i) -> double { double dFdh; if (i == first()) { @@ -701,7 +701,7 @@ double FreddiState::Sigma_plus(double r) const { * std::pow(args().basic->Mx / GSL_CONST_CGSM_SOLAR_MASS, -0.37); } -double FreddiState::v_cooling_front(double r) { +double FreddiState::v_cooling_front(double r) const { // The cooling-front velocity depends on the ratio between the current Sigma and critical Sigmas // Ludwig et al., A&A 290, 473-486 (1994), section 3 // units: cm/s @@ -714,7 +714,7 @@ double FreddiState::v_cooling_front(double r) { * std::pow(args().basic->Mx / GSL_CONST_CGSM_SOLAR_MASS, -0.012); } -double FreddiState::R_cooling_front(double r) { +double FreddiState::R_cooling_front(double r) const { // previous location of Rhot moves with the cooling-front velocity: return R()[last()] - v_cooling_front(r) * args().calc->tau; //return R()[last()] - v_cooling_front(R()[last()]) * args().calc->tau ; diff --git a/cpp/src/ns/ns_evolution.cpp b/cpp/src/ns/ns_evolution.cpp index 3b220cd..ba44fcb 100644 --- a/cpp/src/ns/ns_evolution.cpp +++ b/cpp/src/ns/ns_evolution.cpp @@ -493,7 +493,7 @@ vecd FreddiNeutronStarEvolution::windC() const { } -const vecd& FreddiNeutronStarEvolution::Qx() { +const vecd& FreddiNeutronStarEvolution::Qx() const { if (!opt_str_.Qx) { vecd x(Nx()); const vecd& K = Kirr();