Eclipse and power sizing
What you will accomplish
The eclipse profile of every satellite in a constellation, and the number a battery is actually sized from, which is not the one the summary averages to.
Prerequisites
- A constellation.
Steps
Run the analysis
orbitforge eclipse \
--constellation ph1.json \
--duration-hours 24 --step-seconds 60Eclipse analysis: 60 satellites over 24.0 h at 60 s scan steps using two_body.
ph1-s0-p00-sat00: sunlit 64.7%, umbra 30222 s, penumbra 306 s, 45 intervals
ph1-s0-p00-sat01: sunlit 64.4%, umbra 30472 s, penumbra 315 s, 47 intervals
ph1-s0-p00-sat02: sunlit 64.3%, umbra 30519 s, penumbra 305 s, 46 intervalsGet the intervals, not the totals
orbitforge eclipse --constellation ph1.json \
--duration-hours 24 --step-seconds 60 \
--output eclipse.json --csv eclipse.csv{
"start": "2026-06-21T00:54:44.296875Z",
"end": "2026-06-21T00:54:54.140625Z",
"duration_s": 9.84375,
"state": "penumbra",
"max_obscuration": 1.0
}Reading the interval count
“45 intervals” is not 45 eclipses. Each orbital shadow passage produces three intervals:
penumbra (entering) -> umbra -> penumbra (leaving)For one satellite over 24 hours: 15 umbra intervals and 30 penumbra intervals. Fifteen is the orbit count, which matches a 95.65-minute period.
| Quantity | Value |
|---|---|
| Umbra passages per day | 15 |
| Each umbra passage | 2010 s (33.5 min) |
| Each penumbra crossing | 9.8 s |
| Umbra total | 30150 s |
The penumbra crossing is under 10 seconds. At LEO the transition into darkness is effectively a step, and a power model that treats it as a gradual ramp is adding detail that does not exist. Scan steps are 60 seconds while entry and exit times are refined to 0.5 s, so those short intervals are resolved properly rather than quantized to the step.
The constellation mean is the wrong number
Run the same constellation at a solstice and break the result down by plane:
orbitforge eclipse --constellation ph1.json \
--start 2026-06-21T00:00:00Z --duration-hours 24 --step-seconds 60| Plane | Umbra per day, mean |
|---|---|
| p00 | 30248 s |
| p01 | 31953 s |
| p02 | 28962 s |
| p03 | 0 s |
| p04 | 28890 s |
| p05 | 31942 s |
Plane p03 is in full sunlight for the entire day. All ten of its satellites
eclipse for zero seconds, while the worst satellite in the constellation,
ph1-s0-p05-sat09, spends 32141 s in umbra, which is 37.2 percent of the day.
Same shell, same altitude, same inclination, same spacecraft. The only difference is where each plane’s node sits relative to the Sun.
The constellation-wide mean at this epoch is about 25332 s. Sizing a battery from that mean under-sizes the worst satellite by 27 percent.
The easiest plane becomes the hardest
The obvious response is to size each plane for its own conditions. Run the same constellation at an equinox:
| Plane | Umbra at solstice | Umbra at equinox |
|---|---|---|
| p00 | 30248 s | 32042 s |
| p01 | 31953 s | 27294 s |
| p02 | 28962 s | 27329 s |
| p03 | 0 s | 32038 s |
| p04 | 28890 s | 27269 s |
| p05 | 31942 s | 27299 s |
Plane p03 goes from the only plane with no eclipse at all to one of the two worst in the constellation.
At the equinox no plane escapes: the spread narrows to 27269 to 32042 s, and every satellite is eclipsed on every orbit.
The number to size from is each satellite’s worst case over the year, not its value at any one epoch. Since the identity of the worst plane rotates, in a homogeneous shell that reduces to a single figure applied to every spacecraft, here about 32240 s per day and a 33.5-minute maximum single eclipse.
Full-sun periods are not a bonus to design around. They are a thermal problem arriving in place of a power one, and they end.
Why the plane matters: beta angle
What separates the planes is the angle between the orbit plane and the Sun direction. A plane whose node faces the Sun is edge-on to the terminator and spends the least time in shadow; at a high enough beta angle it misses the shadow entirely, which is what p03 is doing.
Two things move that angle, and they move at very different speeds:
| Effect | Rate |
|---|---|
| The Sun’s apparent motion | about 0.986 deg/day |
| J2 nodal regression | -4.489 deg/day |
The nodal regression figure is measured for this exact shell in Doppler and orbital elements, where it is checked against the closed form.
Nodal regression is more than four times faster than the Sun’s motion, so it dominates how quickly a plane’s illumination changes.
The runs above hold the pattern fixed and move the Sun, which isolates the
geometry cleanly but understates how fast a real plane cycles. To see the true
rate, propagate with --model j2 over a span of weeks rather than comparing
24-hour snapshots at different dates.
A generated constellation carries no epoch, so --start re-anchors the whole
pattern rather than advancing it. That is the mechanism these comparisons rely on
and the reason they are snapshots rather than a time history.
What to hand a power engineer
- Maximum single eclipse duration, which sets depth of discharge.
- Maximum eclipse fraction per orbit, which sets the recharge ratio.
- Worst-case eclipse seconds per day, over a year, not at one epoch.
- The longest full-sun period, for the thermal case.
- The propagation model and window, since the summary prints the model.
Note the model line says two_body. Eclipse geometry is not sensitive to J2 over
a single day, but the plane’s beta angle very much is over weeks, so use j2 or
better for anything spanning more than a few days.
Checklist
- Are you quoting a per-satellite worst case or a constellation mean?
- Did you check more than one epoch across the year?
- Did you read “intervals” as eclipses, when it counts penumbra crossings too?
- For multi-week spans, are you using a model with nodal regression?
- Have you considered the full-sun case as a thermal requirement?
Next steps
eclipsereference for the full flag set.- Doppler and orbital elements for verifying the nodal regression this depends on.
main (pre-release)