Beispiel #1
0
def test_orbmethods():
    from galpy.orbit import Orbit
    from galpy.potential import MWPotential2014
    # 8/17/2019: added explicit z=0.025, because that was the default at the
    # time of the galpy paper, but the default has been changed
    o = Orbit([0.8, 0.3, 0.75, 0., 0.2, 0.],
              zo=0.025)  # setup R,vR,vT,z,vz,phi
    times = numpy.linspace(0., 10., 1001)  # Output times
    o.integrate(times, MWPotential2014)  # Integrate
    o.E()  # Energy
    assert numpy.fabs(o.E() + 1.2547650648697966
                      ) < 10.**-5., 'Orbit method does not work as expected'
    o.L()  # Angular momentum
    assert numpy.all(
        numpy.fabs(o.L() - numpy.array([[0., -0.16, 0.6]])) < 10.**-5.
    ), 'Orbit method does not work as expected'
    o.Jacobi(OmegaP=0.65)  #Jacobi integral E-OmegaP Lz
    assert numpy.fabs(o.Jacobi(OmegaP=0.65) - numpy.array([-1.64476506])
                      ) < 10.**-5., 'Orbit method does not work as expected'
    o.ER(times[-1]), o.Ez(times[-1])  # Rad. and vert. E at end
    assert numpy.fabs(o.ER(times[-1]) + 1.27601734263047
                      ) < 10.**-5., 'Orbit method does not work as expected'
    assert numpy.fabs(o.Ez(times[-1]) - 0.021252201847851909
                      ) < 10.**-5., 'Orbit method does not work as expected'
    o.rperi(), o.rap(), o.zmax()  # Peri-/apocenter r, max. |z|
    assert numpy.fabs(o.rperi() - 0.44231993168097
                      ) < 10.**-5., 'Orbit method does not work as expected'
    assert numpy.fabs(o.rap() - 0.87769030382105
                      ) < 10.**-5., 'Orbit method does not work as expected'
    assert numpy.fabs(o.zmax() - 0.077452357289016
                      ) < 10.**-5., 'Orbit method does not work as expected'
    o.e()  # eccentricity (rap-rperi)/(rap+rperi)
    assert numpy.fabs(o.e() - 0.32982348199330563
                      ) < 10.**-5., 'Orbit method does not work as expected'
    o.R(2., ro=8.)  # Cylindrical radius at time 2. in kpc
    assert numpy.fabs(o.R(2., ro=8.) - 3.5470772876920007
                      ) < 10.**-3., 'Orbit method does not work as expected'
    o.vR(5., vo=220.)  # Cyl. rad. velocity at time 5. in km/s
    assert numpy.fabs(o.vR(5., vo=220.) - 45.202530965094553
                      ) < 10.**-3., 'Orbit method does not work as expected'
    o.ra(1.), o.dec(1.)  # RA and Dec at t=1. (default settings)
    # 5/12/2016: test weakened, because improved galcen<->heliocen
    #            transformation has changed these, but still close
    assert numpy.fabs(o.ra(1.) - numpy.array([288.19277])
                      ) < 10.**-1., 'Orbit method does not work as expected'
    assert numpy.fabs(o.dec(1.) - numpy.array([18.98069155])
                      ) < 10.**-1., 'Orbit method does not work as expected'
    o.jr(type='adiabatic'), o.jz()  # R/z actions (ad. approx.)
    assert numpy.fabs(o.jr(type='adiabatic') - 0.05285302231137586
                      ) < 10.**-3., 'Orbit method does not work as expected'
    assert numpy.fabs(o.jz() - 0.006637988850751242
                      ) < 10.**-3., 'Orbit method does not work as expected'
    # Rad. period w/ Staeckel approximation w/ focal length 0.5,
    o.Tr(type='staeckel', delta=0.5, ro=8., vo=220.)  # in Gyr
    assert numpy.fabs(
        o.Tr(type='staeckel', delta=0.5, ro=8., vo=220.) - 0.1039467864018446
    ) < 10.**-3., 'Orbit method does not work as expected'
    o.plot(d1='R', d2='z')  # Plot the orbit in (R,z)
    o.plot3d()  # Plot the orbit in 3D, w/ default [x,y,z]
    return None
nowvr_om = o.vR(ts)[-1]
nowvt_om = o.vT(ts)[-1]
nowvz_om = o.vz(ts)[-1]

#finding velocty components of omega cen now:
now_arrayvr_omega = forward_omega_orbit.vR(-ts)
now_arrayvt_omega = forward_omega_orbit.vT(-ts)
now_arrayvz_omega = forward_omega_orbit.vz(-ts)
now_vr_omega = forward_omega_orbit.vR(-ts)[-1]
now_vt_omega = forward_omega_orbit.vT(-ts)[-1]
now_vz_omega = forward_omega_orbit.vz(-ts)[-1]

#finding energies of omega cen now:
now_arraye_omega = forward_omega_orbit.E(-ts)
now_arrayer_omega = forward_omega_orbit.ER(-ts)
now_arrayez_omega = forward_omega_orbit.Ez(-ts)
now_e_omega = now_arraye_omega[-1]
now_er_omega = now_arrayer_omega[-1]
now_ez_omega = now_arrayez_omega[-1]

#print("current omega cen location according to code:", now_r_omega,now_vr_omega,now_vt_omega,now_z_omega,now_vz_omega,now_phi_omega)

num_stars = 1000
vrom = o.vR()
mu, sigma = (0, 100 / (np.sqrt(3)))
sr = np.random.normal(mu, sigma, num_stars)

vr_omega_array_vr = np.ones(num_stars) * (now_arrayvr_omega[0])
vt_omega_array_vt = np.ones(num_stars) * (now_arrayvt_omega[0])
vz_omega_array_vz = np.ones(num_stars) * (now_arrayvz_omega[0])
vr_omega_array = sr + vr_omega_array_vr
#star1
star1 = Orbit([(r_omega)*units.kpc, (vr_omega+10)*units.km/units.s, vt_omega*units.km/units.s, z_omega*units.kpc,vz_omega*units.km/units.s, phi_omega*units.deg], ro=8., vo=220., solarmotion='hogg')
star1.integrate(-ts,MWPotential2014)
#[R,vR,vT(,z,vz,phi)]
#finding location of star 1 now:
now_arrayz_star1 = star1.z(-ts)
now_arrayR_star1 = star1.R(-ts)
now_arrayphi_star1 = star1.phi(-ts)
#finding velocty components of star 1 now:
now_arrayvr_star1 = star1.vR(-ts)
now_arrayvt_star1 = star1.vT(-ts)
now_arrayvz_star1 = star1.vz(-ts)
#finding energies of star 1 now:
now_arraye_star1 = star1.E(-ts)
now_arrayer_star1 = star1.ER(-ts)
now_arrayez_star1 = star1.Ez(-ts)
#compared with current orbit of omega cen
arrayR_omega = forward_omega_orbit.R(-ts)
arrayvr_omega = forward_omega_orbit.vR(-ts)
arrayvt_omega = forward_omega_orbit.vT(-ts)
arrayvz_omega = forward_omega_orbit.vz(-ts)
arrayphi_omega = forward_omega_orbit.phi(-ts)
arrayz_omega = forward_omega_orbit.z(-ts)

rrr = arrayR_omega[-1]
vrvr = arrayvr_omega[-1]
vtvt = arrayvt_omega[-1]
zzz = arrayz_omega[-1]
vzvz = arrayvz_omega[-1]
phiphi = arrayphi_omega[-1] 
print("original omega cen location according to builtin orbit:",rrr,vrvr,vtvt,zzz,vzvz,phiphi)