Choosing a pump from its maximum-flow number is an easy mistake to make.
That headline value is normally measured with little or no backpressure. At the other end of the curve, maximum pressure occurs near shutoff, where flow approaches zero. Once tubing, valves, filters, needles, and a fluidic chip are connected, the pump works somewhere between those two endpoints.
That real condition is the operating point: the intersection of the pump curve and the system curve.
This post builds a small, dependency-free Python model to estimate that intersection during early design.
1. Approximate the pump curve
Measured pressure-flow data is always preferable. But when a datasheet provides only maximum flow and shutoff pressure, a linear approximation is a useful first screen:
ΔP_pump(Q) = ΔP_max × (1 - Q / Q_max)
Q_max is the low-backpressure flow rate and ΔP_max is the pressure at approximately zero flow.
This is deliberately simple. A diaphragm, peristaltic, piston, or gear pump may have a nonlinear curve, and the curve can change with voltage, speed, fluid, and control mode.
2. Model the tube as a resistance
For fully developed laminar flow of an incompressible Newtonian liquid through a circular tube, Hagen-Poiseuille gives:
ΔP_system = R × Q
R = 128 μ L / (π D⁴)
The fourth-power dependence on inner diameter is the detail worth remembering. Changing the ID from 0.8 mm to 0.7 mm raises theoretical tube resistance by:
(0.8 / 0.7)⁴ ≈ 1.71
That is about 71% more resistance, before adding valves, filters, connectors, needles, bends, or manifolds.
3. Solve the intersection
Set the pressure available from the pump equal to the pressure required by the system:
ΔP_max × (1 - Q / Q_max) = R × Q
For this simplified linear case, the solution is direct:
Q = ΔP_max / (R + ΔP_max / Q_max)
Here is a compact implementation with explicit unit conversion:
from dataclasses import dataclass
from math import pi
@dataclass(frozen=True)
class Pump:
max_flow_ml_min: float
max_pressure_kpa: float
@dataclass(frozen=True)
class Tube:
inner_diameter_mm: float
length_m: float
viscosity_mpa_s: float = 1.0
def operating_point(pump: Pump, tube: Tube) -> tuple[float, float]:
q_max = pump.max_flow_ml_min * 1e-6 / 60.0 # m³/s
p_max = pump.max_pressure_kpa * 1e3 # Pa
diameter = tube.inner_diameter_mm * 1e-3 # m
viscosity = tube.viscosity_mpa_s * 1e-3 # Pa·s
resistance = (
128.0 * viscosity * tube.length_m
/ (pi * diameter**4)
)
flow = p_max / (resistance + p_max / q_max)
pressure = resistance * flow
return flow * 60.0 * 1e6, pressure / 1e3
4. Run a practical example
Suppose the early design inputs are:
- maximum flow: 120 mL/min;
- maximum pressure: 80 kPa;
- tube length: 1 m;
- tube ID: 0.8 mm;
- viscosity: 1 mPa·s.
pump = Pump(max_flow_ml_min=120.0, max_pressure_kpa=80.0)
tube = Tube(inner_diameter_mm=0.8, length_m=1.0)
flow, pressure = operating_point(pump, tube)
print(f"Operating flow: {flow:.2f} mL/min")
print(f"Pressure drop: {pressure:.2f} kPa")
Output:
Operating flow: 34.42 mL/min
Pressure drop: 57.06 kPa
The pump is advertised at 120 mL/min, but the estimated flow in this system is only about 34 mL/min.
Now change only the tube ID to 0.7 mm. The estimated operating flow falls again, to about 22.89 mL/min, while the pressure drop rises to about 64.74 kPa. A tolerance that looks small on a drawing can therefore move the actual operating point substantially.
5. What should be added next?
The single-tube model is a screening tool, not a system qualification. A realistic pressure budget may also include:
- valves, filters, restrictors, and fittings;
- sampling or dispensing needles;
- microchannels and sudden contractions;
- inlet/outlet pressure and elevation differences;
- temperature-dependent viscosity;
- pump-curve tolerance and tube-ID tolerance.
Extra care is needed for gases, bubbles, non-Newtonian fluids, two-phase flow, compliant tubing, and pulsatile pumping.
The full implementation, input validation, and tests are available in the GitHub repository.
For a quick independent check of circular-tube resistance and pressure drop, I also use the FOREACH Fluid Resistance and Pressure Drop Calculator.
Disclosure: I work with the FOREACH team that develops this calculator. Both the code and calculator are intended for early engineering estimates; measured pump curves and prototype validation should be used before design release.
The useful selection question is not "What is the pump's maximum flow?" It is: Where will this pump operate in my actual fluidic system?
Top comments (0)