def test_dens_in_criticaldens(): #Test the scaling, as a 2nd derivative of the potential / G, should scale as velocity^2/position^2 vofid, rofid = 200., 8. assert numpy.fabs( 4. * bovy_conversion.dens_in_criticaldens(vofid, rofid) / bovy_conversion.dens_in_criticaldens(2. * vofid, rofid) - 1.) < 10.**-10., 'dens_in_criticaldens did not work as expected' assert numpy.fabs( .25 * bovy_conversion.dens_in_criticaldens(vofid, rofid) / bovy_conversion.dens_in_criticaldens(vofid, 2 * rofid) - 1.) < 10.**-10., 'dens_in_critical did not work as expected' return None
def rvir(self, H=70., Om=0.3, t=0., overdens=200., wrtcrit=False, ro=None, vo=None, use_physical=False ): # use_physical necessary bc of pop=False, does nothing inside """ NAME: rvir PURPOSE: calculate the virial radius for this density distribution INPUT: H= (default: 70) Hubble constant in km/s/Mpc Om= (default: 0.3) Omega matter overdens= (200) overdensity which defines the virial radius wrtcrit= (False) if True, the overdensity is wrt the critical density rather than the mean matter density ro= distance scale in kpc or as Quantity (default: object-wide, which if not set is 8 kpc)) vo= velocity scale in km/s or as Quantity (default: object-wide, which if not set is 220 km/s)) OUTPUT: virial radius HISTORY: 2014-01-29 - Written - Bovy (IAS) """ if ro is None: ro = self._ro if vo is None: vo = self._vo if wrtcrit: od = overdens / bovy_conversion.dens_in_criticaldens(vo, ro, H=H) else: od = overdens / bovy_conversion.dens_in_meanmatterdens( vo, ro, H=H, Om=Om) dc = 12. * self.dens(self.a, 0., t=t, use_physical=False) / od x = optimize.brentq( lambda y: (numpy.log(1. + y) - y / (1. + y)) / y**3. - 1. / dc, 0.01, 100.) return x * self.a
def rvir(self,H=70.,Om=0.3,overdens=200.,wrtcrit=False,ro=None,vo=None, use_physical=False): # use_physical necessary bc of pop=False, does nothing inside """ NAME: rvir PURPOSE: calculate the virial radius for this density distribution INPUT: H= (default: 70) Hubble constant in km/s/Mpc Om= (default: 0.3) Omega matter overdens= (200) overdensity which defines the virial radius wrtcrit= (False) if True, the overdensity is wrt the critical density rather than the mean matter density ro= distance scale in kpc or as Quantity (default: object-wide, which if not set is 8 kpc)) vo= velocity scale in km/s or as Quantity (default: object-wide, which if not set is 220 km/s)) OUTPUT: virial radius HISTORY: 2014-01-29 - Written - Bovy (IAS) """ if ro is None: ro= self._ro if vo is None: vo= self._vo if wrtcrit: od= overdens/bovy_conversion.dens_in_criticaldens(vo,ro,H=H) else: od= overdens/bovy_conversion.dens_in_meanmatterdens(vo,ro, H=H,Om=Om) dc= 12.*self.dens(self.a,0.,use_physical=False)/od x= optimize.brentq(lambda y: (numpy.log(1.+y)-y/(1.+y))/y**3.-1./dc, 0.01,100.) return x*self.a
def rvir(self, vo, ro, H=70., Om=0.3, overdens=200., wrtcrit=False): """ NAME: rvir PURPOSE: calculate the virial radius for this density distribution INPUT: vo - velocity unit in km/s ro - length unit in kpc H= (default: 70) Hubble constant in km/s/Mpc Om= (default: 0.3) Omega matter overdens= (200) overdensity which defines the virial radius wrtcrit= (False) if True, the overdensity is wrt the critical density rather than the mean matter density OUTPUT: virial radius in natural units HISTORY: 2014-01-29 - Written - Bovy (IAS) """ if wrtcrit: od = overdens / bovy_conversion.dens_in_criticaldens(vo, ro, H=H) else: od = overdens / bovy_conversion.dens_in_meanmatterdens( vo, ro, H=H, Om=Om) dc = 12. * self.dens(self.a, 0.) / od x = optimize.brentq( lambda y: (numpy.log(1. + y) - y / (1. + y)) / y**3. - 1. / dc, 0.01, 100.) return x * self.a
def _rvir(self,vo,ro,H=70.,Om=0.3,overdens=200.,wrtcrit=False): """ NAME: _rvir PURPOSE: calculate the virial radius for this density distribution INPUT: vo - velocity unit in km/s ro - length unit in kpc H= (default: 70) Hubble constant in km/s/Mpc Om= (default: 0.3) Omega matter overdens= (200) overdensity which defines the virial radius wrtcrit= (False) if True, the overdensity is wrt the critical density rather than the mean matter density OUTPUT: virial radius in natural units HISTORY: 2014-01-29 - Written - Bovy (IAS) """ if wrtcrit: od= overdens/bovy_conversion.dens_in_criticaldens(vo,ro,H=H) else: od= overdens/bovy_conversion.dens_in_meanmatterdens(vo,ro,H=H,Om=Om) dc= 12.*self.dens(self.a,0.)/od x= optimize.brentq(lambda y: (numpy.log(1.+y)-y/(1.+y))/y**3.-1./dc, 0.01,100.) return x*self.a
def __init__(self,amp=1.,a=1.,normalize=False, conc=None,mvir=None, vo=None,ro=None, H=70.,Om=0.3,overdens=200.,wrtcrit=False): """ NAME: __init__ PURPOSE: Initialize a NFW potential INPUT: amp - amplitude to be applied to the potential (default: 1); can be a Quantity with units of mass or Gxmass a - scale radius (can be Quantity) normalize - if True, normalize such that vc(1.,0.)=1., or, if given as a number, such that the force is this fraction of the force necessary to make vc(1.,0.)=1. Alternatively, NFW potentials can be initialized using conc= concentration mvir= virial mass in 10^12 Msolar in which case you also need to supply the following keywords H= (default: 70) Hubble constant in km/s/Mpc Om= (default: 0.3) Omega matter overdens= (200) overdensity which defines the virial radius wrtcrit= (False) if True, the overdensity is wrt the critical density rather than the mean matter density ro=, vo= distance and velocity scales for translation into internal units (default from configuration file) OUTPUT: (none) HISTORY: 2010-07-09 - Written - Bovy (NYU) 2014-04-03 - Initialization w/ concentration and mass - Bovy (IAS) """ Potential.__init__(self,amp=amp,ro=ro,vo=vo,amp_units='mass') if _APY_LOADED and isinstance(a,units.Quantity): a= a.to(units.kpc).value/self._ro if conc is None: self.a= a self.alpha= 1 self.beta= 3 if normalize or \ (isinstance(normalize,(int,float)) \ and not isinstance(normalize,bool)): self.normalize(normalize) else: if wrtcrit: od= overdens/bovy_conversion.dens_in_criticaldens(self._vo, self._ro,H=H) else: od= overdens/bovy_conversion.dens_in_meanmatterdens(self._vo, self._ro, H=H,Om=Om) mvirNatural= mvir*100./bovy_conversion.mass_in_1010msol(self._vo, self._ro) rvir= (3.*mvirNatural/od/4./numpy.pi)**(1./3.) self.a= rvir/conc self._amp= mvirNatural/(numpy.log(1.+conc)-conc/(1.+conc)) self._scale= self.a self.hasC= True self.hasC_dxdv= True self._nemo_accname= 'NFW' return None
def __init__(self,amp=1.,a=1.,normalize=False, conc=None,mvir=None, vo=220.,ro=8., H=70.,Om=0.3,overdens=200.,wrtcrit=False): """ NAME: __init__ PURPOSE: Initialize a NFW potential INPUT: amp - amplitude to be applied to the potential a - "scale" (in terms of Ro) normalize - if True, normalize such that vc(1.,0.)=1., or, if given as a number, such that the force is this fraction of the force necessary to make vc(1.,0.)=1. Alternatively, NFW potentials can be initialized using conc= concentration mvir= virial mass in 10^12 Msolar in which case you also need to supply the following keywords vo= (220.) velocity unit in km/s ro= (8.) length unit in kpc H= (default: 70) Hubble constant in km/s/Mpc Om= (default: 0.3) Omega matter overdens= (200) overdensity which defines the virial radius wrtcrit= (False) if True, the overdensity is wrt the critical density rather than the mean matter density OUTPUT: (none) HISTORY: 2010-07-09 - Written - Bovy (NYU) 2014-04-03 - Initialization w/ concentration and mass - Bovy (IAS) """ Potential.__init__(self,amp=amp) if conc is None: self.a= a self.alpha= 1 self.beta= 3 if normalize or \ (isinstance(normalize,(int,float)) \ and not isinstance(normalize,bool)): self.normalize(normalize) else: if wrtcrit: od= overdens/bovy_conversion.dens_in_criticaldens(vo,ro,H=H) else: od= overdens/bovy_conversion.dens_in_meanmatterdens(vo,ro,H=H,Om=Om) mvirNatural= mvir*100./bovy_conversion.mass_in_1010msol(vo,ro) rvir= (3.*mvirNatural/od/4./numpy.pi)**(1./3.) self.a= rvir/conc self._amp= mvirNatural/(numpy.log(1.+conc)-conc/(1.+conc)) self._scale= self.a self.hasC= True return None
def __init__(self, amp=1., a=1., normalize=False, conc=None, mvir=None, vo=None, ro=None, H=70., Om=0.3, overdens=200., wrtcrit=False): """ NAME: __init__ PURPOSE: Initialize a NFW potential INPUT: amp - amplitude to be applied to the potential (default: 1); can be a Quantity with units of mass or Gxmass a - scale radius (can be Quantity) normalize - if True, normalize such that vc(1.,0.)=1., or, if given as a number, such that the force is this fraction of the force necessary to make vc(1.,0.)=1. Alternatively, NFW potentials can be initialized using conc= concentration mvir= virial mass in 10^12 Msolar in which case you also need to supply the following keywords H= (default: 70) Hubble constant in km/s/Mpc Om= (default: 0.3) Omega matter overdens= (200) overdensity which defines the virial radius wrtcrit= (False) if True, the overdensity is wrt the critical density rather than the mean matter density ro=, vo= distance and velocity scales for translation into internal units (default from configuration file) OUTPUT: (none) HISTORY: 2010-07-09 - Written - Bovy (NYU) 2014-04-03 - Initialization w/ concentration and mass - Bovy (IAS) """ Potential.__init__(self, amp=amp, ro=ro, vo=vo, amp_units='mass') if _APY_LOADED and isinstance(a, units.Quantity): a = a.to(units.kpc).value / self._ro if conc is None: self.a = a self.alpha = 1 self.beta = 3 if normalize or \ (isinstance(normalize,(int,float)) \ and not isinstance(normalize,bool)): self.normalize(normalize) else: if wrtcrit: od = overdens / bovy_conversion.dens_in_criticaldens( self._vo, self._ro, H=H) else: od = overdens / bovy_conversion.dens_in_meanmatterdens( self._vo, self._ro, H=H, Om=Om) mvirNatural = mvir * 100. / bovy_conversion.mass_in_1010msol( self._vo, self._ro) rvir = (3. * mvirNatural / od / 4. / numpy.pi)**(1. / 3.) self.a = rvir / conc self._amp = mvirNatural / (numpy.log(1. + conc) - conc / (1. + conc)) self._scale = self.a self.hasC = True self.hasC_dxdv = True self._nemo_accname = 'NFW' return None
def __init__(self, amp=1., a=1., normalize=False, conc=None, mvir=None, vo=220., ro=8., H=70., Om=0.3, overdens=200., wrtcrit=False): """ NAME: __init__ PURPOSE: Initialize a NFW potential INPUT: amp - amplitude to be applied to the potential a - "scale" (in terms of Ro) normalize - if True, normalize such that vc(1.,0.)=1., or, if given as a number, such that the force is this fraction of the force necessary to make vc(1.,0.)=1. Alternatively, NFW potentials can be initialized using conc= concentration mvir= virial mass in 10^12 Msolar in which case you also need to supply the following keywords vo= (220.) velocity unit in km/s ro= (8.) length unit in kpc H= (default: 70) Hubble constant in km/s/Mpc Om= (default: 0.3) Omega matter overdens= (200) overdensity which defines the virial radius wrtcrit= (False) if True, the overdensity is wrt the critical density rather than the mean matter density OUTPUT: (none) HISTORY: 2010-07-09 - Written - Bovy (NYU) 2014-04-03 - Initialization w/ concentration and mass - Bovy (IAS) """ Potential.__init__(self, amp=amp) if conc is None: self.a = a self.alpha = 1 self.beta = 3 if normalize or \ (isinstance(normalize,(int,float)) \ and not isinstance(normalize,bool)): self.normalize(normalize) else: if wrtcrit: od = overdens / bovy_conversion.dens_in_criticaldens( vo, ro, H=H) else: od = overdens / bovy_conversion.dens_in_meanmatterdens( vo, ro, H=H, Om=Om) mvirNatural = mvir * 100. / bovy_conversion.mass_in_1010msol( vo, ro) rvir = (3. * mvirNatural / od / 4. / numpy.pi)**(1. / 3.) self.a = rvir / conc self._amp = mvirNatural / (numpy.log(1. + conc) - conc / (1. + conc)) self._scale = self.a self.hasC = True self.hasC_dxdv = True self._nemo_accname = 'NFW' return None
def test_dens_in_criticaldens(): #Test the scaling, as a 2nd derivative of the potential / G, should scale as velocity^2/position^2 vofid, rofid= 200., 8. assert numpy.fabs(4.*bovy_conversion.dens_in_criticaldens(vofid,rofid)/bovy_conversion.dens_in_criticaldens(2.*vofid,rofid)-1.) < 10.**-10., 'dens_in_criticaldens did not work as expected' assert numpy.fabs(.25*bovy_conversion.dens_in_criticaldens(vofid,rofid)/bovy_conversion.dens_in_criticaldens(vofid,2*rofid)-1.) < 10.**-10., 'dens_in_critical did not work as expected' return None