C3 Departure Energy (space-systems/mission-design/c3-departure-energy)
Use when the task is the departure-side energy of an interplanetary
mission leaving a circular parking orbit on an escape hyperbola: C3
characteristic energy, hyperbolic excess speed, the injection speed at
the parking radius from the vis-viva integral, the injection delta-v
above the circular parking speed, the parking period, and the
declination of the outgoing asymptote. This leaf implements the
classical two-body departure model in pure Python, stdlib only,
deterministic. It covers the departure only: the parking orbit to the
escape hyperbola asymptote. The encounter at the destination body
belongs to space-systems/orbit-mechanics/gravity-assist-swingby, the
transfer leg after escape to hohmann-transfer, and the launch geometry
of the ascent to launch-window-analysis in this pack.
Domain quick reference
- Characteristic energy: C3 = v_inf^2, the square of the hyperbolic
excess speed (m2/s2). C3 = 9 km2/s2 corresponds to v_inf = 3000 m/s.
- Excess speed from C3: v_inf = sqrt(C3). The two conversions form the
round trip C3 -> v_inf -> C3, exact to float precision.
- Circular parking speed: v_c = sqrt(mu / r) at the parking radius.
- Injection speed on the departure hyperbola (vis-viva evaluated at the
hyperbola periapsis, which is the parking radius):
v_p = sqrt(v_inf^2 + 2mu / r). For v_inf = 0 the hyperbola degrades
to a parabola and v_p is the local escape speed sqrt(2mu / r).
- Injection delta-v: dv = v_p - v_c, the burn that raises the circular
parking speed to the hyperbolic injection speed; always positive for
a positive excess speed.
- Parking orbit period: T = 2pisqrt(r^3 / mu).
- Outgoing asymptote declination: dec = asin(vz / |v|) in degrees, for
the excess velocity vector (vx, vy, vz).
- Convenience bundle: departure_energy_assessment returns
c3_m2_s2, c3_km2_s2, excess_speed_m_s, circular_speed_m_s,
injection_speed_m_s, injection_delta_v_m_s, parking_period_s and
asymptote_declination_deg (None when no velocity components are
given).
- Units are SI throughout: m, m/s, m2/s2, s, deg. MU_EARTH =
3.986004418e14 m3/s2 and G0 = 9.80665 m/s2 are the module constants.
- ECSS E-ST-10C frames the mission analysis context; the relations
above are standard engineering methodology, summary-only.
Workflow
- Fix the central body gravitational parameter mu (MU_EARTH default)
and the circular parking orbit radius r in meters.
- Set the departure energy level: target hyperbolic excess v_inf with
c3_from_excess_speed, or target C3 with excess_speed_from_c3; the
round trip identity excess_speed_from_c3(c3_from_excess_speed(v))
equals v within 1e-6.
- Compute the circular parking speed with circular_speed.
- Compute the injection speed on the departure hyperbola at the
parking radius with injection_speed (vis-viva), then the burn with
injection_delta_v, which equals v_p - v_c exactly.
- Get the parking orbit period with parking_period (about 90 min for
a low Earth parking orbit).
- When the outgoing excess velocity vector is known, convert it to
the asymptote declination with asymptote_declination.
- Bundle the assessment with departure_energy_assessment into one
dict and report C3, excess speed, injection speed, injection
delta-v, parking period and asymptote declination.
- Confirm the deterministic checks with the contract test
scripts/test_c3_departure_energy.py.
Worked example
Earth mu = 3.986004418e14 m3/s2, parking radius 6578 km (300 km
circular), target hyperbolic excess 3000 m/s (C3 = 9 km2/s2). Real
module outputs (deterministic, printed by the module):
- C3 = 9.0 km2/s2 exactly (9000000.0 m2/s2).
- Excess round trip: excess_speed_from_c3(c3_from_excess_speed(3000))
returns 3000.0 m/s.
- Circular parking speed: 7784.3428 m/s (spec bound 7700-7900).
- Injection speed on the departure hyperbola: 11410.1703 m/s (spec
bound 11200-11700).
- Injection delta-v: 3625.8275 m/s (spec bound 3400-3900).
- Parking period: 5309.4775 s, about 88.5 min (spec bound 5300-5600).
- Asymptote declination for v = (2000, 2000, 1000) m/s: 19.4712 deg
(spec bound 16-20); the vector magnitude is exactly 3000 m/s, so it
matches C3 = 9 km2/s2.
Pitfalls
- Mixing parking orbit radius with planet radius: every speed and
period here is evaluated at the parking radius r you pass in, so
injecting at the wrong altitude (or using the surface radius)
shifts C3, v_p, dv and T together.
- Confusing C3 with injection speed: C3 = v_inf^2 is the energy at
infinity; the injection speed at the parking radius is the larger
vis-viva value v_p = sqrt(v_inf^2 + 2*mu/r), and the burn is the
difference v_p - v_c, not v_inf.
- Quoting dv as the excess speed: injection delta-v always exceeds
the hyperbolic excess (3625.8 m/s dv for a 3000 m/s excess in the
worked example); the escape-speed floor appears only when v_inf = 0.
- Treating the asymptote declination as optional input-agnostic:
asymptote_declination needs the actual excess velocity components
and returns None when none are given; the zero vector raises
ValueError, and a vector whose magnitude does not match sqrt(C3)
points at an inconsistent energy state.
- Skipping the round-trip check: excess_speed_from_c3(c3_from_
excess_speed(v)) must return v within 1e-6; a mismatch means a unit
or conversion slip in the calling code.
- Forgetting the far-radius behavior: v_p approaches v_inf only as
r grows (residual 130 m/s even at 1e9 m for a 3000 m/s excess), so
low parking orbits never see the excess speed at injection.
Verification
- Deterministic: no RNG anywhere; repeated runs return bit-identical
floats for the full assessment chain.
- Round trip: excess_speed_from_c3(c3_from_excess_speed(v)) equals v
within 1e-6 for a sweep of physical excess speeds.
- Identities: injection_delta_v equals injection_speed minus
circular_speed exactly; v_p^2 - v_inf^2 = 2mu/r holds at any
radius; zero excess gives the local escape speed sqrt(2mu/r);
a GEO parking radius reproduces the sidereal day (86164.09 s).
- Far-radius approach: v_p approaches v_inf as the radius grows; at
1e9 m the residual v_p - v_inf is 130.05 m/s for the 3000 m/s
excess (2mu/r is still about 8.9% of v_inf^2), shrinks monotonically
and drops below 1 m/s by 1e12 m. The contract test asserts the
sub-50 m/s bound at 1e9 m for the 12 km/s excess, where 2mu/r is
under 1% of v_inf^2 and the exact residual is 33.2 m/s.
- ValueError rejection: negative excess speed, negative C3, mu <= 0,
radius <= 0 in every function, and the zero velocity vector in
asymptote_declination.
- The convenience dict contains exactly the eight documented keys.
Related leaves
- space-systems/mission-design/mission-delta-v-budget: consumes the
injection delta-v inside a full mission delta-v budget.
- space-systems/mission-design/launch-window-analysis: launch site
geometry and ascent timeline for the same interplanetary mission.
- space-systems/orbit-mechanics/hohmann-transfer: sizes the transfer
leg that follows the departure escape.
- space-systems/orbit-mechanics/gravity-assist-swingby: the encounter
phase after the cruise leg, outside this leaf's departure-side
claim.
- space-systems/mission-design/entry-descent-landing: the arrival end
of the mission.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_c3_departure_energy.py
Run from the repo root:
python3 skills/space-systems/mission-design/c3-departure-energy/scripts/test_c3_departure_energy.py
The test covers the worked example outputs against their spec
magnitude bounds and the module's real values, the C3/excess round
trip, the circular and injection speeds, the injection delta-v
identity, the vis-viva far-radius approach, the parking period, the
asymptote declination, the convenience dict keys, determinism, and
ValueError rejection of every non-physical input (35 tests).
Compliance
- Standards referenced, not reproduced: ECSS E-ST-10C (space
engineering) frames the mission analysis context; the C3 and
vis-viva relations above are standard two-body engineering
methodology, summary-only per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: c3-departure-energy3description: Use when you must compute the departure energy of an interplanetary mission from a circular parking orbit: the C3 characteristic energy from a target hyperbolic excess speed and the excess speed back from C3, the injection speed on the departure hyperbola at the parking orbit radius from the vis-viva integral, the injection delta-v above the circular parking speed, the circular parking speed, the parking orbit period, and the declination of the outgoing asymptote from the excess velocity vector. Produces the C3, excess speed, injection speed, injection delta-v, parking period, and asymptote declination that gate the departure-side launch-energy and injection-burn assessment. Trigger: c3 characteristic energy, hyperbolic excess, excess speed, injection delta-v, injection speed, parking orbit, escape hyperbola, asymptote declination, interplanetary departure.4license: Apache-2.05---67# C3 Departure Energy (space-systems/mission-design/c3-departure-energy)89Use when the task is the departure-side energy of an interplanetary10mission leaving a circular parking orbit on an escape hyperbola: C311characteristic energy, hyperbolic excess speed, the injection speed at12the parking radius from the vis-viva integral, the injection delta-v13above the circular parking speed, the parking period, and the14declination of the outgoing asymptote. This leaf implements the15classical two-body departure model in pure Python, stdlib only,16deterministic. It covers the departure only: the parking orbit to the17escape hyperbola asymptote. The encounter at the destination body18belongs to space-systems/orbit-mechanics/gravity-assist-swingby, the19transfer leg after escape to hohmann-transfer, and the launch geometry20of the ascent to launch-window-analysis in this pack.2122## Domain quick reference2324- Characteristic energy: C3 = v_inf^2, the square of the hyperbolic25 excess speed (m2/s2). C3 = 9 km2/s2 corresponds to v_inf = 3000 m/s.26- Excess speed from C3: v_inf = sqrt(C3). The two conversions form the27 round trip C3 -> v_inf -> C3, exact to float precision.28- Circular parking speed: v_c = sqrt(mu / r) at the parking radius.29- Injection speed on the departure hyperbola (vis-viva evaluated at the30 hyperbola periapsis, which is the parking radius):31 v_p = sqrt(v_inf^2 + 2*mu / r). For v_inf = 0 the hyperbola degrades32 to a parabola and v_p is the local escape speed sqrt(2*mu / r).33- Injection delta-v: dv = v_p - v_c, the burn that raises the circular34 parking speed to the hyperbolic injection speed; always positive for35 a positive excess speed.36- Parking orbit period: T = 2*pi*sqrt(r^3 / mu).37- Outgoing asymptote declination: dec = asin(vz / |v|) in degrees, for38 the excess velocity vector (vx, vy, vz).39- Convenience bundle: departure_energy_assessment returns40 c3_m2_s2, c3_km2_s2, excess_speed_m_s, circular_speed_m_s,41 injection_speed_m_s, injection_delta_v_m_s, parking_period_s and42 asymptote_declination_deg (None when no velocity components are43 given).44- Units are SI throughout: m, m/s, m2/s2, s, deg. MU_EARTH =45 3.986004418e14 m3/s2 and G0 = 9.80665 m/s2 are the module constants.46- ECSS E-ST-10C frames the mission analysis context; the relations47 above are standard engineering methodology, summary-only.4849## Workflow50511. Fix the central body gravitational parameter mu (MU_EARTH default)52 and the circular parking orbit radius r in meters.532. Set the departure energy level: target hyperbolic excess v_inf with54 c3_from_excess_speed, or target C3 with excess_speed_from_c3; the55 round trip identity excess_speed_from_c3(c3_from_excess_speed(v))56 equals v within 1e-6.573. Compute the circular parking speed with circular_speed.584. Compute the injection speed on the departure hyperbola at the59 parking radius with injection_speed (vis-viva), then the burn with60 injection_delta_v, which equals v_p - v_c exactly.615. Get the parking orbit period with parking_period (about 90 min for62 a low Earth parking orbit).636. When the outgoing excess velocity vector is known, convert it to64 the asymptote declination with asymptote_declination.657. Bundle the assessment with departure_energy_assessment into one66 dict and report C3, excess speed, injection speed, injection67 delta-v, parking period and asymptote declination.688. Confirm the deterministic checks with the contract test69 scripts/test_c3_departure_energy.py.7071## Worked example7273Earth mu = 3.986004418e14 m3/s2, parking radius 6578 km (300 km74circular), target hyperbolic excess 3000 m/s (C3 = 9 km2/s2). Real75module outputs (deterministic, printed by the module):7677- C3 = 9.0 km2/s2 exactly (9000000.0 m2/s2).78- Excess round trip: excess_speed_from_c3(c3_from_excess_speed(3000))79 returns 3000.0 m/s.80- Circular parking speed: 7784.3428 m/s (spec bound 7700-7900).81- Injection speed on the departure hyperbola: 11410.1703 m/s (spec82 bound 11200-11700).83- Injection delta-v: 3625.8275 m/s (spec bound 3400-3900).84- Parking period: 5309.4775 s, about 88.5 min (spec bound 5300-5600).85- Asymptote declination for v = (2000, 2000, 1000) m/s: 19.4712 deg86 (spec bound 16-20); the vector magnitude is exactly 3000 m/s, so it87 matches C3 = 9 km2/s2.888990## Pitfalls9192- Mixing parking orbit radius with planet radius: every speed and93 period here is evaluated at the parking radius r you pass in, so94 injecting at the wrong altitude (or using the surface radius)95 shifts C3, v_p, dv and T together.96- Confusing C3 with injection speed: C3 = v_inf^2 is the energy at97 infinity; the injection speed at the parking radius is the larger98 vis-viva value v_p = sqrt(v_inf^2 + 2*mu/r), and the burn is the99 difference v_p - v_c, not v_inf.100- Quoting dv as the excess speed: injection delta-v always exceeds101 the hyperbolic excess (3625.8 m/s dv for a 3000 m/s excess in the102 worked example); the escape-speed floor appears only when v_inf = 0.103- Treating the asymptote declination as optional input-agnostic:104 asymptote_declination needs the actual excess velocity components105 and returns None when none are given; the zero vector raises106 ValueError, and a vector whose magnitude does not match sqrt(C3)107 points at an inconsistent energy state.108- Skipping the round-trip check: excess_speed_from_c3(c3_from_109 excess_speed(v)) must return v within 1e-6; a mismatch means a unit110 or conversion slip in the calling code.111- Forgetting the far-radius behavior: v_p approaches v_inf only as112 r grows (residual 130 m/s even at 1e9 m for a 3000 m/s excess), so113 low parking orbits never see the excess speed at injection.114## Verification115116- Deterministic: no RNG anywhere; repeated runs return bit-identical117 floats for the full assessment chain.118- Round trip: excess_speed_from_c3(c3_from_excess_speed(v)) equals v119 within 1e-6 for a sweep of physical excess speeds.120- Identities: injection_delta_v equals injection_speed minus121 circular_speed exactly; v_p^2 - v_inf^2 = 2*mu/r holds at any122 radius; zero excess gives the local escape speed sqrt(2*mu/r);123 a GEO parking radius reproduces the sidereal day (86164.09 s).124- Far-radius approach: v_p approaches v_inf as the radius grows; at125 1e9 m the residual v_p - v_inf is 130.05 m/s for the 3000 m/s126 excess (2*mu/r is still about 8.9% of v_inf^2), shrinks monotonically127 and drops below 1 m/s by 1e12 m. The contract test asserts the128 sub-50 m/s bound at 1e9 m for the 12 km/s excess, where 2*mu/r is129 under 1% of v_inf^2 and the exact residual is 33.2 m/s.130- ValueError rejection: negative excess speed, negative C3, mu <= 0,131 radius <= 0 in every function, and the zero velocity vector in132 asymptote_declination.133- The convenience dict contains exactly the eight documented keys.134135## Related leaves136137- space-systems/mission-design/mission-delta-v-budget: consumes the138 injection delta-v inside a full mission delta-v budget.139- space-systems/mission-design/launch-window-analysis: launch site140 geometry and ascent timeline for the same interplanetary mission.141- space-systems/orbit-mechanics/hohmann-transfer: sizes the transfer142 leg that follows the departure escape.143- space-systems/orbit-mechanics/gravity-assist-swingby: the encounter144 phase after the cruise leg, outside this leaf's departure-side145 claim.146- space-systems/mission-design/entry-descent-landing: the arrival end147 of the mission.148149## Behavior contract (gate 3)150151Run the deterministic contract test (stdlib unittest, offline):152153 python3 scripts/test_c3_departure_energy.py154155Run from the repo root:156157 python3 skills/space-systems/mission-design/c3-departure-energy/scripts/test_c3_departure_energy.py158159The test covers the worked example outputs against their spec160magnitude bounds and the module's real values, the C3/excess round161trip, the circular and injection speeds, the injection delta-v162identity, the vis-viva far-radius approach, the parking period, the163asymptote declination, the convenience dict keys, determinism, and164ValueError rejection of every non-physical input (35 tests).165166## Compliance167168- Standards referenced, not reproduced: ECSS E-ST-10C (space169 engineering) frames the mission analysis context; the C3 and170 vis-viva relations above are standard two-body engineering171 methodology, summary-only per standards-map.yaml.172- compliance: STANDARDS-REF, gated: false.