Source code for ssapy_toolkit.SSAPy_wrappers.ssapy_props

from ssapy.accel import AccelKepler, AccelSolRad, AccelEarthRad, AccelDrag
from ssapy.body import get_body
from ssapy.gravity import AccelHarmonic, AccelThirdBody
from ssapy.propagator import SciPyPropagator, KeplerianPropagator


[docs] def ssapy_kwargs(mass=250.0, area=0.022, CD=2.3, CR=1.3): """Default space-object parameters used by SSAPy non-conservative models.""" return {"mass": float(mass), "area": float(area), "CD": float(CD), "CR": float(CR)}
[docs] def keplerian_prop(ode_kwargs=None): return KeplerianPropagator()
[docs] def keplerian_numerical_prop(): return SciPyPropagator(AccelKepler())
_accel_3_cache = None
[docs] def threebody_prop(ode_kwargs=None): global _accel_3_cache if _accel_3_cache is None: _accel_3_cache = AccelKepler() + AccelThirdBody(get_body("moon")) return SciPyPropagator(_accel_3_cache, ode_kwargs=ode_kwargs)
_accel_4_cache = None
[docs] def fourbody_prop(ode_kwargs=None): global _accel_4_cache if _accel_4_cache is None: _accel_4_cache = ( AccelKepler() + AccelThirdBody(get_body("moon")) + AccelThirdBody(get_body("Sun")) ) return SciPyPropagator(_accel_4_cache, ode_kwargs=ode_kwargs)
_accel_best_cache = None
[docs] def best_prop(kwargs=None, ode_kwargs=None): """ "Best-like" force model: Earth(Kepler+EGM2008 140x140) + Moon(point+20x20) + Sun + planets + SRP+EarthRad+Drag """ global _accel_best_cache if kwargs is None: kwargs = ssapy_kwargs() if _accel_best_cache is None: aEarth = AccelKepler() + AccelHarmonic(get_body("Earth", model="EGM2008"), 140, 140) moon = get_body("moon") aMoon = AccelThirdBody(moon) + AccelHarmonic(moon, 20, 20) aSun = AccelThirdBody(get_body("Sun")) planet_names = ("Mercury", "Venus", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune") planets = None for name in planet_names: term = AccelThirdBody(get_body(name)) planets = term if planets is None else planets + term nonConservative = AccelSolRad(**kwargs) + AccelEarthRad(**kwargs) + AccelDrag(**kwargs) _accel_best_cache = aEarth + aMoon + aSun + planets + nonConservative return SciPyPropagator(_accel_best_cache, ode_kwargs=ode_kwargs)
_accel_best_gravity_cache = None
[docs] def best_gravity_prop(kwargs=None, ode_kwargs=None): """ "Best-like" force model: Earth(Kepler+EGM2008 140x140) + Moon(point+20x20) + Sun + planets + SRP+EarthRad+Drag """ global _accel_best_gravity_cache if kwargs is None: kwargs = ssapy_kwargs() if _accel_best_gravity_cache is None: aEarth = AccelKepler() + AccelHarmonic(get_body("Earth", model="EGM2008"), 140, 140) moon = get_body("moon") aMoon = AccelThirdBody(moon) + AccelHarmonic(moon, 20, 20) aSun = AccelThirdBody(get_body("Sun")) planet_names = ("Mercury", "Venus", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune") planets = None for name in planet_names: term = AccelThirdBody(get_body(name)) planets = term if planets is None else planets + term nonConservative = AccelSolRad(**kwargs) + AccelEarthRad(**kwargs) _accel_best_gravity_cache = aEarth + aMoon + aSun + planets + nonConservative return SciPyPropagator(_accel_best_gravity_cache, ode_kwargs=ode_kwargs)
[docs] def ssapy_prop(propkw=None, ode_kwargs=None): """ A lighter "ssapy_prop"-style model (no planets, no drag): Earth full + Moon full + Sun + SRP + EarthRad """ if propkw is None: propkw = ssapy_kwargs() moon = get_body("moon") sun = get_body("Sun") earth = get_body("Earth", model="EGM2008") aEarth = AccelKepler() + AccelHarmonic(earth, 140, 140) aSun = AccelThirdBody(sun) aMoon = AccelThirdBody(moon) + AccelHarmonic(moon, 20, 20) aSolRad = AccelSolRad(**propkw) aEarthRad = AccelEarthRad(**propkw) accel = aEarth + aMoon + aSun + aSolRad + aEarthRad return SciPyPropagator(accel, ode_kwargs=ode_kwargs)
if __name__ == "__main__": # quick smoke test: build each propagator (doesn't propagate anything) props = { "kepler": keplerian_prop(), "3body": threebody_prop(), "4body": fourbody_prop(), "ssapy_prop": ssapy_prop(), "best": best_prop(), } for k, p in props.items(): print(k, "->", p)