PumpDesign / app.py
ahmad123445's picture
Update app.py
3f5612e verified
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.")