import streamlit as st # Constants GRAVITY = 9.81 # Acceleration due to gravity in m/s² # Predefined Fluid Properties (Density in kg/m³, Viscosity in cP) FLUID_DATABASE = { "Acetone": {"density": 791, "viscosity": 0.3}, "Alcohol (Ethanol)": {"density": 789, "viscosity": 1.2}, "Ammonia (Liquid)": {"density": 682, "viscosity": 0.3}, "Aniline": {"density": 1020, "viscosity": 1.0}, "Benzene": {"density": 876, "viscosity": 0.65}, "Butane": {"density": 580, "viscosity": 0.12}, "Carbon Disulfide": {"density": 1078, "viscosity": 0.33}, "Chlorobenzene": {"density": 1060, "viscosity": 1.1}, "Chloroform": {"density": 1485, "viscosity": 0.55}, "Coconut Oil": {"density": 920, "viscosity": 20}, "Crude Oil": {"density": 870, "viscosity": 50}, "Diesel": {"density": 830, "viscosity": 3}, "Ethanol": {"density": 789, "viscosity": 1.2}, "Fluorine (Liquid)": {"density": 1105, "viscosity": 0.1}, "Gasoline": {"density": 750, "viscosity": 0.6}, "Glycerin": {"density": 1261, "viscosity": 1000}, "Honey": {"density": 1420, "viscosity": 5000}, "Hydraulic Oil": {"density": 870, "viscosity": 35}, "Hydrogen Peroxide": {"density": 1110, "viscosity": 1.2}, "Kerosene": {"density": 820, "viscosity": 2}, "Lard": {"density": 890, "viscosity": 6}, "Lemon Juice": {"density": 1050, "viscosity": 1.0}, "Liquefied Petroleum Gas (LPG)": {"density": 550, "viscosity": 0.15}, "Milk": {"density": 1030, "viscosity": 3}, "Mineral Oil": {"density": 860, "viscosity": 50}, "Nitric Acid": {"density": 1510, "viscosity": 2.1}, "Olive Oil": {"density": 910, "viscosity": 80}, "Palm Oil": {"density": 920, "viscosity": 20}, "Petrol": {"density": 750, "viscosity": 0.6}, "Propane": {"density": 493, "viscosity": 0.1}, "Red Wine": {"density": 990, "viscosity": 1.2}, "Sodium Hydroxide (Liquid)": {"density": 1400, "viscosity": 3.5}, "Sulfuric Acid (98%)": {"density": 1830, "viscosity": 21}, "Toluene": {"density": 867, "viscosity": 0.6}, "Water": {"density": 1000, "viscosity": 1}, "Wheat Flour": {"density": 600, "viscosity": 20}, "Xylene": {"density": 870, "viscosity": 0.6}, "Glycol": {"density": 1060, "viscosity": 20}, "Mercury": {"density": 13600, "viscosity": 1.5}, "Sodium Carbonate": {"density": 1370, "viscosity": 5}, "Benzene Solution": {"density": 875, "viscosity": 0.7}, "Xylenes (Mixture)": {"density": 880, "viscosity": 0.65}, "Acetic Acid": {"density": 1045, "viscosity": 1.4}, "Barium Hydroxide": {"density": 1600, "viscosity": 3}, "Calcium Chloride": {"density": 1600, "viscosity": 1.0}, "Formic Acid": {"density": 1010, "viscosity": 1.3}, "Methanol": {"density": 791, "viscosity": 0.6}, "Sodium Chloride Solution": {"density": 1180, "viscosity": 2.5}, "Silicon Oil": {"density": 975, "viscosity": 10}, "Steam": {"density": 0.6, "viscosity": 0.02}, "Sulfur": {"density": 2000, "viscosity": 25}, "Vinyl Acetate": {"density": 920, "viscosity": 1.5}, } # Function to calculate pump requirements def calculate_pump_requirements(selected_distance, distance_value, fluid_properties, pipe_diameter): try: density = fluid_properties["density"] viscosity = fluid_properties["viscosity"] distance_value = float(distance_value) # meters pipe_diameter = float(pipe_diameter) / 1000 # Convert mm to meters flow_rate = distance_value * 0.05 # m³/h (simplified assumption) flow_velocity = (flow_rate / 3600) / (3.14 * (pipe_diameter / 2) ** 2) # m/s static_head = distance_value if selected_distance == "Vertical Distance (Height)" else 0 friction_loss = (4 * 0.02 * distance_value * flow_velocity**2) / (2 * GRAVITY * pipe_diameter) # Darcy formula for friction loss total_head = static_head + friction_loss hydraulic_power = (flow_rate / 3600) * density * GRAVITY * total_head / 1000 # kW (Required Power) # Select pump type based on head pump_type = "Centrifugal Pump" if total_head > 10 else "Positive Displacement Pump" # Determine cavitation risk cavitation_risk = "Possible" if total_head < 10 else "Low Risk" # Impeller size calculation (simplified) impeller_size = flow_rate / 100 # m (simplified formula) # Pump material selection pump_material = "Stainless Steel" if fluid_properties["density"] < 1000 else "Cast Iron" return { "Flow Rate (m³/h)": flow_rate, "Flow Velocity (m/s)": flow_velocity, "Total Head (m)": total_head, "Hydraulic Power (kW)": hydraulic_power, "Pump Type": pump_type, "Cavitation Risk": cavitation_risk, "Impeller Size (m)": impeller_size, "Pump Material": pump_material, "Friction Loss (m)": friction_loss } except ValueError: return "Invalid input, please enter numeric values." # Streamlit app layout st.title("Pump Design Calculator") # Drop-down for fluid selection fluid_list = sorted([fluid for fluid in FLUID_DATABASE.keys()]) selected_fluid = st.selectbox("Select Fluid Type", fluid_list) fluid_properties = FLUID_DATABASE[selected_fluid] # Drop-down for distance type (horizontal or vertical) distance_type = st.selectbox("Select Distance Type", ["Vertical Distance (Height)", "Horizontal Distance"]) # Input for distance and pipe diameter distance_value = st.text_input("Enter Distance (in meters)", "") pipe_diameter = st.text_input("Enter Pipe Diameter (in mm)", "") # Calculate and display pump requirements if st.button("Calculate Pump Requirements"): if distance_value and pipe_diameter: results = calculate_pump_requirements(distance_type, distance_value, fluid_properties, pipe_diameter) # Display results if isinstance(results, dict): st.subheader("**Pump Requirements**") st.markdown(f"**Fluid Type**: {selected_fluid}") st.markdown(f"**Flow Rate**: {results['Flow Rate (m³/h)']} m³/h") st.markdown(f"**Flow Velocity**: {results['Flow Velocity (m/s)']} m/s") st.markdown(f"**Total Head**: {results['Total Head (m)']} m") st.markdown(f"**Hydraulic Power**: {results['Hydraulic Power (kW)']} kW") st.markdown(f"**Pump Type**: {results['Pump Type']}") st.markdown(f"**Cavitation Risk**: {results['Cavitation Risk']}") st.markdown(f"**Impeller Size**: {results['Impeller Size (m)']} m") st.markdown(f"**Pump Material**: {results['Pump Material']}") st.markdown(f"**Friction Loss**: {results['Friction Loss (m)']} m") else: st.error(results) # If results are an error message, display it else: st.error("Please fill in all input fields correctly.")