# Air density (humidity)

Which density of humid air the drag uses at the rifle: a simple humidity correction, or the exact mix of dry air and water vapor.

## Generated table

**Setting:** Air density (humidity)

| Choice | Used by |
|---|---|
| Simple humidity correction (Standard) | Standard |
| Exact humid air | Physics, Classic, Spin |

## What it does

Humid air is lighter than dry air, because water vapor weighs less than the nitrogen and oxygen it displaces. Lighter air drags less. This setting decides how much lighter the solver makes the air that the bullet flies through. It sets the density at the rifle only; how that density changes with height is the job of [lapse](lapse.md).

- **Simple humidity correction (Standard):** the humidity correction is worked out as if the air were at sea-level pressure. Where the real pressure is lower (high ground; heat adds vapor on top), the correction is too small, so the solver sees slightly more air than there is.
- **Exact humid air:** the density is the real mix of dry air and water vapor at your station pressure.

The density altitude the app shows does not depend on this setting: it is always worked out from the exact humid air.

## When to choose it

Leave it on the model's own choice. Standard uses the simple correction so that it matches its reference; Physics, Classic and Spin use the exact one. Choose the exact density when you want the physics, or when you shoot in hot, humid, thin air (the difference is largest there). In cool or dry air, or near sea level, the two agree.

## How to picture it

Picture a column of dry air at the rifle's pressure, drawn as a bar. Water vapor takes the place of some of that air and is lighter, so the bar shrinks by an amount that grows with the vapor. The exact method sizes the shrink against the real pressure. The simple method sizes it against the pressure of a standard sea-level day. At sea-level pressure the two shrinks are the same size and the bars match; with no vapor there is no shrink at all. At lower pressure the exact shrink is larger (the same vapor is a bigger share of thinner air), so the simple bar stays too tall. A diagram would show the two bars side by side at a few pressures.

A second diagram: a plane with temperature across and station pressure up. Shade it by the ratio of the simple density to the exact one. The shading is 1 along the dry edge and along the sea-level-pressure line, and grows toward the hot, thin, humid corner. The standard shot of the examples sits near the cool, thin side, so it is barely shaded.

## The math

The weather gives the dry-bulb temperature, the relative humidity and the station pressure. Two quantities come first. The vapour pressure $e$ is the water vapor's own pressure, and it is shared with the option [vapour](vapour.md), which owns any change to it. With `vapour` at `'standard'`:

$$e_s = 611.21\,\exp\!\left[\left(18.678 - \frac{T_c}{234.5}\right)\frac{T_c}{257.14 + T_c}\right] \qquad e = \frac{\mathrm{RH}}{100}\,e_s$$

The rest of this section takes $e$ as given. With `vapour` at `'classic'` the saturation pressure $e_s$ is multiplied by a factor before $e$ is formed; that factor, and when it applies, are on the [vapour](vapour.md) page. Both densities below then use that $e$.

| Symbol | Meaning | Unit |
|---|---|---|
| $T_c$ | air temperature | °C |
| $T$ | air temperature, $T_c + 273.15$ | K |
| $\mathrm{RH}$ | relative humidity | % |
| $P$ | station pressure: inHg × 3386.389 | Pa |
| $P_s$ | standard sea-level pressure: 29.92 inHg × 3386.389 | Pa |
| $e_s$ | saturation vapour pressure | Pa |
| $e$ | vapour pressure | Pa |
| $R_d$ | gas constant of dry air, 287.058 | J/(kg·K) |
| $R_v$ | gas constant of water vapor, 461.495 | J/(kg·K) |
| $\rho_{\mathrm{exact}}$ | exact humid-air density at the rifle | kg/m³ |
| $\rho_{\mathrm{simple}}$ | simple-correction density at the rifle | kg/m³ |
| $\rho_0$ | the drag density the flight starts from, one of the two | kg/m³ |
| $\mathrm{DA}$ | density altitude | ft |

**Exact humid air** (`'moist'`). The dry air has pressure $P - e$ and the vapor has pressure $e$, each at its own gas constant:

$$\rho_{\mathrm{exact}} = \frac{P - e}{R_d\,T} + \frac{e}{R_v\,T}$$

**Simple humidity correction** (`'baseline'`). The humidity factor is $1 - (1 - R_d/R_v)\,e/P_s$, where $1 - R_d/R_v$ = 0.37803, applied to the dry-air density at the real pressure:

$$\rho_{\mathrm{simple}} = \frac{P}{R_d\,T}\left[1 - \left(1 - \frac{R_d}{R_v}\right)\frac{e}{P_s}\right]$$

The exact form is the same expression with $P$ in place of $P_s$ in the bracket: $\rho_{\mathrm{exact}} = \frac{P}{R_d T}\left[1 - (1 - R_d/R_v)\,e/P\right]$, which is algebra from the line above. So the simple form divides the vapour pressure by $P_s$ where the exact one divides by $P$. To first order in $e$ the ratio of the two is

$$\frac{\rho_{\mathrm{simple}}}{\rho_{\mathrm{exact}}} \approx 1 + 0.378\,e\left(\frac{1}{P} - \frac{1}{P_s}\right)$$

