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.
Files changed (192) hide show
  1. {satkit-0.9.0 → satkit-0.9.1}/.github/workflows/build.yml +6 -6
  2. {satkit-0.9.0 → satkit-0.9.1}/CHANGES.md +9 -0
  3. {satkit-0.9.0 → satkit-0.9.1}/Cargo.toml +5 -4
  4. {satkit-0.9.0 → satkit-0.9.1}/PKG-INFO +15 -10
  5. {satkit-0.9.0 → satkit-0.9.1}/README.md +14 -9
  6. {satkit-0.9.0 → satkit-0.9.1}/pyproject.toml +1 -1
  7. {satkit-0.9.0 → satkit-0.9.1}/python/requirements.txt +1 -1
  8. {satkit-0.9.0 → satkit-0.9.1}/python/satkit/_version.py +2 -2
  9. {satkit-0.9.0 → satkit-0.9.1}/python/satkit.egg-info/PKG-INFO +15 -10
  10. {satkit-0.9.0 → satkit-0.9.1}/python/satkit.egg-info/SOURCES.txt +2 -0
  11. {satkit-0.9.0 → satkit-0.9.1}/src/earth_orientation_params.rs +8 -8
  12. {satkit-0.9.0 → satkit-0.9.1}/src/frametransform/mod.rs +16 -16
  13. {satkit-0.9.0 → satkit-0.9.1}/src/frametransform/qcirs2gcrs.rs +4 -4
  14. {satkit-0.9.0 → satkit-0.9.1}/src/itrfcoord.rs +1 -1
  15. {satkit-0.9.0 → satkit-0.9.1}/src/jplephem.rs +21 -26
  16. {satkit-0.9.0 → satkit-0.9.1}/src/lib.rs +6 -1
  17. {satkit-0.9.0 → satkit-0.9.1}/src/lpephem/moon.rs +16 -10
  18. {satkit-0.9.0 → satkit-0.9.1}/src/lpephem/planets.rs +5 -3
  19. {satkit-0.9.0 → satkit-0.9.1}/src/lpephem/sun.rs +13 -8
  20. {satkit-0.9.0 → satkit-0.9.1}/src/nrlmsise.rs +9 -5
  21. {satkit-0.9.0 → satkit-0.9.1}/src/orbitprop/drag.rs +3 -3
  22. {satkit-0.9.0 → satkit-0.9.1}/src/orbitprop/precomputed.rs +8 -4
  23. {satkit-0.9.0 → satkit-0.9.1}/src/orbitprop/propagator.rs +40 -19
  24. {satkit-0.9.0 → satkit-0.9.1}/src/orbitprop/satstate.rs +69 -9
  25. {satkit-0.9.0 → satkit-0.9.1}/src/orbitprop/settings.rs +2 -2
  26. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pydensity.rs +2 -2
  27. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pynrlmsise.rs +7 -1
  28. {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/sgp4_impl.rs +23 -18
  29. {satkit-0.9.0 → satkit-0.9.1}/src/spaceweather.rs +6 -4
  30. satkit-0.9.1/src/time/chrono.rs +165 -0
  31. {satkit-0.9.0 → satkit-0.9.1}/src/time/duration.rs +7 -0
  32. {satkit-0.9.0 → satkit-0.9.1}/src/time/mod.rs +5 -0
  33. satkit-0.9.1/src/time/timelike.rs +56 -0
  34. {satkit-0.9.0 → satkit-0.9.1}/.github/workflows/wheels.yml +0 -0
  35. {satkit-0.9.0 → satkit-0.9.1}/.gitignore +0 -0
  36. {satkit-0.9.0 → satkit-0.9.1}/.readthedocs.yaml +0 -0
  37. {satkit-0.9.0 → satkit-0.9.1}/CONTRIBUTING.md +0 -0
  38. {satkit-0.9.0 → satkit-0.9.1}/LICENSE +0 -0
  39. {satkit-0.9.0 → satkit-0.9.1}/MANIFEST.in +0 -0
  40. {satkit-0.9.0 → satkit-0.9.1}/build.rs +0 -0
  41. {satkit-0.9.0 → satkit-0.9.1}/extern/nrlmsise/DOCUMENTATION +0 -0
  42. {satkit-0.9.0 → satkit-0.9.1}/extern/nrlmsise/nrlmsise-00.c +0 -0
  43. {satkit-0.9.0 → satkit-0.9.1}/extern/nrlmsise/nrlmsise-00.h +0 -0
  44. {satkit-0.9.0 → satkit-0.9.1}/extern/nrlmsise/nrlmsise-00_data.c +0 -0
  45. {satkit-0.9.0 → satkit-0.9.1}/python/Pipfile +0 -0
  46. {satkit-0.9.0 → satkit-0.9.1}/python/docs/Makefile +0 -0
  47. {satkit-0.9.0 → satkit-0.9.1}/python/docs/jsdoc_config.json +0 -0
  48. {satkit-0.9.0 → satkit-0.9.1}/python/docs/jsdoc_plugin.js +0 -0
  49. {satkit-0.9.0 → satkit-0.9.1}/python/docs/make.bat +0 -0
  50. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/TLE.md +0 -0
  51. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/_static/density_vs_solar_cycle.svg +0 -0
  52. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/_static/force_vs_altitude.svg +0 -0
  53. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/_static/theme_mods.css +0 -0
  54. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/consts.md +0 -0
  55. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/density.md +0 -0
  56. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/earthgravity.md +0 -0
  57. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/frametransform.md +0 -0
  58. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/itrfcoord.md +0 -0
  59. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/jplephem.md +0 -0
  60. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/kepler.md +0 -0
  61. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/quaternion.md +0 -0
  62. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/satprop.md +0 -0
  63. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/satstate.md +0 -0
  64. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/time.md +0 -0
  65. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/tle.md +0 -0
  66. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/api/utils.md +0 -0
  67. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/conf.py +0 -0
  68. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/datafiles.md +0 -0
  69. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/density.md +0 -0
  70. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/examples/Eclipse.ipynb +0 -0
  71. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/examples/High Precision Propagation.ipynb +0 -0
  72. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/examples/ITRF Coordinates.ipynb +0 -0
  73. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/examples/Orbital Mean-Element Message.ipynb +0 -0
  74. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/examples/Plots.ipynb +0 -0
  75. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/examples/Satellite Ground Contacts.ipynb +0 -0
  76. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/examples/TLE Fitting.ipynb +0 -0
  77. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/examples/Two-Line Element Set.ipynb +0 -0
  78. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/examples/riseset.ipynb +0 -0
  79. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/frametransform.md +0 -0
  80. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/index.md +0 -0
  81. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/install.md +0 -0
  82. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/itrfcoord.md +0 -0
  83. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/quaternion.md +0 -0
  84. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/references.md +0 -0
  85. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/satprop.md +0 -0
  86. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/satstate.md +0 -0
  87. {satkit-0.9.0 → satkit-0.9.1}/python/docs/source/time.md +0 -0
  88. {satkit-0.9.0 → satkit-0.9.1}/python/satkit/__init__.py +0 -0
  89. {satkit-0.9.0 → satkit-0.9.1}/python/satkit/__init__.pyi +0 -0
  90. {satkit-0.9.0 → satkit-0.9.1}/python/satkit/density.pyi +0 -0
  91. {satkit-0.9.0 → satkit-0.9.1}/python/satkit/frametransform.pyi +0 -0
  92. {satkit-0.9.0 → satkit-0.9.1}/python/satkit/jplephem.pyi +0 -0
  93. {satkit-0.9.0 → satkit-0.9.1}/python/satkit/moon.pyi +0 -0
  94. {satkit-0.9.0 → satkit-0.9.1}/python/satkit/planets.pyi +0 -0
  95. {satkit-0.9.0 → satkit-0.9.1}/python/satkit/py.typed +0 -0
  96. {satkit-0.9.0 → satkit-0.9.1}/python/satkit/satkit.pyi +0 -0
  97. {satkit-0.9.0 → satkit-0.9.1}/python/satkit/sun.pyi +0 -0
  98. {satkit-0.9.0 → satkit-0.9.1}/python/satkit/utils.pyi +0 -0
  99. {satkit-0.9.0 → satkit-0.9.1}/python/satkit.egg-info/dependency_links.txt +0 -0
  100. {satkit-0.9.0 → satkit-0.9.1}/python/satkit.egg-info/requires.txt +0 -0
  101. {satkit-0.9.0 → satkit-0.9.1}/python/satkit.egg-info/top_level.txt +0 -0
  102. {satkit-0.9.0 → satkit-0.9.1}/python/test/download_data.py +0 -0
  103. {satkit-0.9.0 → satkit-0.9.1}/python/test/download_from_json.py +0 -0
  104. {satkit-0.9.0 → satkit-0.9.1}/python/test/download_testvecs.py +0 -0
  105. {satkit-0.9.0 → satkit-0.9.1}/python/test/sp3file.py +0 -0
  106. {satkit-0.9.0 → satkit-0.9.1}/python/test/test.py +0 -0
  107. {satkit-0.9.0 → satkit-0.9.1}/setup.cfg +0 -0
  108. {satkit-0.9.0 → satkit-0.9.1}/src/consts.rs +0 -0
  109. {satkit-0.9.0 → satkit-0.9.1}/src/earthgravity.rs +0 -0
  110. {satkit-0.9.0 → satkit-0.9.1}/src/filters/mod.rs +0 -0
  111. {satkit-0.9.0 → satkit-0.9.1}/src/filters/ukf.rs +0 -0
  112. {satkit-0.9.0 → satkit-0.9.1}/src/frames.rs +0 -0
  113. {satkit-0.9.0 → satkit-0.9.1}/src/frametransform/ierstable.rs +0 -0
  114. {satkit-0.9.0 → satkit-0.9.1}/src/kepler.rs +0 -0
  115. {satkit-0.9.0 → satkit-0.9.1}/src/lpephem/mod.rs +0 -0
  116. {satkit-0.9.0 → satkit-0.9.1}/src/mathtypes.rs +0 -0
  117. {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/mod.rs +0 -0
  118. {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkf45.rs +0 -0
  119. {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkts54.rs +0 -0
  120. {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv65.rs +0 -0
  121. {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv65_table.rs +0 -0
  122. {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv87.rs +0 -0
  123. {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv87_table.rs +0 -0
  124. {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv98.rs +0 -0
  125. {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv98_efficient.rs +0 -0
  126. {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv98_efficient_table.rs +0 -0
  127. {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv98_nointerp.rs +0 -0
  128. {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv98_nointerp_table.rs +0 -0
  129. {satkit-0.9.0 → satkit-0.9.1}/src/ode/adaptive_solvers/rkv98_table.rs +0 -0
  130. {satkit-0.9.0 → satkit-0.9.1}/src/ode/mod.rs +0 -0
  131. {satkit-0.9.0 → satkit-0.9.1}/src/ode/nalgebra_bindings.rs +0 -0
  132. {satkit-0.9.0 → satkit-0.9.1}/src/ode/ode_tests.rs +0 -0
  133. {satkit-0.9.0 → satkit-0.9.1}/src/ode/rk_adaptive.rs +0 -0
  134. {satkit-0.9.0 → satkit-0.9.1}/src/ode/rk_adaptive_settings.rs +0 -0
  135. {satkit-0.9.0 → satkit-0.9.1}/src/ode/rk_explicit.rs +0 -0
  136. {satkit-0.9.0 → satkit-0.9.1}/src/ode/types.rs +0 -0
  137. {satkit-0.9.0 → satkit-0.9.1}/src/omm/mod.rs +0 -0
  138. {satkit-0.9.0 → satkit-0.9.1}/src/orbitprop/mod.rs +0 -0
  139. {satkit-0.9.0 → satkit-0.9.1}/src/orbitprop/point_gravity.rs +0 -0
  140. {satkit-0.9.0 → satkit-0.9.1}/src/orbitprop/satproperties.rs +0 -0
  141. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/mod.rs +0 -0
  142. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/mod_utils.rs +0 -0
  143. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyconsts.rs +0 -0
  144. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyduration.rs +0 -0
  145. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyframes.rs +0 -0
  146. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyframetransform.rs +0 -0
  147. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pygravity.rs +0 -0
  148. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyinstant.rs +0 -0
  149. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyitrfcoord.rs +0 -0
  150. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyjplephem.rs +0 -0
  151. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pykepler.rs +0 -0
  152. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pylpephem_moon.rs +0 -0
  153. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pylpephem_planets.rs +0 -0
  154. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pylpephem_sun.rs +0 -0
  155. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pympsuccess.rs +0 -0
  156. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pypropagate.rs +0 -0
  157. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pypropresult.rs +0 -0
  158. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pypropsettings.rs +0 -0
  159. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyquaternion.rs +0 -0
  160. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pysatproperties.rs +0 -0
  161. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pysatstate.rs +0 -0
  162. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pysgp4.rs +0 -0
  163. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pysolarsystem.rs +0 -0
  164. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pytle.rs +0 -0
  165. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyukf.rs +0 -0
  166. {satkit-0.9.0 → satkit-0.9.1}/src/pybindings/pyutils.rs +0 -0
  167. {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/dpper.rs +0 -0
  168. {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/dscom.rs +0 -0
  169. {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/dsinit.rs +0 -0
  170. {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/dspace.rs +0 -0
  171. {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/getgravconst.rs +0 -0
  172. {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/initl.rs +0 -0
  173. {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/mod.rs +0 -0
  174. {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/satrec.rs +0 -0
  175. {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/sgp4_lowlevel.rs +0 -0
  176. {satkit-0.9.0 → satkit-0.9.1}/src/sgp4/sgp4init.rs +0 -0
  177. {satkit-0.9.0 → satkit-0.9.1}/src/solarsystem.rs +0 -0
  178. {satkit-0.9.0 → satkit-0.9.1}/src/time/instant.rs +0 -0
  179. {satkit-0.9.0 → satkit-0.9.1}/src/time/instant_err.rs +0 -0
  180. {satkit-0.9.0 → satkit-0.9.1}/src/time/instant_ops.rs +0 -0
  181. {satkit-0.9.0 → satkit-0.9.1}/src/time/instantparse.rs +0 -0
  182. {satkit-0.9.0 → satkit-0.9.1}/src/time/tests.rs +0 -0
  183. {satkit-0.9.0 → satkit-0.9.1}/src/time/timescale.rs +0 -0
  184. {satkit-0.9.0 → satkit-0.9.1}/src/time/weekday.rs +0 -0
  185. {satkit-0.9.0 → satkit-0.9.1}/src/tle/fitting.rs +0 -0
  186. {satkit-0.9.0 → satkit-0.9.1}/src/tle/mod.rs +0 -0
  187. {satkit-0.9.0 → satkit-0.9.1}/src/utils/datadir.rs +0 -0
  188. {satkit-0.9.0 → satkit-0.9.1}/src/utils/download.rs +0 -0
  189. {satkit-0.9.0 → satkit-0.9.1}/src/utils/mod.rs +0 -0
  190. {satkit-0.9.0 → satkit-0.9.1}/src/utils/pypackage.rs +0 -0
  191. {satkit-0.9.0 → satkit-0.9.1}/src/utils/test.rs +0 -0
  192. {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.0"
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.38"
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.0
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** - Terrestrial Time
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**: Accurate distance and azimuth between ground locations using Vincenty's formulae
136
- - **Coordinate Conversions**: ITRF ↔ Geodetic ↔ East-North-Up ↔ North-East-Down
137
- - **Elevation/Azimuth**: Topocentric coordinate transformations for ground station analysis
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**: Compute sun rise / set times as function of day & location
141
- - **Moon Phase**: Phase of moon and fraction illuminated
142
- - **Ephemeris**: Fast low-precision ephemeris for sun & moon
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** - Terrestrial Time
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**: Accurate distance and azimuth between ground locations using Vincenty's formulae
89
- - **Coordinate Conversions**: ITRF ↔ Geodetic ↔ East-North-Up ↔ North-East-Down
90
- - **Elevation/Azimuth**: Topocentric coordinate transformations for ground station analysis
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**: Compute sun rise / set times as function of day & location
94
- - **Moon Phase**: Phase of moon and fraction illuminated
95
- - **Ephemeris**: Fast low-precision ephemeris for sun & moon
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.0"
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.0; python_version >= '3.8'
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'
@@ -14,5 +14,5 @@ __version__: str
14
14
  __version_tuple__: VERSION_TUPLE
15
15
  version_tuple: VERSION_TUPLE
16
16
 
17
- __version__ = version = "0.9.0"
18
- __version_tuple__ = version_tuple = (0, 9, 0)
17
+ __version__ = version = "0.9.1"
18
+ __version_tuple__ = version_tuple = (0, 9, 1)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: satkit
3
- Version: 0.9.0
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** - Terrestrial Time
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**: Accurate distance and azimuth between ground locations using Vincenty's formulae
136
- - **Coordinate Conversions**: ITRF ↔ Geodetic ↔ East-North-Up ↔ North-East-Down
137
- - **Elevation/Azimuth**: Topocentric coordinate transformations for ground station analysis
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**: Compute sun rise / set times as function of day & location
141
- - **Moon Phase**: Phase of moon and fraction illuminated
142
- - **Ephemeris**: Fast low-precision ephemeris for sun & moon
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: &crate::Instant) -> Option<[f64; 6]> {
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::{Instant, TimeScale};
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: &Instant) -> f64 {
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: &Instant) -> f64 {
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: &Instant) -> f64 {
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: &Instant) -> f64 {
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: &Instant) -> Quaternion {
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: &Instant) -> Quaternion {
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: &Instant) -> Quaternion {
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: &Instant) -> Quaternion {
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: &Instant) -> Quaternion {
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: &Instant) -> Quaternion {
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: &Instant) -> Quaternion {
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: &Instant) -> Quaternion {
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: &Instant) -> Quaternion {
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: &Instant) -> Quaternion {
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::{Instant, TimeScale};
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: &Instant, dxdy: Option<(f64, f64)>) -> Quaternion {
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: &Instant) -> Quaternion {
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.to_ned(&itrf2);
584
+ /// let enu = itrf1.to_enu(&itrf2);
585
585
  /// // Should return [0.0, 0.0, -100.0]
586
586
  /// ```
587
587
  ///