Пример #1
0
    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))
Пример #5
0
 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
Пример #6
0
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),
    )
Пример #7
0
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