Skip to content

v0.14.1: Lambert solver, pure Rust NRLMSISE-00, docs overhaul#77

Merged
ssmichael1 merged 23 commits intomainfrom
numeris_update
Mar 21, 2026
Merged

v0.14.1: Lambert solver, pure Rust NRLMSISE-00, docs overhaul#77
ssmichael1 merged 23 commits intomainfrom
numeris_update

Conversation

@ssmichael1
Copy link
Owner

Summary

  • Lambert targeting solver (Izzo 2015 algorithm) with Householder 4th-order iteration, multi-revolution support, and 180-degree transfer handling
  • Pure Rust NRLMSISE-00 atmospheric density model replacing C FFI — validated against C output to <1e-10 relative error across 22 reference cases
  • Documentation overhaul: switch tutorials from Plotly to matplotlib + SciencePlots (STIX fonts, SVG output, numeris color palette), fix all Python stub docstrings for mkdocstrings rendering, add Lambert tutorial with pork-chop plot
  • Dependency cleanup: remove cc, nalgebra, ndarray, cty, once_cell; replace with numeris 0.5.6
  • 125 Rust tests, 58 Python tests all pass

Test plan

  • cargo test — 125 passed
  • pytest python/test/test.py — 58 passed
  • NRLMSISE-00 reference test validates 22 cases against C output
  • Lambert solver validates energy/momentum conservation + Kepler propagation
  • mkdocs builds and serves locally with all tutorials rendering correctly

🤖 Generated with Claude Code

ssmichael1 and others added 23 commits March 20, 2026 21:32
- Replace nalgebra dependency with numeris 0.5.5 throughout
- Delete src/ode/ module entirely; use numeris built-in ODE solvers
  (RKF45, RKTS54, RKV65, RKV87, RKV98, RODAS4)
- Update mathtypes.rs to alias numeris types (Vector, Matrix, Quaternion, DynMatrix)
- Migrate all source files from nalgebra API to numeris API:
  - Vector3::new() → Vector3::from_array()
  - Quaternion::from_axis_angle(&axis, θ) → Quaternion::rotz/rotx/roty(θ)
  - m.fixed_view/fixed_view_mut → m.block/set_block
  - q.transform_vector(&v) → q * v
  - Matrix::identity() → Matrix::eye()
- Update all Python bindings for numeris types and quaternion
  component order change (nalgebra [x,y,z,w] → numeris [w,x,y,z])
- Bump version to 0.14.0

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add detailed changelog entry for the nalgebra→numeris migration
- Remove qrot_xcoord/qrot_ycoord/qrot_zcoord wrapper functions,
  replace with direct Quaternion::rotx/roty/rotz calls
- Fix remaining nalgebra references in doc comments

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… 0.5.6

- Replace all Vector::from_array([...]) with numeris::vector![...] macro
- Replace hand-rolled rotation_between() with Quaternion::rotation_between()
- Delete src/filters/ module (UKF now available via numeris::estimate::Ukf)
- Update numeris dependency to 0.5.6 with estimate and interp features
- Update CHANGELOG

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove ndarray dependency from both Cargo.toml files (unused;
  numpy crate re-exports it)
- Remove cty dependency; use std::ffi::{c_double, c_int} instead
- Remove 6 redundant reference-based Add/Sub operator impls from
  ITRFCoord (both ITRFCoord and Vector3 are Copy)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove once_cell dependency; use std::sync::OnceLock (stable since
Rust 1.70) as a drop-in replacement in all 5 files.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds .gitattributes to automatically strip Jupyter notebook outputs
via the nbstripout git filter. Run `pip install nbstripout && nbstripout --install`
after cloning to enable.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fix typos: wehre→where, auxilliary→auxiliary, Periaps→Periapsis,
quatnerion→quaternion, represention→representing, oreintation→orientation,
Celestrial→Celestial, Eplanatory→Explanatory, computatation→computation,
instanc→instant, Equinix→Equinox, fo→of

Derive Copy for Kepler (6 f64s, 48 bytes).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…lerances)

- Coordinate Frame Transforms: fix TLE construction (use from_lines),
  fix conjugate/angle property access (not method calls), fix SGP4 API
- Covariance Propagation: fix quaternion conjugate property access
- Atmospheric Density: relax ODE tolerances and shorten propagation
  duration to avoid step rejection on low-altitude drag orbits

All 5 new tutorial notebooks now execute without errors.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add 5 new tutorials to docs/tutorials/index.md
- Replace Haystack Observatory with generic ground station in
  Coordinate Frame Transforms tutorial

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Implement Lambert's problem solver for orbital transfer design using
Izzo's algorithm with Householder 4th-order iteration and multi-revolution
support. Includes Rust core, Python bindings, tests, and documentation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Switch all tutorial plots from Plotly to matplotlib + SciencePlots
  (STIX fonts, SVG output, colorblind-friendly numeris color palette)
- Match numeris site theme (blue grey header, navigation tabs, muted links)
- Generate static SVG plots at build time via docs/examples/gen_plots.py
- Add Lambert Targeting tutorial with delta-v analysis and pork-chop plot
- Fix docstring formatting across all Python stubs for mkdocstrings
- Add concrete defs and typing overloads for proper API reference rendering
- Update CI/CD: cartopy deps, plot generation, remove plotly

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fix Notes section in TLE.fit_from_states (was rendering as code block)
- Add CelesTrak as public TLE catalog source
- Clarify as_euler() returns ZYX intrinsic (aerospace) Tait-Bryan angles

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Translate the NRLMSISE-00 atmospheric density model from C to pure Rust,
removing the cc build dependency and extern/nrlmsise C source files.

- All functions translated: gtd7d, gts7, globe7, glob7s, densu, densm,
  spline/splint/splini, ccor/ccor2, dnet, scalh, glatf, tselec
- All coefficient tables faithfully transcribed from nrlmsise-00_data.c
- Fixed PD[4] (O2 density) data table transcription error (10-element shift)
- Mutable state encapsulated in NrlmsiseState struct (no global statics)
- 22-case reference test validates against C output to <1e-10 relative error
  covering altitudes 50-1000km, latitudes, solar activity, and Ap levels
- Remove cc crate from build-dependencies

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The pure Rust translation is validated against the C output to <1e-10
relative error across 22 reference cases. Safe to remove.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@ssmichael1 ssmichael1 merged commit 39a23c7 into main Mar 21, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant