# Wind in drag

Whether drag is worked out from the bullet's speed over the ground or from its speed through the moving air.

## Generated table

**Setting:** Wind in drag

| Choice | Used by |
|---|---|
| Ground speed (Standard) | Standard |
| Speed through the air | Physics, Classic, Spin |

## What it does

A bullet in a wind feels the air moving past it, not the ground. This setting decides how much of that the drag calculation uses.

- **Ground speed (Standard):** the drag coefficient's Mach number and one speed factor come from the bullet's speed over the ground, and the result multiplies the velocity relative to the air. So the wind tilts the push and also scales it in direct proportion to the air-relative speed, but nothing more. A crosswind comes out almost right this way; a head or tail wind adds only part of the extra drag (or relief) it should.
- **Speed through the air:** drag uses the bullet's velocity relative to the moving air, for the strength, for the Mach number and for the direction. A headwind adds drag and a tailwind removes it; a crosswind comes out of the same calculation.

With no wind the two give the same answer. The zeroing flight is flown in still air, so the zero is the same under both.

How strong the wind is, and where along the path it blows (two speeds, or a list of segments), are inputs to the solve, not part of this setting. This setting only decides how a wind that is already there enters the drag.

## When to choose it

Use "Speed through the air" when you want the physics, or when you shoot with a real headwind or tailwind, or when the bullet comes down to the speed of sound in that wind. Use Ground speed to match the Standard model's reference. For a crosswind the two agree to the precision the app prints, so nothing is lost by leaving the Standard choice on.

## How to picture it

Draw three arrows from the bullet. The first is the bullet's velocity over the ground, pointing downrange. The second is the wind, pointing where the air is going. The third is the velocity relative to the air, the first minus the second.

- **Headwind.** The wind arrow points back at the shooter, so the relative arrow is longer than the ground arrow: the air rushes past faster than the bullet moves over the ground.
- **Tailwind.** The relative arrow is shorter.
- **Crosswind.** The wind arrow is at right angles to the bullet's velocity, so the relative arrow is the long side of a right triangle: it points slightly sideways and is barely longer than the ground arrow.

Drag is a push along the relative arrow. Both values draw it that way, and both scale it by the length of the relative arrow once. They differ in the other speed: **Ground speed** reads the Mach number, and one more speed factor, from the first arrow; **Speed through the air** reads both from the third. A diagram would show the same relative arrow with two lengths of drag arrow beside it, equal for the crosswind and different for the head and tail wind. Beside it, the drag-coefficient curve against Mach, marked at the two Mach numbers (the second marker moves right in a headwind).

## The math

Axes are those of the line of sight: $x$ downrange, $y$ up at right angles to it, $z$ to the right. The bullet moves with velocity $\mathbf v$ over the ground; the air moves with velocity $\mathbf w$.

| Symbol | Meaning | Unit |
|---|---|---|
| $\mathbf v$ | bullet velocity over the ground | m/s |
| $\mathbf w$ | wind velocity at the bullet's downrange position | m/s |
| $\mathbf r$ | $\mathbf v - \mathbf w$, the velocity relative to the air | m/s |
| $s$ | the speed that sets the drag strength and the Mach number (by the value) | m/s |
| $M$ | $s / c$, the Mach number the drag coefficient is read at | none |
| $c$ | speed of sound at the bullet's height (set by `lapse`, `soundSpeed`) | m/s |
| $\rho$ | drag density at the bullet's height (set by `airDensity`, `lapse`) | kg/m³ |
| $C_d(M)$ | drag coefficient (set by `dragTable`) | none |
| $\mathrm{BC}$ | the bullet's ballistic coefficient, in lb/in² | lb/in² |
| $k$ | $\pi / (8\,\mathrm{BC} \cdot 703.0696)$, where 703.0696 converts lb/in² to kg/m² | m²/kg |
| $\mathbf g$ | gravity in the line-of-sight frame | m/s² |
| $\theta$ | inclination of the line of sight, positive uphill | rad |
| $W$, $\psi$, $W_v$ | a wind segment's speed (m/s), the direction it blows from ($0$ ahead, $\pi/2$ from the right), and its vertical speed (up positive) | m/s, rad, m/s |
| $F(s)$ | $C_d(s/c)\,s$ | m/s |

**The wind.** A segment holds from its start range to its end range (in yards, $0.9144$ m each) and is zero outside all segments. In the level frame the wind is $(-W\cos\psi,\ W_v,\ -W\sin\psi)$, and the line-of-sight frame is that rotated by the slope:

$$\mathbf w = \bigl(w_x\cos\theta + w_y\sin\theta,\ \ -w_x\sin\theta + w_y\cos\theta,\ \ w_z\bigr),\quad w_x = -W\cos\psi,\ w_y = W_v,\ w_z = -W\sin\psi$$

