Pump - Curves Similarity Law Model

Model description

The PumpCurveSimilarity component models a pump using manufacturer performance curves together with the classical pump affinity (similarity) laws. It allows computing the pump operating point in three possible modes:

  • P_N : Given suction and discharge pressures and rotational speed, compute flow rate and shaft power.

  • P_M : Given suction and discharge pressures and mass flow rate, compute the rotational speed required to reach this operating point.

  • M_N : Given suction conditions, mass flow rate and speed, compute the discharge pressure and power.

The model uses four characteristic curves at rated speed:

  • Head rise \(\Delta H(Q)\)

  • Isentropic efficiency \(\varepsilon_{\text{is}}(Q)\)

  • Required NPSH \(\text{NPSH}_r(Q)\)

  • (Power curve is derived from head and efficiency)

These curves are supplied at a rated speed \(N_\text{rated}\) and are scaled to other rotational speeds using similarity laws. The model description is available in the pdf document linked in the references.

Class description

class component.pump.pump_curve_similarity.PumpCurveSimilarity[source]

Component: Pump with a characteristic curve associated

Model: Model using characteristic curves for head and power and similarity laws to calculate the pump performance at different speeds.

Description:

Simulates a pump using head, efficiency and NPSHr performance curves (vs flow and speed). Uses the similarity laws to calculate the pump performance at different speeds.

Assumptions:

  • Steady-state

  • Incompressible fluid approximation for head calculation

Connectors:

su (MassConnector): Supply (inlet) side of the turbine.

ex (MassConnector): Exhaust (outlet) side of the turbine.

W (WorkConnector): Shaft power output from the turbine.

Parameters:

V_dot_curve: Array of volumetric flowrate curve [m³/h]

Delta_H_curve: Corresponding array from head rise curve [m]

eta_is_curve: Corresponding array from isentropic efficiency curve [-]

NPSH_r_curve: Corresponding array from NPSH required curve [m]

N_rot_rated: Rated pump speed [rpm]

modeOperation mode (“P_N”, “P_M”, or “M_N”)
  • ‘P_N’: Given suction and exhaust pressures and rotational speed, calculates flow and power

  • ‘M_N’: Given suction pressure, temperature, rotational speed, and mass flow rate, calculates exhaust pressure and power

  • ‘P_M’: Given suction and exhaust pressures and mass flow rate, calculates rotational speed

Inputs:

mode = P_N:

P_su: Suction pressure [Pa]

T_su: Suction temperature [K]

P_ex: Exhaust pressure [Pa]

N_rot: Rotational speed [RPM]

fluid: Actual working fluid

mode = P_M:

P_su: Suction pressure [Pa]

T_su: Suction temperature [K]

P_ex: Exhaust pressure [Pa]

m_dot: Mass flow rate [kg/s]

fluid: Actual working fluid

mode = M_N:

P_su: Suction pressure [Pa]

T_su: Suction temperature [K]

N_rot: Rotational speed [RPM]

m_dot: Mass flow rate [kg/s]

fluid: Actual working fluid

Outputs:

V_dot: Volumetric flow rate [m³/h]

W_dot: Shaft power required by the pump [W]

m_dot: Mass flow rate [kg/s] or P_ex: Exhaust pressure [Pa] or N_rot: Rotational speed [RPM], depending on the mode

Example of use

from labothappy.component.pump.pump_curve_similarity import PumpCurveSimilarity
import CoolProp.CoolProp as CP
import numpy as np

# Example characteristic curves and parameters
V_dot_curve = np.array([20, 30, 40, 50, 60, 70, 80])   # m3/h
Delta_H_curve = np.array([57, 55, 52, 49, 45, 42, 36])  # m (head falls with flow)
eta_is_curve = np.array([0.45, 0.59, 0.69, 0.75, 0.79, 0.79, 0.75])  # eff peaks near mid-flow
NPSH_r_curve = np.array([1.1, 1.1, 1.4, 1.8, 2, 3, 4.7])  # m, increases again near max flow
N_rated = 2900 # RPM
# Reference point: water at 20°C and 1 atm for a rated speed of 2900 RPM

# If you have eta_curve -> you can find back W_dot_curve or vice versa

PUMP = PumpCurveSimilarity()

# Set Parameters
PUMP.set_parameters(
    V_dot_curve = V_dot_curve,
    Delta_H_curve = Delta_H_curve,
    eta_is_curve = eta_is_curve,
    NPSH_r_curve = NPSH_r_curve,
    N_rot_rated = N_rated,
    mode = "P_M",  # Mode can be "M_N", "P_M", or "P_N"
)

# Set Inputs
PUMP.set_inputs(
    P_su=1.3e5,  # Suction pressure in Pascals
    T_su=275.15+15,  # Suction temperature in Kelvin
    P_ex=2.4e5,  # Exhaust pressure in Pascals
    # N_rot=1589,  # Rotational speed in RPM
    m_dot = 0.36,  # Mass flow rate in kg/s
    fluid="R1233zd(E)",  # Actual fluid type
)

PUMP.solve()
PUMP.print_results()
rho_curve = CP.PropsSI("D", "T", 293.15, "P", 101325, "Water")  # Density of water at 20°C and 1 atm
PUMP.plot_characteristic_curves(
    speeds_to_plot=[1450, 1750, 2900, 3500], rho_curve=rho_curve
)

References