--- title: "Roadmap" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Roadmap} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- `orbitr` is a work in progress. This page is a running list of features I'm thinking about adding in future versions. Nothing here is promised, and the priority order is loose — it mostly reflects what I personally find interesting or what users have asked for. If any of these sound useful (or terrible), let me know. Suggestions, feedback, and pull requests are all very welcome. ## Physics ### A `radius` argument on `add_body()` Right now bodies are treated as point masses. This is fine for most orbital distances — gravity outside a sphere behaves exactly as if all the mass were concentrated at its center (the shell theorem) — but it means there's no concept of two bodies physically touching. Adding an optional `radius` parameter would enable collision detection, merging on contact, and more realistic close-encounter behavior. I'd probably add it to `add_body()` as an optional parameter with a sensible default, something like: ```r add_body <- function(system, id, mass, x = 0, y = 0, z = 0, vx = 0, vy = 0, vz = 0, r = NULL) ``` If `r` is supplied for any body in the system, the integrator would check for overlaps on each step and handle them according to a user-chosen policy (elastic bounce, inelastic merge, simulation halt, etc.). In the meantime, the existing `softening` parameter on `simulate_system()` partly works around the missing-radius problem by preventing the gravitational force from blowing up at very small separations — see [The Physics](the-physics.html) for details. ### Non-gravitational forces Optional support for forces beyond pure Newtonian gravity: - **Atmospheric drag** for low orbits around bodies with atmospheres - **Radiation pressure** for small bodies near a star - **J2 oblateness corrections** for orbits around non-spherical bodies (Earth's equatorial bulge measurably perturbs satellite orbits) ### General-relativistic corrections A small post-Newtonian correction term would let `orbitr` reproduce real GR effects like the precession of Mercury's perihelion. Probably opt-in via an argument on `simulate_system()`, since most users wouldn't need it. ## Setup helpers ### ~~Construct bodies from Keplerian orbital elements~~ ✅ Added in v0.2.0 Implemented as `add_body_keplerian()`. See `?add_body_keplerian` for details. ### ~~A `load_solar_system()` convenience~~ ✅ Added in v0.2.0 Implemented as `load_solar_system()`. Builds the Sun, all eight planets, the Moon, and Pluto using real Keplerian elements from JPL DE440. See `?load_solar_system` for details. ## Quality of life ### Save and load simulation state Functions to serialize an `orbit_system` (or a completed simulation tibble) to disk and reload it later. Useful for long-running simulations and for sharing reproducible setups. ### Progress bar for long simulations A simple progress indicator on `simulate_system()` for runs that take more than a few seconds, with an option to disable it for scripted use. ### Built-in conservation diagnostics Helpers to compute total energy, total linear momentum, and total angular momentum at every time step, so you can sanity-check an integrator's behavior over the course of a run. Useful for confirming Velocity Verlet is doing its job, and for spotting cases where the time step is too large. ## Suggestions Welcome If any of these sound useful, if you'd like to see something not on this list, or if you have a use case that `orbitr` doesn't currently handle well, please open an issue on [GitHub](https://github.com/DRosenman/orbitr/issues). I'd love to hear about how people are using the package and what would make it more useful. Pull requests are also very welcome.