One row per wind speed: the optimal upwind tacking angle to the true wind and the boat speed through the water. Between rows the simulation interpolates linearly; outside the range it clamps to the nearest row. One row is enough for a constant-performance boat.
| TWS (kn) | Upwind TWA (°) | Boat speed (kn) |
|---|
The boat is a point mass integrated with a simple time step (dt = 2 s). Its velocity over the ground is the sum of two vectors: the velocity through the water (pointed along the heading = wind direction ± tacking angle) and the local current. The tacking angle and boat speed come from the selected boat's upwind polar. With Tidal wind on (the default) they are re-evaluated at every step against the wind over the water — the true wind vector minus the local current; with it off they are interpolated once at the entered wind speed and stay constant for the whole run.
V_ground = V_boat(heading, through water) + V_current(x, y) position(t+dt) = position(t) + V_ground · dtThe measured currents (start, mark, left and right layline) are blended into a continuous field by inverse-distance weighting: at any position, nearby measurements dominate, distant ones fade out with the square of the distance. Points you leave blank are treated as not measured and dropped from the sum — so with only two points filled, the whole field is interpolated from those two, never from a false zero. With no points measured at all, the field is simply zero everywhere.
V_current(P) = Σ wᵢ·Vᵢ / Σ wᵢ where wᵢ = 1 / dᵢ²The rig does not care how the air moves over the ground — it feels the air moving relative to the water the boat floats in. With the Tidal wind switch on (the default), at every step the local current vector is subtracted from the true wind vector, and the tacking angle and boat speed are re-read from the polar at this effective wind:
W_water = W_true − V_current(x, y)A current running up-wind adds wind speed, a down-wind current takes it away, and a cross current rotates the effective wind by a few degrees — which shifts the no-go zone, the laylines and the tack points. Because the current field varies over the course, the two sides can literally sail in slightly different winds. Switching it off reverts to the simpler model where the boat holds its polar values against the true (over-ground) wind.
At every step the model asks: if I tacked right now, would my course over ground on the other tack point at the mark? It computes the opposite tack's ground vector (boat vector on the other heading + local current) and compares its direction with the bearing to the mark. When the two align — the sign of the angle between them flips — the boat tacks.
tack when: angle( V_ground_opposite , bearing to mark ) crosses 0One tack is not guaranteed. The test is re-run at every step against the local current — and, with tidal wind on, the local effective wind — so the corrected layline is a curve, not a straight line fixed in advance. In a varying field the condition can be satisfied, then lost again as the boat sails into different water (the opposite tack's ground vector drifts off the mark), so a run may legitimately contain two or more tacks before the final approach. A 20 s lock between tacks (section 5) keeps this from degenerating into rail-to-rail oscillation on the layline.
Direct sailing (fetch mode). In parallel, the model checks whether the mark is reachable without beating: it solves for the current-compensated heading whose ground velocity points straight at the mark, and if that heading lies outside the no-go zone (≥ TWA off the wind), the boat steers it directly. This mode takes over exactly where the direct heading exits the no-go zone — i.e. on the current-corrected layline — so the final leg is a continuously corrected curve that always converges on the mark, recovering any drift-induced overstand along the way. A run where even this cannot make progress (current stronger than the boat) is reported as unreachable.
Each scenario–side pair is simulated independently: 3 wind directions (left phase, mean, right phase — each held constant for the whole run) × 2 strategies (left side = starboard tack first, right side = port tack first). Each strategy starts from its own end of the line: the left strategy at the pin, the right strategy at the committee boat. A run ends when the boat is within 5 m of the mark (the final metres are sailed in fetch mode, homing on the mark); the elapsed times feed the results table.
Two guards keep the integration honest: after a tack the boat must sail at least 20 s before tacking again (prevents oscillation on the layline), and a run is abandoned after 4 simulated hours (reported as unreachable — typically when the current overpowers the boat). The chart frame and the four current measurement points are fixed to the start→mark course axis, so changing the wind direction moves the trajectories but never the course, the frame, or the current field.
Practical reading: the tool answers "given this water and these three wind directions, which side is faster on pure geometry + current?" Treat the second list as the tactical layer you add on top of it.
Figure 1. Course-up view of the beat. Solid curves: simulated ground tracks for three wind scenarios × two side strategies; thin blue lines: current-corrected laylines (mean wind); dashed grey lines: no-current reference laylines; green arrows: interpolated current field with the four measurement points; colour shading: current speed (blue = weak, green/yellow = moderate, red = strong; white = still water).
| Wind scenario | Left side | Right side | Delta | Favoured |
|---|