A wind from $\psi = 0$ is a headwind: $w_x < 0$.

**The acceleration.** With gravity $\mathbf g = (-g\sin\theta,\ -g\cos\theta,\ 0)$, $g = 9.80665$ m/s², and Earth rotation off (its terms are on [coriolis](coriolis.md)):

$$\mathbf a = -k\,\rho\,C_d\!\left(\frac{s}{c}\right) s\;\mathbf r + \mathbf g$$

**`'baseline'`.** The speed is the ground speed:

$$s = |\mathbf v|$$

The drag acts along $\mathbf r$, with strength $k\rho\,C_d(|\mathbf v|/c)\,|\mathbf v|\,|\mathbf r|$: the wind enters the strength only through the one factor $|\mathbf r|$ that multiplies the vector.

**`'relative'`.** The speed is the air-relative speed:

$$s = |\mathbf r|$$

so the strength is $k\rho\,C_d(|\mathbf r|/c)\,|\mathbf r|^2$. With $\mathbf w = 0$ both are the same.

**What the Mach number is in the output.** Each row's reported speed and Mach number are $|\mathbf v|$ and $|\mathbf v| / c$ at that range, the ground speed, under both values. Only the Mach number inside the flight (the one that reads $C_d$) depends on this setting.

**Why a crosswind barely differs, and a head or tail wind differs by a factor.** Let $u = \hat{\mathbf v}\cdot\mathbf w$ be the component of the wind along the bullet's direction of travel (positive for a tailwind). Then

$$|\mathbf r|^2 = |\mathbf v|^2 - 2\,|\mathbf v|\,u + |\mathbf w|^2 \quad\Longrightarrow\quad |\mathbf r| = |\mathbf v| - u + \frac{|\mathbf w|^2 - u^2}{2\,|\mathbf v|} + \dots$$

To first order in the wind, $F(|\mathbf r|) \approx F(s) - F'(s)\,u$, so the difference between the two values is

$$\mathbf a_{\text{relative}} - \mathbf a_{\text{baseline}} \approx k\,\rho\,F'(s)\,u\;\mathbf r$$

*Crosswind.* A pure crosswind is at right angles to the line of fire, so $u$ comes only from the bullet's own sideways and vertical velocity ($v_y w_y + v_z w_z$ over $|\mathbf v|$), which is tiny against $|\mathbf v|$. The difference is then second order in the wind and the two values give almost the same deflection. The deflection itself, $-k\rho F(s)\,w_z$ at first order, is the same in both.

*Head and tail wind.* On the line of fire, $\mathbf v = (s, 0, 0)$ and $u = w_x$, so $|\mathbf r| = s - w_x$. The part of the drag that the wind adds is, to first order,

