Skip to content

Volume corrections

Every volume in a recipe is one line of a single ledger, run in either direction — from a target batch size back to the water you need, or from the water you have forward to what you will end up with:

strike + sparge
− grain absorption − mash tun deadspace (+ kettle top-up)
= pre-boil
− boil-off
= post-boil (hot)
− 4 % shrinkage
= post-boil (20 °C)
− kettle deadspace − hop absorption − chiller loss (+ fermenter top-up)
= into fermenter
− trub loss − dry-hop absorption
= packaged

The two directions are exact algebraic inverses of each other, pinned to 10⁻⁹ litres — this part of the engine is arithmetic, not a fit. Litres are conserved: total water minus total loss equals packaged beer.

20 °C is the basis. Every stored volume is a 20 °C volume, which is why the hot post-boil figure and the corrected one are separate lines.

Loss How it is computed Default
Grain absorption grain_kg × rate 1.0 L/kg
Kettle hop absorption hops_kg × rate 6 mL/g
Dry-hop absorption hops_kg × rate inherits 6 mL/g
Boil-off rate × boil_hours 3.0 L/h
Boil shrinkage hot × (1 − %/100) 4 %
Mash tun deadspace flat
Kettle deadspace flat 1.0 L
Chiller loss flat 0 L
Trub loss flat 1.0 L

Millilitres per gram and litres per kilogram are numerically identical, so hop absorption needs no conversion factor. About 1.0 L/kg suits a lauter tun and about 0.8 L/kg a squeezed BIAB bag; about 6 mL/g is right for pellets.

Strike water is mash thickness × grain (3.0 L/kg by default) and the sparge makes up the rest. No-sparge and full-volume BIAB profiles put everything in the strike. If the requested thickness would need more water than the batch calls for, strike is capped at the total and the sparge goes to zero.

A worked 20 L batch — 4.9 kg grain, 90 g kettle hops, 50 g dry hops, 60 minute boil — comes out as 30.34 L of total water (14.70 strike + 15.64 sparge), 25.44 L pre-boil, 22.44 L hot post-boil, 21.54 L at 20 °C, 20 L into the fermenter, 18.70 L packaged.

Nothing is clamped. Volume problems come back as warnings instead: a negative sparge (the mash thickness needs more water than the batch), a non-positive packaged volume (system losses exceed the batch size), a pre-boil volume over the kettle, a mash volume over the tun. The mash volume check uses a grain displacement of 0.6676 L/kg — one pound of crushed malt displaces about 0.08 US gallons — and exists only to answer “will this fit”.

Beerwright has two ways to relate a hot volume to a 20 °C volume, and they are separate functions because they answer different questions.

Planning uses a flat percentage off the equipment profile, 4 % by default — the conventional figure, and the one BeerSmith, Brewer’s Friend and Grainfather all ship. It is editable because it also has to absorb whatever else your rig loses between flame-out and the measuring jug, and because the whole waterfall should follow when you change it.

Measurement uses the physics. Mass is conserved as wort cools, so volumes are in inverse ratio to densities:

V_ref = V_t × ρ(t) / ρ(ref)

where ρ is Kell’s equation — G. S. Kell, “Density, thermal expansivity, and compressibility of liquid water from 0° to 150 °C”, J. Chem. Eng. Data 20(1), 1975, 97–105:

999.83952 + 16.945176·t − 7.9870401e-3·t² − 46.170461e-6·t³
+ 105.56302e-9·t⁴ − 280.54253e-12·t⁵
ρ(t) = ───────────────────────────────────────────────────────────
1 + 16.879850e-3·t

Fitted over 0–150 °C and reproducing tabulated densities to a few parts per million: 998.204 kg/m³ at 20 °C, 958.364 kg/m³ at 100 °C. Only ratios of it are used, so even that residual largely cancels. It also reproduces water’s density maximum at 3.98 °C rather than 0 °C, which is the cheapest available check that the coefficients were transcribed correctly.

The two models agree. The physical figure at 100 °C is 3.991 % against the planning constant’s 4.000 %, and a test pins that agreement to within 0.01 percentage points.

Why it matters that measurement uses a temperature rather than a percentage: a brewer reading a sight glass at 85 °C is owed the contraction for 85 °C, not for boiling. Reading 26 L off a 98 °C kettle is 25.00 L at 20 °C. Below 20 °C the correction runs the other way and the number goes up, because cold water is the denser one: 20 L read at 4 °C is 20.04 L.

This treats wort as water. At brewing strengths wort is 88–95 % water by mass and the dissolved extract raises the expansion coefficient only slightly, so real wort contracts marginally more than this predicts. The error bound is empirical: homebrewing’s directly observed 4 % is reproduced to 0.009 percentage points, so the wort-versus-water difference is smaller than the one significant figure that observation is quoted to. Taking that as the bound, the approximation is worth at most about 0.5 percentage points of volume — 0.1 L in a 25 L kettle, against a sight glass you can read to perhaps 0.25 L.

Valid from 0 to 100 °C, and not clamped outside it. Kell’s equation still evaluates to 150 °C, but the answer stops being about brewing.

From the energy balance V(T_w − T₂) = c·G·(T₂ − T_g) + M·(T₂ − T_t):

T_w = T₂ + (c / r) × (T₂ − T_g) + M × (T₂ − T_t) / V

where r is litres of water per kilogram of grain, c ≈ 0.4 is the ratio of grain’s specific heat to water’s (grain ≈ 1.67 kJ/kg·K, water 4.186), and M is the tun’s thermal mass as equivalent litres of water. This is Palmer’s strike formula from How to Brew stated in SI — his imperial constant 0.2 is the same 0.4 once quarts-per-pound becomes litres-per-kilogram.

At 3 L/kg, mashing 20 °C grain to 66 °C wants 72.13 °C strike water; at 2 L/kg it wants 75.20 °C. Add a tun worth 3 L of water sitting at 10 °C, with 5 kg of grain at 3 L/kg, and it wants 83.33 °C — the tun term is the largest single correction on a cold-start rig, and it is why the first mash of the day undershoots when it is left out.

Palmer’s infusion equation, in the same terms:

V_infusion = rise × (c·G + W) / (T_infusion − T_target)

and a decoction:

V_decoction = (W + c·G) × (T₂ − T₁) / (T_boil − T₁)

A thick decoction is conventionally pulled, so the decoction figure is the water-equivalent volume of mash, not of liquid alone. Neither returns a plausible-looking number when the physics does not allow one: an infusion that is not hotter than the target returns infinity rather than a wrong volume.

All of these conserve extract:

  • Dilute or boil down to a target gravityV₂ = V₁ × points₁ / points₂. The engine refuses to “dilute” to a higher gravity or boil down to a lower one.
  • Gravity after adding waterSG₂ = 1 + points₁ × V₁ / (V₁ + V_water) / 1000.
  • Sugar to hit a targetkg = (points_target − points_current) × V / pointsPerKgPerL. This ignores the small volume the sugar itself contributes.
  • Blending two beers — gravity blends by conserved extract (Σ points × V / Σ V); bitterness, colour and alcohol blend linearly by volume, which is exact for ABV and a good approximation for IBU and SRM.