satkit 0.16.0__tar.gz → 0.16.2__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 (121) hide show
  1. {satkit-0.16.0 → satkit-0.16.2}/Cargo.toml +1 -5
  2. {satkit-0.16.0/python/satkit.egg-info → satkit-0.16.2}/PKG-INFO +6 -6
  3. {satkit-0.16.0 → satkit-0.16.2}/README.md +5 -5
  4. {satkit-0.16.0 → satkit-0.16.2}/pyproject.toml +1 -1
  5. {satkit-0.16.0 → satkit-0.16.2}/python/Cargo.toml +1 -2
  6. {satkit-0.16.0 → satkit-0.16.2}/python/satkit/__init__.pyi +1 -0
  7. {satkit-0.16.0 → satkit-0.16.2}/python/satkit/frametransform.pyi +48 -12
  8. {satkit-0.16.0 → satkit-0.16.2}/python/satkit/satkit.pyi +29 -41
  9. {satkit-0.16.0 → satkit-0.16.2/python/satkit.egg-info}/PKG-INFO +6 -6
  10. {satkit-0.16.0 → satkit-0.16.2}/python/satkit.egg-info/SOURCES.txt +1 -1
  11. {satkit-0.16.0 → satkit-0.16.2}/python/src/lib.rs +6 -2
  12. {satkit-0.16.0 → satkit-0.16.2}/python/src/pyframetransform.rs +117 -24
  13. {satkit-0.16.0 → satkit-0.16.2}/python/src/pylambert.rs +4 -2
  14. {satkit-0.16.0 → satkit-0.16.2}/python/src/pysgp4.rs +1 -1
  15. {satkit-0.16.0 → satkit-0.16.2}/python/src/pytle.rs +12 -15
  16. satkit-0.16.2/python/src/pytlefitstatus.rs +50 -0
  17. {satkit-0.16.0 → satkit-0.16.2}/src/earth_orientation_params.rs +4 -4
  18. {satkit-0.16.0 → satkit-0.16.2}/src/frametransform/mod.rs +95 -13
  19. {satkit-0.16.0 → satkit-0.16.2}/src/lib.rs +21 -8
  20. {satkit-0.16.0 → satkit-0.16.2}/src/solar_cycle_forecast.rs +5 -5
  21. {satkit-0.16.0 → satkit-0.16.2}/src/time/instantparse.rs +28 -18
  22. satkit-0.16.2/src/tle/fitting.rs +535 -0
  23. {satkit-0.16.0 → satkit-0.16.2}/src/tle/mod.rs +2 -0
  24. {satkit-0.16.0 → satkit-0.16.2}/src/utils/update_data.rs +27 -21
  25. satkit-0.16.0/python/src/pympsuccess.rs +0 -57
  26. satkit-0.16.0/src/tle/fitting.rs +0 -346
  27. {satkit-0.16.0 → satkit-0.16.2}/LICENSE +0 -0
  28. {satkit-0.16.0 → satkit-0.16.2}/MANIFEST.in +0 -0
  29. {satkit-0.16.0 → satkit-0.16.2}/python/build.rs +0 -0
  30. {satkit-0.16.0 → satkit-0.16.2}/python/satkit/__init__.py +0 -0
  31. {satkit-0.16.0 → satkit-0.16.2}/python/satkit/density.pyi +0 -0
  32. {satkit-0.16.0 → satkit-0.16.2}/python/satkit/jplephem.pyi +0 -0
  33. {satkit-0.16.0 → satkit-0.16.2}/python/satkit/moon.pyi +0 -0
  34. {satkit-0.16.0 → satkit-0.16.2}/python/satkit/planets.pyi +0 -0
  35. {satkit-0.16.0 → satkit-0.16.2}/python/satkit/py.typed +0 -0
  36. {satkit-0.16.0 → satkit-0.16.2}/python/satkit/sun.pyi +0 -0
  37. {satkit-0.16.0 → satkit-0.16.2}/python/satkit/utils.pyi +0 -0
  38. {satkit-0.16.0 → satkit-0.16.2}/python/satkit.egg-info/dependency_links.txt +0 -0
  39. {satkit-0.16.0 → satkit-0.16.2}/python/satkit.egg-info/requires.txt +0 -0
  40. {satkit-0.16.0 → satkit-0.16.2}/python/satkit.egg-info/top_level.txt +0 -0
  41. {satkit-0.16.0 → satkit-0.16.2}/python/src/mod_utils.rs +0 -0
  42. {satkit-0.16.0 → satkit-0.16.2}/python/src/pyconsts.rs +0 -0
  43. {satkit-0.16.0 → satkit-0.16.2}/python/src/pydensity.rs +0 -0
  44. {satkit-0.16.0 → satkit-0.16.2}/python/src/pyduration.rs +0 -0
  45. {satkit-0.16.0 → satkit-0.16.2}/python/src/pyframes.rs +0 -0
  46. {satkit-0.16.0 → satkit-0.16.2}/python/src/pygravity.rs +0 -0
  47. {satkit-0.16.0 → satkit-0.16.2}/python/src/pyinstant.rs +0 -0
  48. {satkit-0.16.0 → satkit-0.16.2}/python/src/pyitrfcoord.rs +0 -0
  49. {satkit-0.16.0 → satkit-0.16.2}/python/src/pyjplephem.rs +0 -0
  50. {satkit-0.16.0 → satkit-0.16.2}/python/src/pykepler.rs +0 -0
  51. {satkit-0.16.0 → satkit-0.16.2}/python/src/pylpephem_moon.rs +0 -0
  52. {satkit-0.16.0 → satkit-0.16.2}/python/src/pylpephem_planets.rs +0 -0
  53. {satkit-0.16.0 → satkit-0.16.2}/python/src/pylpephem_sun.rs +0 -0
  54. {satkit-0.16.0 → satkit-0.16.2}/python/src/pynrlmsise.rs +0 -0
  55. {satkit-0.16.0 → satkit-0.16.2}/python/src/pyomm.rs +0 -0
  56. {satkit-0.16.0 → satkit-0.16.2}/python/src/pypropagate.rs +0 -0
  57. {satkit-0.16.0 → satkit-0.16.2}/python/src/pypropresult.rs +0 -0
  58. {satkit-0.16.0 → satkit-0.16.2}/python/src/pypropsettings.rs +0 -0
  59. {satkit-0.16.0 → satkit-0.16.2}/python/src/pyquaternion.rs +0 -0
  60. {satkit-0.16.0 → satkit-0.16.2}/python/src/pysatproperties.rs +0 -0
  61. {satkit-0.16.0 → satkit-0.16.2}/python/src/pysatstate.rs +0 -0
  62. {satkit-0.16.0 → satkit-0.16.2}/python/src/pysolarsystem.rs +0 -0
  63. {satkit-0.16.0 → satkit-0.16.2}/python/src/pythrust.rs +0 -0
  64. {satkit-0.16.0 → satkit-0.16.2}/python/src/pyukf.rs +0 -0
  65. {satkit-0.16.0 → satkit-0.16.2}/python/src/pyutils.rs +0 -0
  66. {satkit-0.16.0 → satkit-0.16.2}/setup.cfg +0 -0
  67. {satkit-0.16.0 → satkit-0.16.2}/src/consts.rs +0 -0
  68. {satkit-0.16.0 → satkit-0.16.2}/src/earthgravity.rs +0 -0
  69. {satkit-0.16.0 → satkit-0.16.2}/src/frames.rs +0 -0
  70. {satkit-0.16.0 → satkit-0.16.2}/src/frametransform/ierstable.rs +0 -0
  71. {satkit-0.16.0 → satkit-0.16.2}/src/frametransform/qcirs2gcrs.rs +0 -0
  72. {satkit-0.16.0 → satkit-0.16.2}/src/itrfcoord.rs +0 -0
  73. {satkit-0.16.0 → satkit-0.16.2}/src/jplephem.rs +0 -0
  74. {satkit-0.16.0 → satkit-0.16.2}/src/kepler.rs +0 -0
  75. {satkit-0.16.0 → satkit-0.16.2}/src/lambert.rs +0 -0
  76. {satkit-0.16.0 → satkit-0.16.2}/src/lpephem/mod.rs +0 -0
  77. {satkit-0.16.0 → satkit-0.16.2}/src/lpephem/moon.rs +0 -0
  78. {satkit-0.16.0 → satkit-0.16.2}/src/lpephem/planets.rs +0 -0
  79. {satkit-0.16.0 → satkit-0.16.2}/src/lpephem/sun.rs +0 -0
  80. {satkit-0.16.0 → satkit-0.16.2}/src/mathtypes.rs +0 -0
  81. {satkit-0.16.0 → satkit-0.16.2}/src/nrlmsise.rs +0 -0
  82. {satkit-0.16.0 → satkit-0.16.2}/src/omm/mod.rs +0 -0
  83. {satkit-0.16.0 → satkit-0.16.2}/src/omm/xml.rs +0 -0
  84. {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/drag.rs +0 -0
  85. {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/mod.rs +0 -0
  86. {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/ode/gauss_jackson.rs +0 -0
  87. {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/ode/mod.rs +0 -0
  88. {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/point_gravity.rs +0 -0
  89. {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/precomputed.rs +0 -0
  90. {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/propagator.rs +0 -0
  91. {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/satproperties.rs +0 -0
  92. {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/satstate.rs +0 -0
  93. {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/settings.rs +0 -0
  94. {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/thrust.rs +0 -0
  95. {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/dpper.rs +0 -0
  96. {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/dscom.rs +0 -0
  97. {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/dsinit.rs +0 -0
  98. {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/dspace.rs +0 -0
  99. {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/getgravconst.rs +0 -0
  100. {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/initl.rs +0 -0
  101. {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/mod.rs +0 -0
  102. {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/satrec.rs +0 -0
  103. {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/sgp4_impl.rs +0 -0
  104. {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/sgp4_lowlevel.rs +0 -0
  105. {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/sgp4init.rs +0 -0
  106. {satkit-0.16.0 → satkit-0.16.2}/src/solarsystem.rs +0 -0
  107. {satkit-0.16.0 → satkit-0.16.2}/src/spaceweather.rs +0 -0
  108. {satkit-0.16.0 → satkit-0.16.2}/src/time/chrono.rs +0 -0
  109. {satkit-0.16.0 → satkit-0.16.2}/src/time/duration.rs +0 -0
  110. {satkit-0.16.0 → satkit-0.16.2}/src/time/instant.rs +0 -0
  111. {satkit-0.16.0 → satkit-0.16.2}/src/time/instant_err.rs +0 -0
  112. {satkit-0.16.0 → satkit-0.16.2}/src/time/instant_ops.rs +0 -0
  113. {satkit-0.16.0 → satkit-0.16.2}/src/time/mod.rs +0 -0
  114. {satkit-0.16.0 → satkit-0.16.2}/src/time/tests.rs +0 -0
  115. {satkit-0.16.0 → satkit-0.16.2}/src/time/timelike.rs +0 -0
  116. {satkit-0.16.0 → satkit-0.16.2}/src/time/timescale.rs +0 -0
  117. {satkit-0.16.0 → satkit-0.16.2}/src/time/weekday.rs +0 -0
  118. {satkit-0.16.0 → satkit-0.16.2}/src/utils/datadir.rs +0 -0
  119. {satkit-0.16.0 → satkit-0.16.2}/src/utils/download.rs +0 -0
  120. {satkit-0.16.0 → satkit-0.16.2}/src/utils/mod.rs +0 -0
  121. {satkit-0.16.0 → satkit-0.16.2}/src/utils/test.rs +0 -0
@@ -3,7 +3,7 @@ members = [".", "python"]
3
3
 
4
4
  [package]
5
5
  name = "satkit"
6
- version = "0.16.0"
6
+ version = "0.16.2"
7
7
  edition = "2021"
8
8
  description = "Satellite Toolkit"
9
9
  readme = "README.md"
@@ -26,15 +26,11 @@ numeris = { version = "0.5.7", features = ["serde", "estimate", "ode"] }
26
26
  num-traits = "0.2.19"
27
27
  thiserror = "2.0"
28
28
  ureq = "3.1.2"
29
- json = "0.12.4"
30
29
  process_path = "0.1.4"
31
30
  serde = { version = "1.0", features = ["derive"] }
32
31
  serde_json = "1.0"
33
32
  quick-xml = { version = "0.38", features = ["serialize"], optional = true }
34
- serde-pickle = "1.2.0"
35
- itertools = "0.14.0"
36
33
  anyhow = "1"
37
- rmpfit = "0.3.0"
38
34
  chrono = { version = "0.4", optional = true }
39
35
 
40
36
  [build-dependencies]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: satkit
3
- Version: 0.16.0
3
+ Version: 0.16.2
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>
@@ -43,7 +43,7 @@ Satkit is a high-performance orbital mechanics library written in Rust with comp
43
43
  **[Documentation and tutorials](https://satkit.dev/)** (Python examples, but the concepts and API apply equally to Rust) | **[Rust API reference](https://docs.rs/satkit/)**
44
44
 
45
45
  > [!NOTE]
46
- > **Version 0.14.1** replaces `nalgebra` with [`numeris`](https://crates.io/crates/numeris) for all linear algebra (matrices, quaternions, ODE solvers). `numeris` is a standalone library that unifies these in a single crate, making them available to projects beyond satkit. Performance is equivalent, and all tests pass with matching residuals. If your code uses `nalgebra` types, enable the `nalgebra` feature on `numeris` for zero-cost conversions. Please open an issue if you hit any problems.
46
+ > **Version 0.16.0** introduces several breaking changes: `Frame::RIC` is renamed to the canonical `Frame::RTN` (with `RIC` / `RSW` remaining as aliases, so existing code still compiles); a new `Frame::NTW` (velocity-aligned) is added; `LVLH` is now accepted as a maneuver/thrust frame; the uncertainty API is unified into `set_pos_uncertainty(sigma, frame)` / `set_vel_uncertainty(sigma, frame)` (the four old per-frame methods are removed, not deprecated); `PropSettings::default()` now uses `GravityModel::EGM96` instead of `JGM3`; the **Gauss-Jackson 8** fixed-step multistep integrator is available for long-duration propagation; and `PropSettings::max_steps` is now configurable. See `CHANGELOG.md` for the full list.
47
47
 
48
48
  ## Installation
49
49
 
@@ -133,7 +133,7 @@ let (pos, vel) = jplephem::geocentric_state(SolarSystem::Moon, &time)?;
133
133
 
134
134
  ### Coordinate Frames
135
135
 
136
- Full IAU-2006/2000 reduction with Earth orientation parameters:
136
+ Full IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation) with Earth orientation parameters:
137
137
 
138
138
  | Frame | Description |
139
139
  |-------|-------------|
@@ -154,7 +154,7 @@ Plus ENU, NED, and geodesic distance (Vincenty) utilities.
154
154
 
155
155
  ### Orbit Maneuvers
156
156
 
157
- - **Impulsive maneuvers** -- Instantaneous delta-v applied at a scheduled time during propagation. Supported frames: GCRF (inertial), RTN (radial/tangential/normal — the CCSDS OEM convention, also exposed as `RSW` and `RIC` aliases), NTW (normal/tangent/cross-track — natural for prograde burns on eccentric orbits), and LVLH (Local Vertical / Local Horizontal). Ergonomic helpers `add_prograde` / `add_retrograde` / `add_radial` / `add_normal` for common scalar-magnitude burns.
157
+ - **Impulsive maneuvers** -- Instantaneous delta-v applied at a scheduled time during propagation. Supported frames: GCRF (inertial), RTN (radial/tangential/normal — the CCSDS OEM convention, also exposed as `RSW` and `RIC` aliases), NTW (velocity-aligned — natural for prograde burns on eccentric orbits, where a pure +T delta-v adds exactly Δv to |v|), and LVLH (Local Vertical / Local Horizontal). Ergonomic helpers `add_prograde` / `add_retrograde` / `add_radial` / `add_normal` for common scalar-magnitude burns.
158
158
  - **Continuous thrust** -- Constant-acceleration thrust arcs over time windows in any of the frames above, integrated directly into the force model
159
159
  - **Automatic segmentation** -- Propagation through maneuver sequences is handled transparently, including backward propagation
160
160
 
@@ -180,7 +180,7 @@ Seamless conversion between UTC, TAI, TT, TDB, UT1, and GPS time scales with ful
180
180
  SatKit uses [numeris](https://crates.io/crates/numeris) for all linear algebra (vectors, matrices, quaternions, ODE integration). If you also use nalgebra in your project, enable the `nalgebra` feature on numeris for zero-cost `From`/`Into` conversions between types:
181
181
 
182
182
  ```toml
183
- numeris = { version = "0.5.5", features = ["nalgebra"] }
183
+ numeris = { version = "0.5.7", features = ["nalgebra"] }
184
184
  ```
185
185
 
186
186
  ### Cargo Features
@@ -207,7 +207,7 @@ The library is validated against:
207
207
  - **ICGEM** reference values for gravity field calculations
208
208
  - **GPS SP3** precise ephemerides for multi-day numerical propagation
209
209
 
210
- 142 tests (106 unit + 36 doc-tests) run on every commit across Linux, macOS, and Windows.
210
+ 157 Rust tests and 81 Python tests run on every commit across Linux, macOS, and Windows.
211
211
 
212
212
  ### Running Tests Locally
213
213
 
@@ -19,7 +19,7 @@ Satkit is a high-performance orbital mechanics library written in Rust with comp
19
19
  **[Documentation and tutorials](https://satkit.dev/)** (Python examples, but the concepts and API apply equally to Rust) | **[Rust API reference](https://docs.rs/satkit/)**
20
20
 
21
21
  > [!NOTE]
22
- > **Version 0.14.1** replaces `nalgebra` with [`numeris`](https://crates.io/crates/numeris) for all linear algebra (matrices, quaternions, ODE solvers). `numeris` is a standalone library that unifies these in a single crate, making them available to projects beyond satkit. Performance is equivalent, and all tests pass with matching residuals. If your code uses `nalgebra` types, enable the `nalgebra` feature on `numeris` for zero-cost conversions. Please open an issue if you hit any problems.
22
+ > **Version 0.16.0** introduces several breaking changes: `Frame::RIC` is renamed to the canonical `Frame::RTN` (with `RIC` / `RSW` remaining as aliases, so existing code still compiles); a new `Frame::NTW` (velocity-aligned) is added; `LVLH` is now accepted as a maneuver/thrust frame; the uncertainty API is unified into `set_pos_uncertainty(sigma, frame)` / `set_vel_uncertainty(sigma, frame)` (the four old per-frame methods are removed, not deprecated); `PropSettings::default()` now uses `GravityModel::EGM96` instead of `JGM3`; the **Gauss-Jackson 8** fixed-step multistep integrator is available for long-duration propagation; and `PropSettings::max_steps` is now configurable. See `CHANGELOG.md` for the full list.
23
23
 
24
24
  ## Installation
25
25
 
@@ -109,7 +109,7 @@ let (pos, vel) = jplephem::geocentric_state(SolarSystem::Moon, &time)?;
109
109
 
110
110
  ### Coordinate Frames
111
111
 
112
- Full IAU-2006/2000 reduction with Earth orientation parameters:
112
+ Full IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation) with Earth orientation parameters:
113
113
 
114
114
  | Frame | Description |
115
115
  |-------|-------------|
@@ -130,7 +130,7 @@ Plus ENU, NED, and geodesic distance (Vincenty) utilities.
130
130
 
131
131
  ### Orbit Maneuvers
132
132
 
133
- - **Impulsive maneuvers** -- Instantaneous delta-v applied at a scheduled time during propagation. Supported frames: GCRF (inertial), RTN (radial/tangential/normal — the CCSDS OEM convention, also exposed as `RSW` and `RIC` aliases), NTW (normal/tangent/cross-track — natural for prograde burns on eccentric orbits), and LVLH (Local Vertical / Local Horizontal). Ergonomic helpers `add_prograde` / `add_retrograde` / `add_radial` / `add_normal` for common scalar-magnitude burns.
133
+ - **Impulsive maneuvers** -- Instantaneous delta-v applied at a scheduled time during propagation. Supported frames: GCRF (inertial), RTN (radial/tangential/normal — the CCSDS OEM convention, also exposed as `RSW` and `RIC` aliases), NTW (velocity-aligned — natural for prograde burns on eccentric orbits, where a pure +T delta-v adds exactly Δv to |v|), and LVLH (Local Vertical / Local Horizontal). Ergonomic helpers `add_prograde` / `add_retrograde` / `add_radial` / `add_normal` for common scalar-magnitude burns.
134
134
  - **Continuous thrust** -- Constant-acceleration thrust arcs over time windows in any of the frames above, integrated directly into the force model
135
135
  - **Automatic segmentation** -- Propagation through maneuver sequences is handled transparently, including backward propagation
136
136
 
@@ -156,7 +156,7 @@ Seamless conversion between UTC, TAI, TT, TDB, UT1, and GPS time scales with ful
156
156
  SatKit uses [numeris](https://crates.io/crates/numeris) for all linear algebra (vectors, matrices, quaternions, ODE integration). If you also use nalgebra in your project, enable the `nalgebra` feature on numeris for zero-cost `From`/`Into` conversions between types:
157
157
 
158
158
  ```toml
159
- numeris = { version = "0.5.5", features = ["nalgebra"] }
159
+ numeris = { version = "0.5.7", features = ["nalgebra"] }
160
160
  ```
161
161
 
162
162
  ### Cargo Features
@@ -183,7 +183,7 @@ The library is validated against:
183
183
  - **ICGEM** reference values for gravity field calculations
184
184
  - **GPS SP3** precise ephemerides for multi-day numerical propagation
185
185
 
186
- 142 tests (106 unit + 36 doc-tests) run on every commit across Linux, macOS, and Windows.
186
+ 157 Rust tests and 81 Python tests run on every commit across Linux, macOS, and Windows.
187
187
 
188
188
  ### Running Tests Locally
189
189
 
@@ -9,7 +9,7 @@ requires-python = ">= 3.10"
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.16.0"
12
+ version = "0.16.2"
13
13
  license = "MIT"
14
14
  description = "Satellite Orbital Dynamics Toolkit"
15
15
  keywords = [
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "satkit-python"
3
- version = "0.16.0"
3
+ version = "0.16.2"
4
4
  edition = "2021"
5
5
  publish = false
6
6
 
@@ -16,7 +16,6 @@ numeris = { version = "0.5.6", features = ["serde", "estimate"] }
16
16
  anyhow = "1"
17
17
  serde = { version = "1.0", features = ["derive"] }
18
18
  serde-pickle = "1.2.0"
19
- rmpfit = "0.3.0"
20
19
  process_path = "0.1.4"
21
20
 
22
21
  [build-dependencies]
@@ -48,5 +48,6 @@ __all__ = [
48
48
  "propresult",
49
49
  "propstats",
50
50
  "omm_from_url",
51
+ "tlefitstatus",
51
52
  "__version__",
52
53
  ]
@@ -491,7 +491,7 @@ def qgcrf2itrf(
491
491
  """Quaternion representing rotation from the Geocentric Celestial Reference Frame (GCRF) to the International Terrestrial Reference Frame (ITRF)
492
492
 
493
493
  Notes:
494
- - Uses full IAU2010 Reduction
494
+ - Uses full IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation)
495
495
  - See IERS Technical Note 36, Chapter 5
496
496
  - Does not include solid tides, ocean tides
497
497
  - Very computationally expensive
@@ -529,7 +529,7 @@ def qgcrf2itrf(
529
529
  """Quaternion representing rotation from the Geocentric Celestial Reference Frame (GCRF) to the International Terrestrial Reference Frame (ITRF)
530
530
 
531
531
  Notes:
532
- - Uses full IAU2010 Reduction
532
+ - Uses full IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation)
533
533
  - See IERS Technical Note 36, Chapter 5
534
534
  - Does not include solid tides, ocean tides
535
535
  - Very computationally expensive
@@ -552,7 +552,7 @@ def qgcrf2itrf(*args, **kwargs):
552
552
  """Quaternion representing rotation from the Geocentric Celestial Reference Frame (GCRF) to the International Terrestrial Reference Frame (ITRF)
553
553
 
554
554
  Notes:
555
- - Uses full IAU2010 Reduction
555
+ - Uses full IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation)
556
556
  - See IERS Technical Note 36, Chapter 5
557
557
  - Does not include solid tides, ocean tides
558
558
  - Very computationally expensive
@@ -590,7 +590,7 @@ def qitrf2gcrf(
590
590
  """Quaternion representing rotation from the International Terrestrial Reference Frame (ITRF) to the Geocentric Celestial Reference Frame (GCRF)
591
591
 
592
592
  Notes:
593
- - Uses full IAU2010 Reduction
593
+ - Uses full IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation)
594
594
  - See IERS Technical Note 36, Chapter 5
595
595
  - Does not include solid tides, ocean tides
596
596
  - Very computationally expensive
@@ -621,7 +621,7 @@ def qitrf2gcrf(
621
621
  """Quaternion representing rotation from the International Terrestrial Reference Frame (ITRF) to the Geocentric Celestial Reference Frame (GCRF)
622
622
 
623
623
  Notes:
624
- - Uses full IAU2010 Reduction
624
+ - Uses full IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation)
625
625
  - See IERS Technical Note 36, Chapter 5
626
626
  - Does not include solid tides, ocean tides
627
627
  - Very computationally expensive
@@ -644,7 +644,7 @@ def qitrf2gcrf(*args, **kwargs):
644
644
  """Quaternion representing rotation from the International Terrestrial Reference Frame (ITRF) to the Geocentric Celestial Reference Frame (GCRF)
645
645
 
646
646
  Notes:
647
- - Uses full IAU2010 Reduction
647
+ - Uses full IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation)
648
648
  - See IERS Technical Note 36, Chapter 5
649
649
  - Does not include solid tides, ocean tides
650
650
  - Very computationally expensive
@@ -873,16 +873,21 @@ def to_gcrf(
873
873
  def itrf_to_gcrf_state(
874
874
  pos_itrf: npt.ArrayLike,
875
875
  vel_itrf: npt.ArrayLike,
876
- time: time,
876
+ time: time | list[time] | npt.NDArray,
877
877
  ) -> tuple[npt.NDArray[np.float64], npt.NDArray[np.float64]]:
878
878
  """Transform a satellite state (position + velocity) from ITRF to GCRF.
879
879
 
880
+ Accepts either a single state (``pos``/``vel`` are length-3 vectors and
881
+ ``time`` is a single ``satkit.time``) or a batch of ``N`` states
882
+ (``pos``/``vel`` are shape ``(N, 3)`` arrays and ``time`` is a length-``N``
883
+ array/list of times). The output shape matches the input.
884
+
880
885
  Unlike the raw :func:`qitrf2gcrf` quaternion, this function correctly
881
886
  handles the Earth-rotation contribution to velocity. A point at rest
882
887
  on Earth's surface has zero velocity in ITRF but ~465 m/s in GCRF at
883
888
  the equator, and this function accounts for that term.
884
889
 
885
- The IAU 2010 ITRF → GCRF reduction decomposes into three stages:
890
+ The IERS 2010 ITRF → GCRF reduction decomposes into three stages:
886
891
  polar motion (ITRF → TIRS), Earth rotation about the CIO polar axis
887
892
  (TIRS → CIRS), and precession-nutation (CIRS → GCRF). The
888
893
  Earth-rotation sweep term ``omega_earth x r`` is computed in
@@ -897,9 +902,9 @@ def itrf_to_gcrf_state(
897
902
  1. Rotate ``pos_itrf`` and ``vel_itrf`` into TIRS via polar motion.
898
903
  2. Add ``omega_earth x r_tirs`` to the velocity in TIRS, where
899
904
  ``omega_earth = (0, 0, OMEGA_EARTH)`` exactly.
900
- 3. Rotate TIRS → CIRS → GCRF via the full IAU 2010 chain.
905
+ 3. Rotate TIRS → CIRS → GCRF via the full IERS 2010 chain.
901
906
 
902
- Uses the full IAU 2010 reduction (polar motion + Earth rotation +
907
+ Uses the full IERS 2010 reduction (polar motion + Earth rotation +
903
908
  precession-nutation with dX/dY corrections from Earth orientation
904
909
  parameters).
905
910
 
@@ -932,7 +937,7 @@ def itrf_to_gcrf_state(
932
937
  def gcrf_to_itrf_state(
933
938
  pos_gcrf: npt.ArrayLike,
934
939
  vel_gcrf: npt.ArrayLike,
935
- time: time,
940
+ time: time | list[time] | npt.NDArray,
936
941
  ) -> tuple[npt.NDArray[np.float64], npt.NDArray[np.float64]]:
937
942
  """Transform a satellite state (position + velocity) from GCRF to ITRF.
938
943
 
@@ -941,7 +946,12 @@ def gcrf_to_itrf_state(
941
946
  term **in TIRS** (where Earth's rotation axis is exactly along +z),
942
947
  then applies inverse polar motion to reach ITRF. A geostationary
943
948
  satellite (whose GCRF velocity is pure orbital motion) produces
944
- zero velocity in ITRF. Uses the full IAU 2010 reduction.
949
+ zero velocity in ITRF. Uses the full IERS 2010 reduction.
950
+
951
+ Accepts either a single state or a batch of ``N`` states: when
952
+ ``pos``/``vel`` are shape ``(N, 3)`` arrays, ``time`` must be a
953
+ length-``N`` array/list of times, and the returned arrays have
954
+ shape ``(N, 3)``.
945
955
 
946
956
  Args:
947
957
  pos_gcrf: 3-element position vector in GCRF [m]
@@ -954,6 +964,32 @@ def gcrf_to_itrf_state(
954
964
  """
955
965
  ...
956
966
 
967
+ def itrf_to_gcrf_state_approx(
968
+ pos_itrf: npt.ArrayLike,
969
+ vel_itrf: npt.ArrayLike,
970
+ time: time | list[time] | npt.NDArray,
971
+ ) -> tuple[npt.NDArray[np.float64], npt.NDArray[np.float64]]:
972
+ """Approximate ITRF → GCRF state transform using the IAU-76/FK5
973
+ reduction (accurate to ~1 arcsec on position).
974
+
975
+ Faster alternative to :func:`itrf_to_gcrf_state` when the full IERS
976
+ 2010 precision is not required. Neglects polar motion, so the
977
+ Earth-rotation sweep ``omega_earth x r`` is evaluated in ITRF directly.
978
+ Accepts scalar or batched inputs like :func:`itrf_to_gcrf_state`.
979
+ """
980
+ ...
981
+
982
+ def gcrf_to_itrf_state_approx(
983
+ pos_gcrf: npt.ArrayLike,
984
+ vel_gcrf: npt.ArrayLike,
985
+ time: time | list[time] | npt.NDArray,
986
+ ) -> tuple[npt.NDArray[np.float64], npt.NDArray[np.float64]]:
987
+ """Approximate GCRF → ITRF state transform using the IAU-76/FK5
988
+ reduction. Inverse of :func:`itrf_to_gcrf_state_approx`; accurate to
989
+ ~1 arcsec on position. Accepts scalar or batched inputs.
990
+ """
991
+ ...
992
+
957
993
  def from_gcrf(
958
994
  frame: frame,
959
995
  pos: npt.ArrayLike,
@@ -295,14 +295,15 @@ class TLE:
295
295
  Input GCRF states are rotated into TEME frame used by SGP4.
296
296
  First and second derivatives of mean motion are ignored, as they are not used by SGP4.
297
297
 
298
- Non-linear Levenberg-Marquardt optimization (via the Rust ``rmpfit`` crate)
299
- is performed to fit inclination, eccentricity, RAAN, argument of perigee,
300
- mean anomaly, mean motion, and drag (bstar) to the provided states.
298
+ Non-linear Levenberg-Marquardt optimization is performed to fit
299
+ inclination, eccentricity, RAAN, argument of perigee, mean anomaly,
300
+ mean motion, and drag (bstar) to the provided states. The solver
301
+ is built on top of the ``numeris`` linear algebra crate.
301
302
 
302
303
  The results dictionary includes the following keys:
303
- ``success``, ``best_norm``, ``orig_norm``, ``n_iter``, ``n_fev``,
304
- ``n_par``, ``n_free``, ``n_pegged``, ``n_func``, ``resid``,
305
- ``xerror``, ``covar``.
304
+ ``status`` (a :class:`tlefitstatus`), ``converged`` (bool),
305
+ ``orig_norm``, ``best_norm``, ``grad_norm``, ``n_iter``,
306
+ ``n_res_evals``.
306
307
 
307
308
  Example:
308
309
  ```python
@@ -314,7 +315,7 @@ class TLE:
314
315
  epoch = satkit.time(2024, 1, 1)
315
316
 
316
317
  tle, results = satkit.TLE.fit_from_states(states, times, epoch)
317
- if results["success"] == satkit.mpsuccess.MP_OK_CHI:
318
+ if results["converged"]:
318
319
  print("Fit successful")
319
320
  ```
320
321
  """
@@ -605,51 +606,38 @@ class weekday:
605
606
  Saturday: ClassVar[weekday]
606
607
  """Saturday"""
607
608
 
608
- class mpsuccess:
609
+ class tlefitstatus:
609
610
  """
610
- State of Levenberg-Marquardt optimization from the `rmpfit` rust library
611
-
612
- For details see: <https://docs.rs/rmpfit/latest/rmpfit/>
611
+ Termination status of the TLE non-linear least-squares fit performed by
612
+ :meth:`TLE.fit_from_states`.
613
613
 
614
614
  Values:
615
615
 
616
- - `NotDone`: Not finished iterations
617
- - `Chi`: Convergence in chi-square value
618
- - `Par`: Convergence in parameter value
619
- - `Both`: Convergence in both chi-square and parameter values
620
- - `Dir`: Convergence in orthogonality
621
- - `MaxIter`: Maximum iterations reached
622
- - `Ftol`: ftol is too small; no further improvement
623
- - `Xtol`: xtol is too small; no further improvement
624
- - `Gtol`: gtol is too small; no further improvement
616
+ - ``GradientConverged``: converged on gradient norm tolerance
617
+ - ``StepConverged``: converged on relative step size tolerance
618
+ - ``CostConverged``: converged on relative cost change tolerance
619
+ - ``MaxIterations``: maximum number of iterations reached
620
+ - ``DampingSaturated``: Levenberg-Marquardt damping parameter saturated
625
621
  """
626
622
 
627
- NotDone: ClassVar[mpsuccess]
628
- """Not finished iterations"""
629
-
630
- Chi: ClassVar[mpsuccess]
631
- """Convergence in chi-square value"""
632
-
633
- Par: ClassVar[mpsuccess]
634
- """Convergence in parameter value"""
623
+ GradientConverged: ClassVar[tlefitstatus]
624
+ """Converged on gradient norm tolerance"""
635
625
 
636
- Both: ClassVar[mpsuccess]
637
- """Convergence in both chi-square and parameter values"""
626
+ StepConverged: ClassVar[tlefitstatus]
627
+ """Converged on relative step size tolerance"""
638
628
 
639
- Dir: ClassVar[mpsuccess]
640
- """Convergence in orthogonality"""
629
+ CostConverged: ClassVar[tlefitstatus]
630
+ """Converged on relative cost change tolerance"""
641
631
 
642
- MaxIter: ClassVar[mpsuccess]
643
- """Maximum iterations reached"""
632
+ MaxIterations: ClassVar[tlefitstatus]
633
+ """Maximum number of iterations reached"""
644
634
 
645
- Ftol: ClassVar[mpsuccess]
646
- """ftol is too small; no further improvement"""
635
+ DampingSaturated: ClassVar[tlefitstatus]
636
+ """Levenberg-Marquardt damping parameter saturated"""
647
637
 
648
- Xtol: ClassVar[mpsuccess]
649
- """xtol is too small; no further improvement"""
650
-
651
- Gtol: ClassVar[mpsuccess]
652
- """gtol is too small; no further improvement"""
638
+ def converged(self) -> bool:
639
+ """True if the fit converged successfully."""
640
+ ...
653
641
 
654
642
  class timescale:
655
643
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: satkit
3
- Version: 0.16.0
3
+ Version: 0.16.2
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>
@@ -43,7 +43,7 @@ Satkit is a high-performance orbital mechanics library written in Rust with comp
43
43
  **[Documentation and tutorials](https://satkit.dev/)** (Python examples, but the concepts and API apply equally to Rust) | **[Rust API reference](https://docs.rs/satkit/)**
44
44
 
45
45
  > [!NOTE]
46
- > **Version 0.14.1** replaces `nalgebra` with [`numeris`](https://crates.io/crates/numeris) for all linear algebra (matrices, quaternions, ODE solvers). `numeris` is a standalone library that unifies these in a single crate, making them available to projects beyond satkit. Performance is equivalent, and all tests pass with matching residuals. If your code uses `nalgebra` types, enable the `nalgebra` feature on `numeris` for zero-cost conversions. Please open an issue if you hit any problems.
46
+ > **Version 0.16.0** introduces several breaking changes: `Frame::RIC` is renamed to the canonical `Frame::RTN` (with `RIC` / `RSW` remaining as aliases, so existing code still compiles); a new `Frame::NTW` (velocity-aligned) is added; `LVLH` is now accepted as a maneuver/thrust frame; the uncertainty API is unified into `set_pos_uncertainty(sigma, frame)` / `set_vel_uncertainty(sigma, frame)` (the four old per-frame methods are removed, not deprecated); `PropSettings::default()` now uses `GravityModel::EGM96` instead of `JGM3`; the **Gauss-Jackson 8** fixed-step multistep integrator is available for long-duration propagation; and `PropSettings::max_steps` is now configurable. See `CHANGELOG.md` for the full list.
47
47
 
48
48
  ## Installation
49
49
 
@@ -133,7 +133,7 @@ let (pos, vel) = jplephem::geocentric_state(SolarSystem::Moon, &time)?;
133
133
 
134
134
  ### Coordinate Frames
135
135
 
136
- Full IAU-2006/2000 reduction with Earth orientation parameters:
136
+ Full IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation) with Earth orientation parameters:
137
137
 
138
138
  | Frame | Description |
139
139
  |-------|-------------|
@@ -154,7 +154,7 @@ Plus ENU, NED, and geodesic distance (Vincenty) utilities.
154
154
 
155
155
  ### Orbit Maneuvers
156
156
 
157
- - **Impulsive maneuvers** -- Instantaneous delta-v applied at a scheduled time during propagation. Supported frames: GCRF (inertial), RTN (radial/tangential/normal — the CCSDS OEM convention, also exposed as `RSW` and `RIC` aliases), NTW (normal/tangent/cross-track — natural for prograde burns on eccentric orbits), and LVLH (Local Vertical / Local Horizontal). Ergonomic helpers `add_prograde` / `add_retrograde` / `add_radial` / `add_normal` for common scalar-magnitude burns.
157
+ - **Impulsive maneuvers** -- Instantaneous delta-v applied at a scheduled time during propagation. Supported frames: GCRF (inertial), RTN (radial/tangential/normal — the CCSDS OEM convention, also exposed as `RSW` and `RIC` aliases), NTW (velocity-aligned — natural for prograde burns on eccentric orbits, where a pure +T delta-v adds exactly Δv to |v|), and LVLH (Local Vertical / Local Horizontal). Ergonomic helpers `add_prograde` / `add_retrograde` / `add_radial` / `add_normal` for common scalar-magnitude burns.
158
158
  - **Continuous thrust** -- Constant-acceleration thrust arcs over time windows in any of the frames above, integrated directly into the force model
159
159
  - **Automatic segmentation** -- Propagation through maneuver sequences is handled transparently, including backward propagation
160
160
 
@@ -180,7 +180,7 @@ Seamless conversion between UTC, TAI, TT, TDB, UT1, and GPS time scales with ful
180
180
  SatKit uses [numeris](https://crates.io/crates/numeris) for all linear algebra (vectors, matrices, quaternions, ODE integration). If you also use nalgebra in your project, enable the `nalgebra` feature on numeris for zero-cost `From`/`Into` conversions between types:
181
181
 
182
182
  ```toml
183
- numeris = { version = "0.5.5", features = ["nalgebra"] }
183
+ numeris = { version = "0.5.7", features = ["nalgebra"] }
184
184
  ```
185
185
 
186
186
  ### Cargo Features
@@ -207,7 +207,7 @@ The library is validated against:
207
207
  - **ICGEM** reference values for gravity field calculations
208
208
  - **GPS SP3** precise ephemerides for multi-day numerical propagation
209
209
 
210
- 142 tests (106 unit + 36 doc-tests) run on every commit across Linux, macOS, and Windows.
210
+ 157 Rust tests and 81 Python tests run on every commit across Linux, macOS, and Windows.
211
211
 
212
212
  ### Running Tests Locally
213
213
 
@@ -37,7 +37,6 @@ python/src/pylambert.rs
37
37
  python/src/pylpephem_moon.rs
38
38
  python/src/pylpephem_planets.rs
39
39
  python/src/pylpephem_sun.rs
40
- python/src/pympsuccess.rs
41
40
  python/src/pynrlmsise.rs
42
41
  python/src/pyomm.rs
43
42
  python/src/pypropagate.rs
@@ -50,6 +49,7 @@ python/src/pysgp4.rs
50
49
  python/src/pysolarsystem.rs
51
50
  python/src/pythrust.rs
52
51
  python/src/pytle.rs
52
+ python/src/pytlefitstatus.rs
53
53
  python/src/pyukf.rs
54
54
  python/src/pyutils.rs
55
55
  src/consts.rs
@@ -15,7 +15,7 @@ mod pykepler;
15
15
  mod pylpephem_moon;
16
16
  mod pylpephem_planets;
17
17
  mod pylpephem_sun;
18
- mod pympsuccess;
18
+ mod pytlefitstatus;
19
19
  mod pynrlmsise;
20
20
  mod pypropresult;
21
21
  mod pyquaternion;
@@ -134,6 +134,10 @@ fn frametransform(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> {
134
134
  .unwrap();
135
135
  m.add_function(wrap_pyfunction!(pyft::gcrf_to_itrf_state, m)?)
136
136
  .unwrap();
137
+ m.add_function(wrap_pyfunction!(pyft::itrf_to_gcrf_state_approx, m)?)
138
+ .unwrap();
139
+ m.add_function(wrap_pyfunction!(pyft::gcrf_to_itrf_state_approx, m)?)
140
+ .unwrap();
137
141
  m.add_function(wrap_pyfunction!(pyft::qmod2gcrf, m)?)
138
142
  .unwrap();
139
143
  m.add_function(wrap_pyfunction!(pyft::qtod2mod_approx, m)?)
@@ -168,7 +172,7 @@ pub fn satkit(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> {
168
172
  m.add_class::<pyconsts::Consts>()?;
169
173
  m.add_class::<SolarSystem>()?;
170
174
  m.add_class::<pytle::PyTLE>()?;
171
- m.add_class::<pympsuccess::PyMPSuccess>()?;
175
+ m.add_class::<pytlefitstatus::PyTleFitStatus>()?;
172
176
 
173
177
  m.add_class::<PyGeodet>()?;
174
178
  m.add_class::<PyITRFCoord>()?;