New Features
- Introduced new classes `swiftest.data.SwiftestDataArray` and `swiftest.data.SwiftestDataset`. These are extensions of [xarray.DataArray](https://docs.xarray.dev/en/stable/generated/xarray.DataArray.html) and [xarray.Dataset](https://docs.xarray.dev/en/stable/generated/xarray.Dataset.html), respectively. These are now used to define the internal data storage attributes, like `swiftest.Simulation.data`, `swiftest.Simulation.init_cond`, `swiftest.Simulation.collisions`, and `swiftest.Simulation.encounters`, as well as methods `swiftest.SwiftestDataset.xv2el` and `swiftest.SwiftestDataset.el2xv`. [GH24](https://github.com/MintonGroup/swiftest/issues/24)
- Added binding modules and started writing code to connect the Fortran `el2xv` and `xv2el` to Python and removed the Python implementation of these functions. This allows the Python code to call the same Fortran functions for converting state vectors to orbital elements and back again that the core Swiftest code uses, which are nearly identical to the original implementations of these functions written by Martin Duncan in 1992. The functions themselves are accessible via `swiftest.core.el2xv` and `swiftest.core.xv2el`.
- The `swiftest.Simulation.add_solar_system_body` and `swiftest.Simulation.add_body` methods have been overhauled to make selecting the central body in a more consistent way. Central bodies are now chosen automatically to be the most massive body in the system, and the all other bodies' position and velocity vectors are translated to the central body's frame. We also include a new argument to these functions called `align_to_central_body_rotation` which can be used to rotate bodies into a frame that is aligned with the central body's rotation vector. This is useful for using `swiftest.Simulation.add_solar_system_body` to set bodies other than the Sun to be the central body, as otherwise it aligns all bodies to the ecliptic. See the documentation on planetocentric initial conditions for details of how this works.
Bug Fixes
- Fixed a problem with length check when passing `ephemeris_id` and `name` as scalars.
- Added an explicit status variable when adding bodies to ensure that they get counted properly.
Internal Changes
- Updated initial conditions generators to catch more bad or inconsistent inputs and added more tests to cover these cases.
- Updated build script environment variables to help make the MacOS build more robust.
- Improved the efficiency of the `init_cond.solar_system_horizons` function when fetching physical parameters. It can now accept a jpl HorizonsClass object as an argument so that it can re-use a previous query to look for physical parameters, and only execute a new query on an `altid` if they are not found.
- Switched from using `iso_fortran_env` to `iso_c_binding` for basic type definitions in order to make it easier to expose the Fortran library API to Python.
Documentation
- Added a new documentation page to demonstrate the use of the standalone executable.
- Added a new documentation page for setting planetocentric initial conditions.