# Drag table

Which published drag curve the bullet flies on, and whether the Standard model's small correction near the speed of sound is applied; also how the drag deceleration is built from it.

## Generated table

**Setting:** Drag table

| Choice | Used by |
|---|---|
| G7, adjusted (Standard) | Standard |
| Plain published table | Physics, Classic, Spin |

## What it does

The bullet slows because of air drag. The drag coefficient, how hard the air pushes at a given speed relative to the speed of sound (the Mach number), comes from a published table for the bullet's drag model, G1 or G7. This setting chooses which version of that table the solver reads.

- **G7, adjusted (Standard)** (`'baseline'`): the published G7 table, multiplied by a small correction at Mach 0.75 to 1.05. Inside that band the multiplier varies continuously between 0.935 and 1.052: above 1 (more drag) from about Mach 0.77 to 0.94, below 1 (less drag) on either side of that, and lowest, 0.935, right at Mach 1.0. It keeps the Standard model in line with other widely used calculators. It is a convention, not new physics. It applies to G7 only; a G1 bullet is unaffected. Two edges are easy to get wrong. Below the band the multiplier is not 1: it stays at its Mach 0.75 value, 0.9955, so drag is about half a percent lower than the plain table at every slower speed. Above the band it is exactly 1, so the two values are identical there (see The math).
- **Plain published table** (`'standard'`): the published G1 or G7 table unchanged.

The two values are identical at every speed above Mach 1.05. They differ only once the bullet is slowing through the speed of sound and below it, which is long range.

This page also describes how the drag deceleration is built from the table, the bullet's ballistic coefficient and the calibration inputs, because that is where the table is used.

## When to choose it

Leave it on the model's own choice: the Standard model uses `'baseline'`, and the Physics, Classic and Spin models use `'standard'`. Choose `'standard'` in the Custom list when you want the published curve with nothing added, for example when comparing against a calculator that uses the plain table, or when a drag curve you calibrated from your own firing is meant to be the only correction. A calibrated profile adds its own correction on top of whichever table is chosen (see The math), so switching the table after calibrating changes the curve the calibration multiplies.

Short and medium shots that end above Mach 1.05 do not care. On the 2-mile shot below, the two values differ by a few hundredths of a mil.

## How to picture it

Draw drag coefficient against Mach number. For a long, pointed bullet it is nearly flat and low in the subsonic region, climbs steeply through the speed of sound (between about Mach 0.9 and 1.0 it more than doubles), peaks just past Mach 1, then falls slowly as the bullet gets faster.

The solver reads that curve by joining the published points with straight lines. For the `'standard'` value the curve is the published one. For `'baseline'` a second, almost flat curve is drawn under it, centered on 1: it sags a little below 1 at the lowest speeds, rises to a bump of about 5 % at Mach 0.85, falls below 1 again near Mach 0.95, dips to 0.935 at Mach 1.0 and is back to 1 at Mach 1.05. The solver multiplies the two curves point by point.

A diagram would show the published curve, the small correction curve beneath it on a second axis, and their product. A second diagram follows the bullet down the range: speed against distance, with the band from Mach 1.05 to 0.75 shaded, so that the reader sees the correction acting only over the last stretch of a long shot.

## The math

The drag slows the bullet along its velocity relative to the air. With the drag table chosen by `dragTable`, the acceleration is built in this order.

