workshop private

← all mechanics

Fill Line

mechanics · created 2026-10-08

A two-litre bottle, a bicycle pump, and the dial everybody turns the wrong way — because the load with the most energy in it is not the load that flies highest, and it is not close.

physicssimulationgame-feelcanvas

Pour water in. Pump it up. Let it go.

The pour is the interesting one, and the reason is that everyone gets it backwards in the same direction. More water feels like more rocket — it is the stuff that comes out of the bottom, it is visibly heavy, you can feel it in your arms. And it is the reaction mass, so that instinct is not wrong. It is just only half of the thing, because the water is also the lid on the spring. Every millilitre you add is a millilitre of air you took away, and the air is where every joule in the whole machine is stored.

So the two halves pull against each other, and they do not pull equally hard.

The load with the most energy in it is not the load that flies highest

Six bar on the dial, water out through the bottle’s own neck:

fillspring energyof peak energyapogeeof peak apogee
5%68 J16%49.9 m82%
10%130 J30%56.1 m92%
15%188 J43%59.2 m97%
20%240 J56%60.6 m99%
25%286 J66%61.0 m100%
30%326 J76%60.7 m99%
40%389 J90%58.1 m95%
50%425 J98%53.4 m88%
55%431 J100%50.1 m82%
65%421 J98%40.5 m66%
75%372 J86%22.2 m36%
85%223 J52%3.8 m6%
90%149 J35%1.3 m2%

The two peaks are thirty points of fill apart. At 55% you are holding half again as much energy as the load that wins, and you fly eighteen per cent lower with it. Pumping harder would not fix that; nothing about that bottle is short of energy. It is short of somewhere to put it.

Which is the lesson, and it is more general than bottles: for a fixed amount of stored work, momentum goes as sqrt(2mE). Energy is the thing you can measure on the pad, and momentum is the thing that flies. A design optimised against the gauge you happen to have is optimised against the wrong quantity, and the error does not announce itself — a 55%-full bottle reads better on every instrument on the launch pad than the one that beats it.

The curve is lopsided, and the dangerous side is the intuitive one

Twelve points of slack below the peak, fifteen above — but keep going and the two sides come apart completely. Empty the bottle almost entirely and you still get 82% of the best flight. Fill it three-quarters and you get 36%. An almost empty bottle flies better than a mostly full one, and the direction everybody errs in is the one with the cliff on it.

The second fill line

There is a hard wall further out, and it is the part of this I did not expect to be so clean.

The gas above the water can only expand so far before it is down to room pressure, and that factor is (P/Patm)^(1/γ) — nothing to do with the bottle, everything to do with the pump. If the water you poured is deeper than that expansion can reach, the pressure equalises with water still in the bottle, and that water is ballast. You carry it to apogee and you bring it home.

pumpgas can growpour no higher thanleft at 60% fillat 75%at 90%
2 bar2.18×54%257 ml911 ml1564 ml
3 bar2.67×63%—664 ml1465 ml
4 bar3.13×68%—433 ml1373 ml
6 bar3.98×75%—9 ml1204 ml
8 bar4.76×79%——1047 ml
10 bar5.50×82%——901 ml

So “how much water is too much” is not a property of the bottle. It is a property of the dial, it moves by nearly thirty points across the range of a hand pump, and it is the one coupling between two controls that the controls themselves give you no way to see. That is the picture on the demo’s bottle: the line you poured to, and a dashed line showing where the air gives out. When the dashed one is underneath, the band between them is hatched, and that band is luggage.

It is worth being precise about how much of the damage this accounts for, because it is less than it looks. At 4 bar the usable line sits at 68% —

fillpoured innever leavesapogee
60%1198 g—31.4 m
68%1357 g—18.9 m
75%1497 g433 ml6.8 m
90%1796 g1373 ml0.5 m

— and the flight was already ruined at 68%, where nothing is stranded at all. The wall is not what kills an over-filled bottle. It is what is waiting for it after it is dead.

The throat is a clock, not a lever

Here is the one you can prove on paper before you simulate it. Thrust from a water rocket is 2·A·ΔP, and the time to expel a volume dVw is dVw/(A·ve). Multiply:

Thrust·dt = 2·A·ΔP · dVw/(A·ve) = sqrt(2·ρw·ΔP) · dVw

The area cancels. Total impulse does not depend on the nozzle at all. Which the simulation then agrees with, to four digits, across a 250-fold range of throat area:

throatburnanalytic impulsesimulatedgravity lossdrag lossburnout speedburnout heightapogee
2.5 mm7680 ms19.29 N·s21.24 N·s75.3 m/s4.4 m/s−4.3 m/s25.0 m26.0 m
3 mm5333 ms19.29 N·s21.24 N·s52.3 m/s12.9 m/s6.3 m/s48.6 m50.5 m
4 mm3000 ms19.29 N·s21.24 N·s29.4 m/s23.0 m/s19.1 m/s54.0 m67.7 m
5 mm1920 ms19.29 N·s21.24 N·s18.8 m/s24.3 m/s28.4 m/s44.6 m68.5 m
6 mm1333 ms19.29 N·s21.24 N·s13.1 m/s22.6 m/s35.8 m/s35.6 m67.1 m
9 mm592 ms19.29 N·s21.24 N·s5.8 m/s15.4 m/s50.3 m/s19.2 m63.6 m
13 mm284 ms19.29 N·s21.24 N·s2.8 m/s9.1 m/s59.7 m/s10.1 m61.5 m
22 mm99 ms19.29 N·s21.25 N·s1.0 m/s3.6 m/s66.9 m/s3.7 m60.1 m
32 mm47 ms19.29 N·s21.26 N·s0.5 m/s1.8 m/s69.3 m/s1.8 m59.6 m
40 mm30 ms19.29 N·s21.27 N·s0.3 m/s1.1 m/s70.1 m/s1.1 m59.5 m

