5.4 KiB
Config File Improvements & Main.cpp Refactoring
Date: 2026-01-03
Overview
This session focused on refactoring main.cpp into smaller functions and adding support for eccentric orbits through an extended configuration file format.
Changes Made
1. Main.cpp Refactoring
Broke down 215-line main() function into focused, reusable functions:
New Functions:
parse_command_line_args()- Parse CLI args into ProgramArgs structprint_startup_info()- Display simulation configurationrun_headless_simulation()- Terminal-based simulation with state capturerun_gui_simulation()- 3D visualization mode
Result: main() now only ~25 lines (setup and dispatch)
Additional Improvements:
- Added initial state capture in headless mode
- Initial state now printed both at start AND end for comparison
- Cleaner separation of concerns
2. Eccentric Orbit Support
Extended config format from 10 to 12 fields:
Old Format (10 fields):
name mass radius x y z parent_index r g b
New Format (12 fields):
name mass radius x y z parent_index r g b eccentricity semi_major_axis
Implementation:
- Uses vis-viva equation:
v = sqrt(G*M*(2/r - 1/a)) - Circular orbits: e=0, a=orbital_radius
- Elliptical orbits: e>0, a=semi_major_axis
- Unified code path for both orbit types
Example Configurations:
# Circular orbit
Earth 5.972e24 6.371e6 1.496e11 0 0 0 0.0 0.5 1.0 0 1.496e11
# Eccentric orbit (e=0.7)
Comet 1e14 5e3 1.122e11 0 0 0 0.5 0.8 1.0 0.7 3.74e11
3. Code Simplification
- Removed dual format parsing (now single unified format)
- Shortened function name:
calculate_initial_velocities_with_params()→calculate_velocities() - Removed
OrbitParams.has_paramsfield (always have params now) - Cleaner velocity calculation logic
4. Testing
Created test_simple.txt with eccentric comet:
- Eccentricity: 0.7
- Semi-major axis: 2.5 AU
- Perihelion: 0.75 AU
- Aphelion: 4.25 AU
Test Results:
- ✓ Initial velocity: 44.849 km/s (matches theoretical)
- ✓ Position varies from 0.75 AU to ~3.8 AU over simulation
- ✓ Velocity varies from 44.8 km/s (perihelion) to 10.6 km/s (aphelion)
- ✓ Energy conservation maintained
5. Documentation Updates
README.md:
- Updated config format section with 12-field format
- Added examples for both circular and eccentric orbits
- Added "Eccentric orbit support" to features list
- Updated field descriptions
docs/config_assumptions.md:
- Documented fixed issues (eccentric orbits, main.cpp refactoring)
- Updated format assumptions (10 → 12 fields)
- Added prioritized TODO list
- Added session notes with detailed change log
Git Commits
-
e5da7aa- Refactor main.cpp into focused functions- Extracted argument parsing, headless sim, GUI sim
- Added initial state capture for comparison
-
17f11bb- Add eccentric orbit support with unified config format- Extended format to 12 fields
- Implemented vis-viva equation
- Added example comet configuration
-
8b9a06e- Update documentation for eccentric orbit support- Updated README with new format
- Updated config_assumptions.md
-
61ac1c5- Add session notes and TODOs to config documentation- Documented all session changes
- Created prioritized action items
Files Modified
Source Code:
- src/main.cpp (refactored into functions)
- src/config_loader.cpp (added orbit parameters support)
Configuration:
- configs/test_simple.txt (updated to 12-field format + comet)
Documentation:
- README.md (new format examples)
- docs/config_assumptions.md (status updates + TODOs)
Known Issues & TODOs
HIGH PRIORITY:
- Update configs/solar_system.txt to new 12-field format
- Update configs/example_binary_star.txt to new 12-field format
- Fix Moon position in solar_system.txt
- Current: (1.500e11, 0, 0) - 4 million km from Earth
- Should: (~1.496e11 + 3.844e8, 0, 0) - 384,400 km from Earth
- Fix Jupiter's moons positions (same issue as Moon)
MEDIUM PRIORITY:
- Add config file validation
- Document coordinate system clearly (absolute vs relative)
LOW PRIORITY:
- Consider relative coordinate option for child bodies
- Add 3D orbit support (currently XY plane only)
Technical Notes
Vis-Viva Equation
v = sqrt(G*M*(2/r - 1/a))
Where:
- v = orbital velocity at current position
- G = gravitational constant
- M = parent body mass
- r = current distance from parent
- a = semi-major axis of orbit
For circular orbits (e=0):
- r = a (constant)
- Equation simplifies to:
v = sqrt(G*M/r)
For eccentric orbits (e>0):
- At perihelion (r = a(1-e)): velocity is maximum
- At aphelion (r = a(1+e)): velocity is minimum
- Demonstrates Kepler's 2nd law (equal areas in equal times)
Orbital Period:
T = 2π * sqrt(a³/GM)
Example for comet (a=2.5 AU): T ≈ 1444 days
Testing Commands
Build:
make
Run with default config (currently test_simple.txt):
./orbit_sim
Run headless for 1000 days:
./orbit_sim --days 1000
Run with specific config:
./orbit_sim configs/test_simple.txt
Run headless with readable units:
./orbit_sim --headless --readable --days 365
Next Session Recommendations
- Update remaining config files to 12-field format
- Fix moon positions with correct physics
- Test updated configurations
- Consider adding config validation warnings
- Possibly add argument of periapsis parameter for 3D orbit orientation