File size: 6,869 Bytes
6e2024a
 
28a5017
 
 
6e2024a
 
4b996c7
 
 
 
6e2024a
 
0177ad7
6e2024a
4b996c7
 
0177ad7
 
 
 
4b996c7
6e2024a
0177ad7
 
 
 
 
 
 
6e2024a
0177ad7
 
 
4b996c7
0177ad7
806292e
 
 
 
 
 
 
 
 
 
 
6e2024a
 
 
 
 
 
4b996c7
 
6e2024a
4b996c7
6e2024a
 
 
 
806292e
 
 
 
 
6e2024a
0177ad7
 
806292e
4b996c7
 
6e2024a
 
 
806292e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6e2024a
 
 
 
 
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
import streamlit as st

# Set page configuration
st.set_page_config(page_title="Hydraulic Pump Power Calculator", page_icon="\U0001F6E0", layout="centered")

# Unit conversion factors
UNIT_CONVERSIONS = {
    "Displacement": {"cc/rev": 1, "in^3/rev": 16.387, "liters/rev": 1000},
    "Pressure": {"bar": 1, "MPa": 10, "PSI": 0.0689476, "kPa": 0.01, "atm": 1.01325},
    "Torque": {"Nm": 1, "lb-ft": 1.35582},
    "Flow Rate": {"L/min": 1, "m^3/h": 16.6667, "GPM (US)": 3.78541, "GPM (UK)": 4.54609}
}

# Hydraulic Power Calculation and Missing Parameter Estimation
@st.cache
def calculate_hydraulic_parameters(displacement, pressure, rpm, torque, flow_rate, 
                                     displacement_unit, pressure_unit, torque_unit, flow_rate_unit):
    # Convert inputs to base units
    displacement_cc = displacement * UNIT_CONVERSIONS["Displacement"].get(displacement_unit, 1) if displacement else None
    pressure_bar = pressure * UNIT_CONVERSIONS["Pressure"].get(pressure_unit, 1) if pressure else None
    torque_nm = torque * UNIT_CONVERSIONS["Torque"].get(torque_unit, 1) if torque else None
    flow_rate_lpm = flow_rate * UNIT_CONVERSIONS["Flow Rate"].get(flow_rate_unit, 1) if flow_rate else None

    # Calculate missing parameters if possible
    if displacement_cc and pressure_bar and rpm and not torque_nm:
        torque_nm = (displacement_cc * pressure_bar) / (20 * 3.14159)
    elif torque_nm and pressure_bar and rpm and not displacement_cc:
        displacement_cc = (torque_nm * 20 * 3.14159) / pressure_bar
    elif torque_nm and displacement_cc and rpm and not pressure_bar:
        pressure_bar = (torque_nm * 20 * 3.14159) / displacement_cc

    # Calculate power using available data
    power_displacement = (displacement_cc * pressure_bar * rpm) / 600.0 if displacement_cc and pressure_bar and rpm else None
    power_torque = (torque_nm * rpm) / 9549 if torque_nm and rpm else None
    power_flow_rate = (flow_rate_lpm * pressure_bar) / 600.0 if flow_rate_lpm and pressure_bar else None

    # Convert results to all available units
    results = {
        "displacement": {unit: displacement_cc / factor for unit, factor in UNIT_CONVERSIONS["Displacement"].items()} if displacement_cc else {},
        "pressure": {unit: pressure_bar / factor for unit, factor in UNIT_CONVERSIONS["Pressure"].items()} if pressure_bar else {},
        "torque": {unit: torque_nm / factor for unit, factor in UNIT_CONVERSIONS["Torque"].items()} if torque_nm else {},
        "flow_rate": {unit: flow_rate_lpm / factor for unit, factor in UNIT_CONVERSIONS["Flow Rate"].items()} if flow_rate_lpm else {},
        "power_displacement": power_displacement,
        "power_torque": power_torque,
        "power_flow_rate": power_flow_rate
    }
    return results, displacement_cc, pressure_bar, torque_nm, flow_rate_lpm

# Streamlit App
st.title("Hydraulic Pump Power Calculator")
st.sidebar.header("Input Units")

# Unit selection
displacement_unit = st.sidebar.selectbox("Displacement Unit:", ["cc/rev", "in^3/rev", "liters/rev"])
pressure_unit = st.sidebar.selectbox("Pressure Unit:", ["bar", "MPa", "PSI", "kPa", "atm"])
torque_unit = st.sidebar.selectbox("Torque Unit:", ["Nm", "lb-ft"])
flow_rate_unit = st.sidebar.selectbox("Flow Rate Unit:", ["L/min", "m^3/h", "GPM (US)", "GPM (UK)"])

st.sidebar.header("Input Parameters")

# User inputs
displacement = st.sidebar.number_input("Pump Displacement (cc/rev, in^3/rev, or liters/rev):", value=None, step=0.1, format="%.2f")
pressure = st.sidebar.number_input("Working Pressure (bar, MPa, PSI, kPa, or atm):", value=None, step=0.1, format="%.2f")
rpm = st.sidebar.number_input("Pump RPM:", value=None, step=1.0, format="%.0f")
torque = st.sidebar.number_input("Torque (Nm or lb-ft):", value=None, step=0.1, format="%.2f")
flow_rate = st.sidebar.number_input("Flow Rate (L/min, m^3/h, GPM (US), or GPM (UK)):", value=None, step=0.1, format="%.2f")

# Calculate parameters and power
if st.sidebar.button("Calculate"):
    results, displacement_cc, pressure_bar, torque_nm, flow_rate_lpm = calculate_hydraulic_parameters(
        displacement, pressure, rpm, torque, flow_rate,
        displacement_unit, pressure_unit, torque_unit, flow_rate_unit
    )

    st.subheader("Results")

    # Display formulas
    st.write("### Formulas Used:")
    if displacement_cc and pressure_bar and rpm:
        st.write("Power based on Displacement: Power (kW) = (Displacement (cc/rev) × Pressure (bar) × RPM) / 600")
    if torque_nm and rpm:
        st.write("Power based on Torque: Power (kW) = (Torque (Nm) × RPM) / 9549")
    if flow_rate_lpm and pressure_bar:
        st.write("Power based on Flow Rate: Power (kW) = (Flow Rate (L/min) × Pressure (bar)) / 600")

    # Display input conversions
    st.write("### Converted Input Parameters:")
    if displacement_cc:
        st.write(f"Displacement: {displacement_cc:.2f} cc/rev")
    if pressure_bar:
        st.write(f"Pressure: {pressure_bar:.2f} bar")
    if torque_nm:
        st.write(f"Torque: {torque_nm:.2f} Nm")
    if flow_rate_lpm:
        st.write(f"Flow Rate: {flow_rate_lpm:.2f} L/min")

    # Display results for all units
    if results["displacement"]:
        st.write("### Pump Displacement:")
        for unit, value in results["displacement"].items():
            st.write(f"{value:.2f} {unit}")

    if results["pressure"]:
        st.write("### Working Pressure:")
        for unit, value in results["pressure"].items():
            st.write(f"{value:.2f} {unit}")

    if results["torque"]:
        st.write("### Torque:")
        for unit, value in results["torque"].items():
            st.write(f"{value:.2f} {unit}")

    if results["flow_rate"]:
        st.write("### Flow Rate:")
        for unit, value in results["flow_rate"].items():
            st.write(f"{value:.2f} {unit}")

    # Power results
    st.write("### Hydraulic Power:")
    if results['power_displacement']:
        st.write(f"Based on Displacement: {results['power_displacement']:.2f} kW / {(results['power_displacement'] * 1.34102):.2f} HP")
    else:
        st.write("Power based on Displacement: Not calculable.")

    if results['power_torque']:
        st.write(f"Based on Torque: {results['power_torque']:.2f} kW / {(results['power_torque'] * 1.34102):.2f} HP")
    else:
        st.write("Power based on Torque: Not calculable.")

    if results['power_flow_rate']:
        st.write(f"Based on Flow Rate: {results['power_flow_rate']:.2f} kW / {(results['power_flow_rate'] * 1.34102):.2f} HP")
    else:
        st.write("Power based on Flow Rate: Not calculable.")

# Hugging Face Space Deployment Notice
st.sidebar.markdown("---")
st.sidebar.write("This app is ready for deployment on Hugging Face Spaces using Streamlit.")
st.sidebar.write("To deploy, include this `app.py` and `requirements.txt` in your Hugging Face Space repository.")