From 9233c17f1d7d201a2731eb1c70d1528f19175bde Mon Sep 17 00:00:00 2001 From: Robert Izzard <r.izzard@surrey.ac.uk> Date: Mon, 12 Feb 2018 09:08:25 +0000 Subject: [PATCH] another attempt to fix the bug with discs only taking up partial timesteps. I've replaced disc->ftdisc (and removed it) with a local variable, and the disc->Mdot,Jdot etc. derivatives are now calculated only for the disc time. disc->dT is the disc time. The conversion factor ftdisc is now set in the binary_c derivative calculation function, which is really where it should be set. --- failsys | 2 ++ src/binary_c_structures.h | 2 +- ...ar_momentum_and_eccentricity_derivatives.c | 21 +++++++++-------- ...ar_mass_and_angular_momentum_derivatives.c | 11 +++++++-- src/disc/disc_apply_derivatives.c | 23 ++++++++++++------- 5 files changed, 39 insertions(+), 20 deletions(-) mode change 100644 => 100755 failsys diff --git a/failsys b/failsys old mode 100644 new mode 100755 index 855c5afae..b356670b3 --- a/failsys +++ b/failsys @@ -1 +1,3 @@ +#!/bin/bash + ./binary_c --M_1 1.16771787551687 --M_2 1.12767845518499 --eccentricity 0 --orbital_period 1.15478198468946 --metallicity 0.02 --max_evolution_time 15000 --probability 8.15193521532146e-07 --AGB_3dup_algorithm 2 --AGB_core_algorithm 2 --AGB_luminosity_algorithm 2 --AGB_radius_algorithm 2 --BH_prescription 0 --Bondi_Hoyle_accretion_factor 1.5 --CRAP_parameter 0 --E2_prescription 0 --NeNaMgAl 1 --RLOF_interpolation_method 0 --RLOF_mdot_factor 1 --RLOF_method 0 --RLOF_timestep_modulator 1 --WRLOF_method 1 --accretion_end_time -1 --accretion_limit_dynamical_multiplier 1 --accretion_limit_eddington_multiplier 1 --accretion_limit_thermal_multiplier 1 --accretion_rate_novae_upper_limit 1.03e-07 --accretion_rate_soft_xray_upper_limit 2.71e-07 --accretion_start_time -1 --agbwindfac 1 --alphaCB 0 --alpha_ce 1 --angular_momentum_accretion_rate1 0 --angular_momentum_accretion_rate2 0 --angular_momentum_accretion_rate_orbit 0 --api_log_filename_prefix /dev/null --beta_reverse_nova 0 --c13_eff 1 --cbdisc_alpha 0.001 --cbdisc_eccentricity_pumping_method 1 --cbdisc_gamma 1.6666666666 --cbdisc_kappa 0.01 --cbdisc_mass_loss_FUV_multiplier 0 --cbdisc_mass_loss_ISM_pressure 3000 --cbdisc_mass_loss_ISM_ram_pressure_multiplier 1 --cbdisc_mass_loss_Xray_multiplier 1 --cbdisc_mass_loss_constant_rate 0 --cbdisc_mass_loss_inner_L2_cross_multiplier 0 --cbdisc_mass_loss_inner_viscous_accretion_method 1 --cbdisc_mass_loss_inner_viscous_multiplier 1 --cbdisc_minimum_fRing 0.2 --cbdisc_minimum_luminosity 0.0001 --cbdisc_minimum_mass 1e-06 --cbdisc_resonance_damping 1 --cbdisc_resonance_multiplier 1 --cbdisc_torquef 0.0001 --cbdisc_viscous_photoevaporation_coupling 1 --chandrasekhar_mass 1.44 --comenv_disc_angmom_fraction -3 --comenv_disc_mass_fraction 0.1 --comenv_ejection_spin_method 0 --comenv_merger_spin_method 0 --comenv_ms_accretion_mass 0 --comenv_ns_accretion_fraction 0 --comenv_ns_accretion_mass 0 --comenv_post_eccentricity 1e-05 --comenv_prescription 0 --comenv_splitmass 1.01 --delta_mcmin 0 --donor_limit_dynamical_multiplier 1 --donor_limit_thermal_multiplier 1 --dtfac 1 --escape_fraction 0 --escape_velocity 1000000000 --evolution_splitting 0 --evolution_splitting_maxdepth 2 --evolution_splitting_sn_n 10 --gb_reimers_eta 0.4 --gbwind 0 --gbwindfac 1 --gce_metallicity 0.02 --gravitational_radiation_model 0 --hachisu_disk_wind 0 --hachisu_qcrit 1.15 --hbbtfac 1 --idum 0 --individual_novae 0 --init_abunds_only 0 --initial_abundance_mix 0 --internal_buffering 2 --internal_buffering_compression 0 --jorb_RLOF_transfer_model 0 --lambda_ce -1 --lambda_enthalpy 0 --lambda_ionisation 0.1 --lambda_min 0 --lambda_multiplier 1 --lithium_GB_post_1DUP 0 --lithium_GB_post_Heflash 0 --lithium_hbb_multiplier 1 --log_filename /tmp/c_log.dat --lw 1 --magnetic_braking_factor 1 --mass_accretion_for_eld 1000000 --mass_accretion_rate1 0 --mass_accretion_rate2 0 --mass_for_Hestar_Ia_lower 0 --mass_for_Hestar_Ia_upper 0 --max_HeWD_mass 0.7 --max_neutron_star_mass 1.8 --max_tpagb_core_mass 1.38 --maximum_nuclear_burning_timestep 1e+20 --maximum_timestep 1e+20 --mc13_pocket_multiplier 1 --merger_angular_momentum_factor 1 --minimum_donor_menv_for_comenv 0.1 --minimum_envelope_mass_for_third_dredgeup 0.5 --minimum_mass_for_carbon_ignition 1.6 --minimum_mass_for_neon_ignition 2.85 --minimum_orbital_period_for_instant_RLOF 0 --minimum_separation_for_instant_RLOF 0 --minimum_timestep 1e-08 --monte_carlo_kicks --nelemans_gamma 1.75 --nelemans_max_frac_j_change 1 --nelemans_minq 0.2 --nelemans_n_comenvs 0 --nelemans_recalc_eccentricity 0 --no_thermohaline_mixing 0 --nonconservative_angmom_gamma -1 --nova_faml_multiplier 0 --nova_irradiation_multiplier 0 --nova_retention_fraction 0.001 --nova_retention_method 0 --nucsyn_metallicity 0.02 --phasevol 0.000307126809344586 --post_SN_orbit_method 0 --pre_main_sequence 0 --pre_main_sequence_fit_lobes 0 --qcrit_BH 3 --qcrit_CHeB 3 --qcrit_COWD 3 --qcrit_EAGB -1 --qcrit_GB -1 --qcrit_HG 4 --qcrit_HeGB 0.78125 --qcrit_HeHG 4 --qcrit_HeMS 3 --qcrit_HeWD 3 --qcrit_LMMS 0.6944 --qcrit_MS 1.6 --qcrit_NS 3 --qcrit_ONeWD 3 --qcrit_TPAGB -1 --qcrit_degenerate_BH 0.625 --qcrit_degenerate_CHeB 3 --qcrit_degenerate_COWD 0.625 --qcrit_degenerate_EAGB 1.15 --qcrit_degenerate_GB 1.15 --qcrit_degenerate_HG 4.7619 --qcrit_degenerate_HeGB 1.15 --qcrit_degenerate_HeHG 4.7619 --qcrit_degenerate_HeMS 3 --qcrit_degenerate_HeWD 0.625 --qcrit_degenerate_LMMS 1 --qcrit_degenerate_MS 1 --qcrit_degenerate_NS 0.625 --qcrit_degenerate_ONeWD 0.625 --qcrit_degenerate_TPAGB 1.15 --random_systems 0 --repeat 1 --rlperi 0 --rotationally_enhanced_exponent 1 --rotationally_enhanced_mass_loss 0 --sn_kick_companion_AIC 0 --sn_kick_companion_AIC_BH 0 --sn_kick_companion_BH_BH 0 --sn_kick_companion_BH_NS 0 --sn_kick_companion_ECAP 0 --sn_kick_companion_GRB_COLLAPSAR 0 --sn_kick_companion_HeStarIa 0 --sn_kick_companion_IA_CHAND 0 --sn_kick_companion_IA_CHAND_Coel 0 --sn_kick_companion_IA_ELD 0 --sn_kick_companion_IA_He 0 --sn_kick_companion_IA_He_Coel 0 --sn_kick_companion_IBC 0 --sn_kick_companion_II 0 --sn_kick_companion_IIa 0 --sn_kick_companion_NS_NS 0 --sn_kick_companion_TZ 0 --sn_kick_companion_WDKICK 0 --sn_kick_dispersion_AIC_BH 0 --sn_kick_dispersion_BH_BH 0 --sn_kick_dispersion_BH_NS 0 --sn_kick_dispersion_ECAP 0 --sn_kick_dispersion_GRB_COLLAPSAR 190 --sn_kick_dispersion_IBC 190 --sn_kick_dispersion_II 190 --sn_kick_dispersion_NS_NS 0 --sn_kick_dispersion_TZ 0 --sn_kick_distribution_AIC_BH 0 --sn_kick_distribution_BH_BH 0 --sn_kick_distribution_BH_NS 0 --sn_kick_distribution_ECAP 0 --sn_kick_distribution_GRB_COLLAPSAR 1 --sn_kick_distribution_IBC 1 --sn_kick_distribution_II 1 --sn_kick_distribution_NS_NS 0 --sn_kick_distribution_TZ 0 --superwind_mira_switchon 500 --third_dup 1 --tidal_strength_factor 1 --timestep_modulator 1 --tpagb_reimers_eta 1 --tpagbwind 0 --vrot1 0 --vrot2 0 --vw93_mira_shift 0 --vw93_multiplier 1 --vwind_multiplier 0.125 --wd_kick_direction 0 --wd_kick_pulse_number 0 --wd_kick_when 0 --wd_sigma 0 --wind_angular_momentum_loss 0 --wind_disc_angmom_fraction 0 --wind_disc_mass_fraction 0 --wind_djorb_fac 1 --wind_mass_loss 1 --wr_wind 0 --wr_wind_fac 1 --wrwindfac 1 --yields_dt 100000 --internal_buffering 0 --internal_buffering_compression 0 --log_filename /tmp/c_log2.dat diff --git a/src/binary_c_structures.h b/src/binary_c_structures.h index b18c8c42d..a5a0a6f99 100644 --- a/src/binary_c_structures.h +++ b/src/binary_c_structures.h @@ -789,7 +789,7 @@ struct disc_t { double dM_binary,Mdot_binary; double dM_ejected,Mdot_ejected; double dJ_binary,Jdot_binary; - double dT,ftdisc; + double dT; double de_binary,edot_binary; double Tvisc,Tradin,Tradout; double Hin; // inner edge scale height diff --git a/src/binary_star_functions/angular_momentum_and_eccentricity_derivatives.c b/src/binary_star_functions/angular_momentum_and_eccentricity_derivatives.c index fe80c347c..80d207abf 100644 --- a/src/binary_star_functions/angular_momentum_and_eccentricity_derivatives.c +++ b/src/binary_star_functions/angular_momentum_and_eccentricity_derivatives.c @@ -85,12 +85,12 @@ void angular_momentum_and_eccentricity_derivatives( */ struct disc_t * disc = & stardata->common.discs[i]; - double dt = stardata->model.dtm * 1e6; + double dt = stardata->model.dtm * 1e6 * YEAR_LENGTH_IN_SECONDS; + double ftdisc = disc->dT / dt; if(disc->dT > TINY && dt > TINY) { - double jdot = disc->Jdot_binary * disc->ftdisc * + double jdot = disc->Jdot_binary * ftdisc * YEAR_LENGTH_IN_SECONDS / ANGULAR_MOMENTUM_CGS; - stardata->model.derivative[DERIVATIVE_ORBIT_ANGMOM_CBDISC] += jdot; /* @@ -101,14 +101,17 @@ void angular_momentum_and_eccentricity_derivatives( * the disc that falls onto star 0 (the "primary") */ double f = disc_inner_edge_accretion_f(stardata); - double mdot = disc->Mdot_binary * disc->ftdisc * + double mdot = disc->Mdot_binary * ftdisc * YEAR_LENGTH_IN_SECONDS / M_SUN; - - if(0)printf("DMBIN deriv mdot %g Msun/y (ftdisc = %g/%g = %g)\n", + + if(0)printf("DMBIN deriv mdot %g Msun/y (ftdisc = %g/%g = %g, disc->M=%g) : DM=%g\n", mdot, disc->dT/YEAR_LENGTH_IN_SECONDS, - stardata->model.dtm*1e6, - disc->ftdisc); + dt, + ftdisc, + disc->M/M_SUN, + mdot * stardata->model.dtm * 1e6 + ); stardata->star[0].derivative[DERIVATIVE_STELLAR_MASS_CBDISC_GAIN] = f * mdot; @@ -121,7 +124,7 @@ void angular_momentum_and_eccentricity_derivatives( * Resonant interaction with the circumbinary * disc drives binary eccentricity */ - double edot = disc->edot_binary * YEAR_LENGTH_IN_SECONDS * disc->ftdisc; + double edot = disc->edot_binary * ftdisc * YEAR_LENGTH_IN_SECONDS; stardata->model.derivative[DERIVATIVE_ORBIT_ECCENTRICITY_CBDISC] = edot; diff --git a/src/binary_star_functions/apply_stellar_mass_and_angular_momentum_derivatives.c b/src/binary_star_functions/apply_stellar_mass_and_angular_momentum_derivatives.c index 857761745..71727cd63 100644 --- a/src/binary_star_functions/apply_stellar_mass_and_angular_momentum_derivatives.c +++ b/src/binary_star_functions/apply_stellar_mass_and_angular_momentum_derivatives.c @@ -17,7 +17,7 @@ void apply_stellar_mass_and_angular_momentum_derivatives(struct stardata_t * sta * Timestep */ double dt = RLOF==TRUE ? (stardata->model.dtm*1e6) : stardata->model.dt; - + #if DEBUG==1 if(0&&Debug_expression) show_derivatives(stardata); @@ -52,8 +52,15 @@ void apply_stellar_mass_and_angular_momentum_derivatives(struct stardata_t * sta double dM_in_timestep = star->derivative[DERIVATIVE_STELLAR_MASS]*dt; star->mass += dM_in_timestep; - if(star->mass > 90) + if(0&&star->mass > 90) { + show_derivatives(stardata); + printf("star %d: M=%g dM=%g Mdot=%g\n", + star->starnum, + star->mass, + dM_in_timestep, + star->derivative[DERIVATIVE_STELLAR_MASS] + ); Exit_binary_c(2,"oops M>90"); } diff --git a/src/disc/disc_apply_derivatives.c b/src/disc/disc_apply_derivatives.c index eda0e8e77..1dd59a306 100644 --- a/src/disc/disc_apply_derivatives.c +++ b/src/disc/disc_apply_derivatives.c @@ -64,14 +64,15 @@ void disc_apply_derivatives(struct disc_t * disc, disc->loss[DISC_LOSS_INNER_L2_CROSSING].mdot )); - if(1) - printf("DMBIN substep ddt=%g : integrated dM=%g Msun in dT=%g y, rate = %g Msun/y (ddt = %g y, disc->dT = %g y ) disc->M = %g Msun\n", + if(0) + printf("DMBIN substep ddt=%g : integrated dM=%g Msun in dT=%g y, rate = %g Msun/y (ddt = %g y, disc->dT = %g y, stardata dt = %g y) disc->M = %g Msun\n", ddt/YEAR_LENGTH_IN_SECONDS, disc->dM_binary/M_SUN, disc->dT/YEAR_LENGTH_IN_SECONDS, (disc->dM_binary * YEAR_LENGTH_IN_SECONDS) / (disc->dT * M_SUN), ddt/YEAR_LENGTH_IN_SECONDS, disc->dT/YEAR_LENGTH_IN_SECONDS, + stardata->model.dtm * 1e6, disc->M/M_SUN ); @@ -171,16 +172,22 @@ void disc_apply_derivatives(struct disc_t * disc, */ if(disc->dT > TINY) { - disc->ftdisc = disc->dT / (YEAR_LENGTH_IN_SECONDS * 1e6 * stardata->model.dtm); + + /* + * The derivatives are only valid while the disc is alive. + * This is taken into account during the derivative + * application process (with its factor ftdisc). + */ disc->Mdot_ejected = disc->dM_ejected / disc->dT; disc->Mdot_binary = disc->dM_binary / disc->dT; disc->Jdot_binary = disc->dJ_binary / disc->dT; disc->edot_binary = disc->de_binary / disc->dT; - printf("disc dots Mej=%g Mbin=%g : ftdisc = %g\n", - disc->Mdot_ejected * YEAR_LENGTH_IN_SECONDS / M_SUN, - disc->Mdot_binary * YEAR_LENGTH_IN_SECONDS / M_SUN, - disc->ftdisc - ); + if(0) + printf("disc dMej/dt=%g dMbin/dt=%g Msun/y for dT=%g y\n", + disc->Mdot_ejected * YEAR_LENGTH_IN_SECONDS / M_SUN, + disc->Mdot_binary * YEAR_LENGTH_IN_SECONDS / M_SUN, + disc->dT / YEAR_LENGTH_IN_SECONDS + ); } } -- GitLab