| Symbol | Meaning | Unit |
|---|---|---|
| $\mathbf v$ | bullet velocity | m/s |
| $\mathbf w$ | wind velocity at the bullet's downrange distance | m/s |
| $s$ | speed that drag uses: $\lvert\mathbf v\rvert$ for `windDrag` `'baseline'`, $\lvert\mathbf v-\mathbf w\rvert$ for `'relative'` (see [windDrag](windDrag.md)) | m/s |
| $c$ | speed of sound at the bullet's height (see [lapse](lapse.md), [soundSpeed](soundSpeed.md)) | m/s |
| $\rho$ | air density at the bullet's height (see [lapse](lapse.md), [airDensity](airDensity.md)) | kg/m³ |
| $M$ | Mach number, $s/c$ | none |
| $b$ | the profile's ballistic coefficient for its drag model | lb/in² |
| $q$ | calibration drag factor; 1 when the profile has none | none |
| $b_e$ | the coefficient the solver flies with, $b/q$ | lb/in² |
| $B$ | pounds per square inch in kilograms per square metre, 703.0696 | (kg/m²)/(lb/in²) |
| $\kappa_0$ | the bullet's constant $\pi/(8\,b_e\,B)$ | m²/kg |
| $C_T(M)$ | the published table's drag coefficient (G1 or G7) | none |
| $\kappa_B(M)$ | the baseline correction (G7 and `'baseline'` only) | none |
| $\kappa_c(M)$ | the calibrated Mach multiplier, 1 with no list | none |
| $C_d(M)$ | the drag coefficient the solver uses | none |
| $\mathbf a_d$ | the drag acceleration | m/s² |

**Drag acceleration.** The profile's coefficient divides by the calibration factor, and the constant follows:

$$b_e = \frac{b}{q} \qquad \kappa_0 = \frac{\pi}{8\,b_e\,B} \qquad M = \frac{s}{c}$$

$$\mathbf a_d = -\,\kappa_0\,\rho\,C_d(M)\,s\,(\mathbf v-\mathbf w)$$

With no wind its length is $\kappa_0\,\rho\,C_d\,s^2$. To compute it by hand: find $M$, read $C_d$ as below, multiply by $\rho$, by $s^2$, and by $\kappa_0$. Gravity, Coriolis and the other terms are added to this one.

**The drag coefficient.** Three factors multiply, in this order (the product is commutative, but this is how the code groups it):

$$C_d(M) = C_T(M)\;\kappa_B(M)\;\kappa_c(M)$$

**1. The published table.** Let the table's points be $(M_i, C_i)$, ascending. The table is read by straight lines between neighbours and held flat beyond its ends:

$$C_T(M) = \begin{cases} C_0 & M \le M_0 \\ C_i + (C_{i+1}-C_i)\,\dfrac{M-M_i}{M_{i+1}-M_i} & M_i \le M \le M_{i+1} \\ C_n & M \ge M_n \end{cases}$$

Each table runs from Mach 0 to Mach 5, with its points closest together through the speed of sound. Near the speed of sound the G7 values are, for example, 0.1464 at Mach 0.9, 0.3803 at Mach 1.0 and 0.4043 at Mach 1.05.

**2. The baseline correction.** For `'standard'`, and for every G1 bullet, $\kappa_B = 1$. For `'baseline'` and a G7 bullet it is read from seven points by the same straight-line rule, held flat beyond the first and last:

| Mach | 0.75 | 0.80 | 0.85 | 0.90 | 0.95 | 1.00 | 1.05 |
|---|---|---|---|---|---|---|---|
| $\kappa_B$ | 0.9955 | 1.01 | 1.052 | 1.014 | 0.9975 | 0.935 | 1 |

So $\kappa_B = 0.9955$ at every speed below Mach 0.75, and $\kappa_B = 1$ at every speed above Mach 1.05. It exceeds 1 (more drag) between a speed in the interval 0.75 to 0.8 and a speed in the interval 0.9 to 0.95, and is below 1 (less drag) everywhere else.

**3. The calibration multiplier.** A calibrated profile can carry a list of Mach points $(m_j, k_j)$ ascending. $\kappa_c$ is read from it by the same straight-line rule and held flat beyond its ends. With no list, or an empty one, $\kappa_c = 1$. When the Spin model's coefficients carry their own drag curve, this option is not used (see [dynamics](dynamics.md)).

**What is not in the drag.** The calibration also has a drop scale factor by Mach. It is not part of $C_d$: it scales the finished elevation at the target's Mach.

## The algorithm

The coefficient, once per Mach:

```text
interp(points, x)                       // points ascending in x
  if x <= first.x: return first.y
  if x >= last.x:  return last.y
  find i with points[i].x <= x < points[i+1].x   // binary search
  return y_i + (y_{i+1} - y_i) * (x - x_i) / (x_{i+1} - x_i)

cd(model, knots, mach, table) -> Cd
  base = interp(TABLE[model], mach)                    // G1 or G7
  kB = 1
  if table == 'baseline' and model == 'G7':
      kB = interp(the seven points of the baseline correction, mach)
  kc = interp(knots, mach) if knots present and not empty else 1
  return base * kB * kc
```

