Spaces:
Sleeping
Sleeping
File size: 5,409 Bytes
f6184ad dad2376 f6184ad dad2376 f6184ad | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | import math
import streamlit as st
st.set_page_config(page_title="Pump Power Calculator", page_icon="💧", layout="centered")
# ----------------------------
# Helpers
# ----------------------------
G_SI = 9.80665 # m/s^2
RHO_WATER_4C = 1000.0 # kg/m^3 (reference for SG)
FLOW_UNITS = {
"m³/s": 1.0,
"L/s": 1e-3,
"L/min": 1e-3 / 60.0,
"m³/h": 1.0 / 3600.0,
"gpm (US)": 0.003785411784 / 60.0, # 1 US gallon = 3.785411784 L
"ft³/s": 0.028316846592,
}
HEAD_UNITS = {
"m": 1.0,
"ft": 0.3048,
}
EFF_UNITS = {
"%": 0.01,
"fraction": 1.0,
}
def to_si_flow(value, unit):
return value * FLOW_UNITS[unit]
def to_si_head(value, unit):
return value * HEAD_UNITS[unit]
def to_fraction(value, unit):
return max(1e-6, min(0.999999, value * EFF_UNITS[unit]))
def sg_to_density(sg):
return max(1e-6, sg) * RHO_WATER_4C
def hydraulic_power_kw(rho, g, Q, H):
# P_h = rho * g * Q * H [W]
return (rho * g * Q * H) / 1000.0
def shaft_power_kw(P_h_kw, eff_frac):
return P_h_kw / eff_frac
def kw_to_hp(kw):
return kw * 1.34102209 # metric HP
# ----------------------------
# UI
# ----------------------------
st.title("💧 Pump Power Calculator")
st.caption("Compute hydraulic and shaft power for a centrifugal/rotodynamic pump. Supports SI & US units, any fluid via specific gravity.")
with st.sidebar:
st.header("Inputs")
st.markdown("**Flow rate**")
Q_val = st.number_input("Flow value", min_value=0.0, value=0.05, step=0.01)
Q_unit = st.selectbox("Flow unit", list(FLOW_UNITS.keys()), index=0)
st.markdown("**Total dynamic head (TDH)**")
H_val = st.number_input("Head value", min_value=0.0, value=20.0, step=0.5)
H_unit = st.selectbox("Head unit", list(HEAD_UNITS.keys()), index=0)
st.markdown("**Fluid**")
sg = st.number_input("Specific Gravity (SG)", min_value=0.0, value=1.0, step=0.05,
help="SG = ρ_fluid / ρ_water. Water ≈ 1.00, seawater ≈ 1.025, oils < 1, etc.")
rho_override = st.checkbox("Override with custom density (kg/m³)")
rho_custom = st.number_input("Custom density (kg/m³)", min_value=0.0, value=1000.0, step=10.0, disabled=not rho_override)
st.markdown("**Pump/Drive**")
eff_val = st.number_input("Pump efficiency", min_value=0.0, value=70.0, step=1.0)
eff_unit = st.selectbox("Efficiency unit", ["%", "fraction"], index=0)
st.markdown("---")
st.markdown("**Advanced**")
g_val = st.number_input(
"Gravity g (m/s²)",
min_value=0.0,
value=G_SI,
step=0.001,
format="%.3f", # 🔹 show 3 decimal places
help="Use 9.81 m/s² for standard Earth gravity."
)
show_steps = st.checkbox("Show calculation steps", value=True)
# Convert inputs to SI
Q_si = to_si_flow(Q_val, Q_unit) # m³/s
H_si = to_si_head(H_val, H_unit) # m
eta = to_fraction(eff_val, eff_unit) # fraction
rho = rho_custom if rho_override else sg_to_density(sg)
# Calculations
P_h_kw = hydraulic_power_kw(rho, g_val, Q_si, H_si)
P_shaft_kw = shaft_power_kw(P_h_kw, eta)
P_h_hp = kw_to_hp(P_h_kw)
P_shaft_hp = kw_to_hp(P_shaft_kw)
# Output
st.subheader("Results")
c1, c2 = st.columns(2)
with c1:
st.metric("Hydraulic Power", f"{P_h_kw:,.3f} kW", help="Power imparted to the fluid.")
st.metric("Hydraulic Power", f"{P_h_hp:,.3f} HP")
with c2:
st.metric("Shaft Power", f"{P_shaft_kw:,.3f} kW", help="Power at the pump shaft (before motor/drive losses).")
st.metric("Shaft Power", f"{P_shaft_hp:,.3f} HP")
st.divider()
# Quick notes
with st.expander("Assumptions & Notes", expanded=False):
st.markdown(
"""
- **Formulae**
- Hydraulic power: \n
\\(P_{hyd} = \\rho\\, g\\, Q\\, H\\)
- Shaft power: \n
\\(P_{shaft} = \\dfrac{P_{hyd}}{\\eta}\\)
- **Units**: Internally, the app converts flow to m³/s and head to meters.
- **Specific Gravity (SG)** converts to density by \\(\\rho = SG \\cdot 1000\\,\\text{kg/m³}\\).
- **Efficiency** is the pump hydraulic efficiency (not motor efficiency).
- For a **motor** selection, you may want to add motor efficiency and a service factor.
"""
)
if show_steps:
st.subheader("Calculation Steps")
st.latex(r"Q_{SI} = Q \times \text{(flow unit factor)} \quad [\text{m}^3/\text{s}]")
st.latex(r"H_{SI} = H \times \text{(head unit factor)} \quad [\text{m}]")
st.latex(r"\rho = \begin{cases}"
r"\rho_{\text{custom}} & \text{if custom density is used} \\"
r"\text{SG} \times 1000 & \text{otherwise}"
r"\end{cases}")
st.latex(r"P_{hyd} = \rho \, g \, Q_{SI} \, H_{SI} \quad [\text{W}]")
st.latex(r"P_{shaft} = \dfrac{P_{hyd}}{\eta}")
with st.container(border=True):
st.code(
f"""Given:
Flow = {Q_val} {Q_unit} -> Q_SI = {Q_si:.6f} m³/s
Head = {H_val} {H_unit} -> H_SI = {H_si:.6f} m
Specific Gravity = {sg:.4f}
Density used = {rho:.2f} kg/m³ (custom override = {rho_override})
g = {g_val:.3f} m/s²
Efficiency = {eff_val} {eff_unit} -> η = {eta:.6f}
Computed:
Hydraulic Power = ρ·g·Q·H = {P_h_kw:.6f} kW = {P_h_hp:.6f} HP
Shaft Power = P_h / η = {P_shaft_kw:.6f} kW = {P_shaft_hp:.6f} HP
""",
language="text",
)
st.divider()
st.caption("© Pump Power Calculator • Streamlit • No external APIs • Suitable for Hugging Face Spaces")
|