snorer.HaloSpike

class snorer.HaloSpike(mBH,tBH,alpha)

Superclass: snorer.Constants

Class for constructing dark matter halo with spike due to supermassive black hole (SMBH) in the galactic center.

Parameters:

mBH : float
    SMBH mass, \(M_\odot\)

tBH : float
    SMBH age, years

alpha : str
    Slope of the spike profile, only '3/2' or '7/3' is acceptable

Attributes:

mBH : float
    SMBH mass, user's input

tBH : float
    SMBH age, user's input

alpha : obj
    Slope of the spike profile

rh : float
     SMBH influence radius \(r_h\), kpc

Rs : float
     Schwarzschild radius \(R_{\rm s}\), kpc

__call__ (r,mx,sigv,rhos,rs,n)

After initializing snorer.HaloSpike instance, it is callable like normal function with the following required inputs.

Parameters:

r : float
    Distance to GC, kpc

mx : float
    DM mass, MeV

sigv : float
     DM annihilation cross section \(\langle\sigma v\rangle\) in the unit of cm3 s−1. None means no annihilation

rhos : float
    Charasteristic density \(\rho_s\), MeV s−3

rs : float
    Characteristic radius \(r_s\), kpc

n : float
    Slope of the DM profile outside \(R_{\rm sp}\)

Returns:

out : scalar
    DM number density at \(r\), cm−3

Examples

Initializing instance and check its attributes.

>>> import snorer as sn
>>> nx = sn.HaloSpike(mBH=1e7,tBH=1e10,alpha='3/2') # initializing instance
>>> nx # print instance information
          SMBH mass: 1.000e+07 M_sun
        Spike slope: 3/2
Schwarzschild slope: 9.504e-10
   Influence radius: 3.412e-03 kpc
>>> nx.alpha # check alpha
'3/2'

The influence radius \(r_h\) is auto generated but can be replaced by user defined number. It can be reset to the default value by giving None.

>>> nx.rh # default value of rh
0.003411783398329804
>>> nx.rh = 2.54e-3 # replace rh with user-defined value
>>> nx.rh
2.54e-03
>>> nx.rh = None # reset it to the default value
>>> nx.rh
0.003411783398329804

Make it a callable function that can calculate DM number density at different \(r\).

import numpy as np
import matplotlib.pyplot as plt
import snorer as sn

# Get MW rhos, rs, n, mBH and rh
rhos,rs,n,mBH,rh = constant.MW_profile.values()
# Assuming BH age is 1 Gyr
tBH = 1e10
# DM mass, MeV
mx = 0.1
# Annihilation cross section
sigv_list = [3,0.03,None]
sigv_label = ['3','0.03','0']
# Initializing instances with two different alphas
nx = HaloSpike(mBH=mBH,tBH=tBH,alpha='3/2')  # alpha = 3/2

# radius, kpc
r_vals = np.logspace(-5,2,100)

for i in range(3):
    sigv = sigv_list[i]
    nx_vals = [nx(r,mx,sigv,rhos,rs,n) for r in r_vals]
    plt.plot(r_vals,nx_vals,label=sigv_label[i] + r'$\times10^{-26}\,{\rm cm^3~s^{-1}}$')
plt.xscale('log')
plt.yscale('log')
plt.xlabel(r'$r$ [kpc]')
plt.ylabel(r'$n_\chi(r)$ [cm$^{-3}$]')
plt.title(fr'$m_\chi = {mx:.1f}$ MeV')
plt.legend()
plt.show()
nx

Notes

This class is based on the Supplementary Material of Ref. [1].

References

  1. Y.-H. Lin and M.-R. Wu, Phys. Rev. Lett. 133, 111004 (2024)

  2. P. Gondolo and J. Silk, Phys. Rev. Lett. 83, 1719 (1999)
  3. J. Cline and M. Puel, JCAP 06, 004 (2023)