$$\text{baseline: } k\rho\,F(s)\,w_x \qquad\qquad \text{relative: } k\rho\,\bigl[F(s) + s\,F'(s)\bigr]\,w_x$$

and their ratio is

$$R = 1 + \frac{s\,F'(s)}{F(s)} = 2 + \frac{d\ln C_d}{d\ln M}$$

Because $F = C_d\,s$ and $M = s/c$. If $C_d$ did not depend on Mach the drag would be exactly quadratic and $R$ would be exactly 2: this is where "the baseline understates a head or tail wind by about a factor of two" comes from. A real table changes it with the slope of $\ln C_d$ against $\ln M$: $R$ is below 2 where $C_d$ falls with Mach, and above 2 where it rises. On the G7 table $R$ is about 1.4 to 1.6 for Mach 1.28 to 2.5, 2.0 at Mach 0.6, 2.5 to 3.0 at Mach 0.8 and 5 and above between Mach 0.9 and 1.0 (evaluated from the solver's table).

The first-order step is an argument, not a printed number; the check beside this page integrates the exact equations above (no linearisation) and compares them with the solver's flight.

**The Spin model.** The modified point-mass model's lift, yaw and Magnus terms use the air-relative speed $U = \max(|\mathbf r|, 1\ \text{m/s})$ under both values (the code's ternary gives the same $|\mathbf r|$ in both branches; the floor keeps a stalled bullet's $U^4$ finite); the Mach number it reads its coefficients at is the $M$ above, so it does follow this setting. Under `'baseline'` that mixes the two frames, a case only the Custom model can reach (see Why).

## The algorithm

The drag is applied in the bullet's acceleration, which the flight evaluates four times per fourth-order Runge-Kutta step (0.001 s unless changed):

```text
acc(x, v, spin) -> a        // x: position in the line-of-sight frame, v: ground velocity
  w = windLos(wind, x_along_m, incl_deg)       // 0 outside every segment
  r = v - w
  1. if windDrag == 'baseline': s = |v|
     else:                      s = |r|
  h = height for the air, chosen by lapse
  (rho, c) = airAt(air, h, lapse, soundSpeed, tempClamp)
  mach = s / c
  f = -k * rho * Cd(mach) * s
  a = f * r + gravity + earth_rotation_terms
  2. if modified point-mass dynamics:
         U = max(|r|, 1)                                      // the code's two branches give the same value
         lift, yaw of repose, Magnus use U and mach
  return a
```

`windLos` rotates a segment's wind into the line-of-sight frame as in The math. After the flight, each requested range is read by linear interpolation between the two steps that straddle it, and the speed and Mach number reported there are the ground speed over `c` at that height, whatever this setting is. The zeroing flight is flown without wind, so `r = v` and both values give the same zero.

## On a real shot

Read from the first table below (every number in this paragraph is copied from it). The four columns with a wind from the right are crosswinds: the cell for `'relative'` is 0.000 / 0.000 / 0.0 in each, so on the level, uphill and downhill shots the two values agree to the printed precision, as the first-order argument in The math says. The column with the wind from ahead is the one that moves: `'relative'` needs +0.497 mil more elevation, with -0.016 mil of windage change and the bullet arriving -12.3 fps slower. The wind from ahead makes the air-relative speed larger than the ground speed, which raises the drag; the baseline value leaves the Mach number at ground speed and carries the wind only in the factor $|\mathbf r|$, so it adds less.

The second table repeats the north and headwind shots under the Spin model's other settings, with `'relative'` as the reference (the Spin model's own choice). The crosswind column is again 0.000 / 0.000 / 0.0. In the headwind column `'baseline'` needs -0.483 mil less elevation, +0.018 mil windage change and arrives +12.3 fps faster: the same kind of difference as in the first table, reversed because the reference row is the other value, and a little smaller in elevation than the first table's +0.497 because this is a different model (the same setting does not move every model by the same amount).

**Changing only this setting on the Standard model**

The shot: a 350 gr 0.375 in bullet at 3048 fps muzzle velocity, fired at 3520 yd in air of 60 °F, 40 % humidity, 24.43 inHg at the firing line, latitude 42.1°, wind as the column heads say; site altitude 5,500 ft. In the app, type it as "Site altitude" (shown when the profile's model reads one); left blank, the classic values count from sea level and can differ from this table. All other settings are the Standard model's. In the first column (North, level, 10 mph from the right) the reference arc reaches 223 ft above the line of sight at 2160 yd.

| Value | Shown in the app as | North, level, 10 mph from the right | East, level, 10 mph from the right | North, level, 10 mph from ahead | North, 10° uphill, 10 mph from the right | North, 10° downhill, 10 mph from the right |
|---|---|---|---|---|---|---|
| `'baseline'` | Ground speed (Standard) | reference | reference | reference | reference | reference |
| `'relative'` | Speed through the air | 0.000 / 0.000 / 0.0 | 0.000 / 0.000 / 0.0 | +0.497 / -0.016 / -12.3 | 0.000 / 0.000 / 0.0 | 0.000 / 0.000 / 0.0 |

Each cell is the change from the reference row (`'baseline'`) in the same shot, as elevation (mil) / windage (mil) / velocity at the target (fps). Elevation: plus means more elevation must be dialed. Windage: plus means the windage correction moves to the right (dial further right); this is a correction, not where the bullet lands. Velocity: plus means the bullet arrives faster. A zero means no difference at the shown precision.

**Each value under the Spin model's other settings**

The shot: a 350 gr 0.375 in bullet at 3048 fps muzzle velocity, fired at 3520 yd in air of 60 °F, 40 % humidity, 24.43 inHg at the firing line, latitude 42.1°, wind as the column heads say; site altitude 5,500 ft. In the app, type it as "Site altitude" (shown when the profile's model reads one); left blank, the classic values count from sea level and can differ from this table. All other settings are the Spin model's. In the first column (North, level, 10 mph from the right) the reference arc reaches 221 ft above the line of sight at 2150 yd.

| Value | Shown in the app as | North, level, 10 mph from the right | North, level, 10 mph from ahead |
|---|---|---|---|
| `'baseline'` | Ground speed (Standard) | 0.000 / 0.000 / 0.0 | -0.483 / +0.018 / +12.3 |
| `'relative'` | Speed through the air | reference | reference |

Each cell is the change from the reference row (`'relative'`) in the same shot, as elevation (mil) / windage (mil) / velocity at the target (fps). Elevation: plus means more elevation must be dialed. Windage: plus means the windage correction moves to the right (dial further right); this is a correction, not where the bullet lands. Velocity: plus means the bullet arrives faster. A zero means no difference at the shown precision.

---

[All reference pages](../index.md)
