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")