Real energy balance, not a scripted animation. Sun elevation follows a half-sine day arc, θ(h) = 90°·sin(π·(h−6)/12) for h in [6,18] and 0 at night. Surface irradiance applies the Mars solar constant and Beer–Lambert dust extinction with an airmass correction:
I(h) = I0 · sin(θ) · exp(−τ · airmass)
I0 = 590 W/m² (Mars mean solar constant)
airmass = 1 / sin(θ), capped at low elevation
τ = 0.1 + dust% × 4.9 (clear sky → global-storm range)
Array power is I(h) × panel area × count × 22% cell efficiency. Life-support load is a fixed base draw plus a per-crew share, with a night-time heater surcharge when the sun is down. The difference between generation and load integrates directly into a battery state-of-charge ODE each tick — push the dust slider toward a global storm at midday and watch the battery genuinely drain toward brown-out, exactly as it would on a real habitat.
- Sky/horizon pane — sun position on its sol arc, sky tint driven by the same optical depth used in the power equation.
- Strip chart — battery state of charge over the last several sol-hours, so a storm's effect on reserves is visible, not just numeric.