vibe coding an orbital mechanics simulation to try out claude code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

79 lines
2.5 KiB

#!/usr/bin/env python3
"""
Precalculate expected values for test_cartesian_to_elements_basic.cpp.
Usage:
python3 scripts/precalc_cartesian_to_elements_basic.py
Outputs C++-style comments with precalculated values for embedding in the test.
"""
import sys, math
sys.path.insert(0, 'scripts')
from sim_engine import orbital_to_cartesian, cartesian_to_orbital_elements, vmag, OrbitalElements, G
# Test configuration: moderate eccentricity, zero inclination
mu = G * 5.972e24
a = 1.5e7
e = 0.5
nu = 0.0
inc = 0.0
Omega = 0.0
omega = 0.0
elements = OrbitalElements(a=a, e=e, nu=nu, inc=inc, Omega=Omega, omega=omega)
pos, vel = orbital_to_cartesian(elements, 5.972e24)
r = vmag(pos)
v = vmag(vel)
# Round-trip: convert back
elements_rt = cartesian_to_orbital_elements(pos, vel, 5.972e24)
print("# Test: test_cartesian_to_elements_basic")
print(f"#")
print(f"# Original elements:")
print(f"# a = {a:.6f}")
print(f"# e = {e:.6f}")
print(f"# nu = {nu:.6f}")
print(f"# inc = {inc:.6f}")
print(f"# Omega = {Omega:.6f}")
print(f"# omega = {omega:.6f}")
print(f"#")
print(f"# State vectors from elements:")
print(f"# pos = ({pos[0]:.6f}, {pos[1]:.6f}, {pos[2]:.6f}) m")
print(f"# vel = ({vel[0]:.6f}, {vel[1]:.6f}, {vel[2]:.6f}) m/s")
print(f"# r = {r:.6f} m")
print(f"# v = {v:.6f} m/s")
print(f"#")
print(f"# Round-trip recovered elements:")
print(f"# a = {elements_rt.a:.15f}")
print(f"# e = {elements_rt.e:.15f}")
print(f"# nu = {elements_rt.nu:.15f}")
print(f"# inc = {elements_rt.inc:.15f}")
print(f"# Omega = {elements_rt.Omega:.15f}")
print(f"# omega = {elements_rt.omega:.15f}")
print(f"#")
print(f"# Errors:")
print(f"# da = {abs(elements_rt.a - a):.2e}")
print(f"# de = {abs(elements_rt.e - e):.2e}")
print(f"# dnu = {abs(elements_rt.nu - nu):.2e}")
print(f"# dinc = {abs(elements_rt.inc - inc):.2e}")
print(f"# dOmega = {abs(elements_rt.Omega - Omega):.2e}")
print(f"# domega = {abs(elements_rt.omega - omega):.2e}")
print(f"# dr = {abs(r - r):.2e} (trivial)")
print(f"# dv = {abs(v - v):.2e} (trivial)")
# Re-convert recovered elements back to state vectors
pos2, vel2 = orbital_to_cartesian(elements_rt, 5.972e24)
r2 = vmag(pos2)
v2 = vmag(vel2)
print(f"#")
print(f"# Reconstructed from recovered elements:")
print(f"# pos = ({pos2[0]:.6f}, {pos2[1]:.6f}, {pos2[2]:.6f}) m")
print(f"# vel = ({vel2[0]:.6f}, {vel2[1]:.6f}, {vel2[2]:.6f}) m/s")
print(f"# r = {r2:.6f} m")
print(f"# v = {v2:.6f} m/s")
print(f"# dr = {abs(r2 - r):.2e} m")
print(f"# dv = {abs(v2 - v):.2e} m/s")