Releases: ATTron/astroz
v0.11.1
v0.10.0
What's Changed
- handle different instruction sets for non modern CPUs for SIMD hot paths
Full Changelog: v0.9.0...v0.10.0
v0.9.0
v0.9.0
SDP4 Deep-Space Propagator
astroz now handles all cataloged satellites — not just near-earth. GPS, GEO, Molniya, and other deep-space orbits (period > 225 min) are fully supported with SIMD-vectorized SDP4 propagation.
Everything auto-dispatches. Pass any TLE to Satrec.twoline2rv() or Constellation and it just works — SGP4 for near-earth, SDP4 for deep-space, no code changes needed.
What's new:
- Sdp4.zig / Sdp4Batch.zig — scalar and SIMD SDP4 with lunar/solar perturbations and resonance handling
- Satellite.zig — unified type that picks SGP4 or SDP4 automatically
- Constellation.zig — replaces Sgp4Constellation.zig, propagates mixed constellations with threading
- Satrec.is_deep_space property in Python
- Satrec.sgp4_array_into() — zero-copy SIMD batch for single satellites (SGP4 and SDP4)
- New benchmark scripts for JAX CPU/GPU comparisons
Breaking Changes (Zig only)
Python API has no breaking changes.
- Sgp4Constellation replaced by Constellation
- Sgp4Batch and simdMath now accessed via Constellation.Sgp4Batch / Constellation.simdMath
- DragCoefficients no longer stores perige — passed as a parameter instead
- Several Sgp4 internal types made pub for SDP4 reuse
Fixes
- Fixed non-compiling benchmarks (#80)
- CelestialBody constants refactored to use default field values
v0.8.1
v0.8.0
What's New
Numerical Force Models
astroz now includes high fidelity force models for orbit propagation, all implementing a
common ForceModel interface:
- Zonal harmonics: J2, J3, and J4 Earth oblateness perturbations
- Atmospheric drag: Exponential density model with solar activity scaling
- Solar radiation pressure: Includes cylindrical Earth shadow model
- Composite model: Combine multiple force models into a single propagation pipeline
Dormand-Prince 8(7) Adaptive Integrator
A new high order adaptive step size integrator (DormandPrince87) for long duration,
high accuracy propagation. Configurable absolute and relative tolerances, and compatible
with all force models.
CSPICE Integration
Optional NAIF CSPICE bindings (enabled with -Denable-cspice=true) for high precision
planetary ephemeris and leap second handling. Planetary kernels are fetched automatically
at build time.
New Examples
- conjunction_screening.zig — Collision avoidance screening
- maneuver_planning.zig — Hohmann transfers with J2 effects
- constellation_phasing.zig — RAAN drift for Walker constellations
- spice_propagation.zig — High-precision propagation with CSPICE ephemeris
What's Changed
- FEAT: new numerical models by @ATTron in #71
- new Io.Timestamp fix by @ATTron in #72
- bug: remove sdist and license warning by @ATTron in
#74
Full Changelog: v0.7.1...v0.8.0
v0.7.1
v0.7.0
What's New
- python-sgp4 interoperablity: astroz is now a drop in replacement for python-sgp4. Simply change your import line to
from astrozand get a 2x speedup! Follow the full migration guide for even more gains up to 100x compared to sgp4.
What's Changed
Full Changelog: v0.6.1...v0.7.0
v0.6.1
v0.6.0
Breaking Changes
Removed APIs
- Sgp4 class - Single satellite propagator removed from Python bindings
- load_constellation() - Backward compatibility alias removed
- min_distances() - Standalone function removed
- coarse_screen() - Standalone function removed
- WGS84 constant - No longer exported
Constellation class changes
- propagate() method removed from class (now a module-level function)
- metadata property and with_metadata parameter removed
- batch_size property removed
- out parameter for pre-allocated output removed
New API
The Python API is now simplified to two main functions:
from astroz import Constellation, propagate, screen
# Parse TLEs once for repeated use
c = Constellation("starlink")
# Propagate satellites
positions = propagate(c, times, start_time=dt, output="ecef")
positions, velocities = propagate(c, times, velocities=True)
# Conjunction screening - single target (fastest, fused propagate+screen)
min_dists, t_indices = screen(c, times, threshold=10.0, target=0)
# Conjunction screening - all-vs-all
pairs, t_indices = screen(c, times, threshold=10.0)Migration Guide
Propagating a constellation:
# Before
c = Constellation("starlink")
positions = c.propagate(times)
# After
c = Constellation("starlink")
positions = propagate(c, times)Loading a constellation:
# Before
c = load_constellation("starlink")
# After
c = Constellation("starlink")Conjunction screening:
# Before
positions = c.propagate(times)
pairs = coarse_screen(positions, threshold=10.0)
distances, t_indices = min_distances(positions, pairs)
# After
pairs, t_indices = screen(c, times, threshold=10.0)
Single-target screening:
# Before
positions = c.propagate(times)
pairs = coarse_screen(positions, threshold=10.0)
# ... filter pairs for target ...
# After (faster - fused propagate+screen)
min_dists, t_indices = screen(c, times, threshold=10.0, target=0)Single satellite propagation:
# Before
sgp4 = Sgp4(tle)
pos, vel = sgp4.propagate(30.0)
# After
positions = propagate(tle_string, [30.0])What's Changed
- conjunction screening returns incorrect tuple value by @ATTron in #63
- update sgp4 example to use propagateN by @arrufat in #66
- Update zignal dependency by @arrufat in #65
- faster conjunction by @ATTron in #64
Full Changelog: v0.5.0...v0.6.0