which is 1 when $e = 0$ (dry air) and when $P = P_s$, is above 1 whenever $P < P_s$, and grows with $e$ (heat and humidity) and with how far $P$ is below $P_s$.

**What the flight uses.** The flight uses

$$\rho_0 = \begin{cases} \rho_{\mathrm{simple}} & \text{if } \texttt{airDensity} = \texttt{'baseline'} \\ \rho_{\mathrm{exact}} & \text{if } \texttt{airDensity} = \texttt{'moist'} \end{cases}$$

as the density at the rifle, and [lapse](lapse.md) changes it with height from there. The drag at each moment is proportional to the density at that point.

**The displayed density altitude** does not use $\rho_0$. It is always worked out from the exact density:

$$\mathrm{DA} = \frac{1 - (\rho_{\mathrm{exact}}/1.225)^{1/4.2559}}{6.8756\times 10^{-6}}$$

where 1.225 kg/m³ is the standard sea-level density. It is the same under both values.

## The algorithm

Two densities are worked out once, when the weather is turned into an air record, and the flight picks one when it starts. In the pseudocode `rho0_drag` is the solver's baseline drag density (the simple one); the exact one is `rho0`.

```text
air(env, vapour) -> (rho0, rho0_drag, ..., da_ft)
  Tc = (temp_F - 32) / 1.8
  T  = Tc + 273.15
  P  = station_pressure_inHg * 3386.389
  es = 611.21 * exp((18.678 - Tc/234.5) * (Tc / (257.14 + Tc)))
  if vapour == 'classic': es = es * (the vapour option's factor)       // see the vapour page
  e  = (rh_pct / 100) * es
  rho0    = (P - e)/(287.058*T) + e/(461.495*T)                         // exact
  rho0_drag = (P/(287.058*T)) * (1 - (1 - 287.058/461.495) * (e / (29.92*3386.389)))   // simple
  da_ft   = (1 - (rho0/1.225)^(1/4.2559)) / 6.8756e-6                  // from the exact density
```

```text
fly(input) -> samples
  1. if airDensity == 'baseline' (the default when unset):
         airIn = the air record with rho0 replaced by rho0_drag
     else ('moist'):
         airIn = the air record unchanged
  2. every acceleration evaluation and every reported Mach number
     calls airAt(airIn, h, lapse, sound, tempClamp)
```

The speed of sound at a given temperature does not depend on this setting; Mach is affected only through the temperature taper of `tempClamp` (see [tempClamp](tempClamp.md)), which works out its temperature deviation from the chosen density. Otherwise only the drag's size changes. The zeroing flight and the card both go through `fly`, so both use the same chosen density. The Spin model's stability factor along the flight uses the density the flight uses at each point. The displayed density altitude is `da_ft` from the first block and is not touched by step 1.

## On a real shot

Read from the tables below (every number here is copied from them). **The standard air** (60 °F, 40 % humidity, 24.43 inHg) is cool and only moderately humid, not where the effect is largest, so the change is small but not zero. Switching from `'baseline'` to `'moist'` changes the elevation by -0.041 mil on the north level shot and by -0.040 mil on the east level shot, with -0.003 mil of windage and the bullet arriving +0.3 fps faster. On the slopes the elevation change is -0.041 mil uphill and -0.039 mil downhill. The sign follows from The math: at this pressure $\rho_{\mathrm{simple}}$ is a little above $\rho_{\mathrm{exact}}$, so the exact density gives less drag, hence less elevation and a faster arrival.

**Hot, humid, thin air** (110 °F, 50 %, 22 inHg): see the second table. Here the same switch changes the elevation by -0.287 mil on the north level shot and -0.284 mil on the east level shot, with -0.024 mil of windage and the bullet arriving +3.1 fps faster; uphill the change is -0.285 mil and downhill -0.280 mil. That is about seven times the standard air's change in elevation. It follows from the ratio in The math: it grows with the vapour pressure $e$ (hot, humid air has a lot) and with how far the station pressure $P$ is below $P_s$ (22 inHg against the standard sea-level value), and both are large here and moderate in the first table.

**The standard shot's air**

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 humidity correction (Standard) | reference | reference | reference | reference |
| `'moist'` | Exact humid air | -0.041 / -0.003 / +0.3 | -0.040 / -0.003 / +0.3 | -0.041 / -0.003 / +0.3 | -0.039 / -0.003 / +0.3 |

**Hot, humid, thin air: 110 °F, 50 % humidity, 22 inHg**

The shot: a 350 gr 0.375 in bullet at 3048 fps muzzle velocity, fired at 3520 yd in air of 110 °F, 50 % humidity, 22 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 air is changed from the scenario's for this table: temperature 110 °F, humidity 50 %, station pressure 22 inHg. All other settings are the Standard model's. In the first column (North, level) the reference arc reaches 164 ft above the line of sight at 2110 yd.

| Value | Shown in the app as | North, level | East, level | North, 10° uphill | North, 10° downhill |
|---|---|---|---|---|---|
| `'baseline'` | Simple humidity correction (Standard) | reference | reference | reference | reference |
| `'moist'` | Exact humid air | -0.287 / -0.024 / +3.1 | -0.284 / -0.024 / +3.1 | -0.285 / -0.024 / +3.3 | -0.280 / -0.024 / +2.9 |

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.

---

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