diff options
| -rw-r--r-- | fg21sim/utils/virial.py | 71 | 
1 files changed, 71 insertions, 0 deletions
diff --git a/fg21sim/utils/virial.py b/fg21sim/utils/virial.py new file mode 100644 index 0000000..2e81ab4 --- /dev/null +++ b/fg21sim/utils/virial.py @@ -0,0 +1,71 @@ +# Copyright (c) 2019 Weitian LI <wt@liwt.net> +# MIT License + +""" +Virial radius/mass utilities. + +.. [duffy2008] +   Duffy et al. 2008, MNRAS, 390, L64 +   http://adsabs.harvard.edu/abs/2008MNRAS.390L..64D + +.. [ettori2009] +   Ettori & Balestra 2009, A&A, 496, 343 +   http://adsabs.harvard.edu/abs/2009A%26A...496..343 + +.. [lokas2001] +   Łokas & Mamon 2001, MNRAS, 321, 155 +   http://adsabs.harvard.edu/abs/2001MNRAS.321..155L +""" + +import logging + +import numpy as np +from ..share import COSMO + + +logger = logging.getLogger(__name__) + + +def concentration(mass, z=0): +    """ +    Calculate the NFW concentration parameter (c = r_vir / r_s) from the +    mass-concentration relation: c = A [M/M_pivot]^B (1+z)^C + +    Reference: [duffy2008],Tab.1 +    """ +    A, B, C = 5.71, -0.084, -0.47  # for M200 +    M_pivot = 2e12 / COSMO.h  # [Msun] +    return A * (mass/M_pivot) ** B + (1+z) ** C + + +def mass_fraction_nfw(s, c): +    """ +    Calculate the mass fraction (of virial mass) within the scaled radius +    ``s = r / r_vir``. + +    Reference: [lokas2001] + +    Parameters +    ---------- +    s : float +        The radius scaled by the virial radius, i.e., s = r / r_vir. +    c : float +        The concentration parameter, i.e., c = r_vir / r_s. +    """ +    nom = np.log(1 + c*s) - c*s / (1 + c*s) +    denom = np.log(1 + c) - c / (1 + c) +    return nom / denom + + +def M200(M500, z=0): +    """ +    Estimate the M200 from the M500. +    """ +    # r500 ~= 0.65 r200; Ref.[ettori2009],Sec.2 +    s = 0.65 +    # Begin with 'M200 = 1.5*M500' +    c = concentration(M500*1.5, z) +    mass = M500 / mass_fraction_nfw(s, c) +    # Again with the updated mass +    c = concentration(mass, z) +    return M500 / mass_fraction_nfw(s, c)  | 
