Skip to content

Verify against NASA NESC Lunar Check Cases #399

@simnaut

Description

@simnaut

Goal

Add a new verification track that propagates the NASA NESC Lunar Check Cases through Simulation::step() and compares against the published reference trajectories.

The NESC GN&C check cases (NESC-RP-12-00767 / "Independent Orbit Propagation Verification") are a canonical, vendor-neutral benchmark for high-fidelity propagators: cislunar transfer, lunar orbit, and Earth–Moon–Sun three-body trajectories with documented ICs, force models, integrator settings, and reference ephemerides at fixed checkpoints. Passing them would give us a cross-check that is independent of JEOD/Trick and exercises lunar-regime physics our existing Tier 3 fleet only touches lightly.

Scope

  • Locate and ingest the NESC reference data set (ICs + checkpoint state vectors) and commit a parsed mirror under crates/astrodyn_verif_nesc/test_data/ (new crate, parallel to astrodyn_verif_jeod).
  • Stand up a regen binary that reads the original NESC artifacts (when $NESC_HOME or a --nesc-home path is supplied) and writes the committed fixtures, mirroring the extract_* pattern.
  • Add a tier3_nesc_* test per check case driving astrodyn_runner::Simulation end-to-end from the NESC ICs and asserting position/velocity (and attitude, if the case specifies it) against the checkpoint vectors with tolerances set per the No Half-Baked Implementations rule (match the case's force model exactly — point mass vs spherical harmonics, third-body set, integrator, step size).
  • Wire a corresponding parity-trait sibling so the Bevy adapter inherits coverage transitively (per the issue Make bevy_parity tests a superset of every runner↔JEOD Tier 3 scenario #389 infrastructure), or add a KNOWN_PARITY_GAPS exemption with a written reason if a case can't ride the recipe path.
  • Document the regen workflow in the new crate's README.md and link it from CLAUDE.md alongside the JEOD regen instructions.

Out of scope

  • Adding NESC fixtures to the existing astrodyn_verif_jeod crate. Keep the NESC track in its own crate so the JEOD vs NESC provenance never gets mixed.
  • Any new physics. If a check case exposes missing physics, that's a separate issue and a port — not an approximation in the test.

Open questions

  • Which release of the NESC check cases is canonical? (There are several revisions floating around; we should pin one.)
  • Do the published cases assume DE405/DE421/DE440 ephemerides? We need to match exactly what the reference used, not what we happen to have loaded.
  • Is the attitude case set worth including in the first cut, or should it be a follow-up after the translational cases land?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions