Chandrasekhar dynamical friction¶

class
galpy.potential.
ChandrasekharDynamicalFrictionForce
(amp=1.0, GMs=0.1, gamma=1.0, rhm=0.0, dens=None, sigmar=None, const_lnLambda=False, minr=0.0001, maxr=25.0, nr=501, ro=None, vo=None)¶ Class that implements the Chandrasekhar dynamical friction force
\[\mathbf{F}(\mathbf{x},\mathbf{v}) = 2\pi\,[G\,M]\,[G\,\rho(\mathbf{x})]\,\ln[1+\Lambda^2] \,\left[\mathrm{erf}(X)\frac{2X}{\sqrt{\pi}}\exp\left(X^2\right)\right]\,\frac{\mathbf{v}}{\mathbf{v}^3}\,\]on a mass (e.g., a satellite galaxy or a black hole) \(M\) at position \(\mathbf{x}\) moving at velocity \(\mathbf{v}\) through a background density \(\rho\). The quantity \(X\) is the usual \(X=\mathbf{v}/[\sqrt{2}\sigma_r(r)\). The factor \(\Lambda\) that goes into the Coulomb logarithm is taken to be
\[\Lambda = \frac{r/\gamma}{\mathrm{max}\left(r_{\mathrm{hm}},GM/\mathbf{v}^2\right)}\,,\]where \(\gamma\) is a constant. This \(\gamma\) should be the absolute value of the logarithmic slope of the density \(\gamma = \mathrm{d} \ln \rho / \mathrm{d} \ln r\), although for \(\gamma<1\) it is advisable to set \(\gamma=1\). Implementation here roughly follows 2016MNRAS.463..858P and earlier work.

__init__
(amp=1.0, GMs=0.1, gamma=1.0, rhm=0.0, dens=None, sigmar=None, const_lnLambda=False, minr=0.0001, maxr=25.0, nr=501, ro=None, vo=None)¶ NAME:
__init__PURPOSE:
initialize a Chandrasekhar Dynamical Friction forceINPUT:
amp  amplitude to be applied to the potential (default: 1)
GMs  satellite mass; can be a Quantity with units of mass or Gxmass; can be adjusted after initialization by setting obj.GMs= where obj is your ChandrasekharDynamicalFrictionForce instance (note that the mass of the satellite can not be changed simply by multiplying the instance by a number, because he mass is not only used as an amplitude)
rhm  halfmass radius of the satellite (set to zero for a black hole; can be a Quantity); can be adjusted after initialization by setting obj.rhm= where obj is your ChandrasekharDynamicalFrictionForce instance
gamma  Freeparameter in \(\Lambda\)
dens  Potential instance or list thereof that represents the density [default: LogarithmicHaloPotential(normalize=1.,q=1.)]
sigmar= (None) function that gives the velocity dispersion as a function of r (has to be in natural units!); if None, computed from the dens potential using the spherical Jeans equation (in galpy.df.jeans) assuming zero anisotropy; if set to a lambda function, the object cannot be pickled (so set it to a real function)
cont_lnLambda= (False) if set to a number, use a constant ln(Lambda) instead with this value
minr= (0.0001) minimum r at which to apply dynamical friction: at r < minr, friction is set to zero (can be a Quantity)
Interpolation:
maxr= (25) maximum r for which sigmar gets interpolated; for best performance set this to the maximum r you will consider (can be a Quantity)
nr= (501) number of radii to use in the interpolation of sigmar
You can check that sigmar is interpolated correctly by comparing the methods sigmar [the interpolated version] and sigmar_orig [the original or directly computed version]
OUTPUT:
(none)HISTORY:
20111226  Started  Bovy (NYU)
20180318  Restarted: updated to r dependent Lambda form and integrated into galpy framework  Bovy (UofT)
20180723  Calculate sigmar from the Jeans equation and interpolate it; allow GMs and rhm to be set on the fly  Bovy (UofT)