Where the choice is made, once per solve, and where the coefficient is used, at every step of the flight:

```text
choose the drag                         // in the solve, before flying
  if the Spin model's coefficients carry their own drag curve:
      use that curve; this option is not used        // see dynamics
  else:
      bc = profile.bc / (cdf or 1)
      model = profile.model; knots = profile.knots; table = the option's value

each integration step, acc(x, v, p)
  s    = |v|  or  |v - w|                              // windDrag
  (rho, c) = air at the bullet's height                // lapse, soundSpeed, ...
  mach = s / c
  f    = -(pi / (8 * bc * 703.0696)) * rho * cd(model, knots, mach, table) * s
  a_drag = f * (v - w)
```

The zeroing flight uses the same choice, so a rifle is zeroed with the table it is then fired with. For a zero range the bullet reaches while still above Mach 1.05, the two values zero identically. The range card's "past the calibrated Mach" blend flies the same profile without its calibration and with the same table.

## On a real shot

**The 2-mile shot, 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'` | G7, adjusted (Standard) | reference | reference | reference | reference | reference |
| `'standard'` | Plain published table | +0.034 / +0.001 / +2.1 | +0.034 / +0.001 / +2.1 | +0.034 / 0.000 / +2.2 | +0.034 / +0.002 / +1.8 | +0.033 / +0.001 / +2.4 |

**A shorter shot that ends inside the band, 2,800 yd, Standard model**

The shot: a 350 gr 0.375 in bullet at 3048 fps muzzle velocity, fired at 2800 yd in air of 60 °F, 40 % humidity, 24.43 inHg at the firing line, latitude 42.1°, wind 10 mph from the right (90° to the line of fire), the same wind in every column; 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. The shot is changed from the scenario's for this table: 2800 yd. All other settings are the Standard model's. In the first column (North, level) the reference arc reaches 98 ft above the line of sight at 1670 yd.

| Value | Shown in the app as | North, level |
|---|---|---|
| `'baseline'` | G7, adjusted (Standard) | reference |
| `'standard'` | Plain published table | +0.006 / +0.002 / -1.6 |

**A shot that ends just below the band, 4,400 yd, Standard model**

The shot: a 350 gr 0.375 in bullet at 3048 fps muzzle velocity, fired at 4400 yd in air of 60 °F, 40 % humidity, 24.43 inHg at the firing line, latitude 42.1°, wind 10 mph from the right (90° to the line of fire), the same wind in every column; 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. The shot is changed from the scenario's for this table: 4400 yd. All other settings are the Standard model's. In the first column (North, level) the reference arc reaches 485 ft above the line of sight at 2670 yd.

| Value | Shown in the app as | North, level |
|---|---|---|
| `'baseline'` | G7, adjusted (Standard) | reference |
| `'standard'` | Plain published table | -0.022 / -0.006 / +2.2 |

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.

Read from the first table: switching to `'standard'` changes the 2-mile elevation by +0.034 mil and the arrival speed by +2.1 fps, and the same in every column (the downhill one reads +0.033), with windage moving by at most +0.002 mil. So the difference is the drag curve acting along the path, not wind or slope. The shot arrives inside the adjusted band. The bullet stays above the adjusted band for roughly the first two-thirds of the shot, where both values are the same published curve; the two shots part company only afterwards. Stepping the range in the solver shows how: just past the speed of sound the baseline value has less drag, so it is ahead; further on its extra drag below that eats the lead. The 2,800 yd table reads the early stage, where the plain table is slower on arrival (-1.6 fps) and wants slightly more elevation (+0.006 mil). The 4,400 yd table reads the end of the whole band: the plain table arrives faster (+2.2 fps) and wants less elevation (-0.022 mil), because by then it has spent less time in the air, and drop grows with the square of that time. Below the band the held baseline value (less drag than the plain table at every slower speed) pulls the other way, so the turnover happens despite it.

---

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