# Coriolis

How the Earth's rotation moves the bullet: a drift formula plus a change in gravity, the full acceleration at every step, or nothing.

## Generated table

**Setting:** Coriolis

| Choice | Used by |
|---|---|
| Simple formula (Standard) | Standard |
| Integrated along the flight | Physics, Spin |
| Off (Classic has no Coriolis) | Classic |

## What it does

The Earth turns while the bullet flies, so the target moves a little under it. This setting decides how that is counted.

- **Simple formula (Standard):** two shortcuts. A sideways correction of Earth's rotation rate times the time of flight times the sine of the latitude, and, for shots with an east or west part, a constant change in the pull of gravity (the Eötvös effect: east shots hit high, west shots low). Nothing is integrated.
- **Integrated along the flight:** the full Coriolis acceleration is applied at every step of the flight, using your latitude, the shot's azimuth and its slope.
- **Off:** the Earth's rotation is ignored, as the Classic model does.

## When to choose it

Use Standard to match a calculator that uses the shortcuts, which is the point of the Standard model. Use Integrated when you want the physical answer. Use Off to match a calculator that has no latitude or azimuth input, as the Classic model does. At 2,000 yd the effect is well under half a mil; it grows with range. Every value except Off needs the latitude and the azimuth of the shot to do anything.

## How to picture it

Look down on the shot from above, with north up. Rifle and target both sit on the turning Earth, so the line from the shooter to the target slowly turns while the bullet is in the air, and the bullet, which is not carried round with it, flies a path that is straight in space. Seen from the shooter, in the Northern Hemisphere that path ends to the right of where the target now is, in the Southern Hemisphere to the left, by a gap that grows with the time of flight. A diagram would draw the shooter-to-target line at launch and a little turned at arrival, the straight path, and the gap at the target.

A second picture is a side view for the east-west part. From the equations below, an east shot is pushed up and a west shot down, by an amount that grows with the bullet's speed along the line of fire and is zero for a north or south shot. In the side view, draw the normal arc, a slightly flatter arc for an east shot and a slightly more curved one for a west shot; the Standard value draws those arcs by a small change in the pull of gravity. The two shortcuts are those two pictures: a sideways nudge that does not depend on the direction of fire, and a change in gravity that does.

## The math

| Symbol | Meaning | Value / unit |
|---|---|---|
| $\Omega$ | rotation rate of the Earth | 7.292115e-5 rad/s |
| $\varphi$ | latitude of the shot, north positive | rad |
| $\alpha$ | azimuth of fire, 0 = north, 90° = east | rad |
| $\theta$ | inclination of the line of sight, up positive | rad |
| $v_0$ | muzzle velocity (feet per second times 0.3048) | m/s |
| $t$ | time of flight to the row's range | s |
| $g_0$ | gravity chosen by `gravity` (standard 9.80665) | m/s² |
| $g$ | effective gravity used in the flight | m/s² |
| $\vec v = (v_x, v_y, v_z)$ | bullet velocity in the line-of-sight frame: $x$ downrange along the line of sight, $y$ up across it, $z$ to the right | m/s |
| $\vec\Omega_{\mathrm{los}}$ | the Earth's rotation vector in that frame | rad/s |
| $\vec a_C$ | Coriolis acceleration | m/s² |
| $\Delta w$ | sideways correction, positive = dial right | mil |

**Standard (`'baseline'`).** Two terms. The first changes the gravity used by the flight, with the vector split along the slope as always:

$$ g = g_0 - 2\,\Omega\, v_0 \cos\varphi \,\sin\alpha \qquad \vec g = \left(-g\sin\theta,\ -g\cos\theta,\ 0\right) $$

East ($\sin\alpha = 1$) lightens the bullet; west makes it heavier; north and south leave $g_0$. The change is $2\Omega v_0\cos\varphi\,\sin\alpha$ taken at the muzzle velocity and held constant: the bullet's slowing is not followed. At 3,048 fps, $2\Omega v_0$ is about 0.1355 m/s², which is about 0.0138 of $g_0$ (1.4 %), so the change is that much times $\cos\varphi\sin\alpha$. The drop of a long shot is roughly proportional to the pull, so the come-up changes by about that fraction of itself (to first order; drag makes it only roughly so). The second term is a correction to the windage of each row:

$$ \Delta w = -\,\Omega\, t \,\sin\varphi \times 1000 $$

