@@ -398,8 +398,11 @@ void BaseBinaryStar::SetRemainingValues() {
398398 m_PhiE = DEFAULT_INITIAL_DOUBLE_VALUE;
399399 m_PsiE = DEFAULT_INITIAL_DOUBLE_VALUE;
400400
401- m_SynchronizationTimescale = DEFAULT_INITIAL_DOUBLE_VALUE;
401+ m_SynchronizationTimescale1 = DEFAULT_INITIAL_DOUBLE_VALUE;
402+ m_SynchronizationTimescale2 = DEFAULT_INITIAL_DOUBLE_VALUE;
402403 m_CircularizationTimescale = DEFAULT_INITIAL_DOUBLE_VALUE;
404+ m_ImKnm1_tidal = std::tuple<double , double , double , double > (DEFAULT_INITIAL_DOUBLE_VALUE, DEFAULT_INITIAL_DOUBLE_VALUE, DEFAULT_INITIAL_DOUBLE_VALUE, DEFAULT_INITIAL_DOUBLE_VALUE);;
405+ m_ImKnm2_tidal = std::tuple<double , double , double , double > (DEFAULT_INITIAL_DOUBLE_VALUE, DEFAULT_INITIAL_DOUBLE_VALUE, DEFAULT_INITIAL_DOUBLE_VALUE, DEFAULT_INITIAL_DOUBLE_VALUE);;
403406
404407 // RLOF details
405408 m_RLOFDetails.experiencedRLOF = false ;
@@ -625,11 +628,36 @@ COMPAS_VARIABLE BaseBinaryStar::BinaryPropertyValue(const T_ANY_PROPERTY p_Prope
625628 case BINARY_PROPERTY::STELLAR_TYPE_NAME_2_PRE_COMMON_ENVELOPE: value = STELLAR_TYPE_LABEL.at (StellarType2PreCEE ()); break ;
626629 case BINARY_PROPERTY::SUPERNOVA_ORBIT_INCLINATION_ANGLE: value = SN_OrbitInclinationAngle (); break ;
627630 case BINARY_PROPERTY::SUPERNOVA_STATE: value = SN_State (); break ;
628- case BINARY_PROPERTY::SYNCHRONIZATION_TIMESCALE: value = SynchronizationTimescale (); break ;
631+ case BINARY_PROPERTY::SYNCHRONIZATION_TIMESCALE_1: value = SynchronizationTimescale1 (); break ;
632+ case BINARY_PROPERTY::SYNCHRONIZATION_TIMESCALE_2: value = SynchronizationTimescale2 (); break ;
629633 case BINARY_PROPERTY::SYSTEMIC_SPEED: value = SystemicSpeed (); break ;
630634 case BINARY_PROPERTY::SYSTEMIC_VELOCITY_X: value = SystemicVelocityX (); break ;
631635 case BINARY_PROPERTY::SYSTEMIC_VELOCITY_Y: value = SystemicVelocityY (); break ;
632636 case BINARY_PROPERTY::SYSTEMIC_VELOCITY_Z: value = SystemicVelocityZ (); break ;
637+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_1_10: std::tie (value, std::ignore, std::ignore, std::ignore) = ImKnm1_tidal (); break ;
638+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_1_12: std::tie (std::ignore, value, std::ignore, std::ignore) = ImKnm1_tidal (); break ;
639+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_1_22: std::tie (std::ignore, std::ignore, value, std::ignore) = ImKnm1_tidal (); break ;
640+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_1_32: std::tie (std::ignore, std::ignore, std::ignore, value) = ImKnm1_tidal (); break ;
641+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_2_10: std::tie (value, std::ignore, std::ignore, std::ignore) = ImKnm2_tidal (); break ;
642+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_2_12: std::tie (std::ignore, value, std::ignore, std::ignore) = ImKnm2_tidal (); break ;
643+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_2_22: std::tie (std::ignore, std::ignore, value, std::ignore) = ImKnm2_tidal (); break ;
644+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_2_32: std::tie (std::ignore, std::ignore, std::ignore, value) = ImKnm2_tidal (); break ;
645+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_1_10_EQ: std::tie (value, std::ignore, std::ignore, std::ignore) = ImKnm1_tidal_eq (); break ;
646+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_1_12_EQ: std::tie (std::ignore, value, std::ignore, std::ignore) = ImKnm1_tidal_eq (); break ;
647+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_1_22_EQ: std::tie (std::ignore, std::ignore, value, std::ignore) = ImKnm1_tidal_eq (); break ;
648+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_1_32_EQ: std::tie (std::ignore, std::ignore, std::ignore, value) = ImKnm1_tidal_eq (); break ;
649+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_2_10_EQ: std::tie (value, std::ignore, std::ignore, std::ignore) = ImKnm2_tidal_eq (); break ;
650+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_2_12_EQ: std::tie (std::ignore, value, std::ignore, std::ignore) = ImKnm2_tidal_eq (); break ;
651+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_2_22_EQ: std::tie (std::ignore, std::ignore, value, std::ignore) = ImKnm2_tidal_eq (); break ;
652+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_2_32_EQ: std::tie (std::ignore, std::ignore, std::ignore, value) = ImKnm2_tidal_eq (); break ;
653+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_1_10_DYN: std::tie (value, std::ignore, std::ignore, std::ignore) = ImKnm1_tidal_dyn ();break ;
654+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_1_12_DYN: std::tie (std::ignore, value, std::ignore, std::ignore) = ImKnm1_tidal_dyn ();break ;
655+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_1_22_DYN: std::tie (std::ignore, std::ignore, value, std::ignore) = ImKnm1_tidal_dyn ();break ;
656+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_1_32_DYN: std::tie (std::ignore, std::ignore, std::ignore, value) = ImKnm1_tidal_dyn ();break ;
657+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_2_10_DYN: std::tie (value, std::ignore, std::ignore, std::ignore) = ImKnm2_tidal_dyn ();break ;
658+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_2_12_DYN: std::tie (std::ignore, value, std::ignore, std::ignore) = ImKnm2_tidal_dyn ();break ;
659+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_2_22_DYN: std::tie (std::ignore, std::ignore, value, std::ignore) = ImKnm2_tidal_dyn ();break ;
660+ case BINARY_PROPERTY::TIDAL_POTENTIAL_LOVE_NUMBER_2_32_DYN: std::tie (std::ignore, std::ignore, std::ignore, value) = ImKnm2_tidal_dyn ();break ;
633661 case BINARY_PROPERTY::TIME: value = Time (); break ;
634662 case BINARY_PROPERTY::TIME_TO_COALESCENCE: value = TimeToCoalescence (); break ;
635663 case BINARY_PROPERTY::TOTAL_ANGULAR_MOMENTUM: value = TotalAngularMomentum (); break ;
@@ -2705,31 +2733,35 @@ void BaseBinaryStar::ProcessTides(const double p_Dt) {
27052733
27062734 // Evolve binary semi-major axis, eccentricity, and spin of each star based on Kapil et al., 2025
27072735
2708- DBL_DBL_DBL_DBL ImKnm1 = m_Star1->CalculateImKnmTidal (omega, m_SemiMajorAxis, m_Star2->Mass ());
2709- DBL_DBL_DBL_DBL ImKnm2 = m_Star2->CalculateImKnmTidal (omega, m_SemiMajorAxis, m_Star1->Mass ());
2736+ m_ImKnm1_tidal = m_Star1->CalculateImKnmTidal (omega, m_SemiMajorAxis, m_Star2->Mass ());
2737+ m_ImKnm2_tidal = m_Star2->CalculateImKnmTidal (omega, m_SemiMajorAxis, m_Star1->Mass ());
27102738
2711- double DSemiMajorAxis1Dt = CalculateDSemiMajorAxisTidalDt (ImKnm1 , m_Star1); // change in semi-major axis from star1
2712- double DSemiMajorAxis2Dt = CalculateDSemiMajorAxisTidalDt (ImKnm2 , m_Star2); // change in semi-major axis from star2
2739+ m_DSemiMajorAxis1Dt_tidal = CalculateDSemiMajorAxisTidalDt (m_ImKnm1_tidal , m_Star1); // change in semi-major axis from star1
2740+ m_DSemiMajorAxis2Dt_tidal = CalculateDSemiMajorAxisTidalDt (m_ImKnm2_tidal , m_Star2); // change in semi-major axis from star2
27132741
2714- double DEccentricity1Dt = CalculateDEccentricityTidalDt (ImKnm1 , m_Star1); // change in eccentricity from star1
2715- double DEccentricity2Dt = CalculateDEccentricityTidalDt (ImKnm2 , m_Star2); // change in eccentricity from star2
2742+ m_DEccentricity1Dt_tidal = CalculateDEccentricityTidalDt (m_ImKnm1_tidal , m_Star1); // change in eccentricity from star1
2743+ m_DEccentricity2Dt_tidal = CalculateDEccentricityTidalDt (m_ImKnm2_tidal , m_Star2); // change in eccentricity from star2
27162744
2717- double DOmega1Dt = CalculateDOmegaTidalDt (ImKnm1 , m_Star1); // change in spin from star1
2718- double DOmega2Dt = CalculateDOmegaTidalDt (ImKnm2 , m_Star2); // change in spin from star2
2745+ m_DOmega1Dt_tidal = CalculateDOmegaTidalDt (m_ImKnm1_tidal , m_Star1); // change in spin from star1
2746+ m_DOmega2Dt_tidal = CalculateDOmegaTidalDt (m_ImKnm2_tidal , m_Star2); // change in spin from star2
27192747
27202748 // limit change in stellar and orbital properties from tides to a maximum fraction of the current value
27212749 double fraction_tidal_change = 1.0 ;
2722- fraction_tidal_change = std::min (fraction_tidal_change, std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * OrbitalAngularVelocity () / (DOmega1Dt * p_Dt * MYR_TO_YEAR)));
2723- fraction_tidal_change = std::min (fraction_tidal_change, std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * OrbitalAngularVelocity () / (DOmega2Dt * p_Dt * MYR_TO_YEAR)));
2724- fraction_tidal_change = std::min (fraction_tidal_change, std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * m_SemiMajorAxis / ((DSemiMajorAxis1Dt + DSemiMajorAxis2Dt ) * p_Dt * MYR_TO_YEAR)));
2725- fraction_tidal_change = std::min (fraction_tidal_change, std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * m_Eccentricity / ((DEccentricity1Dt + DEccentricity2Dt ) * p_Dt * MYR_TO_YEAR)));
2750+ fraction_tidal_change = std::min (fraction_tidal_change, std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * OrbitalAngularVelocity () / (m_DOmega1Dt_tidal * p_Dt * MYR_TO_YEAR)));
2751+ fraction_tidal_change = std::min (fraction_tidal_change, std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * OrbitalAngularVelocity () / (m_DOmega2Dt_tidal * p_Dt * MYR_TO_YEAR)));
2752+ fraction_tidal_change = std::min (fraction_tidal_change, std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * m_SemiMajorAxis / ((m_DSemiMajorAxis1Dt_tidal + m_DSemiMajorAxis2Dt_tidal ) * p_Dt * MYR_TO_YEAR)));
2753+ fraction_tidal_change = std::min (fraction_tidal_change, std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * m_Eccentricity / ((m_DEccentricity1Dt_tidal + m_DEccentricity2Dt_tidal ) * p_Dt * MYR_TO_YEAR)));
27262754
2727- m_Star1->SetOmega (m_Star1->Omega () + fraction_tidal_change * (DOmega1Dt * p_Dt * MYR_TO_YEAR)); // evolve star 1 spin
2728- m_Star2->SetOmega (m_Star2->Omega () + fraction_tidal_change * (DOmega2Dt * p_Dt * MYR_TO_YEAR)); // evolve star 2 spin
2729- m_SemiMajorAxis = m_SemiMajorAxis + fraction_tidal_change * ((DSemiMajorAxis1Dt + DSemiMajorAxis2Dt ) * p_Dt * MYR_TO_YEAR); // evolve separation
2730- m_Eccentricity = m_Eccentricity + fraction_tidal_change * ((DEccentricity1Dt + DEccentricity2Dt ) * p_Dt * MYR_TO_YEAR); // evolve eccentricity
2755+ m_Star1->SetOmega (m_Star1->Omega () + fraction_tidal_change * (m_DOmega1Dt_tidal * p_Dt * MYR_TO_YEAR)); // evolve star 1 spin
2756+ m_Star2->SetOmega (m_Star2->Omega () + fraction_tidal_change * (m_DOmega2Dt_tidal * p_Dt * MYR_TO_YEAR)); // evolve star 2 spin
2757+ m_SemiMajorAxis = m_SemiMajorAxis + fraction_tidal_change * ((m_DSemiMajorAxis1Dt_tidal + m_DSemiMajorAxis2Dt_tidal ) * p_Dt * MYR_TO_YEAR); // evolve separation
2758+ m_Eccentricity = m_Eccentricity + fraction_tidal_change * ((m_DEccentricity1Dt_tidal + m_DEccentricity2Dt_tidal ) * p_Dt * MYR_TO_YEAR); // evolve eccentricity
27312759
2732- m_TotalAngularMomentum = CalculateAngularMomentum (); // re-calculate angular momenta
2760+ m_CircularizationTimescale = - m_Eccentricity / (m_DEccentricity1Dt_tidal + m_DEccentricity2Dt_tidal) * YEAR_TO_MYR; // Circularization timescale in Myr (for output files)
2761+ m_SynchronizationTimescale1 = - (m_Star1->Omega () - omega) / m_DOmega1Dt_tidal * YEAR_TO_MYR; // Synchronization timescale for Star1 in Myr (for output files)
2762+ m_SynchronizationTimescale2 = - (m_Star2->Omega () - omega) / m_DOmega2Dt_tidal * YEAR_TO_MYR; // Synchronization timescale for Star2 in Myr (for output files)
2763+
2764+ m_TotalAngularMomentum = CalculateAngularMomentum (); // re-calculate angular momenta
27332765 m_OrbitalAngularMomentum = CalculateOrbitalAngularMomentum (m_Star1->Mass (), m_Star2->Mass (), m_SemiMajorAxis, m_Eccentricity);
27342766
27352767 } break ;
@@ -2999,30 +3031,30 @@ double BaseBinaryStar::ChooseTimestep(const double p_Factor) {
29993031 // yes - need to adjust dt
30003032 double omega = OrbitalAngularVelocity ();
30013033
3002- DBL_DBL_DBL_DBL ImKnm1 = m_Star1->CalculateImKnmTidal (omega, m_SemiMajorAxis, m_Star2->Mass ());
3003- DBL_DBL_DBL_DBL ImKnm2 = m_Star2->CalculateImKnmTidal (omega, m_SemiMajorAxis, m_Star1->Mass ());
3034+ m_ImKnm1_tidal = m_Star1->CalculateImKnmTidal (omega, m_SemiMajorAxis, m_Star2->Mass ());
3035+ m_ImKnm2_tidal = m_Star2->CalculateImKnmTidal (omega, m_SemiMajorAxis, m_Star1->Mass ());
30043036
3005- double DSemiMajorAxis1DtTidal = CalculateDSemiMajorAxisTidalDt (ImKnm1 , m_Star1);
3006- double DSemiMajorAxis2DtTidal = CalculateDSemiMajorAxisTidalDt (ImKnm2 , m_Star2);
3037+ double m_DSemiMajorAxis1Dt_tidal = CalculateDSemiMajorAxisTidalDt (m_ImKnm1_tidal , m_Star1);
3038+ double m_DSemiMajorAxis2Dt_tidal = CalculateDSemiMajorAxisTidalDt (m_ImKnm2_tidal , m_Star2);
30073039
3008- double DEccentricity1DtTidal = CalculateDEccentricityTidalDt (ImKnm1 , m_Star1);
3009- double DEccentricity2DtTidal = CalculateDEccentricityTidalDt (ImKnm2 , m_Star2);
3040+ double m_DEccentricity1Dt_tidal = CalculateDEccentricityTidalDt (m_ImKnm1_tidal , m_Star1);
3041+ double m_DEccentricity2Dt_tidal = CalculateDEccentricityTidalDt (m_ImKnm2_tidal , m_Star2);
30103042
3011- double DOmega1Dt_tidal = CalculateDOmegaTidalDt (ImKnm1 , m_Star1);
3012- double DOmega2Dt_tidal = CalculateDOmegaTidalDt (ImKnm2 , m_Star2);
3043+ double m_DOmega1Dt_tidal = CalculateDOmegaTidalDt (m_ImKnm1_tidal , m_Star1);
3044+ double m_DOmega2Dt_tidal = CalculateDOmegaTidalDt (m_ImKnm2_tidal , m_Star2);
30133045
30143046 // Ensure that the change in orbital and spin properties due to tides in a single timestep is constrained (to 1 percent by default)
30153047 // Limit the spin evolution of each star based on the orbital frequency rather than its spin frequency, since tides should not cause major problems until synchronization.
3016- double Dt_SemiMajorAxis1Tidal = utils::Compare (DSemiMajorAxis1DtTidal , 0.0 ) == 0 ? dt : std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * m_SemiMajorAxis / DSemiMajorAxis1DtTidal ) * YEAR_TO_MYR;
3017- double Dt_SemiMajorAxis2Tidal = utils::Compare (DSemiMajorAxis2DtTidal , 0.0 ) == 0 ? dt : std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * m_SemiMajorAxis / DSemiMajorAxis2DtTidal ) * YEAR_TO_MYR;
3048+ double Dt_SemiMajorAxis1Tidal = utils::Compare (m_DSemiMajorAxis1Dt_tidal , 0.0 ) == 0 ? dt : std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * m_SemiMajorAxis / m_DSemiMajorAxis1Dt_tidal ) * YEAR_TO_MYR;
3049+ double Dt_SemiMajorAxis2Tidal = utils::Compare (m_DSemiMajorAxis2Dt_tidal , 0.0 ) == 0 ? dt : std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * m_SemiMajorAxis / m_DSemiMajorAxis2Dt_tidal ) * YEAR_TO_MYR;
30183050 double Dt_SemiMajorAxisTidal = std::min (Dt_SemiMajorAxis1Tidal, Dt_SemiMajorAxis2Tidal);
30193051
3020- double Dt_Eccentricity1Tidal = utils::Compare (DEccentricity1DtTidal , 0.0 ) == 0 ? dt : std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * m_Eccentricity / DEccentricity1DtTidal ) * YEAR_TO_MYR;
3021- double Dt_Eccentricity2Tidal = utils::Compare (DEccentricity2DtTidal , 0.0 ) == 0 ? dt : std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * m_Eccentricity / DEccentricity2DtTidal ) * YEAR_TO_MYR;
3052+ double Dt_Eccentricity1Tidal = utils::Compare (m_DEccentricity1Dt_tidal , 0.0 ) == 0 ? dt : std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * m_Eccentricity / m_DEccentricity1Dt_tidal ) * YEAR_TO_MYR;
3053+ double Dt_Eccentricity2Tidal = utils::Compare (m_DEccentricity2Dt_tidal , 0.0 ) == 0 ? dt : std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * m_Eccentricity / m_DEccentricity2Dt_tidal ) * YEAR_TO_MYR;
30223054 double Dt_EccentricityTidal = std::min (Dt_Eccentricity1Tidal, Dt_Eccentricity2Tidal);
30233055
3024- double Dt_Omega1Tidal = utils::Compare (DOmega1Dt_tidal , 0.0 ) == 0 ? dt : std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * omega / DOmega1Dt_tidal ) * YEAR_TO_MYR;
3025- double Dt_Omega2Tidal = utils::Compare (DOmega2Dt_tidal , 0.0 ) == 0 ? dt : std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * omega / DOmega2Dt_tidal ) * YEAR_TO_MYR;
3056+ double Dt_Omega1Tidal = utils::Compare (m_DOmega1Dt_tidal , 0.0 ) == 0 ? dt : std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * omega / m_DOmega1Dt_tidal ) * YEAR_TO_MYR;
3057+ double Dt_Omega2Tidal = utils::Compare (m_DOmega2Dt_tidal , 0.0 ) == 0 ? dt : std::abs (TIDES_MAXIMUM_ORBITAL_CHANGE_FRAC * omega / m_DOmega2Dt_tidal ) * YEAR_TO_MYR;
30263058 double Dt_OmegaTidal = std::min (Dt_Omega1Tidal, Dt_Omega2Tidal);
30273059
30283060 dt = std::min (dt, std::min (Dt_SemiMajorAxisTidal, std::min (Dt_EccentricityTidal, Dt_OmegaTidal)));
0 commit comments