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