It is independent of azimuth. It is negative (dial left) in the Northern Hemisphere, positive in the Southern. For a bullet that travels at a steady speed along the line of fire, the sideways acceleration $2\Omega\sin\varphi\,v_x$ gives a sideways offset $\Omega\sin\varphi\,v t^2$ at range $v t$, an angle of $\Omega t\sin\varphi$; the formula is that angle, in mil. No elevation term comes from it. The row's windage is the calm-air drift of the row minus the calm-air drift at the zero range (the zero absorbs what is present there), then divided by the profile's wind scale factor, so the net Coriolis part is $-\Omega\sin\varphi\,(t - t_{\mathrm{zero}})\times 1000$.

No acceleration is added to the equations of motion in this mode.

**Integrated (`'integrated'`).** Gravity is $g = g_0$ (no Eötvös term, no drift formula), and the equations of motion gain $\vec a_C = -2\,\vec\Omega_{\mathrm{los}} \times \vec v$ at every evaluation. The rotation vector is built in the local frame (forward along the line of fire, level; up; right; $\Omega_F$ is the horizontal component along the direction of fire) and turned by the slope:

$$ \Omega_F = \Omega\cos\varphi\cos\alpha \qquad \Omega_U = \Omega\sin\varphi \qquad \Omega_R = -\Omega\cos\varphi\sin\alpha $$

$$ \Omega_x = \Omega_F\cos\theta + \Omega_U\sin\theta \qquad \Omega_y = -\Omega_F\sin\theta + \Omega_U\cos\theta \qquad \Omega_z = \Omega_R $$

$$ a_{Cx} = -2\,(\Omega_y v_z - \Omega_z v_y) \qquad a_{Cy} = -2\,(\Omega_z v_x - \Omega_x v_z) \qquad a_{Cz} = -2\,(\Omega_x v_y - \Omega_y v_x) $$

