#!/usr/bin/env python3 # # Weitian LI # Created: 2016-06-24 # Updated: 2016-06-26 # # Change logs: # 2016-06-26: # * Add document on gravitational potential calculation # 2016-06-25: # * Rename method 'interpolate()' to 'fit_spline()' # * Use 'InterpolatedUnivariateSpline' instead of 'interp1d' # * Implement 'calc_mass_total()' # * Update documentation # 2016-06-24: # * Update method 'gen_radius()' # """ Calculate the (gas and gravitational) mass profile and gravitational potential profile from the electron number density profile, under the assumption of hydrostatic equilibrium. The electron density profile and temperature profile are required. Assuming that the gas is in hydrostatic equilibrium with the gravitational potential and a spherically-symmetric distribution of the gas, we can write the hydrostatic equilibrium equation (HEE) of the ICM as (ref.[1], eq.(6)): derivative(P_gas, r) / rho_gas = - derivative(phi, r) = - G M_tot( R, i.e., outside the shell) The total gravitational potential may be considered to be the sum of the potentials of spherical shells of mass dM(r) = 4 * pi * rho(r) * r^2 dr, so we may calculate the gravitational potential at 'R' generated by an arbitrary spherically symmetric density distribution 'rho(r)' by adding the contributions to the potential produced by shells (1) with r < R, and (2) with r > R. In this way, we obtain phi(R) = - (G/R) * \int_0^R dM(r) - G * \int_R^{\inf} dM(r)/r = - 4*pi*G * ((1/R) * \int_0^R r^2 * rho(r) dr + \int_R^{\inf} r * rho(r) dr) ------------------------------------------------------------ References: [1] Ettori et al., 2013, Space Science Review, 177, 119-154 [2] Walker et al., 2012, MNRAS, 422, 3503 [3] Tremaine & Binney, Galactic Dynamics, 2nd edition, 2008 Sample configuration file: ------------------------------------------------------------ ## Configuration for `calc_mass_potential.py` ## Date: 2016-06-24 # redshift used for pixel to distance conversion redshift = # electron density profile ne_profile = ne_profile.txt # cooling function profile cf_profile = coolfunc_profile.txt # unit of the CF profile radius (default: pixel) cf_unit = "pixel" # temperature profile t_profile = t_profile.txt # unit of the T profile radius (default: pixel) t_unit = "pixel" # number of data points for the output profile calculation num_dp = 1000 # output gas mass profile m_gas_profile = mass_gas_profile.txt # output total (gravitational) mass profile m_total_profile = mass_total_profile.txt # output gravitational potential profile potential_profile = potential_profile.txt ------------------------------------------------------------ """ import argparse import numpy as np import astropy.units as au import astropy.constants as ac import scipy.interpolate as interpolate import scipy.integrate as integrate from scipy.misc import derivative from configobj import ConfigObj from astro_params import AstroParams, ChandraPixel from projection import Projection class DensityProfile: """ Utilize the 3D (electron number or gas mass) density profile to calculate the following quantities: * 2D projected surface brightness (requires cooling function profile) * gas mass profile (integrated, M_gas(