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.
- ssapy_toolkit-1.0.0/LICENSE +28 -0
- ssapy_toolkit-1.0.0/PKG-INFO +182 -0
- ssapy_toolkit-1.0.0/README.md +81 -0
- ssapy_toolkit-1.0.0/pyproject.toml +90 -0
- ssapy_toolkit-1.0.0/setup.cfg +4 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/__init__.py +18 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_add.py +26 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_circularize.py +88 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_deltav.py +50 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_deltav_vector.py +39 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_earth_harmonics.py +172 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_equitorial.py +41 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_inclination.py +40 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_moon.py +46 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_plane.py +44 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_point_earth.py +9 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_radial.py +27 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_sun.py +38 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_uniform_earth.py +31 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Accelerations/accel_velocity.py +25 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/__init__.py +18 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/calculate_errors.py +22 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/fft.py +43 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/find_bounding_cube.py +24 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/generate_sphere_of_vectors.py +102 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/lambertian_magnitude.py +250 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/lyapunov_exponent.py +190 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/mengos.py +31 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/proper_motions.py +107 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/sampling.py +537 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Compute/segment_intersection.py +46 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/__init__.py +18 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/cartesian_to_cylindrical.py +20 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/cartesian_to_spherical.py +22 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/earth_trojan_sim.py +59 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/equitorial_and_ecliptic.py +167 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/gcrf_to_itrf.py +75 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/gcrf_to_llh.py +55 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/gcrf_to_lonlat.py +25 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/gcrf_to_lunar.py +76 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/gcrf_to_ntw.py +23 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/itrf_to_gcrf.py +67 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/j2000_to_gcrf.py +80 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/llh_to_gcrf.py +45 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/local_and_equitorial.py +130 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/lon_lat_bbox.py +47 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/lonlat_perigee.py +70 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/lunar_position.py +35 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/ntw_to_gcrf.py +35 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/on_sky_distance.py +23 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/sky_angles.py +155 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/surface_rv.py +60 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/unit_conversions.py +137 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Coordinates/v_from_r.py +51 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/__init__.py +18 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/converter_json_hdf5.py +219 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/csv_utils.py +340 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/dict_to_from_hdf5.py +315 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/get_memory.py +15 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/guess_delimiter.py +24 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/hdf5_to_csv.py +170 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/hdf5_utils.py +207 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/html_to_gif.py +158 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/io_utils.py +184 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/json_utils.py +99 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/listfiles.py +56 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/pickle_utils.py +13 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/pprint_utils.py +447 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/read_3le.py +351 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/read_3le_by_bit.py +231 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/tle_iter_pairs.py +41 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/tle_prop_to_time.py +67 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/workspace_io.py +306 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/xml_utils.py +265 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/yu_logging.py +68 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/yuchaching.py +344 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/IO/yudata.py +89 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Integrators/__init__.py +18 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Integrators/fuel.py +70 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Integrators/gravity_turn.py +29 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Integrators/int_utils.py +126 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Integrators/leap_frog.py +148 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Integrators/quick_int.py +182 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Integrators/rk4.py +69 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/__init__.py +18 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/all_orbit_quanities.py +165 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/burn_to_deltav.py +80 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/calculate_finite_burn_acceleration.py +38 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/deltav_to_burn.py +82 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/ellipse_fit.py +734 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/ellipse_from_rv.py +177 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/ellipse_inject.py +9 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/equally_spaced_ta.py +135 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/gamma_and_heading.py +230 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/keplerian.py +1118 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/lagrange_points.py +215 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/launch_pads.py +83 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/misc.py +173 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/orbital_accel_model_comparisons.py +724 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/orbital_comparison_stats.py +1000 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/rv_to_ellipse.py +154 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/synthetic_orbit_population.py +209 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_coplanar.py +144 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_coplanar_continuous.py +120 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_hohmann.py +250 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_inclination_continuous.py +169 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_lambertian.py +216 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_rendezvous.py +141 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_shooter.py +240 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_shooter_continuous.py +0 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_velocity_and_inclination_continuous.py +184 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Orbital_Mechanics/transfer_velocity_continuous.py +212 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/__init__.py +18 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/break_plot_lines.py +115 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/build_dashboard.py +74 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/cislunar_plot.py +213 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/cislunar_plot_3d.py +172 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/cislunar_plot_xy.py +199 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/divergence_gif.py +215 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/divergence_plot.py +107 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/figpath.py +87 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/gifify.py +307 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/globe_plot.py +277 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/groundtrack_dashboard.py +264 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/groundtrack_dashboard_gamma_heading.py +247 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/groundtrack_plot.py +352 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/groundtrack_video.py +292 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/misc_plotting.py +371 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/orbit_plot.py +139 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/orbit_plot_rv.py +126 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/orbit_plot_xy.py +223 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/orbit_plot_xyxz.py +249 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/plotutils.py +653 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/rendezvous_plot.py +98 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/set_axes_equal.py +32 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/tracking_plot.py +179 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/transfer_plot.py +147 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/write_gifs.py +222 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Plots/write_videos.py +117 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Rockets/__init__.py +18 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Rockets/fuel.py +162 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Rockets/rescale_burn.py +59 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/SSAPy_wrappers/__init__.py +18 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/SSAPy_wrappers/accel_ladder.py +80 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/SSAPy_wrappers/sat_kwargs.py +9 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/SSAPy_wrappers/ssapy_orbits.py +246 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/SSAPy_wrappers/ssapy_props.py +141 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Time_Functions/__init__.py +18 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Time_Functions/absolute_times_to_relative.py +68 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Time_Functions/convert_dd_and_dms.py +55 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Time_Functions/convert_dd_and_hms.py +65 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Time_Functions/convert_gps_to_TT.py +17 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Time_Functions/convert_to_gps.py +32 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Time_Functions/get_times.py +163 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Time_Functions/now_time.py +15 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Time_Functions/relative_times_to_absolute.py +72 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Yastropy/__init__.py +18 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Yastropy/astropy_gcrf_to_llh.py +50 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Yastropy/astropy_llh_to_gcrf.py +42 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Yastropy/astropy_surface_rv.py +39 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/Yastropy/astropy_test.py +43 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/__init__.py +43 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/asteroids.py +168 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/constants.py +123 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/engines.py +195 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/hpc.py +213 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/launch_pads.py +215 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/orbit_initializer.py +72 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/utils.py +662 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit/vectors.py +241 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit.egg-info/PKG-INFO +182 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit.egg-info/SOURCES.txt +175 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit.egg-info/dependency_links.txt +1 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit.egg-info/requires.txt +47 -0
- ssapy_toolkit-1.0.0/ssapy_toolkit.egg-info/top_level.txt +1 -0
- ssapy_toolkit-1.0.0/tests/test_demos_easy.py +128 -0
- 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,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
|