Skip to content

andysantarelli/MESA-QUEST

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

52 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MESA Quasi-star Evolutionary Simulation Toolkit (MESA-QUEST)

This is a MESA model simulating a quasi-star -- a massive, star-like object containing a black hole in its core that acts as a heavy SMBH seeding mechanism.

We include each version here:

  • An early version, created to replicate the work of Ball 2012. Corresponding publication found here. MESA version r24.03.1.
  • A version containing a new implementation based on Coughlin 2024. Corresponding publication found here. MESA version r24.08.1 or r25.12.1.
  • A version using the previous implementation along with the MESA Colors module. Corresponding publication found here. MESA version r25.12.1.

Additional features, processes, data, and plots will be added upon publication of their respective papers.

If you use MESA-QUEST in a publication, please cite the corresponding publications above, and follow the MESA best practices guidelines.

The primary changes have been made within the MESA run_star_extras.f90 file. The core changes are found in the subroutine below.

      subroutine black_hole_accretion(id, s, startup, restart, ierr)
          integer, intent(in) :: id
          logical, intent(in) :: startup, restart
          type (star_info), pointer :: s
          integer, intent(out) :: ierr
          
          integer :: k
          ! Physical variables
          real(dp) :: G, c2, rho, dt, quasi_star_mass
          real(dp) :: L_Edd, gamma1
          real(dp) :: M_BH, M_rat
          real(dp) :: R_B, R
          real(dp) :: M_dot, M_dot_BH, dm
          real(dp) :: rad_eff, con_eff, timestep_factor, alpha
          real(dp) :: core_avg_rho, core_avg_eps, new_core_mass, L_center_prev, dL
          
          ! Control parameters
          rad_eff = s% x_ctrl(1)         ! Radiative efficiency (epsilon)
          con_eff = s% x_ctrl(2)         ! Convective efficiency (eta)
          timestep_factor = s% x_ctrl(3) ! Timestep scaling factor
          alpha = s% x_ctrl(4)           ! Accretion factor (alpha)
          quasi_star_mass = s% m(1)/Msun ! Quasi-star mass (Msun)

          !write (*,*) 'quasi_star_mass', quasi_star_mass
          ! Stellar properties at center

          dt      = s% dt
          G       = s% cgrav(s% nz)
          c_s     = s% csound(s% nz)
          rho     = s%rho(s% nz)
          opacity = s% opacity(s% nz)
          gamma1  = s%gamma1(s% nz)
          R       = s% r(s% nz) 
          c2 = clight**2

          M_BH = M_BH_new ! s% xtra(1) ! Black hole mass (g)
          M_rat = M_BH / s% mstar
          
          ! Calculate Bondi accretion rate with smoothed sound speed
          M_dot_Bondi = 16d0 * pi * rho * pow2(G * M_BH) / c_s / c2 * &
                        con_eff / rad_eff * (1d0 - rad_eff) / gamma1
          L_Bondi = rad_eff / (1d0 - rad_eff) * M_dot_Bondi * c2
          L_Edd = 4*pi * clight * G * quasi_star_mass * Msun / opacity  ! Eddington rate for entire object, erg/s

          L_BH = alpha * L_Bondi
          if (s% x_logical_ctrl(3)) L_BH = alpha * L_Edd
          
          M_dot = L_BH / (rad_eff * c2)
          dm = (1d0 - rad_eff) * M_dot * dt
          M_BH_new = M_BH + dm
          
          ! Calculate inner boundaries
          R_B = 2d0 * G * M_BH_new / pow2(c_s)
          R_sc = get_R_sc(s) 
          
          ! Calculate cavity mass and core properties
          M_cav = 8d0 * pi / 3d0 * rho * pow3(R_B) ! rho prop to r**-3/2
          if (s% x_logical_ctrl(2)) M_cav = 8d0 * pi / 5d0 * rho * pow3(R_sc) ! rho prop to r**-1/2
          new_core_mass = (M_BH_new + M_cav) / Msun
          
          core_avg_eps = L_BH / (new_core_mass * Msun)
          core_avg_rho = (new_core_mass * Msun) / (4d0 / 3d0 * pi * pow3(R_B))
          if (s% x_logical_ctrl(2)) core_avg_rho = (new_core_mass * Msun) / (4d0 / 3d0 * pi * pow3(R_sc))

          ! Set adaptive timestep
          s% max_timestep = timestep_factor * M_BH / ((1d0 - rad_eff) * M_dot)
          
          ! Store results in xtra array for output
          s% xtra(1)  = M_BH_new
          s% xtra(2)  = L_BH
          s% xtra(3)  = R_B
          s% xtra(4)  = M_dot
          log_dm_dt   = safe_log10(dm) - safe_log10(dt)
          s% xtra(5)  = log_dm_dt
          s% xtra(6)  = rad_eff
          s% xtra(7)  = opacity
          s% xtra(8)  = M_cav
          s% xtra(9)  = M_dot_Bondi
          s% xtra(10) = L_Bondi
          s% xtra(11) = c_s
          s% xtra(12) = R_sc

          ! Apply core modifications
          if (startup .and. .not. restart) then
             call star_write_model(id, "initial_model.mod", ierr)

             s% M_center = new_core_mass !M_BH
             s% L_center = L_BH

            if (s% x_logical_ctrl(2)) then
                call do1_relax_R_center(s, R_sc, ierr)
            else
                call do1_relax_R_center(s, R_B, ierr)  
            end if

          else
           
              s% M_center = new_core_mass * Msun
              s% mstar = s% mstar - rad_eff * M_dot * dt
              s% xmstar = s% mstar - s% M_center
              s% L_center = L_BH

            if (s% x_logical_ctrl(2)) then
                call do1_relax_R_center(s, R_sc, ierr)
            else
                call do1_relax_R_center(s, R_B, ierr)  ! Use smoothed R_B
            end if

          end if
          
          ! Output diagnostics
          write(*, '(a)') '--- Black Hole Properties ---'
          write(*,*) 'M/M_sun: ',    s% mstar / Msun
          write(*,*) 'M_BH/M_sun: ', M_BH_new / Msun
          write(*,*) 'Core_mass/M_sun: ', new_core_mass*Msun / s% mstar
          write(*,*) 'M_BH/M_star: ', M_BH_new / s% mstar
          write(*, '(a, f12.6)') 'log(L_BH/L_sun): ', max(-99,log10(L_BH/Lsun))! / Lsun
          write(*, '(a, f12.6)') 'R_B/R_star: ', R_B / s% r(1)!R
          write(*, '(a, f12.6)') 'R_sc/R_star: ', R_sc / s% r(1)
          write(*, '(a, f12.6)') 'Radiative efficiency: ', rad_eff
          write(*, '(a, es12.4)') 'Sound speed (raw): ', c_s
          write(*, '(a)') '-----------------------------'
          
      end subroutine black_hole_accretion

We include relevant adjustable parameters at the bottom of the inlist_project file. These will be expanded to include additional options and scenarios as we develop these models further.

    x_logical_ctrl(1) = .true.    ! accrete onto black hole
    x_logical_ctrl(2) = .true.    ! use saturated-convection inner boundary
    x_logical_ctrl(3) = .true.    ! use M_star Eddington rate ! .false. means use Ball et al. 2012
    x_logical_ctrl(4) = .false.   ! use super-Eddington winds
    
    x_ctrl(1) = 0.1               ! radiative efficiency, epsilon
    x_ctrl(2) = 0.1               ! convective efficiency, eta (only used for Ball accretion)
    x_ctrl(3) = 1.0               ! BH mass growth timestep factor
    x_ctrl(4) = 1.0               ! accretion factor, alpha
    x_ctrl(5) = 1d5               ! profile interval in Msun units
    x_ctrl(6) = -1                ! black hole mass limit in Msun units (negative value means no limit)

qwest? qwest!

About

This is a MESA model simulating a quasi-star -- a massive, star-like object powered by a black hole in its core that acts as a heavy seeding mechanism for SMBH formation.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages