Note
Go to the end to download the full example code or to run this example in your browser via JupyterLite.
Swamee and Jain’s explicit friction factor (1976)#
Colebrook’s equation needs iteration, which was a nuisance on the first programmable calculators. In 1976 Prabhata Swamee and Akalank Jain fitted explicit formulas for all three of Moody’s pipe problems. Their friction factor,
\[f = \frac{0.25}{\left[\log_{10}\left(\frac{\varepsilon/D}{3.7} + \frac{5.74}{Re^{0.9}}\right)\right]^2},\]
(swamee_jain_friction_factor())
stays close to Colebrook’s over the range of engineering pipes. This
example maps the error and checks their explicit diameter formula against
an iterative solution.
import matplotlib.pyplot as plt
import numpy as np
from scipy import optimize
from engineeringkit.fluid_engineering import (
G,
colebrook_friction_factor,
darcy_head_loss,
swamee_jain_friction_factor,
)
Error against Colebrook#
Re = np.geomspace(5e3, 1e8, 60)
rel = np.geomspace(1e-6, 0.05, 50)
RE, REL = np.meshgrid(Re, rel)
error = swamee_jain_friction_factor(RE, REL) / colebrook_friction_factor(RE, REL) - 1
fig, ax = plt.subplots(figsize=(6.5, 4.2))
mesh = ax.pcolormesh(Re, rel, 100 * error, shading="auto", cmap="RdBu_r", vmin=-3, vmax=3)
ax.set(xscale="log", yscale="log", xlabel="Reynolds number", ylabel="relative roughness", title="Swamee-Jain error [%]")
fig.colorbar(mesh)
fig.tight_layout()
print(f"largest error {100 * np.abs(error).max():.2f}%; median {100 * np.median(np.abs(error)):.2f}%")
![Swamee-Jain error [%]](../../../../_images/sphx_glr_plot_07_swamee_jain_001.png)
largest error 2.99%; median 0.39%
The explicit diameter#
For a flow \(Q\) over a length \(L\) with head loss \(h_f\),
\[D = 0.66\left[\varepsilon^{1.25}\left(\frac{LQ^2}{gh_f}\right)^{4.75}
+ \nu Q^{9.4}\left(\frac{L}{gh_f}\right)^{5.2}\right]^{0.04}.\]
nu, eps, Q, L, h_f = 1.0e-6, 0.045e-3, 0.05, 1000.0, 10.0
D_sj = 0.66 * (eps**1.25 * (L * Q**2 / (G * h_f)) ** 4.75 + nu * Q**9.4 * (L / (G * h_f)) ** 5.2) ** 0.04
def loss(D):
v = Q / (np.pi * D**2 / 4)
return darcy_head_loss(colebrook_friction_factor(v * D / nu, eps / D), L, D, v)
D_exact = optimize.brentq(lambda D: loss(D) - h_f, 0.05, 1.0)
print(f"explicit D = {1e3 * D_sj:.1f} mm, iterative D = {1e3 * D_exact:.1f} mm")
assert np.abs(error).max() < 0.03
assert abs(D_sj / D_exact - 1) < 0.02
plt.show()
explicit D = 205.0 mm, iterative D = 202.2 mm
Total running time of the script: (0 minutes 0.112 seconds)