(The simulated column runs about 2 N·s over the analytic one at every row because the analytic figure is the water phase only; the rest is the air blowing down behind it. The gap closes to exactly zero when the fill is high enough that the air never gets a turn — see the first check table below.)

Same push, every time. What changes is the schedule, and the schedule is worth nine metres — 15% on the worse of them. Read the two loss columns and the reason is right there, pointing opposite ways:

Between the two there is a real interior optimum, and the burnout-height column is where you can watch it work: the winning rocket is 45 metres up and only doing 28 m/s when the water runs out. It climbed on thrust instead of being thrown. A slow climb is cheap because the atmosphere bills by v².

And the best throat changes sides

The balance between a cost that scales with time and a cost that scales with speed² depends entirely on how much push you have, so the answer swings by an order of magnitude across the pump’s range:

pumpbest throatapogee there5 mm9 mm22 mm
1.5 bar29 mm21.3 m12.9 m19.3 m21.1 m
2 bar30 mm28.0 m21.3 m26.8 m27.9 m
2.5 bar16.5 mm33.8 m29.4 m33.5 m33.8 m
3 bar9.5 mm39.3 m36.8 m39.3 m38.9 m
4 bar6 mm49.9 m49.5 m49.1 m47.7 m
6 bar4 mm70.3 m69.1 m64.0 m61.0 m
8 bar3 mm90.3 m84.0 m75.2 m71.1 m
10 bar3 mm109.0 m96.0 m84.3 m79.2 m

The pinhole and the neck trade places between 3.4 and 3.6 bar, and at 3.4 bar they are within half a metre of each other, which is as clean a crossover as you could ask for. Below it the pinhole is a mistake; above it the neck is leaving a third of the flight on the table. Nothing about either piece of hardware changed.

And the pinhole’s failure mode is not gradual. Three-quarters full at 6 bar, the neck manages a miserable 22 m; the 5 mm throat on the same bottle gets 0.29 m. It is not that it cannot lift — 23.6 N against 15.7 N of weight is a thrust-to-weight of 1.5, and it does leave the pad. It is that at 1.5 the margin is thinner than the rate the pressure decays, so the thrust falls under the weight within a few centimetres and the thing settles back down with most of its water still aboard. The neck’s T/W on the identical load is 29.

The best throat in the set is the one that needs you to have got the other two dials right first.

Two more, briefly

Each extra bar is worth less than the last, and the bottle has an opinion. 2→3 bar buys 11.1 m; 10→11 bar buys 3.5 m. Nominal burst for a sound 2 L PET bottle is around 11.5 bar gauge, and it drops with every cycle and with warmth. The demo draws each bottle a hidden limit between 9.4 and 11.6 bar and lets the wall tell you — crazing and a shiver, about 1.7 bar out. Worth listening to: the last bar on the dial is three metres of altitude against the whole round.

A heavier rocket flies higher, up to a point, and wants more water.

dry massbest fillapogeeburnout
50 g18%49.7 m95.0 m/s
100 g25%61.0 m68.7 m/s
150 g29%62.9 m55.4 m/s
200 g32%60.3 m47.1 m/s
500 g42%33.7 m26.8 m/s

Taping 50 g of dead weight to a 100 g rocket buys you two metres. Same reason as the throat: mass is ballistic coefficient, the lighter rocket leaves the pad faster and gets charged v² for it. The 50 g version hits 95 m/s and does not get to keep any of it.

Playing it

  1. Pour — drag up and down, or ↑ ↓. The bottle fills; when the pump has any pressure in it you also get the dashed line saying how high you may safely pour. Click or SPACE when the level is right.
  2. Pump — hold click or SPACE. Strokes are a fixed volume of atmospheric air, so a nearly-full bottle gets to pressure in a handful of them, which is its own small trap: over-filling makes pumping feel better.
  3. Launch — ENTER. B goes back to the water.

← → pick the throat · C toggles the coach · N is a fresh bottle · R resets the best line.

When the flight settles, the view pulls back to frame it and runs the same pump and the same throat at the fill it should have been, as a second column beside yours. Most of the time the gap between the two columns is the entire piece.

Reuse

src/fill-line.mjs is a framework-free ES module and draws nothing. SI units, absolute pressure in pascals; barG() and absFromBarG() convert to and from what a dial reads.

A flight is about a millisecond and a bestFill about thirteen, so the demo computes its coach live rather than baking a curve the way Skipstone had to.

Gotchas