Spaces:
Sleeping
Sleeping
| 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") | |