Skip to content

earlbellinger/black-hole-sun

Repository files navigation

Black Hole Sun

Bellinger, E. P., Caplan, M. E., Ryu, T., Bollimpalli, D., Ball, W. H., Kühnel, F., Farmer, R., de Mink, S. E., Christensen-Dalsgaard, J. (2023). Solar evolution models with a central black hole. ApJ accepted.

In my eyes
Indisposed
In disguises no one knows
Hides the face
Lies the snake
And the sun in my disgrace
Boiling heat
Summer stench
'Neath the black, the sky looks dead
Call my name
Through the cream
And I'll hear you scream again

Black hole sun
Won't you come
And wash away the rain?
Black hole sun
Won't you come
Won't you come
Won't you come?

The supplied notebooks generate all the figures in the paper.

Stuttering
Cold and damp
Steal the warm wind, tired friend
Times are gone
For honest men
Sometimes, far too long for snakes
In my shoes
Walking sleep
In my youth, I pray to keep
Heaven send
Hell away
No one sings like you anymore

Black hole sun
Won't you come

And wash away the rain?
Black hole sun
Won't you come
Won't you come?

The crux of the code is a modification to the MESA run_star_extras.f90 file, the most important contents of which is the following FORTRAN subroutine to model the growth of the black hole:

      subroutine black_hole_accretion(id, s, startup, ierr)
          integer, intent(in) :: id
          logical, intent(in) :: startup
          type (star_info), pointer :: s
          integer, intent(out) :: ierr
          
          real(dp) :: G, c2, c_s, rho, gamma1, opacity, dt
          real(dp) :: nabla_ad, P_rad, P_gas
          real(dp) :: M_BH, M_BH_new, M_cav
          real(dp) :: M_dot_BH, M_dot, dm, R_B
          real(dp) :: L_Bondi, L_Edd, L_BH
          real(dp) :: rad_eff, con_eff, timestep_factor
          real(dp) :: core_avg_rho, core_avg_eps, new_core_mass
          
          rad_eff = s% x_ctrl(1) ! epsilon 
          con_eff = s% x_ctrl(2) ! eta 
          timestep_factor = s% x_ctrl(3)
          
          dt      = s% dt             ! time step              (s)
          G       = s% cgrav(s% nz)   ! gravitational constant (cm^3 / g s^2)
          c_s     = s% csound(s% nz)  ! speed of sound         (cm / s)
          rho     = s% rho(s% nz)     ! density                (g / cm^3)
          opacity = s% opacity(s% nz) ! opacity                (cm^2 / g)
          P_rad   = s% prad(s% nz)    ! radiation pressure     (dyn / cm^2)
          P_gas   = s% pgas(s% nz)    ! gas pressure           (dyn / cm^2)
          gamma1  = s% gamma1(s% nz)  ! adiabatic index
          nabla_ad = 1 - 1 / gamma1
          c2 = pow(clight, 2)
          
          M_BH = s% xtra(1) ! black hole mass (g)
          
          M_dot_BH = 16*pi / (rad_eff / (1 - rad_eff)) * con_eff/gamma1/c_s*rho * pow(G*M_BH, 2)/c2 ! g/s
          
          L_Edd = 4*pi * clight * G * M_BH / opacity  ! erg/s
          L_Bondi = (rad_eff / (1 - rad_eff)) * M_dot_BH * c2 ! erg/s
          L_BH = L_Bondi
          if (s% x_logical_ctrl(2)) L_BH = min(L_Bondi, L_Edd)
          
          M_dot = L_BH / (rad_eff * c2) ! g/s
          
          dm = (1 - rad_eff) * M_dot * dt  ! g 
          M_BH_new = M_BH + dm             ! g
          
          R_B = 2 * G * M_BH_new / pow(c_s, 2)         ! Bondi radius (cm)
          M_cav = 8 * pi / 3 * rho * pow(R_B, 3)       ! mass of cavity (g)
          new_core_mass = (M_BH_new + M_cav) / Msun    ! new core mass (Msun)
          core_avg_eps = L_BH / (new_core_mass * Msun) ! average specific energy generation rate (erg/g s)
          core_avg_rho = 1/(4/3*pi) * (new_core_mass * Msun) / pow(R_B, 3) ! avg core density (g/cm^3)
          
          s% max_timestep = timestep_factor * M_BH / ((1 - rad_eff) * M_dot) ! maximum timestep (s)
          
          s% xtra(1)  = M_BH_new
          s% xtra(2)  = L_BH
          s% xtra(3)  = R_B
          s% xtra(4)  = M_dot
          s% xtra(5)  = safe_log10(dm) - safe_log10(dt)
          s% xtra(6)  = rad_eff
          s% xtra(7)  = opacity
          s% xtra(8)  = L_Bondi
          s% xtra(9)  = L_Edd
          s% xtra(10) = M_cav
          s% xtra(11) = P_rad
          s% xtra(12) = P_gas
          s% xtra(13) = nabla_ad
          
          if (startup) then
              call star_relax_core( &
                  id, new_core_mass, s% job% dlg_core_mass_per_step, &
                  s% job% relax_core_years_for_dt, &
                  core_avg_rho, core_avg_eps, ierr)
          else
              s% M_center = new_core_mass
              s% mstar = s% mstar - rad_eff * M_dot * dt ! remove mass converted into photons
              s% xmstar = s% mstar - s% M_center
              s% L_center = L_BH
              call do1_relax_R_center(s, R_B, ierr)
          end if 
          
          print*, '--- Black Hole Properties ---'
          print*, 'M/M_sun: ',    s% mstar / Msun
          print*, 'M_BH/M_sun: ', M_BH_new / Msun
          print*, 'L_BH/L_sun: ', L_BH / Lsun
          print*, 'radiative efficiency: ', rad_eff
          print*, '-----------------------------'
          
      end subroutine black_hole_accretion

This code implements functionality for several user-supplied parameters to be specified in the &controls namelist:

    x_ctrl(1) = 0.08 ! radiative efficiency (epsilon) 
    x_ctrl(2) = 1    ! convective efficiency (eta) 
    x_ctrl(3) = 1    ! timestep factor based on black hole mass growth, lower means slower growth 

It takes the initial mass of the black hole from the &star_jobs parameter new_core_mass.

Hang my head
Drown my fear
Till you all just disappear
Black hole sun