Remove complex hysteresis logic and implement simple SOI-based
parent switching: bodies stay with current parent while within its SOI,
and switch to closest body whose SOI contains them when exiting.
This eliminates unnecessary N-body comparisons when inside current
parent's SOI, preventing unphysical transitions (e.g., Moon→Mars
while still in Earth's SOI).
Simplified logic:
- Within parent's SOI → STAY with current parent
- Outside parent's SOI → FIND new parent (closest body whose SOI contains us)
- If no SOI contains us → fall back to Sun (index 0)
This matches simple 2-body simulation model and makes the code
much clearer and more maintainable.
Note: SOI transition test temporarily expects hysteresis behavior
and will need to be updated in follow-up commit.
Modified find_dominant_body() to detect when bodies exit SOI by checking
distance against current parent's SOI radius. Applies different hysteresis:
- Inside SOI: 0.5x distance threshold prevents oscillations
- Outside SOI: switches to closest body without hysteresis
Added test requirement for Mars SOI exit detection.
Claude
- Create soi_transition.toml with Sun + Mars + SmallBody (3 bodies)
- Add test_soi_transition.cpp with 2 test cases:
* SOI transition from Sun to Mars (validates one-way transition)
* SOI radii calculation verification
- Use comet parameters (e=0.7, a=3.74e11) for Mars encounter
- Document hysteresis makes Mars -> Sun exit impossible
- Simpler than original 7-body test_comet_orbit.cpp
- All 3 SOI tests pass (12 assertions total)
Claude