Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
(Sun, SunFixed, HCRS),
(Mercury, MercuryFixed, MercuryICRS),
(Venus, VenusFixed, VenusICRS),
(Earth, ITRS, GCRS),
(Mars, MarsFixed, MarsICRS),
(Jupiter, JupiterFixed, JupiterICRS),
(Saturn, SaturnFixed, SaturnICRS),
(Uranus, UranusFixed, UranusICRS),
(Neptune, NeptuneFixed, NeptuneICRS),
],
)
def test_planetary_inertial_roundtrip_vector(body, fixed_frame, inertial_frame):
with solar_system_ephemeris.set("builtin"):
epoch = J2000
sampling_time = 10 * u.s
fixed_position = fixed_frame(
np.broadcast_to(0 * u.deg, (1000,), subok=True),
def test_plot_ephem_different_plane_raises_error():
unused_epochs = Time.now().reshape(-1)
unused_coordinates = CartesianRepresentation(
[(1, 0, 0)] * u.au,
xyz_axis=1,
differentials=CartesianDifferential([(0, 1, 0)] * (u.au / u.day), xyz_axis=1),
)
op = StaticOrbitPlotter(plane=Planes.EARTH_ECLIPTIC)
op.set_attractor(Sun)
op.set_body_frame(Earth)
with pytest.raises(ValueError) as excinfo:
op.plot_ephem(Ephem(unused_epochs, unused_coordinates, Planes.EARTH_EQUATOR))
assert (
"sample the ephemerides using a different plane or create a new plotter"
in excinfo.exconly()
)
def hyperbolic():
r = [1.197659243752796e09, -4.443716685978071e09, -1.747610548576734e09] * u.km
v = (
[5.540549267188614e00, -1.251544669134140e01, -4.848892572767733e00]
* u.km
/ u.s
)
epoch = Time("2015-07-14 07:59", scale="tdb")
return Orbit.from_vectors(Sun, r, v, epoch)
"raan": 6.0 * u.deg,
"argp": -11.0 * u.deg,
"inc": 6.5 * 1e-3 * u.deg,
"orbit": [
42164.0 * u.km,
0.0001 * u.one,
1 * u.deg,
0.0 * u.deg,
0.0 * u.deg,
0.0 * u.rad,
],
"period": 28 * u.day,
}
sun_heo = {
"body": Sun,
"tof": 200 * u.day,
"raan": -0.10 * u.deg,
"argp": 0.2 * u.deg,
"inc": 0.1 * u.deg,
"orbit": [
26553.4 * u.km,
0.741 * u.one,
63.4 * u.deg,
0.0 * u.deg,
-10.12921 * u.deg,
0.0 * u.rad,
],
"period": 365 * u.day,
}
sun_leo = {
def test_propagating_to_certain_nu_is_correct():
# take an elliptic orbit
a = 1.0 * u.AU
ecc = 1.0 / 3.0 * u.one
_a = 0.0 * u.rad
nu = 10 * u.deg
elliptic = Orbit.from_classical(Sun, a, ecc, _a, _a, _a, nu)
elliptic_at_perihelion = elliptic.propagate_to_anomaly(0.0 * u.rad)
r_per, _ = elliptic_at_perihelion.rv()
elliptic_at_aphelion = elliptic.propagate_to_anomaly(np.pi * u.rad)
r_ap, _ = elliptic_at_aphelion.rv()
assert_quantity_allclose(norm(r_per), a * (1.0 - ecc))
assert_quantity_allclose(norm(r_ap), a * (1.0 + ecc))
# TODO: Test specific values
assert elliptic_at_perihelion.epoch > elliptic.epoch
assert elliptic_at_aphelion.epoch > elliptic.epoch
# test 10 random true anomaly values
# TODO: Rework this test
'''
records = record_from_name(name)
orbits = []
for record in records:
body_data = read_record(record)
a = body_data['A'].item() * u.au
ecc = body_data['EC'].item() * u.one
inc = body_data['IN'].item() * u.deg
raan = body_data['OM'].item() * u.deg
argp = body_data['W'].item() * u.deg
M = body_data['MA'].item() * u.deg
nu = M_to_nu(M, ecc)
epoch = Time(body_data['EPOCH'].item(), format='jd')
orbits.append(Orbit.from_classical(Sun, a, ecc, inc, raan, argp, nu, epoch))
return orbits
raan = body_data["OM"].item() * u.deg
argp = body_data["W"].item() * u.deg
M = body_data["MA"].item() * u.deg
epoch = Time(body_data["EPOCH"].item(), format="jd", scale="tdb")
# NOTE: It is unclear how this conversion should happen,
# see https://ssd-api.jpl.nasa.gov/doc/sbdb.html
if ecc < 1:
M = (M + np.pi * u.rad) % (2 * np.pi * u.rad) - np.pi * u.rad
nu = E_to_nu(M_to_E(M, ecc), ecc)
elif ecc == 1:
nu = D_to_nu(M_to_D(M))
else:
nu = F_to_nu(M_to_F(M, ecc), ecc)
orbit = Orbit.from_classical(Sun, a, ecc, inc, raan, argp, nu, epoch)
orbit._frame = HeliocentricEclipticJ2000(obstime=epoch)
return orbit
"""Molniya orbit example"""
_r_a = Earth.R + 35950 * u.km
_r_p = Earth.R + 250 * u.km
_a = (_r_a + _r_p) / 2
soyuz_gto = Orbit.from_classical(
Earth, _a, _r_a / _a - 1, 6 * u.deg, 188.5 * u.deg, 178 * u.deg, 0 * u.deg
)
"""Soyuz geostationary transfer orbit (GTO) example
Taken from Soyuz User's Manual, issue 2 revision 0
"""
churi = Orbit.from_classical(
Sun,
3.46250 * u.AU,
0.64 * u.one,
7.04 * u.deg,
50.1350 * u.deg,
12.8007 * u.deg,
63.89 * u.deg,
time.Time("2015-11-05 12:00", scale="utc"),
)
"""Comet 67P/Churyumov–Gerasimenko orbit example"""
def to_equatorial(fixed_coo, equatorial_frame):
# TODO replace w/ something smart (Sun/Earth special cased)
if fixed_coo.body == Sun:
assert type(equatorial_frame) == HCRS
else:
assert fixed_coo.body == equatorial_frame.body
r = fixed_coo.cartesian
ra, dec, W = fixed_coo.rot_elements_at_epoch(equatorial_frame.obstime)
r = r.transform(rotation_matrix(-W, "z"))
r_trans1 = r.transform(rotation_matrix(-(90 * u.deg - dec), "x"))
data = r_trans1.transform(rotation_matrix(-(90 * u.deg + ra), "z"))
return equatorial_frame.realize_frame(data)
of the two body problem. Therefore, this function exists merely for practical
purposes.
.. versionadded:: 0.11.0
"""
coords = self.frame.realize_frame(
self.represent_as(CartesianRepresentation)
)
coords.representation_type = CartesianRepresentation
icrs_cart = coords.transform_to(ICRS).represent_as(CartesianRepresentation)
# TODO: The attractor is in fact the Solar System Barycenter
ss = self.from_vectors(
Sun,
r=icrs_cart.xyz,
v=icrs_cart.differentials['s'].d_xyz,
epoch=self.epoch
)
ss._frame = ICRS() # Hack!
return ss