def get_gravity_at_point(self, eps, x, y, z): R = np.sqrt(x.value_in(units.kpc)**2. + y.value_in(units.kpc)**2.) zed = z.value_in(units.kpc) phi = np.arctan2(y.value_in(units.kpc), x.value_in(units.kpc)) Rforce = potential.evaluateRforces(self.pot, R / self.ro, zed / self.ro, phi=phi, t=self.tgalpy) phiforce = potential.evaluatephiforces( self.pot, R / self.ro, zed / self.ro, phi=phi, t=self.tgalpy) / (R / self.ro) zforce = potential.evaluatezforces(self.pot, R / self.ro, zed / self.ro, phi=phi, t=self.tgalpy) ax = (Rforce * np.cos(phi) - phiforce * np.sin(phi)) * bovy_conversion.force_in_kmsMyr( ro=self.ro, vo=self.vo) | units.kms * units.myr**-1 ay = (Rforce * np.sin(phi) + phiforce * np.cos(phi)) * bovy_conversion.force_in_kmsMyr( ro=self.ro, vo=self.vo) | units.kms * units.myr**-1 az = zforce * bovy_conversion.force_in_kmsMyr( ro=self.ro, vo=self.vo) | units.kms * units.myr**-1 return ax, ay, az
def force_pal5(pot: PotentialType, dpal5: float, ro: float = REFR0, vo: float = REFV0) -> Tuple[float]: """Return the force at Pal5. Parameters ---------- pot: Potential, list dpal5: float ro, vo: float Return ------ force: tuple [fx, fy, fz] """ from galpy import potential from galpy.util import bovy_coords # First compute the location based on the distance l5, b5 = bovy_coords.radec_to_lb(229.018, -0.124, degree=True) X5, Y5, Z5 = bovy_coords.lbd_to_XYZ(l5, b5, dpal5, degree=True) R5, p5, Z5 = bovy_coords.XYZ_to_galcencyl(X5, Y5, Z5, Xsun=ro, Zsun=0.025) args: list = [pot, R5 / ro, Z5 / ro] kws: dict = {"phi": p5, "use_physical": True, "ro": ro, "vo": vo} return ( potential.evaluateRforces(*args, **kws), potential.evaluatezforces(*args, **kws), potential.evaluatephiforces(*args, **kws), )
def force_gd1(pot,ro,vo): """Return the force at GD-1""" # Just use R=12.5 kpc, Z= 6.675 kpc, phi=0 R1= 12.5 Z1= 6.675 p1= 0. return (potential.evaluateRforces(pot,R1/ro,Z1/ro,phi=p1, use_physical=True,ro=ro,vo=vo), potential.evaluatezforces(pot,R1/ro,Z1/ro,phi=p1, use_physical=True,ro=ro,vo=vo), potential.evaluatephiforces(pot,R1/ro,Z1/ro,phi=p1, use_physical=True,ro=ro,vo=vo))
def force_pal5(pot,dpal5,ro,vo): """Return the force at Pal5""" # First compute the location based on the distance l5, b5= bovy_coords.radec_to_lb(229.018,-0.124,degree=True) X5,Y5,Z5= bovy_coords.lbd_to_XYZ(l5,b5,dpal5,degree=True) R5,p5,Z5= bovy_coords.XYZ_to_galcencyl(X5,Y5,Z5,Xsun=ro,Zsun=0.025) return (potential.evaluateRforces(pot,R5/ro,Z5/ro,phi=p5, use_physical=True,ro=ro,vo=vo), potential.evaluatezforces(pot,R5/ro,Z5/ro,phi=p5, use_physical=True,ro=ro,vo=vo), potential.evaluatephiforces(pot,R5/ro,Z5/ro,phi=p5, use_physical=True,ro=ro,vo=vo))
def _getForces(folder): loc = "SCFAnalysis/Orbits/{0}".format(folder) Acos = nu.load(loc + "/Acos.npy") a_nfw = 200./8 orbits_pos =nu.load(TIMEORBITS.format(loc, TIME,0.004,1*units.Myr)) scf = potential.SCFPotential(Acos=Acos, a=a_nfw, normalize=.35) ps= potential.PowerSphericalPotentialwCutoff(alpha=1.8,rc=1.9/8.,normalize=0.05) mn= potential.MiyamotoNagaiPotential(a=3./8.,b=0.28/8.,normalize=.6) MWPotential= [ps,mn,scf] x,y,z = orbits_pos[-1,1:4] R, phi, z = rect_to_cyl(x,y,z) print "(R,z,phi) = ({0}, {1}, {2})".format(R,z,phi) Rforce = potential.evaluateRforces(MWPotential, R,z,phi) zforce = potential.evaluatezforces(MWPotential, R,z,phi) phiforce = potential.evaluatephiforces(MWPotential, R,z,phi) return Rforce, zforce, phiforce
def force_gd1(pot, ro, vo): """Return the force at GD-1. Parameters ---------- pot: Potential ro, vo: float Return ------ force: tuple [fx, fy, fz] """ # Just use R=12.5 kpc, Z= 6.675 kpc, phi=0 R1 = 12.5 Z1 = 6.675 p1 = 0.0 return ( potential.evaluateRforces(pot, R1 / ro, Z1 / ro, phi=p1, use_physical=True, ro=ro, vo=vo), potential.evaluatezforces(pot, R1 / ro, Z1 / ro, phi=p1, use_physical=True, ro=ro, vo=vo), potential.evaluatephiforces(pot, R1 / ro, Z1 / ro, phi=p1, use_physical=True, ro=ro, vo=vo), )
def del_E(coord, custom_potential=None): """ NAME: del_E PURPOSE: Given (m,6) array for a list of the position and velocity of stars in Cartesian coordinate, return the gradient vectors of energy in Cartesian form, in the corresponding row order. Assumes input and out put are in natrual unit. INPUT: coord = array([[x, y, z, vx, vy, vz], ...]) where each row represents the coordinate of a star OUTPUT: del_E = gradient in Cartesian coordinate where each row represents the gradient of a star HISTORY: 2018-07-10 - Written - Samuel Wong 2018-07-24 - Changed to an array of points - Samuel Wong """ if custom_potential == None: potential = MWPotential2014 else: potential = custom_potential x, y, z, vx, vy, vz = coord.T R, vR, vT, z, vz, phi = rect_to_cyl(x, y, z, vx, vy, vz).T # get the force of the potential in cylindrical form F_phi = evaluatephiforces(potential, R, z, phi) / R F_R = evaluateRforces(potential, R, z, phi) F_z = evaluatezforces(potential, R, z, phi) # return the gradient in Cartesian coordinate gradient = [ F_phi * np.sin(phi) - F_R * np.cos(phi), -F_R * np.sin(phi) - F_phi * np.cos(phi), -F_z, vx, vy, vz ] return np.array(gradient).T