ssapy-toolkit 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. ssapy_toolkit-1.0.0/LICENSE +28 -0
  2. ssapy_toolkit-1.0.0/PKG-INFO +182 -0
  3. ssapy_toolkit-1.0.0/README.md +81 -0
  4. ssapy_toolkit-1.0.0/pyproject.toml +90 -0
  5. ssapy_toolkit-1.0.0/setup.cfg +4 -0
  6. ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/__init__.py +18 -0
  7. ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_add.py +26 -0
  8. ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_circularize.py +88 -0
  9. ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_deltav.py +50 -0
  10. ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_deltav_vector.py +39 -0
  11. ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_earth_harmonics.py +172 -0
  12. ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_equitorial.py +41 -0
  13. ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_inclination.py +40 -0
  14. ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_moon.py +46 -0
  15. ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_plane.py +44 -0
  16. ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_point_earth.py +9 -0
  17. ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_radial.py +27 -0
  18. ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_sun.py +38 -0
  19. ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_uniform_earth.py +31 -0
  20. ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_velocity.py +25 -0
  21. ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/__init__.py +18 -0
  22. ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/calculate_errors.py +22 -0
  23. ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/fft.py +43 -0
  24. ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/find_bounding_cube.py +24 -0
  25. ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/generate_sphere_of_vectors.py +102 -0
  26. ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/lambertian_magnitude.py +250 -0
  27. ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/lyapunov_exponent.py +190 -0
  28. ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/mengos.py +31 -0
  29. ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/proper_motions.py +107 -0
  30. ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/sampling.py +537 -0
  31. ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/segment_intersection.py +46 -0
  32. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/__init__.py +18 -0
  33. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/cartesian_to_cylindrical.py +20 -0
  34. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/cartesian_to_spherical.py +22 -0
  35. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/earth_trojan_sim.py +59 -0
  36. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/equitorial_and_ecliptic.py +167 -0
  37. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/gcrf_to_itrf.py +75 -0
  38. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/gcrf_to_llh.py +55 -0
  39. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/gcrf_to_lonlat.py +25 -0
  40. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/gcrf_to_lunar.py +76 -0
  41. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/gcrf_to_ntw.py +23 -0
  42. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/itrf_to_gcrf.py +67 -0
  43. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/j2000_to_gcrf.py +80 -0
  44. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/llh_to_gcrf.py +45 -0
  45. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/local_and_equitorial.py +130 -0
  46. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/lon_lat_bbox.py +47 -0
  47. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/lonlat_perigee.py +70 -0
  48. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/lunar_position.py +35 -0
  49. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/ntw_to_gcrf.py +35 -0
  50. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/on_sky_distance.py +23 -0
  51. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/sky_angles.py +155 -0
  52. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/surface_rv.py +60 -0
  53. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/unit_conversions.py +137 -0
  54. ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/v_from_r.py +51 -0
  55. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/__init__.py +18 -0
  56. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/converter_json_hdf5.py +219 -0
  57. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/csv_utils.py +340 -0
  58. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/dict_to_from_hdf5.py +315 -0
  59. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/get_memory.py +15 -0
  60. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/guess_delimiter.py +24 -0
  61. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/hdf5_to_csv.py +170 -0
  62. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/hdf5_utils.py +207 -0
  63. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/html_to_gif.py +158 -0
  64. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/io_utils.py +184 -0
  65. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/json_utils.py +99 -0
  66. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/listfiles.py +56 -0
  67. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/pickle_utils.py +13 -0
  68. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/pprint_utils.py +447 -0
  69. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/read_3le.py +351 -0
  70. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/read_3le_by_bit.py +231 -0
  71. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/tle_iter_pairs.py +41 -0
  72. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/tle_prop_to_time.py +67 -0
  73. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/workspace_io.py +306 -0
  74. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/xml_utils.py +265 -0
  75. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/yu_logging.py +68 -0
  76. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/yuchaching.py +344 -0
  77. ssapy_toolkit-1.0.0/ssapy_toolkit/IO/yudata.py +89 -0
  78. ssapy_toolkit-1.0.0/ssapy_toolkit/Integrators/__init__.py +18 -0
  79. ssapy_toolkit-1.0.0/ssapy_toolkit/Integrators/fuel.py +70 -0
  80. ssapy_toolkit-1.0.0/ssapy_toolkit/Integrators/gravity_turn.py +29 -0
  81. ssapy_toolkit-1.0.0/ssapy_toolkit/Integrators/int_utils.py +126 -0
  82. ssapy_toolkit-1.0.0/ssapy_toolkit/Integrators/leap_frog.py +148 -0
  83. ssapy_toolkit-1.0.0/ssapy_toolkit/Integrators/quick_int.py +182 -0
  84. ssapy_toolkit-1.0.0/ssapy_toolkit/Integrators/rk4.py +69 -0
  85. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/__init__.py +18 -0
  86. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/all_orbit_quanities.py +165 -0
  87. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/burn_to_deltav.py +80 -0
  88. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/calculate_finite_burn_acceleration.py +38 -0
  89. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/deltav_to_burn.py +82 -0
  90. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/ellipse_fit.py +734 -0
  91. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/ellipse_from_rv.py +177 -0
  92. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/ellipse_inject.py +9 -0
  93. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/equally_spaced_ta.py +135 -0
  94. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/gamma_and_heading.py +230 -0
  95. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/keplerian.py +1118 -0
  96. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/lagrange_points.py +215 -0
  97. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/launch_pads.py +83 -0
  98. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/misc.py +173 -0
  99. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/orbital_accel_model_comparisons.py +724 -0
  100. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/orbital_comparison_stats.py +1000 -0
  101. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/rv_to_ellipse.py +154 -0
  102. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/synthetic_orbit_population.py +209 -0
  103. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_coplanar.py +144 -0
  104. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_coplanar_continuous.py +120 -0
  105. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_hohmann.py +250 -0
  106. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_inclination_continuous.py +169 -0
  107. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_lambertian.py +216 -0
  108. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_rendezvous.py +141 -0
  109. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_shooter.py +240 -0
  110. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_shooter_continuous.py +0 -0
  111. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_velocity_and_inclination_continuous.py +184 -0
  112. ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_velocity_continuous.py +212 -0
  113. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/__init__.py +18 -0
  114. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/break_plot_lines.py +115 -0
  115. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/build_dashboard.py +74 -0
  116. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/cislunar_plot.py +213 -0
  117. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/cislunar_plot_3d.py +172 -0
  118. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/cislunar_plot_xy.py +199 -0
  119. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/divergence_gif.py +215 -0
  120. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/divergence_plot.py +107 -0
  121. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/figpath.py +87 -0
  122. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/gifify.py +307 -0
  123. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/globe_plot.py +277 -0
  124. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/groundtrack_dashboard.py +264 -0
  125. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/groundtrack_dashboard_gamma_heading.py +247 -0
  126. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/groundtrack_plot.py +352 -0
  127. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/groundtrack_video.py +292 -0
  128. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/misc_plotting.py +371 -0
  129. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/orbit_plot.py +139 -0
  130. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/orbit_plot_rv.py +126 -0
  131. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/orbit_plot_xy.py +223 -0
  132. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/orbit_plot_xyxz.py +249 -0
  133. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/plotutils.py +653 -0
  134. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/rendezvous_plot.py +98 -0
  135. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/set_axes_equal.py +32 -0
  136. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/tracking_plot.py +179 -0
  137. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/transfer_plot.py +147 -0
  138. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/write_gifs.py +222 -0
  139. ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/write_videos.py +117 -0
  140. ssapy_toolkit-1.0.0/ssapy_toolkit/Rockets/__init__.py +18 -0
  141. ssapy_toolkit-1.0.0/ssapy_toolkit/Rockets/fuel.py +162 -0
  142. ssapy_toolkit-1.0.0/ssapy_toolkit/Rockets/rescale_burn.py +59 -0
  143. ssapy_toolkit-1.0.0/ssapy_toolkit/SSAPy_wrappers/__init__.py +18 -0
  144. ssapy_toolkit-1.0.0/ssapy_toolkit/SSAPy_wrappers/accel_ladder.py +80 -0
  145. ssapy_toolkit-1.0.0/ssapy_toolkit/SSAPy_wrappers/sat_kwargs.py +9 -0
  146. ssapy_toolkit-1.0.0/ssapy_toolkit/SSAPy_wrappers/ssapy_orbits.py +246 -0
  147. ssapy_toolkit-1.0.0/ssapy_toolkit/SSAPy_wrappers/ssapy_props.py +141 -0
  148. ssapy_toolkit-1.0.0/ssapy_toolkit/Time_Functions/__init__.py +18 -0
  149. ssapy_toolkit-1.0.0/ssapy_toolkit/Time_Functions/absolute_times_to_relative.py +68 -0
  150. ssapy_toolkit-1.0.0/ssapy_toolkit/Time_Functions/convert_dd_and_dms.py +55 -0
  151. ssapy_toolkit-1.0.0/ssapy_toolkit/Time_Functions/convert_dd_and_hms.py +65 -0
  152. ssapy_toolkit-1.0.0/ssapy_toolkit/Time_Functions/convert_gps_to_TT.py +17 -0
  153. ssapy_toolkit-1.0.0/ssapy_toolkit/Time_Functions/convert_to_gps.py +32 -0
  154. ssapy_toolkit-1.0.0/ssapy_toolkit/Time_Functions/get_times.py +163 -0
  155. ssapy_toolkit-1.0.0/ssapy_toolkit/Time_Functions/now_time.py +15 -0
  156. ssapy_toolkit-1.0.0/ssapy_toolkit/Time_Functions/relative_times_to_absolute.py +72 -0
  157. ssapy_toolkit-1.0.0/ssapy_toolkit/Yastropy/__init__.py +18 -0
  158. ssapy_toolkit-1.0.0/ssapy_toolkit/Yastropy/astropy_gcrf_to_llh.py +50 -0
  159. ssapy_toolkit-1.0.0/ssapy_toolkit/Yastropy/astropy_llh_to_gcrf.py +42 -0
  160. ssapy_toolkit-1.0.0/ssapy_toolkit/Yastropy/astropy_surface_rv.py +39 -0
  161. ssapy_toolkit-1.0.0/ssapy_toolkit/Yastropy/astropy_test.py +43 -0
  162. ssapy_toolkit-1.0.0/ssapy_toolkit/__init__.py +43 -0
  163. ssapy_toolkit-1.0.0/ssapy_toolkit/asteroids.py +168 -0
  164. ssapy_toolkit-1.0.0/ssapy_toolkit/constants.py +123 -0
  165. ssapy_toolkit-1.0.0/ssapy_toolkit/engines.py +195 -0
  166. ssapy_toolkit-1.0.0/ssapy_toolkit/hpc.py +213 -0
  167. ssapy_toolkit-1.0.0/ssapy_toolkit/launch_pads.py +215 -0
  168. ssapy_toolkit-1.0.0/ssapy_toolkit/orbit_initializer.py +72 -0
  169. ssapy_toolkit-1.0.0/ssapy_toolkit/utils.py +662 -0
  170. ssapy_toolkit-1.0.0/ssapy_toolkit/vectors.py +241 -0
  171. ssapy_toolkit-1.0.0/ssapy_toolkit.egg-info/PKG-INFO +182 -0
  172. ssapy_toolkit-1.0.0/ssapy_toolkit.egg-info/SOURCES.txt +175 -0
  173. ssapy_toolkit-1.0.0/ssapy_toolkit.egg-info/dependency_links.txt +1 -0
  174. ssapy_toolkit-1.0.0/ssapy_toolkit.egg-info/requires.txt +47 -0
  175. ssapy_toolkit-1.0.0/ssapy_toolkit.egg-info/top_level.txt +1 -0
  176. ssapy_toolkit-1.0.0/tests/test_demos_easy.py +128 -0
  177. ssapy_toolkit-1.0.0/tests/test_demos_heavy.py +44 -0
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026, Lawrence Livermore National Laboratory
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,182 @@
1
+ Metadata-Version: 2.4
2
+ Name: ssapy-toolkit
3
+ Version: 1.0.0
4
+ Summary: SSAPy Toolkit: extensions for orbital mechanics, plotting, and data IO
5
+ Author-email: "Travis R. Yeager" <yeagerastro@gmail.com>
6
+ License: BSD 3-Clause License
7
+
8
+ Copyright (c) 2026, Lawrence Livermore National Laboratory
9
+
10
+ Redistribution and use in source and binary forms, with or without
11
+ modification, are permitted provided that the following conditions are met:
12
+
13
+ 1. Redistributions of source code must retain the above copyright notice, this
14
+ list of conditions and the following disclaimer.
15
+
16
+ 2. Redistributions in binary form must reproduce the above copyright notice,
17
+ this list of conditions and the following disclaimer in the documentation
18
+ and/or other materials provided with the distribution.
19
+
20
+ 3. Neither the name of the copyright holder nor the names of its
21
+ contributors may be used to endorse or promote products derived from
22
+ this software without specific prior written permission.
23
+
24
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
28
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
+
35
+ Project-URL: Homepage, https://github.com/llnl/SSAPy-Toolkit
36
+ Project-URL: Repository, https://github.com/llnl/SSAPy-Toolkit
37
+ Project-URL: Issues, https://github.com/llnl/SSAPy-Toolkit/issues
38
+ Project-URL: Documentation, https://ssapy-toolkit.readthedocs.io/
39
+ Keywords: orbital-mechanics,astrodynamics,visualization,utilities
40
+ Classifier: Development Status :: 3 - Alpha
41
+ Classifier: Intended Audience :: Science/Research
42
+ Classifier: License :: OSI Approved :: MIT License
43
+ Classifier: Programming Language :: Python :: 3
44
+ Classifier: Programming Language :: Python :: 3 :: Only
45
+ Classifier: Programming Language :: Python :: 3.10
46
+ Classifier: Programming Language :: Python :: 3.11
47
+ Classifier: Programming Language :: Python :: 3.12
48
+ Classifier: Operating System :: OS Independent
49
+ Classifier: Topic :: Scientific/Engineering :: Astronomy
50
+ Classifier: Topic :: Scientific/Engineering :: Visualization
51
+ Requires-Python: >=3.10
52
+ Description-Content-Type: text/markdown
53
+ License-File: LICENSE
54
+ Requires-Dist: astropy
55
+ Requires-Dist: astroquery
56
+ Requires-Dist: corner
57
+ Requires-Dist: emcee
58
+ Requires-Dist: gitpython
59
+ Requires-Dist: h5py
60
+ Requires-Dist: imageio
61
+ Requires-Dist: imageio-ffmpeg
62
+ Requires-Dist: ipykernel
63
+ Requires-Dist: ipympl
64
+ Requires-Dist: ipython
65
+ Requires-Dist: ipytree
66
+ Requires-Dist: ipyvolume
67
+ Requires-Dist: jplephem
68
+ Requires-Dist: llnl-ssapy
69
+ Requires-Dist: lmfit
70
+ Requires-Dist: matplotlib
71
+ Requires-Dist: mpmath
72
+ Requires-Dist: nexusformat
73
+ Requires-Dist: npy-append-array
74
+ Requires-Dist: numpy
75
+ Requires-Dist: opencv-python
76
+ Requires-Dist: pandas
77
+ Requires-Dist: pillow
78
+ Requires-Dist: psutil
79
+ Requires-Dist: pyerfa
80
+ Requires-Dist: PyPDF2
81
+ Requires-Dist: rebound
82
+ Requires-Dist: regex
83
+ Requires-Dist: requests
84
+ Requires-Dist: scikit-learn
85
+ Requires-Dist: seaborn
86
+ Requires-Dist: selenium
87
+ Requires-Dist: sympy
88
+ Requires-Dist: tqdm
89
+ Requires-Dist: spacetrack
90
+ Requires-Dist: vg
91
+ Provides-Extra: dev
92
+ Requires-Dist: pytest; extra == "dev"
93
+ Requires-Dist: pytest-mpi; extra == "dev"
94
+ Requires-Dist: sphinx; extra == "dev"
95
+ Requires-Dist: sphinx-rtd-theme; extra == "dev"
96
+ Requires-Dist: myst-parser<4.0.0; extra == "dev"
97
+ Requires-Dist: ruff; extra == "dev"
98
+ Requires-Dist: build; extra == "dev"
99
+ Requires-Dist: twine; extra == "dev"
100
+ Dynamic: license-file
101
+
102
+ # SSAPy Toolkit
103
+
104
+ **SSAPy Toolkit** (Python package: `ssapy_toolkit`) is a collection of extensions for the SSAPy ecosystem, providing tools for orbital mechanics, plotting, and data IO to support research and engineering workflows.
105
+
106
+ SSAPy itself is a fast, flexible, high-fidelity orbital modeling and analysis tool for orbits spanning from low-Earth orbit into the cislunar regime. It supports rich satellite definitions, multiple element types and coordinate frames, configurable force models (Earth and lunar gravity, radiation pressure, drag, planetary perturbations, maneuvers), a variety of integrators, Monte Carlo and UQ workflows, and extensive ground/space observer and plotting capabilities. See the SSAPy repository for full details:
107
+
108
+ https://github.com/llnl/SSAPy/tree/main
109
+
110
+ ---
111
+
112
+ ## Features
113
+ - Utility functions for orbital mechanics and astrodynamics
114
+ - Coordinate transforms and time conversions
115
+ - Data IO helpers for HDF5, CSV, JSON, and more
116
+ - Plotting helpers for orbits, ground tracks, and dashboards
117
+
118
+ ---
119
+
120
+ ## Installation
121
+
122
+ SSAPy Toolkit is a standard Python package.
123
+
124
+ ```bash
125
+ python -m venv .venv
126
+ source .venv/bin/activate # On Windows: .venv\Scripts\activate
127
+ pip install --upgrade pip
128
+ pip install -e .[dev]
129
+ ```
130
+
131
+ This installs the package in editable mode along with development dependencies (testing, linting, docs tools, etc.).
132
+
133
+ ---
134
+
135
+ ## Usage
136
+
137
+ Once installed, you can import the package in Python:
138
+
139
+ ```python
140
+ import ssapy_toolkit as st
141
+
142
+ from ssapy_toolkit.Orbital_Mechanics import keplerian
143
+ from ssapy_toolkit.Plots import orbit_plot
144
+ ```
145
+
146
+ More detailed examples can be found in the `demos/` directory.
147
+
148
+ ---
149
+
150
+ ## Development
151
+
152
+ To run the test suite:
153
+
154
+ ```bash
155
+ pytest demos
156
+ ```
157
+
158
+ Code formatting and linting are handled via `ruff` (see `pyproject.toml` for configuration).
159
+
160
+ ---
161
+
162
+ ## Documentation
163
+
164
+ Project documentation is built with Sphinx and hosted on Read the Docs.
165
+ Once configured, you will be able to find the latest documentation at:
166
+
167
+ https://ssapy-toolkit.readthedocs.io
168
+
169
+ To build the docs locally (after installing dev dependencies):
170
+
171
+ ```bash
172
+ cd docs
173
+ make html
174
+ ```
175
+
176
+ The built HTML files will be in `docs/_build/html/`.
177
+
178
+ ---
179
+
180
+ ## License
181
+
182
+ This project is licensed under the BSD 3-Clause License. See the `LICENSE` file for details.
@@ -0,0 +1,81 @@
1
+ # SSAPy Toolkit
2
+
3
+ **SSAPy Toolkit** (Python package: `ssapy_toolkit`) is a collection of extensions for the SSAPy ecosystem, providing tools for orbital mechanics, plotting, and data IO to support research and engineering workflows.
4
+
5
+ SSAPy itself is a fast, flexible, high-fidelity orbital modeling and analysis tool for orbits spanning from low-Earth orbit into the cislunar regime. It supports rich satellite definitions, multiple element types and coordinate frames, configurable force models (Earth and lunar gravity, radiation pressure, drag, planetary perturbations, maneuvers), a variety of integrators, Monte Carlo and UQ workflows, and extensive ground/space observer and plotting capabilities. See the SSAPy repository for full details:
6
+
7
+ https://github.com/llnl/SSAPy/tree/main
8
+
9
+ ---
10
+
11
+ ## Features
12
+ - Utility functions for orbital mechanics and astrodynamics
13
+ - Coordinate transforms and time conversions
14
+ - Data IO helpers for HDF5, CSV, JSON, and more
15
+ - Plotting helpers for orbits, ground tracks, and dashboards
16
+
17
+ ---
18
+
19
+ ## Installation
20
+
21
+ SSAPy Toolkit is a standard Python package.
22
+
23
+ ```bash
24
+ python -m venv .venv
25
+ source .venv/bin/activate # On Windows: .venv\Scripts\activate
26
+ pip install --upgrade pip
27
+ pip install -e .[dev]
28
+ ```
29
+
30
+ This installs the package in editable mode along with development dependencies (testing, linting, docs tools, etc.).
31
+
32
+ ---
33
+
34
+ ## Usage
35
+
36
+ Once installed, you can import the package in Python:
37
+
38
+ ```python
39
+ import ssapy_toolkit as st
40
+
41
+ from ssapy_toolkit.Orbital_Mechanics import keplerian
42
+ from ssapy_toolkit.Plots import orbit_plot
43
+ ```
44
+
45
+ More detailed examples can be found in the `demos/` directory.
46
+
47
+ ---
48
+
49
+ ## Development
50
+
51
+ To run the test suite:
52
+
53
+ ```bash
54
+ pytest demos
55
+ ```
56
+
57
+ Code formatting and linting are handled via `ruff` (see `pyproject.toml` for configuration).
58
+
59
+ ---
60
+
61
+ ## Documentation
62
+
63
+ Project documentation is built with Sphinx and hosted on Read the Docs.
64
+ Once configured, you will be able to find the latest documentation at:
65
+
66
+ https://ssapy-toolkit.readthedocs.io
67
+
68
+ To build the docs locally (after installing dev dependencies):
69
+
70
+ ```bash
71
+ cd docs
72
+ make html
73
+ ```
74
+
75
+ The built HTML files will be in `docs/_build/html/`.
76
+
77
+ ---
78
+
79
+ ## License
80
+
81
+ This project is licensed under the BSD 3-Clause License. See the `LICENSE` file for details.
@@ -0,0 +1,90 @@
1
+ [build-system]
2
+ requires = ["setuptools>=69", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "ssapy-toolkit"
7
+ version = "1.0.0"
8
+ description = "SSAPy Toolkit: extensions for orbital mechanics, plotting, and data IO"
9
+ authors = [
10
+ { name = "Travis R. Yeager", email = "yeagerastro@gmail.com" }
11
+ ]
12
+ readme = "README.md"
13
+ requires-python = ">=3.10"
14
+ license = { file = "LICENSE" }
15
+ keywords = ["orbital-mechanics", "astrodynamics", "visualization", "utilities"]
16
+
17
+ classifiers = [
18
+ "Development Status :: 3 - Alpha",
19
+ "Intended Audience :: Science/Research",
20
+ "License :: OSI Approved :: MIT License",
21
+ "Programming Language :: Python :: 3",
22
+ "Programming Language :: Python :: 3 :: Only",
23
+ "Programming Language :: Python :: 3.10",
24
+ "Programming Language :: Python :: 3.11",
25
+ "Programming Language :: Python :: 3.12",
26
+ "Operating System :: OS Independent",
27
+ "Topic :: Scientific/Engineering :: Astronomy",
28
+ "Topic :: Scientific/Engineering :: Visualization",
29
+ ]
30
+
31
+ dependencies = [
32
+ "astropy",
33
+ "astroquery",
34
+ "corner",
35
+ "emcee",
36
+ "gitpython",
37
+ "h5py",
38
+ "imageio",
39
+ "imageio-ffmpeg",
40
+ "ipykernel",
41
+ "ipympl",
42
+ "ipython",
43
+ "ipytree",
44
+ "ipyvolume",
45
+ "jplephem",
46
+ "llnl-ssapy",
47
+ "lmfit",
48
+ "matplotlib",
49
+ "mpmath",
50
+ "nexusformat",
51
+ "npy-append-array",
52
+ "numpy",
53
+ "opencv-python",
54
+ "pandas",
55
+ "pillow",
56
+ "psutil",
57
+ "pyerfa",
58
+ "PyPDF2",
59
+ "rebound",
60
+ "regex",
61
+ "requests",
62
+ "scikit-learn",
63
+ "seaborn",
64
+ "selenium",
65
+ "sympy",
66
+ "tqdm",
67
+ "spacetrack",
68
+ "vg",
69
+ ]
70
+
71
+ [project.optional-dependencies]
72
+ dev = [
73
+ "pytest",
74
+ "pytest-mpi",
75
+ "sphinx",
76
+ "sphinx-rtd-theme",
77
+ "myst-parser<4.0.0",
78
+ "ruff",
79
+ "build",
80
+ "twine",
81
+ ]
82
+
83
+ [project.urls]
84
+ Homepage = "https://github.com/llnl/SSAPy-Toolkit"
85
+ Repository = "https://github.com/llnl/SSAPy-Toolkit"
86
+ Issues = "https://github.com/llnl/SSAPy-Toolkit/issues"
87
+ Documentation = "https://ssapy-toolkit.readthedocs.io/"
88
+
89
+ [tool.setuptools]
90
+ packages = { find = { where = ["."], include = ["ssapy_toolkit*"] } }
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,18 @@
1
+ """Acceleration models and utilities for orbit propagation."""
2
+
3
+ import importlib
4
+ import os
5
+
6
+ # Get the directory of the current file
7
+ sub_dir = os.path.dirname(__file__)
8
+
9
+ # Loop through all Python files in this directory and import their functions
10
+ for filename in os.listdir(sub_dir):
11
+ if filename.endswith(".py") and filename != "__init__.py":
12
+ module_name = f"{__name__}.{filename[:-3]}"
13
+ module = importlib.import_module(module_name)
14
+
15
+ # Add all attributes of the module to the package namespace
16
+ for attr in dir(module):
17
+ if not attr.startswith("_"): # Avoid internal attributes
18
+ globals()[attr] = getattr(module, attr)
@@ -0,0 +1,26 @@
1
+ import numpy as np
2
+
3
+
4
+ def accel_add(*accel_funcs):
5
+ """
6
+ Returns a function that sums multiple acceleration functions.
7
+
8
+ Parameters
9
+ ----------
10
+ accel_funcs : list of functions
11
+ Each must take (r) or (r, t) depending on your usage.
12
+
13
+ Returns
14
+ -------
15
+ combined : function
16
+ A function that evaluates and sums all input accelerations.
17
+ """
18
+ def combined(r, t=None):
19
+ total = np.zeros(3)
20
+ for f in accel_funcs:
21
+ try:
22
+ total += f(r, t)
23
+ except TypeError:
24
+ total += f(r)
25
+ return total
26
+ return combined
@@ -0,0 +1,88 @@
1
+ # ssapy_toolkit/Accelerations/accel_circularize.py
2
+
3
+ import numpy as np
4
+ from ..constants import EARTH_MU, EARTH_RADIUS # [56]
5
+
6
+ _orbit_achieved = False # global variable to track circularization
7
+
8
+
9
+ def reset_orbit_status():
10
+ """Reset the internal latch so circularization thrust can be used again."""
11
+ global _orbit_achieved
12
+ _orbit_achieved = False
13
+
14
+
15
+ def accel_to_circular(r, v, t=None, *, thrust, tol=10.0, min_altitude=100e3):
16
+ """
17
+ Acceleration command that steers (r, v) toward a circular orbit at radius |r|.
18
+
19
+ Designed to be passed into leapfrog(..., accels=[...]) where leapfrog may call
20
+ accelerations as f(r,v,t) (t is accepted but not required here).
21
+
22
+ Parameters
23
+ ----------
24
+ r : array_like, shape (3,)
25
+ Position vector (m).
26
+ v : array_like, shape (3,)
27
+ Velocity vector (m/s).
28
+ t : optional
29
+ Time (ignored; present for integrator compatibility).
30
+ thrust : float
31
+ Magnitude of available acceleration (m/s^2).
32
+ tol : float, optional
33
+ Convergence tolerance on ||v_target - v|| (m/s). Default 10.
34
+ min_altitude : float, optional
35
+ Minimum altitude above Earth's surface to allow control (m). Default 100 km.
36
+
37
+ Returns
38
+ -------
39
+ a : ndarray, shape (3,)
40
+ Acceleration command (m/s^2), or zeros if converged/disabled.
41
+ """
42
+ global _orbit_achieved
43
+
44
+ if _orbit_achieved:
45
+ return np.zeros(3, dtype=float)
46
+
47
+ r = np.asarray(r, dtype=float).reshape(3)
48
+ v = np.asarray(v, dtype=float).reshape(3)
49
+
50
+ r_norm = np.linalg.norm(r)
51
+ if r_norm == 0.0 or thrust == 0.0:
52
+ return np.zeros(3, dtype=float)
53
+
54
+ if r_norm < EARTH_RADIUS + float(min_altitude):
55
+ return np.zeros(3, dtype=float)
56
+
57
+ # Unit radial direction
58
+ r_hat = r / r_norm
59
+
60
+ # Tangential velocity component
61
+ v_r = float(np.dot(v, r_hat))
62
+ v_t_vec = v - v_r * r_hat
63
+ v_t = np.linalg.norm(v_t_vec)
64
+
65
+ if v_t > 0.0:
66
+ t_hat = v_t_vec / v_t
67
+ else:
68
+ # Fallback if velocity is purely radial: pick a consistent tangential direction
69
+ t_hat = np.cross(np.array([0.0, 0.0, 1.0]), r_hat)
70
+ n = np.linalg.norm(t_hat)
71
+ if n == 0.0:
72
+ return np.zeros(3, dtype=float)
73
+ t_hat /= n
74
+
75
+ # Circular speed at current radius
76
+ v_circ = np.sqrt(EARTH_MU / r_norm)
77
+
78
+ # Desired circular velocity vector (purely tangential)
79
+ v_target = v_circ * t_hat
80
+
81
+ dv = v_target - v
82
+ dv_norm = np.linalg.norm(dv)
83
+
84
+ if dv_norm <= float(tol) or dv_norm == 0.0:
85
+ _orbit_achieved = True
86
+ return np.zeros(3, dtype=float)
87
+
88
+ return float(thrust) * (dv / dv_norm)
@@ -0,0 +1,50 @@
1
+ import numpy as np
2
+
3
+ def accel_deltav(dv: float, thrust_accel: float, center_idx: int, dt: float = 1.0) -> dict:
4
+ """
5
+ Build a Δv-based along-track accel profile centered at a given step.
6
+
7
+ Parameters
8
+ ----------
9
+ dv : float
10
+ Signed total Δv to deliver (m/s). (Only its sign matters.)
11
+ thrust_accel : float
12
+ Available constant acceleration magnitude (m/s²). Must be > 0.
13
+ center_idx : int
14
+ Index in your time array where the burn is centered.
15
+ dt : float, optional
16
+ Uniform timestep between your indices (s). Defaults to 1 s.
17
+
18
+ Returns
19
+ -------
20
+ profile : dict
21
+ A dict with keys:
22
+ - 'thrust' : signed acceleration (m/s²)
23
+ - 'start' : start index (int)
24
+ - 'end' : end index (int)
25
+ which you can pass directly to `leapfrog(..., velocity=profile)`.
26
+ """
27
+ if thrust_accel <= 0:
28
+ raise ValueError("`thrust_accel` must be positive")
29
+ if dt <= 0:
30
+ raise ValueError("`dt` must be positive")
31
+
32
+ # total burn time (s) required for |Δv|
33
+ burn_time = abs(dv) / thrust_accel
34
+
35
+ # number of steps (round to nearest int, minimum 1)
36
+ steps = max(1, int(round(burn_time / dt)))
37
+
38
+ # center the burn on center_idx
39
+ half = steps // 2
40
+ start = center_idx - half
41
+ end = start + steps # ensures end - start == steps
42
+
43
+ # signed acceleration to match dv's sign
44
+ signed_accel = thrust_accel * np.sign(dv)
45
+
46
+ return {
47
+ "thrust": signed_accel,
48
+ "start": start,
49
+ "end": end,
50
+ }
@@ -0,0 +1,39 @@
1
+ import numpy as np
2
+
3
+
4
+ def accel_deltav_vector(dv, duration):
5
+ """
6
+ Compute the constant acceleration vector needed to achieve a given Δv in a set time.
7
+
8
+ Parameters
9
+ ----------
10
+ dv : array_like, shape (3,)
11
+ Desired change in velocity vector (m/s).
12
+ duration : float
13
+ Time over which to apply the acceleration (s).
14
+
15
+ Returns
16
+ -------
17
+ thrust : float
18
+ Magnitude of the required acceleration (m/s²).
19
+ direction : ndarray, shape (3,)
20
+ Unit vector indicating acceleration direction.
21
+ a_vec : ndarray, shape (3,)
22
+ Acceleration vector (m/s²) that, when applied constantly over `duration`, yields `dv`.
23
+
24
+ Raises
25
+ ------
26
+ ValueError
27
+ If `duration` is zero or negative.
28
+ """
29
+ dv = np.asarray(dv, dtype=float)
30
+ if duration <= 0:
31
+ raise ValueError("Duration must be positive and non-zero.")
32
+ dv_norm = np.linalg.norm(dv)
33
+ if dv_norm == 0:
34
+ return 0.0, np.zeros(3), np.zeros(3)
35
+
36
+ thrust = dv_norm / duration
37
+ direction = dv / dv_norm
38
+ a_vec = thrust * direction
39
+ return thrust, direction, a_vec