From 41b61b4f9d3c441450b93e1d6c8f75e4b590656c Mon Sep 17 00:00:00 2001 From: Ilya Mandel Date: Mon, 25 Nov 2024 11:50:25 +1100 Subject: [PATCH 1/4] Recalculate timescales when updating stellar age after mass loss --- src/BaseBinaryStar.cpp | 5 +++++ src/BaseStar.h | 2 +- src/CH.cpp | 3 ++- src/HG.cpp | 2 ++ src/HeGB.h | 6 +++--- src/HeHG.h | 2 +- src/HeMS.cpp | 2 ++ src/MainSequence.cpp | 5 +++++ src/changelog.h | 8 +++++--- 9 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/BaseBinaryStar.cpp b/src/BaseBinaryStar.cpp index 7cd90c864..4a7f25691 100644 --- a/src/BaseBinaryStar.cpp +++ b/src/BaseBinaryStar.cpp @@ -1995,6 +1995,9 @@ void BaseBinaryStar::CalculateMassTransfer(const double p_Dt) { double zetaEquilibrium = m_Donor->CalculateZetaEquilibrium(); m_ZetaLobe = CalculateZetaRocheLobe(jLoss, betaNuclear); // try nuclear timescale mass transfer first + + std::cout<<"Donor is star 1?"<IsRLOF()<<"Donor type"<<(int)m_Donor->StellarType()<<" mass"<< m_Donor->Mass()<<" zetaEq"<IsOneOf(ALL_MAIN_SEQUENCE) && utils::Compare(zetaEquilibrium, m_ZetaLobe) > 0) { m_MassLossRateInRLOF = donorMassLossRateNuclear; m_FractionAccreted = betaNuclear; @@ -2090,6 +2093,7 @@ void BaseBinaryStar::CalculateMassTransfer(const double p_Dt) { m_MassTransferTrackerHistory == MT_TRACKING::STABLE_1_TO_2_SURV; } } + std::cout<<"MassTransferTimescale"<<(int)m_MassTransferTimescale<<" MassDiffDonor"<Mass()<< "Time:"<SetRLOFOntoNS(); // donor donated mass to a neutron star m_Accretor->SetRecycledNS(); // accretor is (was) a recycled NS } + } diff --git a/src/BaseStar.h b/src/BaseStar.h index 8eec672c2..1a29906d9 100644 --- a/src/BaseStar.h +++ b/src/BaseStar.h @@ -325,7 +325,7 @@ class BaseStar { virtual double ResolveCommonEnvelopeAccretion(const double p_FinalMass, const double p_CompanionMass = 0.0, const double p_CompanionRadius = 0.0, - const double p_CompanionEnvelope = 0.0) { return p_FinalMass - Mass(); } // LvS: todo: more consistent super eddington accretion during CE should also affect e.g. MS stars + const double p_CompanionEnvelope = 0.0) { return p_FinalMass - Mass(); } // Overwritten in NS.h; for now, no accretion on stars other than compact objects during CE virtual STELLAR_TYPE ResolveEnvelopeLoss(bool p_Force = false) { return m_StellarType; } diff --git a/src/CH.cpp b/src/CH.cpp index 554eb2d11..0eacf0679 100755 --- a/src/CH.cpp +++ b/src/CH.cpp @@ -277,10 +277,11 @@ void CH::UpdateAgeAfterMassLoss() { // Calculate the ratio of the lifetime of a CH star to a normal MS star double lifetimeRatio = CalculateLifetimeRatio(m_Mass); - tBGBprime *= lifetimeRatio; tMSprime *= lifetimeRatio; m_Age *= tMSprime / tMS; + + CalculateTimescales(m_Mass, m_Timescales); } diff --git a/src/HG.cpp b/src/HG.cpp index 107bbdc42..861de1f7f 100755 --- a/src/HG.cpp +++ b/src/HG.cpp @@ -1017,6 +1017,8 @@ void HG::UpdateAgeAfterMassLoss() { double tMSprime = MainSequence::CalculateLifetimeOnPhase(m_Mass0, tBGBprime); m_Age = tMSprime + (((tBGBprime - tMSprime) / (tBGB - tMS)) * (m_Age - tMS)); + + CalculateTimescales(m_Mass0, m_Timescales); } diff --git a/src/HeGB.h b/src/HeGB.h index 8a43633b4..b9acdca74 100755 --- a/src/HeGB.h +++ b/src/HeGB.h @@ -52,14 +52,14 @@ class HeGB: virtual public BaseStar, public HeHG { void Initialise(const STELLAR_TYPE p_PreviousStellarType) { CalculateTimescales(); // Initialise timescales if (p_PreviousStellarType != STELLAR_TYPE::NAKED_HELIUM_STAR_HERTZSPRUNG_GAP) // If not evolving from HeHG... - m_Age = CalculateAgeOnPhase_Static(m_Mass, m_COCoreMass, m_Timescales[static_cast(TIMESCALE::tHeMS)], m_GBParams); // ... Set age appropriately + m_Age = CalculateAgeOnPhase_Static(m_Mass, m_COCoreMass, m_Timescales[static_cast(TIMESCALE::tHeMS)], m_GBParams); // ... Set age appropriately EvolveOnPhase(0.0); } // member functions - alphabetically double CalculateCriticalMassRatioClaeys14(const bool p_AccretorIsDegenerate) const ; - double CalculateCriticalMassRatioHurleyHjellmingWebbink() const { return 1.28; } // From BSE. Using the inverse owing to how qCrit is defined in COMPAS. See Hurley et al. 2002 sect. 2.6.1 for additional details. + double CalculateCriticalMassRatioHurleyHjellmingWebbink() const { return 1.28; } // From BSE. Using the inverse owing to how qCrit is defined in COMPAS. See Hurley et al. 2002 sect. 2.6.1 for additional details. double CalculateLuminosityOnPhase(const double p_CoreMass, const double p_GBPB, const double p_GBPD) const { return CalculateLuminosityOnPhase_Static(p_CoreMass, p_GBPB, p_GBPD); } double CalculateLuminosityOnPhase() const { return CalculateLuminosityOnPhase(m_CoreMass, m_GBParams[static_cast(GBP::B)], m_GBParams[static_cast(GBP::D)]); } @@ -70,7 +70,7 @@ class HeGB: virtual public BaseStar, public HeHG { std::tuple CalculateRadiusAndStellarTypeOnPhase(const double p_Mass, const double p_Luminosity) const; std::tuple CalculateRadiusAndStellarTypeOnPhase() const { return CalculateRadiusAndStellarTypeOnPhase(m_Mass, m_Luminosity); } - ENVELOPE DetermineEnvelopeType() const { return ENVELOPE::CONVECTIVE; } // Always CONVECTIVE + ENVELOPE DetermineEnvelopeType() const { return ENVELOPE::CONVECTIVE; } // Always CONVECTIVE }; #endif // __HeGB_h__ diff --git a/src/HeHG.h b/src/HeHG.h index 13006c54e..038dea565 100755 --- a/src/HeHG.h +++ b/src/HeHG.h @@ -128,7 +128,7 @@ class HeHG: virtual public BaseStar, public HeMS { bool ShouldEvolveOnPhase() const; bool ShouldSkipPhase() const { return false; } // Never skip HeMS phase - void UpdateAgeAfterMassLoss() { GiantBranch::UpdateAgeAfterMassLoss(); } // Skip HeMS + void UpdateAgeAfterMassLoss() { GiantBranch::UpdateAgeAfterMassLoss(); } // No action for He giants void UpdateInitialMass() { GiantBranch::UpdateInitialMass(); } // Skip HeMS }; diff --git a/src/HeMS.cpp b/src/HeMS.cpp index 28385252b..f56f80c3a 100755 --- a/src/HeMS.cpp +++ b/src/HeMS.cpp @@ -530,6 +530,8 @@ void HeMS::UpdateAgeAfterMassLoss() { double tHeMSprime = CalculateLifetimeOnPhase_Static(m_Mass); m_Age *= tHeMSprime / tHeMS; + + CalculateTimescales(m_Mass, m_Timescales); } diff --git a/src/MainSequence.cpp b/src/MainSequence.cpp index 85effc070..399faac58 100644 --- a/src/MainSequence.cpp +++ b/src/MainSequence.cpp @@ -745,8 +745,13 @@ void MainSequence::UpdateAgeAfterMassLoss() { double tMS = m_Timescales[static_cast(TIMESCALE::tMS)]; double tBGBprime = CalculateLifetimeToBGB(m_Mass); double tMSprime = MainSequence::CalculateLifetimeOnPhase(m_Mass, tBGBprime); + std::cout<<"Time"<(TIMESCALE::tMS)]<(TIMESCALE::tMS)]< Date: Mon, 25 Nov 2024 11:52:13 +1100 Subject: [PATCH 2/4] Recalculate timescales when updating stellar age after mass loss --- src/changelog.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/changelog.h b/src/changelog.h index 6e5d867ea..5e2d4490f 100644 --- a/src/changelog.h +++ b/src/changelog.h @@ -1394,7 +1394,7 @@ // 03.08.03 VK - Nov 20, 2024 - Defect repair: // - Fixed behavior for core spin to be retained after envelope loss // 03.08.04 IM - Nov 25, 2024 - Defect repair: -// - Recalculate timescales when updating stellar age after mass loss +// - Recalculate timescales when updating stellar age after mass loss (addresses issue #1231) const std::string VERSION_STRING = "03.08.04"; # endif // __changelog_h__ From 0ee94aeb7b0a40870e402d019a430f6a8fe0d231 Mon Sep 17 00:00:00 2001 From: Ilya Mandel Date: Mon, 25 Nov 2024 11:54:08 +1100 Subject: [PATCH 3/4] Cleaning code --- src/BaseBinaryStar.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/BaseBinaryStar.cpp b/src/BaseBinaryStar.cpp index 4a7f25691..5ed28e662 100644 --- a/src/BaseBinaryStar.cpp +++ b/src/BaseBinaryStar.cpp @@ -1996,8 +1996,6 @@ void BaseBinaryStar::CalculateMassTransfer(const double p_Dt) { m_ZetaLobe = CalculateZetaRocheLobe(jLoss, betaNuclear); // try nuclear timescale mass transfer first - std::cout<<"Donor is star 1?"<IsRLOF()<<"Donor type"<<(int)m_Donor->StellarType()<<" mass"<< m_Donor->Mass()<<" zetaEq"<IsOneOf(ALL_MAIN_SEQUENCE) && utils::Compare(zetaEquilibrium, m_ZetaLobe) > 0) { m_MassLossRateInRLOF = donorMassLossRateNuclear; m_FractionAccreted = betaNuclear; @@ -2093,7 +2091,6 @@ void BaseBinaryStar::CalculateMassTransfer(const double p_Dt) { m_MassTransferTrackerHistory == MT_TRACKING::STABLE_1_TO_2_SURV; } } - std::cout<<"MassTransferTimescale"<<(int)m_MassTransferTimescale<<" MassDiffDonor"<Mass()<< "Time:"< Date: Mon, 25 Nov 2024 11:57:02 +1100 Subject: [PATCH 4/4] Removing spurious prints --- src/MainSequence.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/MainSequence.cpp b/src/MainSequence.cpp index 399faac58..fe69f6f3f 100644 --- a/src/MainSequence.cpp +++ b/src/MainSequence.cpp @@ -745,13 +745,9 @@ void MainSequence::UpdateAgeAfterMassLoss() { double tMS = m_Timescales[static_cast(TIMESCALE::tMS)]; double tBGBprime = CalculateLifetimeToBGB(m_Mass); double tMSprime = MainSequence::CalculateLifetimeOnPhase(m_Mass, tBGBprime); - std::cout<<"Time"<(TIMESCALE::tMS)]<(TIMESCALE::tMS)]<