For a bullet moving mostly downrange ($v_x$ large) the leading terms are $a_{Cz} \approx 2\Omega_y v_x$ (sideways: $2\Omega v_x\sin\varphi$ on a level shot, the Standard drift's rate) and $a_{Cy} \approx -2\Omega_z v_x = 2\Omega v_x \cos\varphi\sin\alpha$ (upward for an east shot, the same size as the Standard change in gravity). The integrated mode adds the terms that depend on the other velocity components, and follows the real $v_x$ as the bullet slows.

**Why the integrated sideways deflection is smaller than the formula's.** The air in the model is at rest relative to the ground, so drag also acts on the sideways velocity the rotation gives the bullet: $\dot v_z \approx 2\Omega_y v_x - \kappa\,v_z$, with $\kappa$ the drag's rate of slowing per second. The Standard formula, $\Omega t \sin\varphi$, is the deflection with no drag on the sideways velocity ($\kappa = 0$), so the integrated deflection falls below it, by more the longer the flight and the more drag the bullet has. On a level shot the shortfall is the larger part of the difference between the two values.

**Off (`'off'`).** $g = g_0$, no added acceleration, no drift term.

**Zeroing.** The zeroing flight always runs with Coriolis off: the bore angle that zeros the rifle contains no Earth rotation. The calm-air sideways drift at the zero range is then flown and removed from the windage of every row (above); the vertical part at the zero range is not removed from elevation.

## The algorithm

Where it runs: three places in one solve. Pseudocode in the order the code reaches them.

```text
solve(profile, env, target, options):
  bore = zeroAngle(flight with coriolis forced 'off', wind none, zero range)    // 1. zero without Earth rotation
  samples = fly(flight with options.coriolis, bore, ranges)                     // 2. the shot
  zeroDrift = drift(fly(flight with options.coriolis, bore, [zero range]))      // 3. calm drift at the zero range
  per row:  windage = (drift(row) - zeroDrift - zero offset) / wind scale factor

fly(input, bore, ranges):                                   // once per flight, before the steps
  g0 = 9.80665 if gravity == 'standard' else wgs84Gravity(lat, 0)
  if coriolis == 'baseline': gv = g0 - 2 * Omega * (mv_fps * 0.3048) * cos(lat) * sin(azimuth)
  else:                      gv = g0
  g = [-gv * sin(theta), -gv * cos(theta), 0]
  Omega_los = omegaLos(lat, azimuth, inclination, coriolis)
  each of the four evaluations of a step:
    cx = -2 * (Oy*vz - Oz*vy);  cy = -2 * (Oz*vx - Ox*vz);  cz = -2 * (Ox*vy - Oy*vx)
    a  = drag + g + [cx, cy, cz]

omegaLos(lat, azimuth, inclination, mode):
  if mode == 'off' or mode == 'baseline': return [0, 0, 0]           // so cx = cy = cz = 0
  return [OF*cos(theta) + OU*sin(theta), -OF*sin(theta) + OU*cos(theta), OR]   // OF, OU, OR as in The math

drift(row):                                                // windage in mil, positive = right, per row
  w = -(z / range) * 1000 - (spin drift terms, see spinDrift)
  if coriolis == 'baseline': w = w - 1000 * Omega * tof * sin(lat)
  return w
```

The flight is stepped by the same fourth-order Runge-Kutta as the other options (0.001 s unless changed); the Coriolis acceleration is added to the acceleration in each of the four evaluations. Under the Spin model's dynamics (`dynamics` `'mpm'`) it is also part of the non-drag, non-lift acceleration from which the yaw of repose is computed (gravity plus the Coriolis acceleration; `yawRepose` `'full'` adds the lift and Magnus forces to it). That means `'baseline'` reaches the yaw of repose only through the changed gravity, `'integrated'` through the whole acceleration, and `'off'` through neither. The sideways drift formula is added to the windage of every dynamics, the Spin model's included, whenever the value is `'baseline'`.

The Standard drift uses the row's time of flight, the integrated mode the velocity components of the flown path. In the card, `flight` `'zeroed'` flies every row on the trajectory aimed at the zero range, and `'dialed'` flies each row aimed at its own elevation (see [flight](flight.md)); the integrated acceleration therefore reads a different $v_y$ in the two.

## On a real shot

Read from the first table (every number in this paragraph is copied from it). Firing north, the Standard gravity change is zero, because it is proportional to the sine of the azimuth, so `'off'` differs from the reference row only in windage: +0.344 mil, with elevation 0.000. That is the sideways drift formula taken away. The same formula gives +0.344 on the 10° uphill shot, +0.345 east and +0.345 on the downhill shot, as The math says: it depends on the time of flight and the latitude, not on azimuth or slope. Firing east, `'off'` also needs +0.558 mil more elevation, which is the change in gravity taken away. `'integrated'` is between the two on that shot, +0.251: its east lift is a little over half the Standard one. Per The math, the Standard change holds the muzzle velocity for the whole flight, while the integrated upward term follows the speed along the line of fire as the bullet slows; to first order the upward term does not involve the bullet's vertical speed at all. In windage `'integrated'` needs +0.063 mil more than the formula on the level north shot, +0.116 uphill and +0.021 downhill: its sideways rate depends on the slope through the tilt of the rotation vector (The math), and the formula's does not. On the level north shot most of that +0.063 is the drag on the sideways velocity, which the formula leaves out (The math).

The second table starts from the Physics model, where `'integrated'` is the reference row. `'off'` differs from it by +0.280 mil of windage north, +0.228 uphill and +0.324 downhill, which is the size of the integrated sideways correction on each of those shots, and by +0.304 mil of elevation east. `'baseline'` differs from the integrated reference by -0.248 mil of elevation east and -0.063 of windage north. Velocity at the target moves by at most +0.2 fps in either table.

**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 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. All other settings are the Standard model's. In the first column (North, level) the reference arc reaches 223 ft above the line of sight at 2160 yd.

| Value | Shown in the app as | North, level | East, level | North, 10° uphill | North, 10° downhill |
|---|---|---|---|---|---|
| `'baseline'` | Simple formula (Standard) | reference | reference | reference | reference |
| `'integrated'` | Integrated along the flight | +0.001 / +0.063 / 0.0 | +0.251 / +0.074 / +0.1 | +0.001 / +0.116 / 0.0 | +0.001 / +0.021 / 0.0 |
| `'off'` | Off (Classic has no Coriolis) | 0.000 / +0.344 / 0.0 | +0.558 / +0.345 / +0.2 | 0.000 / +0.344 / 0.0 | 0.000 / +0.345 / 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 Physics model's other settings (reference row: the integrated value)**

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 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. All other settings are the Physics model's. In the first column (North, level) the reference arc reaches 221 ft above the line of sight at 2150 yd.

| Value | Shown in the app as | North, level | East, level | North, 10° uphill | North, 10° downhill |
|---|---|---|---|---|---|
| `'baseline'` | Simple formula (Standard) | -0.001 / -0.063 / 0.0 | -0.248 / -0.074 / -0.2 | -0.001 / -0.116 / 0.0 | -0.001 / -0.020 / 0.0 |
| `'integrated'` | Integrated along the flight | reference | reference | reference | reference |
| `'off'` | Off (Classic has no Coriolis) | -0.001 / +0.280 / 0.0 | +0.304 / +0.270 / +0.1 | -0.001 / +0.228 / 0.0 | -0.001 / +0.324 / 0.0 |

Each cell is the change from the reference row (`'integrated'`) 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)
