Source code for adam_core.dynamics.tisserand
"""
This code generates the dictionary of semi-major axes for the
third body needed for the Tisserand parameter
from adam_core.orbits.query import _get_horizons_elements
ids = ["199", "299", "399", "499", "599", "699", "799", "899"]
elements = _get_horizons_elements(ids, times, id_type="majorbody")
MAJOR_BODIES = {}
for i, r in elements[["targetname", "a"]].iterrows():
body_name = r["targetname"].split(" ")[0].lower()
MAJOR_BODIES[body_name] = r["a"]
"""
import numpy as np
MAJOR_BODIES = {
"mercury": 0.3870970330236769,
"venus": 0.723341974974844,
"earth": 0.9997889954736553,
"mars": 1.523803685638066,
"jupiter": 5.203719697535582,
"saturn": 9.579110220472034,
"uranus": 19.18646168457971,
"neptune": 30.22486701698071,
}
[docs]
def calc_tisserand_parameter(a, e, i, third_body="jupiter"):
"""
Calculate Tisserand's parameter used to identify potential comets.
For example, objects with Tisserand parameter's with respect to Jupiter greater than 3 are
typically asteroids, whereas Jupiter family comets may have Tisserand's parameter
between 2 and 3. Damocloids have Jupiter Tisserand's parameter of less than 2.
Parameters
----------
a : float or `~numpy.ndarray` (N)
Semi-major axis in au.
e : float or `~numpy.ndarray` (N)
Eccentricity.
i : float or `~numpy.ndarray` (N)
Inclination in degrees.
third_body : str
Name of planet with respect to which Tisserand's parameter
should be calculated.
Returns
-------
Tp : float or `~numpy.ndarray` (N)
Tisserand's parameter.
"""
i_rad = np.radians(i)
major_bodies = MAJOR_BODIES.keys()
if third_body not in major_bodies:
err = f"third_body should be one of {','.join(major_bodies)}"
raise ValueError(err)
ap = MAJOR_BODIES[third_body]
Tp = ap / a + 2 * np.cos(i_rad) * np.sqrt(a / ap * (1 - e**2))
return Tp