7 Simplified Bernoulli
To apply the Bernoulli equation, consider blood flowing through a heart valve.
Point 1 lies in the chamber just upstream of the valve, where the blood moves slowly at \(v_1\), and point 2 lies in the narrow jet through the valve, where continuity has raised the speed to \(v_2\). Under the assumptions of steady, frictionless flow along a streamline established previously, Bernoulli’s equation relates the pressure and velocity at these points:
\[P_1 + \tfrac{1}{2}\rho v_1^2 + \rho g h_1 = P_2 + \tfrac{1}{2}\rho v_2^2 + \rho g h_2 .\]
The quantity of interest is the pressure drop \(\Delta p = P_1 - P_2\) that the heart must supply.
Step 1 — the valve is horizontal. The two sides of a valve lie at essentially the same height, so \(h_1 \approx h_2\) and the two \(\rho g h\) terms cancel — a simplification, since the two sides are not in fact at exactly the same height. Rearranging the remainder,
\[\Delta p = P_1 - P_2 = \tfrac{1}{2}\rho\big(v_2^2 - v_1^2\big).\]
Step 2 — the upstream speed is negligible. By continuity the wide chamber feeds a narrow orifice, so \(v_2 \gg v_1\); and because the velocities enter the equation squared, the velocity at point 2 dominates the difference. Dropping the small \(v_1^2\) and writing the jet speed as \(v_{\max}\) (the peak velocity reported by the ultrasound),
\[\Delta p \approx \tfrac{1}{2}\rho\,v_{\max}^2 .\]
Step 3 — insert the density and convert the units. Blood has density \(\rho \approx 1060~\text{kg/m}^3\), a standard physiological value slightly above water’s \(1000\). With \(v_{\max}\) in meters per second, this gives \(\Delta p\) in pascals:
\[\Delta p \approx \tfrac{1}{2}(1060)\,v_{\max}^2 = 530\,v_{\max}^2~\text{Pa}.\]
Clinicians, however, quote pressure in mmHg rather than pascals, and the conversion is \(1~\text{mmHg} = 133.3~\text{Pa}\). Dividing,
\[\Delta p~[\text{mmHg}] \approx \frac{530\,v_{\max}^2}{133.3} = 3.98\,v_{\max}^2 \approx 4\,v_{\max}^2 .\]
The origin of the “4” is now explicit: it is \(\tfrac{1}{2}\rho / 133.3 = \tfrac{1}{2}(1060)/133.3 = 3.98\), rounded for clinical use. The constant incorporates the density of blood and the pascal-to-mmHg conversion, so it is specific to cardiology; the same calculation with the density of water gives 3.75 rather than 4.
For blood passing through a narrowed heart valve, the pressure gradient the heart must generate is determined by the jet’s peak velocity alone:
\[\boxed{\;\Delta p \approx 4\,v_{\max}^2\;} \qquad \left(\Delta p~\text{in mmHg},\quad v_{\max}~\text{in m/s}\right).\]
Measuring the jet velocity with Doppler ultrasound, squaring it, and multiplying by four gives the pressure drop across the valve in the units a cardiologist uses, without any instrument entering the body (Heys et al. 2010). The formula rests on the three assumptions made explicitly above: the flow is frictionless, the valve is horizontal, and the upstream velocity is negligible.
- Viscous losses are ignored. A real stenotic jet dissipates some energy to friction, energy that the frictionless Bernoulli equation assumes is available to convert into pressure. The simplified formula therefore tends to overestimate the true gradient in some settings.
- The upstream velocity is neglected. Dropping \(v_1\) is excellent when \(v_2 \gg v_1\), but if the chamber velocity is not small — a high-output state, or a second narrowing upstream — the full form \(\Delta p = \tfrac{1}{2}\rho(v_2^2 - v_1^2)\) should be used instead.
- Steady flow is assumed. Cardiac flow is pulsatile, not steady, and an additional acceleration term may be needed in some cases.
- \(v_{\max}\) must be the true peak. Doppler reports only the velocity component along the beam, \(v\cos\theta\); a misaligned beam under-reads the velocity, and because \(\Delta p \propto v^2\), that error is squared into a substantially larger under-estimate of the gradient.
The simplified formula is therefore a useful clinical estimate rather than an exact energy balance, and its accuracy depends on how closely the three assumptions above hold for a given patient.
A stenotic mitral valve
The mitral valve is the left-heart atrioventricular valve, through which blood passes to fill the left ventricle. Take a healthy mitral valve whose peak inflow velocity is a normal \(v_{\text{healthy}} = 1~\text{m/s}\), and compare it with a stenotic valve whose opening has narrowed to half its healthy area while the heart drives the same flow \(Q\) through it. The code below performs both calculations and plots the result.
import numpy as np
import matplotlib.pyplot as plt
plt.style.use("../../theme/bioe10.mplstyle")
RHO = 1060.0 # blood density, kg/m^3
MMHG = 133.322 # pascals per mmHg
def dp_mmHg(v): # simplified Bernoulli: v in m/s -> pressure gradient in mmHg
return 0.5 * RHO * v**2 / MMHG
# healthy valve: normal peak inflow velocity
v_healthy = 1.0
# stenotic valve: HALF the area at the same flow Q -> continuity DOUBLES the velocity
v_stenotic = v_healthy * (1 / 0.5) # A -> A/2, so v -> 2v
print(f"coefficient 0.5*rho/mmHg = {0.5 * RHO / MMHG:.3f} (the clinical '4')")
print(f"healthy : v = {v_healthy:.1f} m/s -> dp = {dp_mmHg(v_healthy):.1f} mmHg")
print(f"stenotic: v = {v_stenotic:.1f} m/s -> dp = {dp_mmHg(v_stenotic):.1f} mmHg")
print(f"gradient grew by {dp_mmHg(v_stenotic) / dp_mmHg(v_healthy):.0f}x")
fig, (axA, axB) = plt.subplots(1, 2, figsize=(10, 4.2))
# Panel A -- continuity: velocity vs orifice area (constant flow), v = v_healthy / frac
frac = np.linspace(0.30, 1.05, 200) # orifice area as a fraction of healthy
axA.plot(frac, v_healthy / frac, color="#0072B2")
axA.scatter([1.0, 0.5], [v_healthy, v_stenotic], color=["#333333", "#D55E00"], zorder=5)
axA.annotate("healthy", (1.0, v_healthy), textcoords="offset points", xytext=(8, -14))
axA.annotate("stenotic", (0.5, v_stenotic), textcoords="offset points",
xytext=(-40, 16), ha="right", color="#D55E00")
axA.set_xlabel("orifice area (fraction of healthy)")
axA.set_ylabel("jet velocity (m/s)")
# Panel B -- Bernoulli: pressure gradient vs velocity, dp = 4 v^2
v = np.linspace(0, 3, 200)
axB.plot(v, dp_mmHg(v), color="#E69F00")
axB.scatter([v_healthy, v_stenotic],
[dp_mmHg(v_healthy), dp_mmHg(v_stenotic)], color=["#333333", "#D55E00"], zorder=5)
axB.annotate("healthy", (v_healthy, dp_mmHg(v_healthy)), textcoords="offset points",
xytext=(-10, 10), ha="right")
axB.annotate("stenotic", (v_stenotic, dp_mmHg(v_stenotic)), textcoords="offset points",
xytext=(-10, -18), ha="right", color="#D55E00")
axB.text(0.15, dp_mmHg(v).max() * 0.9, r"$\Delta p \approx 4v^2$", fontsize=12)
axB.set_xlabel("jet velocity (m/s)")
axB.set_ylabel(r"pressure gradient $\Delta p$ (mmHg)")
plt.show()Running the code prints
coefficient 0.5*rho/mmHg = 3.975 (the clinical '4')
healthy : v = 1.0 m/s -> dp = 4.0 mmHg
stenotic: v = 2.0 m/s -> dp = 15.9 mmHg
gradient grew by 4x
and produces Figure 7.2.
Doppler to pressure
The ultrasound reports a blood velocity from the Doppler shift of a returning echo, \(v = c f_D / (2 f_0 \cos\theta)\). The clinically required quantity, however, is not velocity but the pressure gradient a stenotic valve imposes on the heart. Conservation of mass and conservation of energy supplied the two physical laws needed to derive Bernoulli’s equation, and the simplification above produced a clinical rule. The full noninvasive chain is:
\[\underbrace{f_D}_{\text{measured}} \;\xrightarrow{\;v = c f_D / 2 f_0\cos\theta\;}\; \underbrace{v_{\max}}_{\text{blood-jet speed}} \;\xrightarrow{\;\Delta p \approx 4 v_{\max}^2\;}\; \underbrace{\Delta p}_{\text{valve pressure gradient}} .\]
A cardiac probe transmits at \(f_0 = 2.0~\text{MHz}\), aligned nearly along an aortic-valve jet (\(\theta \approx 0\)), and the returning echo is shifted by \(f_D = 10.4~\text{kHz}\). The code below converts Doppler shift to velocity and then applies the simplified Bernoulli equation.
import numpy as np
c = 1540.0 # speed of sound in tissue, m/s
RHO = 1060.0 # blood density, kg/m^3
MMHG = 133.322 # pascals per mmHg
f0 = 2.0e6 # transmitted frequency, Hz
fD = 10.4e3 # measured Doppler shift, Hz
ct = 1.0 # cos(theta), beam aligned with the jet
# Step 1 -- Doppler: frequency shift -> blood-jet velocity
v = c * fD / (2 * f0 * ct)
print(f"blood-jet velocity v = {v:.2f} m/s")
# Step 2 -- Bernoulli: velocity -> valve pressure gradient
dp = 4 * v**2 # clinical rule, mmHg
dp_exact = 0.5 * RHO * v**2 / MMHG # the un-rounded version, for comparison
print(f"pressure gradient dp = {dp:.0f} mmHg (exact {dp_exact:.1f} mmHg)")which prints
blood-jet velocity v = 4.00 m/s
pressure gradient dp = 64 mmHg (exact 63.7 mmHg)
The 10.4 kHz shift implies a jet velocity of 4 m/s, and a pressure gradient of about 64 mmHg across the valve: the left ventricle must generate an additional 64 mmHg on every beat to drive blood through the narrowed opening.