There is no engine. There is a wing that sinks at 0.62 m/s on its best day and a sky with a handful of invisible columns in it going up at four or five, and the entire game is getting your circle onto one of those columns and keeping it there while the wind walks it downwind out from under you.
You get one instrument. It is a flask with a jet in it, it measures how fast the air in the flask is leaving, and it is a first-order low-pass filter with a two-and-a-half-second time constant. Everything below comes out of that one fact.
The needle is late, and it is late in degrees
Fly a steady circle offset from a core and there are two moments: the one where the glider is actually closest to the strongest lift, and the one where the needle reads highest. Here is how far apart they are.
| bank | turn rate | one turn | needle peaks | which is | true peak | indicated peak |
|---|---|---|---|---|---|---|
| 25° | 11.6 °/s | 31.1 s | 2.20 s late | 25° of turn | 1.96 m/s | 1.75 m/s |
| 30° | 14.0 °/s | 25.7 s | 2.20 s late | 31° of turn | 1.91 m/s | 1.76 m/s |
| 35° | 16.5 °/s | 21.8 s | 2.18 s late | 36° of turn | 1.84 m/s | 1.75 m/s |
| 40° | 19.2 °/s | 18.8 s | 2.12 s late | 41° of turn | 1.76 m/s | 1.73 m/s |
| 45° | 21.9 °/s | 16.4 s | 2.04 s late | 45° of turn | 1.84 m/s | 1.81 m/s |
| 50° | 24.9 °/s | 14.4 s | 1.90 s late | 47° of turn | 1.99 m/s | 1.90 m/s |
| 55° | 28.2 °/s | 12.8 s | 1.80 s late | 51° of turn | 2.00 m/s | 1.84 m/s |
Read the fifth column against the first. Up to about 45° of bank the needle is late by roughly your bank angle in degrees, which is a coincidence of this vario and this ship and nothing deeper — a 2.1 second lag and a turn rate that happens to run near a degree per second per degree of bank — but it is a coincidence you can fly with. Bank 40, and what the needle is telling you is 40 degrees of turn behind you.
Notice also what does not change much: the indicated peak is within a tenth or two of the true one, all the way down the table. The instrument is not lying about how strong the lift is. It is only lying about where. A reading you would call accurate on any bench is the whole problem, because the quantity you actually need out of it is a bearing, and a filter does not preserve those.
The lag itself is a design choice somebody made, and it is the right one — a vario with no damping in it is unreadable in rough air. Turn it down and the error goes with it:
| vario lag | peak is late by | in turn angle at 45° | peak reads |
|---|---|---|---|
| 0.0 s | 0.00 s | 0° | 1.84 m/s |
| 0.5 s | 0.50 s | 11° | 1.84 m/s |
| 1.0 s | 0.96 s | 21° | 1.83 m/s |
| 2.0 s | 1.70 s | 37° | 1.82 m/s |
| 2.6 s | 2.04 s | 45° | 1.81 m/s |
| 4.0 s | 2.58 s | 57° | 1.79 m/s |
| 6.0 s | 3.02 s | 66° | 1.78 m/s |
Press v in the demo to fly with the 0.15 s version. It is a different game,
and a much easier one.
Five ways to centre, and the instinct is one of the bad ones
Start the same way every time — circle centre 110 m off a 115 m core, 42° of bank — and let a different rule work on it for five minutes.
| strategy | height in 5 min | climb rate | centred after | final offset |
|---|---|---|---|---|
| never correct | 99 m | 0.33 m/s | never | 110 m |
| steer at the needle | -252 m | -0.84 m/s | never | 299 m |
| tighten in rising lift | -275 m | -0.92 m/s | never | 256 m |
| widen in rising lift | 470 m | 1.57 m/s | 43 s | 35 m |
| the 270° rule | 341 m | 1.14 m/s | never | 53 m |
| the 270° rule, minus the lag | 399 m | 1.33 m/s | 45 s | 33 m |
Two of these give away three hundred and fifty metres against doing nothing at all, and one of them — tighten when the lift comes up — is the thing a hand does without being asked. It is the natural reading of a rising needle and it is worth minus 1.25 m/s against not touching the stick.
The reason is phase, and it is worth being precise about because it is not the vario’s fault. Going round a circle whose centre is off the core, the lift you fly through rises for half the turn and falls for the other half. The rising half is the part where you are flying toward the core; the peak is the closest approach, and after it you are flying away. To slide the circle over onto the core you want the shallow, straight-ish bit of your path to happen on the half where the nose is pointed at it — the rising half. Tightening then does the exact opposite: it bends the path away on the one quarter where it was aimed right, and lets it run wide on the quarter where it was aimed wrong, and the circle walks off downhill. The sign is the whole rule and it is the sign nobody’s hand picks.
This one is not about the lag. Turn the vario down to nothing and it stays backwards:
| vario lag | tighten in rising lift | widen in rising lift |
|---|---|---|
| 0.0 s | -0.81 | 1.59 |
| 1.0 s | -0.92 | 1.57 |
| 2.6 s | -0.92 | 1.57 |
| 4.0 s | -0.91 | 1.47 |
| 6.0 s | -0.89 | 1.34 |
Where the lag does bite: the rule with a bearing in it
The rule people are taught has a bearing in it. Note where the needle peaked; keep turning three quarters of a circle; straighten for a couple of seconds. The 270° is there because you want to be flying at the core when you straighten, and heading at the core is a quarter turn before closest approach — so, three quarters of a turn after it.
After it. Not after the needle says so. Subtract the lag and:
| vario lag | the 270° rule | minus the lag | what the correction bought |
|---|---|---|---|
| 0.0 s | 1.36 | 1.36 | +0.00 m/s |
| 0.5 s | 1.23 | 1.28 | +0.05 m/s |
| 1.0 s | 1.11 | 1.23 | +0.12 m/s |
| 2.0 s | 1.23 | 1.33 | +0.10 m/s |
| 2.6 s | 1.14 | 1.33 | +0.19 m/s |
| 4.0 s | 0.87 | 1.33 | +0.47 m/s |
| 6.0 s | 0.31 | 1.32 | +1.01 m/s |
The lag-corrected version is flat across the whole column — 1.32 to 1.36 m/s whatever instrument you hand it — and the uncompensated one falls off a cliff. At six seconds of damping the textbook rule has been reduced to a quarter of its own climb rate while the corrected one has not noticed. That is the shape you want from a correction: it should be worth exactly the error it corrects and nothing else.
How tight to turn, and which way to be wrong
Sink goes up with bank because lift has to rise to n·W and the induced term
goes as the square of it: 0.62 m/s wings-level, 1.05 at 45°, 1.76 at 60°. Bank
buys you a smaller circle, and a smaller circle sits deeper in the core. Those
two trade, and the trade lands somewhere different for every core.
| bank | radius | R=60 m | R=80 m | R=100 m | R=120 m | R=160 m | R=220 m |
|---|---|---|---|---|---|---|---|
| 20° | 138 m | -1.24 | -1.12 | -0.72 | -0.21 | 0.72 | 1.62 |
| 25° | 112 m | -1.23 | -0.79 | -0.15 | 0.44 | 1.31 | 2.03 |
| 30° | 95 m | -1.08 | -0.38 | 0.34 | 0.92 | 1.68 | 2.25 |
| 35° | 83 m | -0.86 | -0.01 | 0.71 | 1.24 | 1.89 | 2.35 |
| 40° | 74 m | -0.64 | 0.28 | 0.96 | 1.44 | 1.99 | 2.38 |
| 45° | 67 m | -0.47 | 0.46 | 1.10 | 1.53 | 2.01 | 2.34 |
| 50° | 62 m | -0.37 | 0.55 | 1.14 | 1.52 | 1.95 | 2.24 |
| 55° | 58 m | -0.38 | 0.51 | 1.07 | 1.42 | 1.80 | 2.05 |
| 60° | 55 m | -0.52 | 0.34 | 0.86 | 1.18 | 1.53 | 1.75 |
Climb rate in m/s, perfectly centred, 4.6 m/s core, 0.3 m/s of ambient sink. The optimum walks from 50° in a narrow core to 40° in a fat one, which is the advice every club gives and it is nice to watch it fall out of a polar.
The part worth taking away is the asymmetry. Compare the two ends of each column — 20° of bank against 60°:
| core radius | 20° of bank | 60° of bank | which error is survivable |
|---|---|---|---|
| 60 m | -1.24 | -0.52 | steep, by 0.72 m/s |
| 80 m | -1.12 | 0.34 | steep, by 1.46 m/s |
| 100 m | -0.72 | 0.86 | steep, by 1.58 m/s |
| 120 m | -0.21 | 1.18 | steep, by 1.39 m/s |
| 160 m | 0.72 | 1.53 | steep, by 0.81 m/s |
| 220 m | 1.62 | 1.75 | steep, by 0.13 m/s |
Every row. Being too steep costs you a fraction in a wide thermal; being too shallow puts you outside a narrow one entirely, in the ring of compensating sink, going down in air that would have carried you up at a metre a second. If you are going to be wrong about the bank, be wrong steep — which, for whatever it is worth, is the same verdict Skipstone reached about the angle you hold a stone at, for entirely unrelated reasons.
There is also a hard floor. Turn radius is V²/(g·tan φ) and V has to climb
with the square root of the load factor, so the circle stops shrinking: 67 m at
45°, 55 m at 60°, and about 50 m at 70°, after which more bank buys nothing
but sink. A core narrower than that is a core this ship cannot get inside,
however well it is flown. The table’s R=60 column is entirely negative and that
is why.
What missing it costs
Same thermal, same 42° of bank, circle centre moved off the core:
| circle centre is off by | climb | of the centred climb |
|---|---|---|
| 0 m | 1.39 m/s | 100% |
| 20 m | 1.33 m/s | 96% |
| 40 m | 1.16 m/s | 84% |
| 60 m | 0.90 m/s | 65% |
| 80 m | 0.58 m/s | 42% |
| 100 m | 0.21 m/s | 15% |
| 140 m | -0.51 m/s | going down |
| 180 m | -1.06 m/s | going down |
Twenty metres is free. Eighty costs you more than half the thermal. A hundred and forty — forty metres further out, under three wingspans — and you are descending in a thermal, which is the condition the whole piece exists to describe: everything looks right, the needle is showing lift twice a turn, and the altimeter is unwinding.
The air
A thermal here is W0·[exp(-u) - (1/9)exp(-u/9)] with u = (d/R)². The second
term is a ring of compensating sink, and the 1/9 is not tuned — it is the one
coefficient that makes the whole thing integrate to exactly zero over the
plane. Air that goes up somewhere comes down somewhere, and this way the sink
on the run-in is the same air you are about to climb in rather than a penalty
somebody added for balance. Lift is positive out to 1.55·R and the sink ring
peaks at about 5% of the core strength, spread over an area nine times larger.
Three other things the model does because they change how it is flown:
- Thermals drift. The column goes downwind at the speed of the wind carrying it, and a glider circling in one drifts with it. This is visible in the demo as the trail: four turns march across the ground like a spring laid on its side. The country moves under you at 20 km/h while you climb, and whether that is progress or a problem is the strategic half of the game.
- They lean. Wind is faster higher up, so the column tilts downwind with height. The cumulus marking the top is therefore not above the lift you are in at 700 m — it is a few hundred metres downwind of it. Flying at the cloud is flying past the thermal.
- The cloud outlives the thermal.
cloudAmountis the same life-cycle envelope as the lift, run 120 seconds late, because condensation needs the air to get up there first and the cloud does not evaporate the moment the engine under it stops. So a cumulus appears a couple of minutes after its thermal starts working and hangs there a couple of minutes after it dies, and from below those two minutes look identical. The good-looking cloud you divert eight kilometres for is sometimes a photograph of a thermal that finished while you were on your way.
MacCready, and the setting that is fastest right up until it is not
Between thermals, how fast should you fly? The answer has been known since 1954 and it is a tangent line: pick the climb you expect to get next, draw the tangent to the polar from it, fly that speed. Faster when the next climb is strong, faster still through sink.
An autopilot flying a 100 km task on six different randomly generated days, with nothing changed but the number on the ring:
| MacCready setting | cruise speed | finished | speed when it finished | mean distance |
|---|---|---|---|---|
| 0.0 m/s | 102 km/h | 6/6 | 66.9 km/h | 100 km |
| 0.5 m/s | 119 km/h | 6/6 | 69.5 km/h | 100 km |
| 1.0 m/s | 132 km/h | 4/6 | 75.1 km/h | 93 km |
| 1.5 m/s | 144 km/h | 0/6 | — | 47 km |
| 2.0 m/s | 155 km/h | 1/6 | 89.5 km/h | 48 km |
| 2.5 m/s | 164 km/h | 0/6 | — | 34 km |
| 3.0 m/s | 172 km/h | 0/6 | — | 31 km |
The climb that autopilot actually achieved on those days, averaged over every turn it flew: 0.84 m/s. Which is where the finished column falls apart, to within the resolution of the sweep — the theory’s own answer is “set it to the climb you expect”, and setting it to the climb you want is the row where two-thirds of your flights end in a field.
Look at the fourth column and the fifth together. The 2.0 setting has the best speed on the board and one finish out of six. That is not a fast setting, it is a survivorship table: the runs that finish at 2.0 are the runs that happened to find a good thermal early, and the five that did not are not in the average. MacCready theory prices the climb. It does not price not finding one, which is why the demo’s summary panel leads with distance and puts the speed at the bottom: getting there slowly beats landing in a field.
Playing it
←→— bank. The stick stays where you leave it;spacelevels the wings. On a touch screen, hold anywhere and slide: your distance from the middle is your bank angle.↑↓— the MacCready ring, 0 to 4. The airspeed follows it in the glide (and pushes over in sink, all by itself); in the turn the ship flies minimum sink for whatever bank you are holding.c— the coach. The lift field at your altitude, the circle you are actually flying, the core you are trying to put in the middle of it, how far apart they are, and two dots: where the needle peaked, and where you were genuinely closest. The gap between the dots is the whole piece.v— a vario with no lag in it.t— real time instead of 3×.p— pause.r— another launch.
Things to look at while flying it: the trail is coloured by what the air was doing, which makes the last four turns a map of the thermal you are in — and the downwind march of that trail is the drift. The glider’s shadow sits at a fixed offset per metre of height, so the closer it gets, the lower you are. Dust spirals mark thermals too young to have made a cloud. Birds circle in the good ones, at their altitude rather than yours.
Reuse
src/centering.mjs is a framework-free ES module and draws nothing.
sinkRate(V, bankDeg)is the polar and everything else consults it;minSinkSpeed(bank),bestGlideSpeed(),stallSpeed(bank),speedToFly(mc, netto),turnRadius(V, bank),turnRate(V, bank).createField(opts)/seedField(field, x, y)/stepField(field, dt, focus)— a drifting, ageing sky that keeps itself populated around a point of interest.liftAt(field, x, y, z)is the only thing the simulation needs from it;axisAt,radiusAt,cloudAmount,thermalAgeare what a renderer needs to draw the tells.createGlider(opts)andstep(gl, field, dt, {bank, speed}, {lag}). Roll and pitch are rate-limited, andgl.variocarriesnetto(the air),te(total energy, immune to the stick),raw(uncompensated, not),ind(the lagged needle) andavg.meanClimbOnCircle({R, W0, bankDeg, offset})andbestBank({R, W0})answer the bank question by geometry rather than by flying — every number in the bank and offset tables is one call.centeringPilot({strategy, bank, lag})is a pilot you can put in a loop;climbTrial()andcrossCountry()wrap it for the strategy and MacCready tables.lagBearing({bankDeg, lag})is the needle-versus-truth measurement.scripts/measure.mjsreproduces every table above, a section at a time.
Gotchas
-
The peak of the profile is
8/9ofW0, notW0. The compensating term is-(1/9)exp(-u/9), which is-1/9at the centre too. A thermal declared at 4.6 m/s peaks at 4.09. This is the kind of thing that silently rescales a whole balance pass, so: the strength parameter is a scale factor, not a reading. -
uniform: trueon a thermal turns off ageing, the height profile and the radius-with-altitude growth. Every analysis helper uses it. Without it a sweep is measuring the height profile as much as the thing it is asking about, which cost me a confusing half hour of a “bank optimum” that moved with altitude for no reason anyone could defend. -
The averager is exponential, not a block average. Real 20- and 30-second averagers usually integrate over a fixed window; this one is a
τ = 22 sfilter because the sim’s timestep varies and a ring buffer would have been the only honest alternative. It reads slightly differently entering and leaving a thermal. It is not what the number on the panel is pretending to be. -
The autopilot is a competent pilot and not a good one. It spends 59% of its time circling, where a real cross-country pilot is nearer 40%, and it averages 0.84 m/s in a sky whose better thermals are worth 1.4 to 1.5 m/s once you are centred in them. That is fine for comparing a setting against itself — every row of the MacCready table has the same pilot in it — but do not read the absolute speeds as what this ship can do.
-
Being off-centre and being in a weak thermal look identical on the averager, which is not a modelling shortcut, it is the actual problem: 0.6 m/s on the needle is a 4.6 m/s core you are 80 m off, or a 3.2 m/s core you are sitting perfectly in the middle of. The first wants two more turns of correction and the second wants you to leave. The demo will not tell you which, because nothing tells you which. Press
cafterwards to find out whether you guessed right. -
The demo runs at 3× real time by default. Circling is a 16-second affair at 45° of bank and three quarters of a turn is twelve seconds of watching a needle, which is right for a cockpit and long for a browser tab. The lag and the turn rate scale together, so the mechanic survives the compression exactly; press
tfor 1× when you want to look at the needle properly. -
The lean is capped at 600 m of rise-equivalent and uses a crude
Δwind × (Δz / climb rate)estimate rather than integrating the parcel’s history. In a strong shear the honest answer runs away — the top of a column in a 40 km/h gradient is kilometres downwind of its source, at which point it is not a column and the model has nothing useful to say. -
demo/bundles its own copy of the module (self-contained by contract, ADR-0002). If you touchsrc/centering.mjs, copy it across.




