# Yaw of repose

Whether the small angle the spinning bullet flies at to its path is worked out from gravity (and the Earth's rotation) alone, or from the bullet's own lift and Magnus force as well.

## Generated table

**Setting:** Yaw of repose

| Choice | Used by |
|---|---|
| Automatic (default) | Standard, Physics, Classic, Spin |
| From gravity only | Custom only |
| From all forces | Custom only |

## What it does

This setting matters only under the Spin model (`dynamics` `'mpm'`). There the bullet flies a very small angle off its path, the yaw of repose, and the lift and Magnus push the bullet gets at that angle drive the spin drift and part of the come-up. The setting decides which acceleration the angle is worked out from.

- **Automatic (default):** the choice that comes with the coefficients in use. The current estimated coefficients say "from all forces"; the original estimated coefficients, and any coefficient set made before that choice existed, say nothing, which means gravity only.
- **From gravity only:** the classical closed form. The angle follows from the acceleration that bends the path when only gravity and the Earth's rotation act on it.
- **From all forces:** the form of the standard modified point-mass method. The acceleration that bends the path also includes the bullet's own lift and Magnus force, which depend on the angle, so the angle appears on both sides of the equation and the solver solves it by repeating the calculation three times at every step.

The setting has no effect on the point-mass dynamics, or on the simplified Spin value that works from a coefficient set's own formulas.

## When to choose it

Leave it on Automatic. The coefficient values were made together with one of the two forms, and Automatic keeps that pairing. Change it to compare: the two forms differ by about a hundredth of a mil of come-up at 2,000 yd on the bullet in the tables below, a few hundredths at two miles, and more on a short, slow bullet. Choose "from all forces" to follow the standard method with a coefficient set whose Magnus value was made without the term. Choose "from gravity only" to see how much of a long shot's come-up the extra push accounts for. Do not combine "from all forces" with the original estimated coefficients and expect a better answer: the original values were not made to go with it, and the change is about twice as large (the second table).

## How to picture it

A spinning bullet on a curving path behaves like a top that is nudged: the nose settles a hair to one side of the direction of travel and follows the turning path. Gravity bends the path down, so for a right-hand twist the nose settles to the right; the air then meets the bullet slightly from one side and pushes it sideways, which is the spin drift, and the Magnus force pushes it up.

Draw the path and, at a point on it, three arrows: the direction of travel, the axis a fraction of a degree to its right, and the lift along the axis tilt. In the gravity form the only thing bending the path is gravity. In the full form add one more arrow: the lift itself pushes the path sideways to the right, a second, smaller bend. A bend to the right makes the nose settle a little upward as well, and lift on an upward-tilted nose pushes the bullet up. So the full form turns the settled angle a few hundredths of the way toward nose-up, hardly changing its size, and adds a small upward push that grows with range. The diagram to draw is the yaw arrow rotated slightly out of the horizontal.

## The math

Work in the line-of-sight frame of [dynamics](dynamics.md): $x$ downrange, $y$ up, $z$ right. That page states the equations of motion; this page owns the yaw of repose $\boldsymbol\alpha$ they use. Symbols that page defines ($\mathbf u$, $U$, $s$, $M$, $\rho$, $c$, $m$, $d$, $S$, $I_x$, $p$, $C_{M\alpha}$, $C_{L\alpha}$, $C_{Np\alpha}$, $\mathbf g$, $\boldsymbol\Omega$) keep their meaning.

| Symbol | Meaning | Unit |
|---|---|---|
| $\mathbf u,\ U$ | air-relative velocity $\mathbf v-\mathbf w$ and its speed $\max(\lvert\mathbf u\rvert,1)$; the 1 m/s floor guards $U^4$ for a stalled bullet | m/s |
| $\mathbf a_0$ | the acceleration that bends the path in the gravity form: gravity plus Coriolis (below) | m/s² |
| $\kappa$ | gain from the turning of the path to the yaw | s²/m |
| $\lambda$ | lift acceleration per radian of yaw | m/s² per rad |
| $\mu$ | Magnus acceleration per radian of yaw, per unit speed | 1/s |
| $G$ | loop gain of the repetition (first order) | none |
| $g_0,\ \varphi,\ A,\ \theta,\ v_0$ | gravity chosen by `gravity`; latitude; azimuth of fire (north 0°, east 90°); slope of the line of sight; muzzle speed | m/s², rad, rad, rad, m/s |
| $\Omega$ | the Earth's rotation rate, $7.292115\times10^{-5}$ | rad/s |

**Where the yaw comes from (outline).** The spinning bullet has angular momentum $I_x p$ along its axis. As the path turns, the velocity direction turns at the rate $\lvert\mathbf u\times\dot{\mathbf u}\rvert/U^2$, and the axis must turn with it. A gyroscope turned this way needs a torque at right angles to both; the only torque available is the air's overturning moment, which for a small angle $\alpha$ between the axis and the air-relative velocity is $\tfrac12\rho S d\,U^2\,C_{M\alpha}\,\alpha$. Setting the two equal gives

$$\lvert\boldsymbol\alpha\rvert=\frac{2\,I_x\,\lvert p\rvert\,\lvert\mathbf u\times\dot{\mathbf u}\rvert}{\rho\,S\,d\,U^{4}\,C_{M\alpha}}$$

and the direction (the axis is displaced in the direction of $\mathbf u\times\dot{\mathbf u}$ for a left twist and opposite to it for a right twist, which the sign of $p$ carries) gives the vector form below. The derivation is the modified point-mass model of McCoy, *Modern Exterior Ballistics*, ch. 9, and eq. 14 of STANAG 4355 Ed. 4 (Czech implementation ČOS 109001). It assumes small angles and a steady yaw that follows the turn, and neglects the damping and Magnus moments on the axis.

$$\kappa=-\frac{2\,I_x\,p}{\rho\,S\,d\,U^{4}\,C_{M\alpha}(M)}$$

The density $\rho$ is the air at the bullet's height ([lapse](lapse.md), [airDensity](airDensity.md)), $M=s/c$ with $s$ by `windDrag`, and $C_{M\alpha}(M)$ is the overturning slope of the coefficient set with its Mach slope and floor, as in [dynamics](dynamics.md). The spin rate $p$ is positive for a right-hand twist, so $\kappa<0$ for a right twist and $\kappa>0$ for a left.

**The acceleration $\mathbf a_0$.** $\mathbf a_0=\mathbf g-2\boldsymbol\Omega_{\mathrm{los}}\times\mathbf v$, with $\mathbf v$ the ground velocity. Gravity is $\mathbf g=(-g\sin\theta,\,-g\cos\theta,\,0)$ with $g=g_0$, except under `coriolis` `'baseline'`, where $g=g_0-2\Omega v_0\cos\varphi\sin A$ (the change in gravity is the whole of that mode's vertical term). The Coriolis term is present only under `coriolis` `'integrated'`, where $\boldsymbol\Omega_{\mathrm{los}}$ is the rotation vector turned into the line-of-sight frame ([coriolis](coriolis.md)); under `'baseline'` and `'off'` it is zero. Drag and yaw drag are parallel to $\mathbf u$ and drop out of every cross product with $\mathbf u$, so they are not in $\mathbf a_0$.

**From gravity only.**

$$\boldsymbol\alpha=\kappa\;\big(\mathbf u\times\mathbf a_0\big)$$

For a right twist ($\kappa<0$) in level flight, $\mathbf u\approx U\hat x$ and $\mathbf a_0\approx-g\hat y$, so $\mathbf u\times\mathbf a_0=-Ug\,\hat z$ and $\boldsymbol\alpha=+\lvert\kappa\rvert Ug\,\hat z$: the nose points right of the path, the lift $\lambda\boldsymbol\alpha$ is to the right (spin drift), and $\boldsymbol\alpha\times\mathbf u$ points up (the Magnus push). For a left twist the yaw and the lift point left and $\boldsymbol\alpha\times\mathbf u$ points down, but $\mu$ changes sign with $p$, so the Magnus push is still up.

**From all forces.** The acceleration that bends the path is the whole non-drag acceleration, the lift and Magnus force included:

$$\lambda=\frac{\rho\,S\,U^{2}\,C_{L\alpha}(M)}{2m}\qquad \mu=\frac{\rho\,S\,d\,p\,C_{Np\alpha}(M)}{2m}\ \ (\mu=0\text{ if the set has no Magnus slope})$$

$$\boldsymbol\alpha^{(0)}=\kappa\,(\mathbf u\times\mathbf a_0)\qquad \boldsymbol\alpha^{(n+1)}=\kappa\;\mathbf u\times\Big(\mathbf a_0+\lambda\,\boldsymbol\alpha^{(n)}+\mu\,\big(\boldsymbol\alpha^{(n)}\times\mathbf u\big)\Big)\quad n=0,1,2\qquad \boldsymbol\alpha=\boldsymbol\alpha^{(3)}$$

The lift acceleration is $\lambda\boldsymbol\alpha$ and the Magnus acceleration $\mu\,(\boldsymbol\alpha\times\mathbf u)$, the same expressions as in the equations of motion. The count of three is a fixed number of updates, from the gravity value, inside every evaluation of the acceleration. The standard, as a predictor-corrector implements it, starts the integration with $\boldsymbol\alpha=0$ and computes the acceleration from the yaw it has at that moment. The standard also carries cubic terms in the yaw in its overturning moment and in its lift, and fitting factors on the lift, the Magnus force and the yaw drag; the solver has none of these (at a yaw under 2 mrad the cubic terms are negligible).

**What the repetition converges to (first order).** Write $G=\dfrac{I_x}{m d^{2}}\,\dfrac{\lvert p\rvert d}{U}\,\dfrac{C_{L\alpha}}{C_{M\alpha}}$, which is $\lambda\lvert\kappa\rvert U$. Take $\mathbf u=U\hat x$ and the sideways gravity-form yaw $\alpha_z\hat z$ of a right twist. The lift $\lambda\alpha_z\hat z$ bends the path to the right, and $\kappa\,\mathbf u\times(\lambda\alpha_z\hat z)=-\kappa U\lambda\alpha_z\,\hat y$, an upward yaw component $G\,\alpha_z$ (nose up; a left twist has $\alpha_z<0$ and $\kappa>0$ and gets the same upward component). Lift on that component pushes up by $\lambda G\alpha_z$, which equals

$$\frac{\rho\,S\,d\,p}{2m}\;\Big(\frac{I_x}{m d^{2}}\frac{C_{L\alpha}^{2}}{C_{M\alpha}}\Big)\;\alpha_z\,U$$

that is, the Magnus push with $C_{Np\alpha}$ replaced by $\dfrac{I_x}{m d^2}\dfrac{C_{L\alpha}^2}{C_{M\alpha}}$ (first order in $G$; the Magnus force's own share bends the path so little that it changes the sideways yaw by a part in several hundred). Each repetition multiplies what is still unsettled by about $G$, so three are enough: $G$ is a few hundredths at rifle speeds (about 0.02 to 0.05 for the estimated coefficients of the table's bullets, computed with the muzzle spin rate and speeds from 3,048 to 900 ft/s, so a bound: the spin rate falls along the flight), and the check file confirms that after three updates less than $10^{-3}$ of the change from the gravity form is left at the muzzle states it tests. The size $\lvert\boldsymbol\alpha\rvert$ moves by under 1 % between the forms there; the main change is the rotation toward nose-up. These first-order statements are derivations, not copies of code: the check compares only the exact repetition.

**Size along a flight.** $\lvert\boldsymbol\alpha\rvert$ is proportional to $\lvert p\rvert\,g/(\rho U^3)$ to first order (gravity form, level). The bullet is much slower downrange (on this flight the cube of the speed falls about thirtyfold between 200 yd and the target); the spin rate falls by nearly half and the overturning slope rises, which take back part of that, so the yaw grows steadily: on a 3,520 yd flight of the table's kind the check finds the yaw at the target more than ten times the yaw at 200 yd, for both forms, and still under one milliradian with the current estimate (under two with the original one). It is a fraction of a degree even at the target.

## The algorithm

Where it runs: the form is set once per solve, then the yaw is recomputed inside every evaluation of the acceleration of the Spin flight (four per Runge-Kutta step), in the zeroing flight and in the shot flight.

```text
fitCard(...) under dynamics 'mpm', the yaw-of-repose step
  1. flight input mp = mpmInput(set, ...)       // mp.yawRepose = 'full' only if the set says so; an estimate says so
                                                // when its rules do (the current public rules do, the original do not)
  2. if options.yawRepose == 'full':      mp.yawRepose = 'full'
     elif options.yawRepose == 'gravity': remove mp.yawRepose
     // 'auto': leave mp.yawRepose as the set made it

acceleration(x, v, p)                           // inside fly(), every evaluation; Spin dynamics
  u = v - wind;  s by windDrag;  M = s / c;  (rho, c) at the bullet's height
  a0 = g - 2 Omega x v                          // g with the Eotvos change under coriolis 'baseline'; Coriolis term only if 'integrated'
  U  = max(|u|, 1)
  kappa  = -2 I_x p / (rho S d U^4 C_Malpha(M))
  alpha  = kappa * (u x a0)                     // the gravity form, and the start of the full form
  lambda = rho S U^2 C_Lalpha(M) / (2 m)
  if mp.yawRepose == 'full':
      mu = rho S d p C_Npalpha(M) / (2 m)  if the set has a Magnus slope, else 0
      repeat 3 times:
          alpha = kappa * (u x (a0 + lambda*alpha + mu*(alpha x u)))
  a2 = |alpha|^2
  lift = lambda*alpha;  magnus = mu*(alpha x u) (if present);  yaw drag along u uses a2   // see dynamics
  at a sampled range: re-evaluate at the interpolated state and report sqrt(a2)*1000 as yaw_repose_mrad
```

The zeroing flight ([dynamics](dynamics.md)) uses the same form, with no wind and no Coriolis, so $\mathbf a_0$ there is gravity alone. A solve under point-mass dynamics never reaches this code.

## On a real shot

**The Spin model with the current estimated coefficients**

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 Spin model's. In the first column (North, level, monolithic tipped bullet) the reference arc reaches 220 ft above the line of sight at 2150 yd. Compared with the first column, the bullet differs in "North, level", "East, level", "North, 10° uphill" and "North, 10° downhill".

| Value | Shown in the app as | North, level, monolithic tipped bullet | North, level | East, level | North, 10° uphill | North, 10° downhill |
|---|---|---|---|---|---|---|
| `'auto'` | Automatic (default) | reference | reference | reference | reference | reference |
| `'gravity'` | From gravity only | +0.033 / -0.006 / 0.0 | +0.020 / -0.003 / 0.0 | +0.019 / -0.003 / 0.0 | +0.020 / -0.003 / 0.0 | +0.019 / -0.003 / 0.0 |
| `'full'` | From all forces | 0.000 / 0.000 / 0.0 | 0.000 / 0.000 / 0.0 | 0.000 / 0.000 / 0.0 | 0.000 / 0.000 / 0.0 | 0.000 / 0.000 / 0.0 |

**The Spin model with the original estimated coefficients**

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 Spin model's, except: Estimated coefficients: Original coefficients. In the first column (North, level, monolithic tipped bullet) the reference arc reaches 220 ft above the line of sight at 2150 yd. Compared with the first column, the bullet differs in "North, level", "East, level", "North, 10° uphill" and "North, 10° downhill".

| Value | Shown in the app as | North, level, monolithic tipped bullet | North, level | East, level | North, 10° uphill | North, 10° downhill |
|---|---|---|---|---|---|---|
| `'auto'` | Automatic (default) | reference | reference | reference | reference | reference |
| `'gravity'` | From gravity only | 0.000 / 0.000 / 0.0 | 0.000 / 0.000 / 0.0 | 0.000 / 0.000 / 0.0 | 0.000 / 0.000 / 0.0 | 0.000 / 0.000 / 0.0 |
| `'full'` | From all forces | -0.073 / +0.013 / 0.0 | -0.043 / +0.007 / 0.0 | -0.042 / +0.007 / 0.0 | -0.043 / +0.008 / 0.0 | -0.041 / +0.007 / 0.0 |

**The same, shot at 2,000 yd with the current estimated coefficients**

The shot: a 350 gr 0.375 in bullet at 3048 fps muzzle velocity, fired at 2000 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: 2000 yd. All other settings are the Spin model's. In the first column (North, level, monolithic tipped bullet) the reference arc reaches 33 ft above the line of sight at 1130 yd. Compared with the first column, the bullet differs in "North, level".

| Value | Shown in the app as | North, level, monolithic tipped bullet | North, level |
|---|---|---|---|
| `'auto'` | Automatic (default) | reference | reference |
| `'gravity'` | From gravity only | +0.010 / -0.001 / 0.0 | +0.006 / -0.001 / 0.0 |
| `'full'` | From all forces | 0.000 / 0.000 / 0.0 | 0.000 / 0.000 / 0.0 |

Each cell is the change from the reference row (`'auto'`) 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 three tables above; every decimal here is copied from them. With the current coefficients, whose own choice is the full form, taking the lift and Magnus terms out of the acceleration (From gravity only) asks for +0.033 mil more elevation on the monolithic tipped bullet and +0.020 on the lead-core bullet (North, level), so the full form lowers the come-up by that much, the upward push described in The math; the change is much the same on the east, uphill and downhill shots (+0.019, +0.020, +0.019). The windage correction changes by -0.006 and -0.003 mil when the terms are removed, so the full form moves it slightly to the right: the Magnus force on the nose-up part of the yaw points left for a right twist, and a much smaller part comes from the slightly smaller sideways yaw. With the original coefficients, whose own choice is gravity only, switching to all forces changes the elevation by -0.073 and -0.043 mil on the same two bullets, about twice the change on the current coefficients: the original coefficients give both a larger yaw downrange (the check file confirms it at the target) and a larger push per unit of yaw, since their lift does not fall and their overturning slope does not rise as the bullet slows, and the push goes as the lift slope squared over the overturning slope times the yaw. At 2,000 yd the third table gives +0.010 mil on the monolithic tipped bullet and +0.006 on the lead-core bullet (North, level) for removing the terms, so the difference between the forms is about a hundredth of a mil there. The velocity at the target does not change at the shown precision.

---

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