satkit 0.9.0__tar.gz → 0.9.1__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.
- {satkit-0.9.0 → satkit-0.9.1}/.github/workflows/build.yml +6 -6
- {satkit-0.9.0 → satkit-0.9.1}/CHANGES.md +9 -0
- {satkit-0.9.0 → satkit-0.9.1}/Cargo.toml +5 -4
- {satkit-0.9.0 → satkit-0.9.1}/PKG-INFO +15 -10
- {satkit-0.9.0 → satkit-0.9.1}/README.md +14 -9
- {satkit-0.9.0 → satkit-0.9.1}/pyproject.toml +1 -1
- {satkit-0.9.0 → satkit-0.9.1}/python/requirements.txt +1 -1
- {satkit-0.9.0 → satkit-0.9.1}/python/satkit/_version.py +2 -2
- {satkit-0.9.0 → satkit-0.9.1}/python/satkit.egg-info/PKG-INFO +15 -10
- {satkit-0.9.0 → satkit-0.9.1}/python/satkit.egg-info/SOURCES.txt +2 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/earth_orientation_params.rs +8 -8
- {satkit-0.9.0 → satkit-0.9.1}/src/frametransform/mod.rs +16 -16
- {satkit-0.9.0 → satkit-0.9.1}/src/frametransform/qcirs2gcrs.rs +4 -4
- {satkit-0.9.0 → satkit-0.9.1}/src/itrfcoord.rs +1 -1
- {satkit-0.9.0 → satkit-0.9.1}/src/jplephem.rs +21 -26
- {satkit-0.9.0 → satkit-0.9.1}/src/lib.rs +6 -1
- {satkit-0.9.0 → satkit-0.9.1}/src/lpephem/moon.rs +16 -10
- {satkit-0.9.0 → satkit-0.9.1}/src/lpephem/planets.rs +5 -3
- {satkit-0.9.0 → satkit-0.9.1}/src/lpephem/sun.rs +13 -8
- {satkit-0.9.0 → satkit-0.9.1}/src/nrlmsise.rs +9 -5
- {satkit-0.9.0 → satkit-0.9.1}/src/orbitprop/drag.rs +3 -3
- {satkit-0.9.0 → satkit-0.9.1}/src/orbitprop/precomputed.rs +8 -4
- {satkit-0.9.0 → satkit-0.9.1}/src/orbitprop/propagator.rs +40 -19
- {satkit-0.9.0 → satkit-0.9.1}/src/orbitprop/satstate.rs +69 -9
- {satkit-0.9.0 → satkit-0.9.1}/src/orbitprop/settings.rs +2 -2
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pydensity.rs +2 -2
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pynrlmsise.rs +7 -1
- {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/sgp4_impl.rs +23 -18
- {satkit-0.9.0 → satkit-0.9.1}/src/spaceweather.rs +6 -4
- satkit-0.9.1/src/time/chrono.rs +165 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/time/duration.rs +7 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/time/mod.rs +5 -0
- satkit-0.9.1/src/time/timelike.rs +56 -0
- {satkit-0.9.0 → satkit-0.9.1}/.github/workflows/wheels.yml +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/.gitignore +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/.readthedocs.yaml +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/CONTRIBUTING.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/LICENSE +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/MANIFEST.in +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/build.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/extern/nrlmsise/DOCUMENTATION +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/extern/nrlmsise/nrlmsise-00.c +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/extern/nrlmsise/nrlmsise-00.h +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/extern/nrlmsise/nrlmsise-00_data.c +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/Pipfile +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/Makefile +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/jsdoc_config.json +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/jsdoc_plugin.js +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/make.bat +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/TLE.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/_static/density_vs_solar_cycle.svg +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/_static/force_vs_altitude.svg +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/_static/theme_mods.css +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/consts.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/density.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/earthgravity.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/frametransform.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/itrfcoord.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/jplephem.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/kepler.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/quaternion.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/satprop.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/satstate.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/time.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/tle.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/utils.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/conf.py +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/datafiles.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/density.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/examples/Eclipse.ipynb +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/examples/High Precision Propagation.ipynb +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/examples/ITRF Coordinates.ipynb +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/examples/Orbital Mean-Element Message.ipynb +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/examples/Plots.ipynb +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/examples/Satellite Ground Contacts.ipynb +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/examples/TLE Fitting.ipynb +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/examples/Two-Line Element Set.ipynb +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/examples/riseset.ipynb +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/frametransform.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/index.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/install.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/itrfcoord.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/quaternion.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/references.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/satprop.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/satstate.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/time.md +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/satkit/__init__.py +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/satkit/__init__.pyi +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/satkit/density.pyi +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/satkit/frametransform.pyi +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/satkit/jplephem.pyi +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/satkit/moon.pyi +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/satkit/planets.pyi +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/satkit/py.typed +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/satkit/satkit.pyi +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/satkit/sun.pyi +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/satkit/utils.pyi +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/satkit.egg-info/dependency_links.txt +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/satkit.egg-info/requires.txt +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/satkit.egg-info/top_level.txt +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/test/download_data.py +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/test/download_from_json.py +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/test/download_testvecs.py +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/test/sp3file.py +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/python/test/test.py +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/setup.cfg +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/consts.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/earthgravity.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/filters/mod.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/filters/ukf.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/frames.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/frametransform/ierstable.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/kepler.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/lpephem/mod.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/mathtypes.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/mod.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkf45.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkts54.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv65.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv65_table.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv87.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv87_table.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv98.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv98_efficient.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv98_efficient_table.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv98_nointerp.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv98_nointerp_table.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv98_table.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/mod.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/nalgebra_bindings.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/ode_tests.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/rk_adaptive.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/rk_adaptive_settings.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/rk_explicit.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/ode/types.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/omm/mod.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/orbitprop/mod.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/orbitprop/point_gravity.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/orbitprop/satproperties.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/mod.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/mod_utils.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyconsts.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyduration.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyframes.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyframetransform.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pygravity.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyinstant.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyitrfcoord.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyjplephem.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pykepler.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pylpephem_moon.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pylpephem_planets.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pylpephem_sun.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pympsuccess.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pypropagate.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pypropresult.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pypropsettings.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyquaternion.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pysatproperties.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pysatstate.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pysgp4.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pysolarsystem.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pytle.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyukf.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyutils.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/dpper.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/dscom.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/dsinit.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/dspace.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/getgravconst.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/initl.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/mod.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/satrec.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/sgp4_lowlevel.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/sgp4init.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/solarsystem.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/time/instant.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/time/instant_err.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/time/instant_ops.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/time/instantparse.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/time/tests.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/time/timescale.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/time/weekday.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/tle/fitting.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/tle/mod.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/utils/datadir.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/utils/download.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/utils/mod.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/utils/pypackage.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/utils/test.rs +0 -0
- {satkit-0.9.0 → satkit-0.9.1}/src/utils/update_data.rs +0 -0
|
@@ -64,7 +64,7 @@ jobs:
|
|
|
64
64
|
run: |
|
|
65
65
|
python -m pip install requests
|
|
66
66
|
python python/test/download_data.py ${{matrix.data_path}}
|
|
67
|
-
|
|
67
|
+
|
|
68
68
|
|
|
69
69
|
# Try to recover satkit test vectors from cache
|
|
70
70
|
- name: Cache Satkit Test Vectors
|
|
@@ -79,7 +79,7 @@ jobs:
|
|
|
79
79
|
- name: Download Satkit Test Vectors
|
|
80
80
|
if: steps.cache-satkit-testvecs.outputs.cache-hit != 'true'
|
|
81
81
|
run: |
|
|
82
|
-
python -m pip install requests
|
|
82
|
+
python -m pip install requests
|
|
83
83
|
python python/test/download_testvecs.py ${{matrix.testvec_path}}
|
|
84
84
|
|
|
85
85
|
- name: Cargo Cache
|
|
@@ -91,16 +91,16 @@ jobs:
|
|
|
91
91
|
~/.cargo/registry/index/
|
|
92
92
|
~/.cargo/registry/cache/
|
|
93
93
|
~/.cargo/git/db/
|
|
94
|
-
target/
|
|
94
|
+
target/
|
|
95
95
|
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
|
96
96
|
restore-keys: ${{ runner.os }}-cargo-
|
|
97
97
|
|
|
98
98
|
- name: Build
|
|
99
99
|
run: cargo build --release
|
|
100
|
-
|
|
100
|
+
|
|
101
101
|
- name: Test
|
|
102
|
-
run: cargo test
|
|
102
|
+
run: cargo test --features chrono
|
|
103
103
|
|
|
104
104
|
- name: Doc
|
|
105
|
-
run: cargo doc --no-deps
|
|
105
|
+
run: cargo doc --no-deps
|
|
106
106
|
|
|
@@ -155,3 +155,12 @@
|
|
|
155
155
|
- add "as_datetime" function in python for satkit.time (for consistent nomenclature)
|
|
156
156
|
- Rename time-interval boundary nomenclature from `start/stop` to `begin/end` across Rust + Python APIs (including propagation functions and related settings/results).
|
|
157
157
|
|
|
158
|
+
|
|
159
|
+
## Rust 0.9.1
|
|
160
|
+
- Functions that accept time as input now accept structs that implement the new `TimeLike` trait.
|
|
161
|
+
- Add a `chrono` feature that enables interoperability with the chrono crate. implement `TimeLike` for `chrono::DateTime`
|
|
162
|
+
|
|
163
|
+
## Rust 0.9.2, Python 0.9.1
|
|
164
|
+
- bugfix: handle high-precision propagation without error when duration is zero
|
|
165
|
+
- Fix Rust documentation for SGP4 to accurately represent sgp4 source
|
|
166
|
+
- Add a "zero" static function for duration to represent zero duration
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "satkit"
|
|
3
|
-
version = "0.9.
|
|
3
|
+
version = "0.9.2"
|
|
4
4
|
edition = "2021"
|
|
5
5
|
description = "Satellite Toolkit"
|
|
6
6
|
readme = "README.md"
|
|
@@ -39,11 +39,11 @@ serde-pickle = "1.2.0"
|
|
|
39
39
|
itertools = "0.14.0"
|
|
40
40
|
anyhow = "1"
|
|
41
41
|
rmpfit = "0.3.0"
|
|
42
|
-
|
|
42
|
+
chrono = { version = "0.4", optional = true }
|
|
43
43
|
|
|
44
44
|
[build-dependencies]
|
|
45
45
|
cc = { version = "1.2", features = ["parallel"] }
|
|
46
|
-
chrono = "0.4
|
|
46
|
+
chrono = "0.4"
|
|
47
47
|
pyo3-build-config = { version = "0.27.1", optional = true }
|
|
48
48
|
|
|
49
49
|
[dev-dependencies]
|
|
@@ -52,7 +52,8 @@ approx = "0.5"
|
|
|
52
52
|
rand_distr = "0.5.1"
|
|
53
53
|
|
|
54
54
|
[features]
|
|
55
|
-
pybindings = ["pyo3", "numpy", "pyo3-build-config"]
|
|
55
|
+
pybindings = ["dep:pyo3", "dep:numpy", "dep:pyo3-build-config"]
|
|
56
|
+
chrono = ["dep:chrono"]
|
|
56
57
|
|
|
57
58
|
[profile.test]
|
|
58
59
|
opt-level = 3
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: satkit
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.1
|
|
4
4
|
Summary: Satellite Orbital Dynamics Toolkit
|
|
5
5
|
Author-email: Steven Michael <ssmichael@gmail.com>
|
|
6
6
|
Maintainer-email: Steven Michael <ssmichael@gmail.com>
|
|
@@ -77,13 +77,18 @@ Satkit provides robust, high-performance satellite orbital mechanics calculation
|
|
|
77
77
|
- Python versions 3.8 through 3.14 supported
|
|
78
78
|
- Full documentation at <https://satellite-toolkit.readthedocs.io/latest/>
|
|
79
79
|
|
|
80
|
+
## Optional Features
|
|
81
|
+
|
|
82
|
+
- **chrono**: Enables interoperability with `chrono::DateTime` by implementing the `TimeLike` trait.
|
|
83
|
+
Activate with Cargo feature `chrono`.
|
|
84
|
+
|
|
80
85
|
## Key Capabilities
|
|
81
86
|
|
|
82
87
|
### Coordinate Frame Transformations
|
|
83
88
|
High-precision conversions between multiple reference frames with full support for time-varying Earth orientation:
|
|
84
89
|
- **ITRF** - International Terrestrial Reference Frame (Earth-fixed)
|
|
85
90
|
- **GCRF** - Geocentric Celestial Reference Frame using IAU-2000/2006 reduction (inertial)
|
|
86
|
-
- **TEME** - True Equinox Mean Equator frame used in SGP4 propagation
|
|
91
|
+
- **TEME** - True Equinox Mean Equator frame used in SGP4 propagation (almost inertial)
|
|
87
92
|
- **CIRF** - Celestial Intermediate Reference Frame (IAU-2006 intermediate)
|
|
88
93
|
- **TIRF** - Terrestrial Intermediate Reference Frame (Earth-rotation intermediate)
|
|
89
94
|
- **Geodetic** - Latitude, longitude, altitude with WGS-84 ellipsoid
|
|
@@ -98,7 +103,7 @@ Multiple propagation methods optimized for different accuracy and performance re
|
|
|
98
103
|
- Full AFSPC and improved mode support
|
|
99
104
|
- TLE fitting from high-precision states with drag estimation
|
|
100
105
|
- Batch processing for multiple satellites
|
|
101
|
-
- Support TLE and Orbital Mean-Element Messages
|
|
106
|
+
- Support TLE and Orbital Mean-Element Messages inputs
|
|
102
107
|
- **Keplerian**: Fast analytical two-body propagation for preliminary analysis
|
|
103
108
|
|
|
104
109
|
### Numerical Integration Force Models
|
|
@@ -125,21 +130,21 @@ Access to high-precision solar system body positions:
|
|
|
125
130
|
Comprehensive support for all standard astronomical time scales:
|
|
126
131
|
- **UTC** - Coordinated Universal Time with leap second handling
|
|
127
132
|
- **TAI** - International Atomic Time
|
|
128
|
-
- **TT**
|
|
133
|
+
- **TT** - Terrestrial Time
|
|
129
134
|
- **TDB** - Barycentric Dynamical Time
|
|
130
135
|
- **UT1** - Universal Time with Earth orientation corrections
|
|
131
136
|
- **GPS** - GPS Time
|
|
132
137
|
- Automatic conversion between all time scales with microsecond precision
|
|
133
138
|
|
|
134
139
|
### Geodetic Utilities
|
|
135
|
-
- **Geodesic Calculations
|
|
136
|
-
- **Coordinate Conversions
|
|
137
|
-
- **Elevation/Azimuth
|
|
140
|
+
- **Geodesic Calculations** - Accurate distance and azimuth between ground locations using Vincenty's formulae
|
|
141
|
+
- **Coordinate Conversions** - ITRF ↔ Geodetic ↔ East-North-Up ↔ North-East-Down
|
|
142
|
+
- **Elevation/Azimuth** - Topocentric coordinate transformations for ground station analysis
|
|
138
143
|
|
|
139
144
|
### Sun / Moon Calculations
|
|
140
|
-
- **Sun rise / set
|
|
141
|
-
- **Moon Phase
|
|
142
|
-
- **Ephemeris
|
|
145
|
+
- **Sun rise / set** - Compute sun rise / set times as function of day & location
|
|
146
|
+
- **Moon Phase** - Phase of moon and fraction illuminated
|
|
147
|
+
- **Ephemeris** - Fast low-precision ephemeris for sun & moon
|
|
143
148
|
|
|
144
149
|
## Technical Details
|
|
145
150
|
|
|
@@ -30,13 +30,18 @@ Satkit provides robust, high-performance satellite orbital mechanics calculation
|
|
|
30
30
|
- Python versions 3.8 through 3.14 supported
|
|
31
31
|
- Full documentation at <https://satellite-toolkit.readthedocs.io/latest/>
|
|
32
32
|
|
|
33
|
+
## Optional Features
|
|
34
|
+
|
|
35
|
+
- **chrono**: Enables interoperability with `chrono::DateTime` by implementing the `TimeLike` trait.
|
|
36
|
+
Activate with Cargo feature `chrono`.
|
|
37
|
+
|
|
33
38
|
## Key Capabilities
|
|
34
39
|
|
|
35
40
|
### Coordinate Frame Transformations
|
|
36
41
|
High-precision conversions between multiple reference frames with full support for time-varying Earth orientation:
|
|
37
42
|
- **ITRF** - International Terrestrial Reference Frame (Earth-fixed)
|
|
38
43
|
- **GCRF** - Geocentric Celestial Reference Frame using IAU-2000/2006 reduction (inertial)
|
|
39
|
-
- **TEME** - True Equinox Mean Equator frame used in SGP4 propagation
|
|
44
|
+
- **TEME** - True Equinox Mean Equator frame used in SGP4 propagation (almost inertial)
|
|
40
45
|
- **CIRF** - Celestial Intermediate Reference Frame (IAU-2006 intermediate)
|
|
41
46
|
- **TIRF** - Terrestrial Intermediate Reference Frame (Earth-rotation intermediate)
|
|
42
47
|
- **Geodetic** - Latitude, longitude, altitude with WGS-84 ellipsoid
|
|
@@ -51,7 +56,7 @@ Multiple propagation methods optimized for different accuracy and performance re
|
|
|
51
56
|
- Full AFSPC and improved mode support
|
|
52
57
|
- TLE fitting from high-precision states with drag estimation
|
|
53
58
|
- Batch processing for multiple satellites
|
|
54
|
-
- Support TLE and Orbital Mean-Element Messages
|
|
59
|
+
- Support TLE and Orbital Mean-Element Messages inputs
|
|
55
60
|
- **Keplerian**: Fast analytical two-body propagation for preliminary analysis
|
|
56
61
|
|
|
57
62
|
### Numerical Integration Force Models
|
|
@@ -78,21 +83,21 @@ Access to high-precision solar system body positions:
|
|
|
78
83
|
Comprehensive support for all standard astronomical time scales:
|
|
79
84
|
- **UTC** - Coordinated Universal Time with leap second handling
|
|
80
85
|
- **TAI** - International Atomic Time
|
|
81
|
-
- **TT**
|
|
86
|
+
- **TT** - Terrestrial Time
|
|
82
87
|
- **TDB** - Barycentric Dynamical Time
|
|
83
88
|
- **UT1** - Universal Time with Earth orientation corrections
|
|
84
89
|
- **GPS** - GPS Time
|
|
85
90
|
- Automatic conversion between all time scales with microsecond precision
|
|
86
91
|
|
|
87
92
|
### Geodetic Utilities
|
|
88
|
-
- **Geodesic Calculations
|
|
89
|
-
- **Coordinate Conversions
|
|
90
|
-
- **Elevation/Azimuth
|
|
93
|
+
- **Geodesic Calculations** - Accurate distance and azimuth between ground locations using Vincenty's formulae
|
|
94
|
+
- **Coordinate Conversions** - ITRF ↔ Geodetic ↔ East-North-Up ↔ North-East-Down
|
|
95
|
+
- **Elevation/Azimuth** - Topocentric coordinate transformations for ground station analysis
|
|
91
96
|
|
|
92
97
|
### Sun / Moon Calculations
|
|
93
|
-
- **Sun rise / set
|
|
94
|
-
- **Moon Phase
|
|
95
|
-
- **Ephemeris
|
|
98
|
+
- **Sun rise / set** - Compute sun rise / set times as function of day & location
|
|
99
|
+
- **Moon Phase** - Phase of moon and fraction illuminated
|
|
100
|
+
- **Ephemeris** - Fast low-precision ephemeris for sun & moon
|
|
96
101
|
|
|
97
102
|
## Technical Details
|
|
98
103
|
|
|
@@ -9,7 +9,7 @@ requires-python = ">= 3.8"
|
|
|
9
9
|
authors = [{ name = "Steven Michael", email = "ssmichael@gmail.com" }]
|
|
10
10
|
maintainers = [{ name = "Steven Michael", email = "ssmichael@gmail.com" }]
|
|
11
11
|
readme = "README.md"
|
|
12
|
-
version = "0.9.
|
|
12
|
+
version = "0.9.1"
|
|
13
13
|
license = { file = "LICENSE" }
|
|
14
14
|
description = "Satellite Orbital Dynamics Toolkit"
|
|
15
15
|
keywords = [
|
|
@@ -103,7 +103,7 @@ rfc3986-validator==0.1.1; python_version >= '2.7' and python_version not in '3.0
|
|
|
103
103
|
rpds-py==0.22.3; python_version >= '3.9'
|
|
104
104
|
rsa==4.9; python_version >= '3.6'
|
|
105
105
|
satkit-data==0.8.0; python_version >= '3.8'
|
|
106
|
-
satkit==0.9.
|
|
106
|
+
satkit==0.9.1; python_version >= '3.8'
|
|
107
107
|
scipy==1.16.2; python_version >= '3.10'
|
|
108
108
|
send2trash==1.8.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'
|
|
109
109
|
setuptools==75.8.0; python_version >= '3.9'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: satkit
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.1
|
|
4
4
|
Summary: Satellite Orbital Dynamics Toolkit
|
|
5
5
|
Author-email: Steven Michael <ssmichael@gmail.com>
|
|
6
6
|
Maintainer-email: Steven Michael <ssmichael@gmail.com>
|
|
@@ -77,13 +77,18 @@ Satkit provides robust, high-performance satellite orbital mechanics calculation
|
|
|
77
77
|
- Python versions 3.8 through 3.14 supported
|
|
78
78
|
- Full documentation at <https://satellite-toolkit.readthedocs.io/latest/>
|
|
79
79
|
|
|
80
|
+
## Optional Features
|
|
81
|
+
|
|
82
|
+
- **chrono**: Enables interoperability with `chrono::DateTime` by implementing the `TimeLike` trait.
|
|
83
|
+
Activate with Cargo feature `chrono`.
|
|
84
|
+
|
|
80
85
|
## Key Capabilities
|
|
81
86
|
|
|
82
87
|
### Coordinate Frame Transformations
|
|
83
88
|
High-precision conversions between multiple reference frames with full support for time-varying Earth orientation:
|
|
84
89
|
- **ITRF** - International Terrestrial Reference Frame (Earth-fixed)
|
|
85
90
|
- **GCRF** - Geocentric Celestial Reference Frame using IAU-2000/2006 reduction (inertial)
|
|
86
|
-
- **TEME** - True Equinox Mean Equator frame used in SGP4 propagation
|
|
91
|
+
- **TEME** - True Equinox Mean Equator frame used in SGP4 propagation (almost inertial)
|
|
87
92
|
- **CIRF** - Celestial Intermediate Reference Frame (IAU-2006 intermediate)
|
|
88
93
|
- **TIRF** - Terrestrial Intermediate Reference Frame (Earth-rotation intermediate)
|
|
89
94
|
- **Geodetic** - Latitude, longitude, altitude with WGS-84 ellipsoid
|
|
@@ -98,7 +103,7 @@ Multiple propagation methods optimized for different accuracy and performance re
|
|
|
98
103
|
- Full AFSPC and improved mode support
|
|
99
104
|
- TLE fitting from high-precision states with drag estimation
|
|
100
105
|
- Batch processing for multiple satellites
|
|
101
|
-
- Support TLE and Orbital Mean-Element Messages
|
|
106
|
+
- Support TLE and Orbital Mean-Element Messages inputs
|
|
102
107
|
- **Keplerian**: Fast analytical two-body propagation for preliminary analysis
|
|
103
108
|
|
|
104
109
|
### Numerical Integration Force Models
|
|
@@ -125,21 +130,21 @@ Access to high-precision solar system body positions:
|
|
|
125
130
|
Comprehensive support for all standard astronomical time scales:
|
|
126
131
|
- **UTC** - Coordinated Universal Time with leap second handling
|
|
127
132
|
- **TAI** - International Atomic Time
|
|
128
|
-
- **TT**
|
|
133
|
+
- **TT** - Terrestrial Time
|
|
129
134
|
- **TDB** - Barycentric Dynamical Time
|
|
130
135
|
- **UT1** - Universal Time with Earth orientation corrections
|
|
131
136
|
- **GPS** - GPS Time
|
|
132
137
|
- Automatic conversion between all time scales with microsecond precision
|
|
133
138
|
|
|
134
139
|
### Geodetic Utilities
|
|
135
|
-
- **Geodesic Calculations
|
|
136
|
-
- **Coordinate Conversions
|
|
137
|
-
- **Elevation/Azimuth
|
|
140
|
+
- **Geodesic Calculations** - Accurate distance and azimuth between ground locations using Vincenty's formulae
|
|
141
|
+
- **Coordinate Conversions** - ITRF ↔ Geodetic ↔ East-North-Up ↔ North-East-Down
|
|
142
|
+
- **Elevation/Azimuth** - Topocentric coordinate transformations for ground station analysis
|
|
138
143
|
|
|
139
144
|
### Sun / Moon Calculations
|
|
140
|
-
- **Sun rise / set
|
|
141
|
-
- **Moon Phase
|
|
142
|
-
- **Ephemeris
|
|
145
|
+
- **Sun rise / set** - Compute sun rise / set times as function of day & location
|
|
146
|
+
- **Moon Phase** - Phase of moon and fraction illuminated
|
|
147
|
+
- **Ephemeris** - Fast low-precision ephemeris for sun & moon
|
|
143
148
|
|
|
144
149
|
## Technical Details
|
|
145
150
|
|
|
@@ -169,6 +169,7 @@ src/sgp4/satrec.rs
|
|
|
169
169
|
src/sgp4/sgp4_impl.rs
|
|
170
170
|
src/sgp4/sgp4_lowlevel.rs
|
|
171
171
|
src/sgp4/sgp4init.rs
|
|
172
|
+
src/time/chrono.rs
|
|
172
173
|
src/time/duration.rs
|
|
173
174
|
src/time/instant.rs
|
|
174
175
|
src/time/instant_err.rs
|
|
@@ -176,6 +177,7 @@ src/time/instant_ops.rs
|
|
|
176
177
|
src/time/instantparse.rs
|
|
177
178
|
src/time/mod.rs
|
|
178
179
|
src/time/tests.rs
|
|
180
|
+
src/time/timelike.rs
|
|
179
181
|
src/time/timescale.rs
|
|
180
182
|
src/time/weekday.rs
|
|
181
183
|
src/tle/fitting.rs
|
|
@@ -178,7 +178,7 @@ pub fn update() -> Result<()> {
|
|
|
178
178
|
let d = datadir()?;
|
|
179
179
|
if d.metadata()?.permissions().readonly() {
|
|
180
180
|
bail!(
|
|
181
|
-
r#"Data directory is read-only.
|
|
181
|
+
r#"Data directory is read-only.
|
|
182
182
|
Try setting the environment variable SATKIT_DATA
|
|
183
183
|
to a writeable directory and re-starting or explicitly set
|
|
184
184
|
data directory"#
|
|
@@ -236,7 +236,7 @@ pub fn eop_from_mjd_utc(mjd_utc: f64) -> Option<[f64; 6]> {
|
|
|
236
236
|
|
|
237
237
|
This warning will only be shown once for each library load.
|
|
238
238
|
|
|
239
|
-
To disable this warning, run `satkit.frametransform.disable_eop_time_warning()`
|
|
239
|
+
To disable this warning, run `satkit.frametransform.disable_eop_time_warning()`
|
|
240
240
|
",
|
|
241
241
|
mjd_utc
|
|
242
242
|
);
|
|
@@ -251,7 +251,7 @@ pub fn eop_from_mjd_utc(mjd_utc: f64) -> Option<[f64; 6]> {
|
|
|
251
251
|
|
|
252
252
|
This warning will only be shown once for each library load.
|
|
253
253
|
|
|
254
|
-
To disable this warning, run `satkit::earth_orientation_params::disable_eop_time_warning()`
|
|
254
|
+
To disable this warning, run `satkit::earth_orientation_params::disable_eop_time_warning()`
|
|
255
255
|
",
|
|
256
256
|
mjd_utc
|
|
257
257
|
);
|
|
@@ -269,10 +269,10 @@ pub fn eop_from_mjd_utc(mjd_utc: f64) -> Option<[f64; 6]> {
|
|
|
269
269
|
eprintln!(
|
|
270
270
|
r"
|
|
271
271
|
Warning: EOP data not available for MJD UTC = {} (too early).
|
|
272
|
-
|
|
272
|
+
|
|
273
273
|
This warning will only be shown once for each library load.
|
|
274
274
|
|
|
275
|
-
To disable this warning, run `satkit.frametransform.disable_eop_time_warning()`
|
|
275
|
+
To disable this warning, run `satkit.frametransform.disable_eop_time_warning()`
|
|
276
276
|
",
|
|
277
277
|
mjd_utc
|
|
278
278
|
);
|
|
@@ -280,11 +280,11 @@ pub fn eop_from_mjd_utc(mjd_utc: f64) -> Option<[f64; 6]> {
|
|
|
280
280
|
#[cfg(not(feature = "pybindings"))]
|
|
281
281
|
eprintln!(
|
|
282
282
|
"
|
|
283
|
-
Warning: EOP data not available for MJD UTC = {} (too early).
|
|
283
|
+
Warning: EOP data not available for MJD UTC = {} (too early).
|
|
284
284
|
|
|
285
285
|
This warning will only be shown once for each library load.
|
|
286
286
|
|
|
287
|
-
To disable this warning, run `satkit::earth_orientation_params::disable_eop_time_warning()`
|
|
287
|
+
To disable this warning, run `satkit::earth_orientation_params::disable_eop_time_warning()`
|
|
288
288
|
",
|
|
289
289
|
mjd_utc
|
|
290
290
|
);
|
|
@@ -336,7 +336,7 @@ pub fn eop_from_mjd_utc(mjd_utc: f64) -> Option<[f64; 6]> {
|
|
|
336
336
|
/// ```
|
|
337
337
|
///
|
|
338
338
|
#[inline]
|
|
339
|
-
pub fn get(tm: &
|
|
339
|
+
pub fn get<T: crate::TimeLike>(tm: &T) -> Option<[f64; 6]> {
|
|
340
340
|
eop_from_mjd_utc(tm.as_mjd_with_scale(crate::TimeScale::UTC))
|
|
341
341
|
}
|
|
342
342
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
mod ierstable;
|
|
2
2
|
mod qcirs2gcrs;
|
|
3
3
|
|
|
4
|
-
use crate::{
|
|
4
|
+
use crate::{TimeLike, TimeScale};
|
|
5
5
|
use std::f64::consts::PI;
|
|
6
6
|
|
|
7
7
|
use crate::mathtypes::*;
|
|
@@ -47,7 +47,7 @@ pub(crate) fn qrot_zcoord(theta: f64) -> Quaternion {
|
|
|
47
47
|
///
|
|
48
48
|
/// * `gmst` - in radians
|
|
49
49
|
///
|
|
50
|
-
pub fn gmst(tm: &
|
|
50
|
+
pub fn gmst<T: TimeLike>(tm: &T) -> f64 {
|
|
51
51
|
let tut1: f64 = (tm.as_mjd_with_scale(TimeScale::UT1) - 51544.5) / 36525.0;
|
|
52
52
|
let mut gmst: f64 = tut1.mul_add(
|
|
53
53
|
tut1.mul_add(
|
|
@@ -63,7 +63,7 @@ pub fn gmst(tm: &Instant) -> f64 {
|
|
|
63
63
|
|
|
64
64
|
/// Equation of Equinoxes
|
|
65
65
|
/// Equation of the equinoxes
|
|
66
|
-
pub fn eqeq(tm: &
|
|
66
|
+
pub fn eqeq<T: TimeLike>(tm: &T) -> f64 {
|
|
67
67
|
let d: f64 = tm.as_mjd_with_scale(TimeScale::TT) - 51544.5;
|
|
68
68
|
let omega = PI / 180.0 * 0.052954f64.mul_add(-d, 125.04);
|
|
69
69
|
let l = 0.98565f64.mul_add(d, 280.47).to_radians();
|
|
@@ -74,7 +74,7 @@ pub fn eqeq(tm: &Instant) -> f64 {
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
/// Greenwich Apparent Sidereal Time
|
|
77
|
-
pub fn gast(tm: &
|
|
77
|
+
pub fn gast<T: TimeLike>(tm: &T) -> f64 {
|
|
78
78
|
gmst(tm) + eqeq(tm)
|
|
79
79
|
}
|
|
80
80
|
|
|
@@ -102,7 +102,7 @@ pub fn gast(tm: &Instant) -> f64 {
|
|
|
102
102
|
/// * ERA = 2𝜋 ((0.7790572732640 + f + 0.00273781191135448 * (t − 2451545.0))
|
|
103
103
|
///
|
|
104
104
|
///
|
|
105
|
-
pub fn earth_rotation_angle(tm: &
|
|
105
|
+
pub fn earth_rotation_angle<T: TimeLike>(tm: &T) -> f64 {
|
|
106
106
|
let t = tm.as_jd_with_scale(TimeScale::UT1);
|
|
107
107
|
let f = t % 1.0;
|
|
108
108
|
2.0 * PI * (0.00273781191135448f64.mul_add(t - 2451545.0, 0.7790572732640 + f) % 1.0)
|
|
@@ -126,7 +126,7 @@ pub fn earth_rotation_angle(tm: &Instant) -> f64 {
|
|
|
126
126
|
/// valid range of EOP data (1962 to current, predicts to current + ~ 4 months)
|
|
127
127
|
/// they will be set to zero, and a warning will be printed to stderr.
|
|
128
128
|
///
|
|
129
|
-
pub fn qitrf2tirs(tm: &
|
|
129
|
+
pub fn qitrf2tirs<T: TimeLike>(tm: &T) -> Quaternion {
|
|
130
130
|
const ASEC2RAD: f64 = PI / 180.0 / 3600.0;
|
|
131
131
|
// Get earth oreintation parameters or set them all to zero if not available
|
|
132
132
|
// (function will print warning to stderr if not available)
|
|
@@ -156,7 +156,7 @@ pub fn qitrf2tirs(tm: &Instant) -> Quaternion {
|
|
|
156
156
|
/// SGP4 propagator
|
|
157
157
|
/// * This is Equation 3-90 in Vallado
|
|
158
158
|
///
|
|
159
|
-
pub fn qteme2itrf(tm: &
|
|
159
|
+
pub fn qteme2itrf<T: TimeLike>(tm: &T) -> Quaternion {
|
|
160
160
|
qitrf2tirs(tm).conjugate() * qrot_zcoord(gmst(tm))
|
|
161
161
|
}
|
|
162
162
|
|
|
@@ -178,7 +178,7 @@ pub fn qteme2itrf(tm: &Instant) -> Quaternion {
|
|
|
178
178
|
/// SGP4 propagator
|
|
179
179
|
/// * An approximate rotation, accurate to within 1 arcsec
|
|
180
180
|
///
|
|
181
|
-
pub fn qteme2gcrf(tm: &
|
|
181
|
+
pub fn qteme2gcrf<T: TimeLike>(tm: &T) -> Quaternion {
|
|
182
182
|
qitrf2gcrf_approx(tm) * qteme2itrf(tm)
|
|
183
183
|
}
|
|
184
184
|
|
|
@@ -193,12 +193,12 @@ pub fn qteme2gcrf(tm: &Instant) -> Quaternion {
|
|
|
193
193
|
/// # Returns
|
|
194
194
|
///
|
|
195
195
|
/// * Quaternion representing rotation from MOD to GCRF
|
|
196
|
-
///
|
|
196
|
+
///
|
|
197
197
|
/// # Notes
|
|
198
198
|
///
|
|
199
199
|
/// * Equations 3-88 and 3-89 in Vallado
|
|
200
200
|
///
|
|
201
|
-
pub fn qmod2gcrf(tm: &
|
|
201
|
+
pub fn qmod2gcrf<T: TimeLike>(tm: &T) -> Quaternion {
|
|
202
202
|
const ASEC2RAD: f64 = PI / 180.0 / 3600.0;
|
|
203
203
|
let tt = (tm.as_mjd_with_scale(TimeScale::TT) - 51544.5) / 36525.0;
|
|
204
204
|
|
|
@@ -257,7 +257,7 @@ pub fn qmod2gcrf(tm: &Instant) -> Quaternion {
|
|
|
257
257
|
/// * For a reference, see "Eplanatory Supplement to the
|
|
258
258
|
/// Astronomical Almanac", 2013, Ch. 6
|
|
259
259
|
///
|
|
260
|
-
pub fn qgcrf2itrf_approx(tm: &
|
|
260
|
+
pub fn qgcrf2itrf_approx<T: TimeLike>(tm: &T) -> Quaternion {
|
|
261
261
|
// Neglecting polar motion
|
|
262
262
|
let qitrf2tod_approx: Quaternion = qrot_zcoord(-gast(tm));
|
|
263
263
|
|
|
@@ -287,7 +287,7 @@ pub fn qgcrf2itrf_approx(tm: &Instant) -> Quaternion {
|
|
|
287
287
|
///
|
|
288
288
|
/// * For a reference, see "Eplanatory Supplement to the
|
|
289
289
|
/// Astronomical Almanac", 2013, Ch. 6
|
|
290
|
-
pub fn qitrf2gcrf_approx(tm: &
|
|
290
|
+
pub fn qitrf2gcrf_approx<T: TimeLike>(tm: &T) -> Quaternion {
|
|
291
291
|
qgcrf2itrf_approx(tm).conjugate()
|
|
292
292
|
}
|
|
293
293
|
|
|
@@ -297,7 +297,7 @@ pub fn qitrf2gcrf_approx(tm: &Instant) -> Quaternion {
|
|
|
297
297
|
///
|
|
298
298
|
/// See Vallado section 3.7.3
|
|
299
299
|
///
|
|
300
|
-
pub fn qtod2mod_approx(tm: &
|
|
300
|
+
pub fn qtod2mod_approx<T: TimeLike>(tm: &T) -> Quaternion {
|
|
301
301
|
let d = tm.as_mjd_with_scale(TimeScale::TT) - 51544.5;
|
|
302
302
|
let t = d / 36525.0;
|
|
303
303
|
|
|
@@ -366,7 +366,7 @@ pub fn qtod2mod_approx(tm: &Instant) -> Quaternion {
|
|
|
366
366
|
/// valid range of EOP data (1962 to current, predicts to current + ~ 4 months)
|
|
367
367
|
/// they will be set to zero, and a warning will be printed to stderr.
|
|
368
368
|
///
|
|
369
|
-
pub fn qitrf2gcrf(tm: &
|
|
369
|
+
pub fn qitrf2gcrf<T: TimeLike>(tm: &T) -> Quaternion {
|
|
370
370
|
// w is rotation from international terrestrial reference frame
|
|
371
371
|
// to terrestrial intermediate reference frame
|
|
372
372
|
let eop = earth_orientation_params::get(tm).unwrap_or([0.0; 6]);
|
|
@@ -409,7 +409,7 @@ pub fn qitrf2gcrf(tm: &Instant) -> Quaternion {
|
|
|
409
409
|
/// * **Note** This is **very** computationally expensive; for most
|
|
410
410
|
/// applications, the approximate rotation will work just fine
|
|
411
411
|
///
|
|
412
|
-
pub fn qgcrf2itrf(tm: &
|
|
412
|
+
pub fn qgcrf2itrf<T: TimeLike>(tm: &T) -> Quaternion {
|
|
413
413
|
qitrf2gcrf(tm).conjugate()
|
|
414
414
|
}
|
|
415
415
|
|
|
@@ -433,7 +433,7 @@ pub fn qgcrf2itrf(tm: &Instant) -> Quaternion {
|
|
|
433
433
|
/// Equation 5.5
|
|
434
434
|
///
|
|
435
435
|
#[inline]
|
|
436
|
-
pub fn qtirs2cirs(tm: &
|
|
436
|
+
pub fn qtirs2cirs<T: TimeLike>(tm: &T) -> Quaternion {
|
|
437
437
|
qrot_zcoord(-earth_rotation_angle(tm))
|
|
438
438
|
}
|
|
439
439
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
use super::ierstable::IERSTable;
|
|
2
2
|
use crate::frametransform::{qrot_ycoord, qrot_zcoord};
|
|
3
|
-
use crate::{
|
|
3
|
+
use crate::{TimeLike, TimeScale};
|
|
4
4
|
|
|
5
5
|
use crate::mathtypes::*;
|
|
6
6
|
|
|
@@ -25,7 +25,7 @@ fn table5d_singleton() -> &'static IERSTable {
|
|
|
25
25
|
INSTANCE.get_or_init(|| IERSTable::from_file("tab5.2d.txt").unwrap())
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
pub fn qcirs2gcrs_dxdy(tm: &
|
|
28
|
+
pub fn qcirs2gcrs_dxdy<T: TimeLike>(tm: &T, dxdy: Option<(f64, f64)>) -> Quaternion {
|
|
29
29
|
let t_tt = (tm.as_mjd_with_scale(TimeScale::TT) - 51544.5) / 36525.0;
|
|
30
30
|
const ASEC2RAD: f64 = PI / 180.0 / 3600.0;
|
|
31
31
|
|
|
@@ -163,8 +163,8 @@ pub fn qcirs2gcrs_dxdy(tm: &Instant, dxdy: Option<(f64, f64)>) -> Quaternion {
|
|
|
163
163
|
///
|
|
164
164
|
/// * See Vallado Ch. 3.7
|
|
165
165
|
/// * Also see [IERS Technical Note 36, Chapter 5](https://www.iers.org/SharedDocs/Publikationen/EN/IERS/Publications/tn/TechnNote36/tn36_043.pdf)
|
|
166
|
-
///
|
|
167
|
-
pub fn qcirs2gcrs(tm: &
|
|
166
|
+
///
|
|
167
|
+
pub fn qcirs2gcrs<T: TimeLike>(tm: &T) -> Quaternion {
|
|
168
168
|
let dxdy: Option<(f64, f64)> = crate::earth_orientation_params::get(tm).map(|v| (v[4], v[5]));
|
|
169
169
|
qcirs2gcrs_dxdy(tm, dxdy)
|
|
170
170
|
}
|
|
@@ -581,7 +581,7 @@ impl ITRFCoord {
|
|
|
581
581
|
/// let itrf2 = ITRFCoord::from_geodetic_deg(42.466, -71.1516, 250.0);
|
|
582
582
|
///
|
|
583
583
|
/// // Get ENU of itrf1 relative to itrf2
|
|
584
|
-
/// let enu = itrf1.
|
|
584
|
+
/// let enu = itrf1.to_enu(&itrf2);
|
|
585
585
|
/// // Should return [0.0, 0.0, -100.0]
|
|
586
586
|
/// ```
|
|
587
587
|
///
|