Create app.py
Browse files
app.py
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import numpy as np
|
| 3 |
+
import pandas as pd
|
| 4 |
+
|
| 5 |
+
# App title
|
| 6 |
+
st.title("Shell and Tube Heat Exchanger Design")
|
| 7 |
+
|
| 8 |
+
# Sidebar for user inputs
|
| 9 |
+
st.sidebar.header("Input Parameters")
|
| 10 |
+
|
| 11 |
+
# Input parameters
|
| 12 |
+
fluid_1 = st.sidebar.selectbox("Fluid on Shell Side", ["Water", "Oil", "Air"])
|
| 13 |
+
fluid_2 = st.sidebar.selectbox("Fluid on Tube Side", ["Water", "Oil", "Air"])
|
| 14 |
+
flow_rate_1 = st.sidebar.number_input("Flow Rate (Shell Side) [kg/s]", min_value=0.1, value=1.0, step=0.1)
|
| 15 |
+
flow_rate_2 = st.sidebar.number_input("Flow Rate (Tube Side) [kg/s]", min_value=0.1, value=1.0, step=0.1)
|
| 16 |
+
inlet_temp_1 = st.sidebar.number_input("Inlet Temperature (Shell Side) [°C]", min_value=-50.0, value=50.0, step=1.0)
|
| 17 |
+
inlet_temp_2 = st.sidebar.number_input("Inlet Temperature (Tube Side) [°C]", min_value=-50.0, value=20.0, step=1.0)
|
| 18 |
+
desired_outlet_temp_1 = st.sidebar.number_input("Desired Outlet Temperature (Shell Side) [°C]", min_value=-50.0, value=70.0, step=1.0)
|
| 19 |
+
|
| 20 |
+
# Thermal properties
|
| 21 |
+
fluid_properties = {
|
| 22 |
+
"Water": {"cp": 4186, "density": 997},
|
| 23 |
+
"Oil": {"cp": 2000, "density": 900},
|
| 24 |
+
"Air": {"cp": 1005, "density": 1.2},
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
cp_1 = fluid_properties[fluid_1]["cp"]
|
| 28 |
+
cp_2 = fluid_properties[fluid_2]["cp"]
|
| 29 |
+
|
| 30 |
+
# Calculations
|
| 31 |
+
heat_duty = flow_rate_1 * cp_1 * (desired_outlet_temp_1 - inlet_temp_1) # Heat duty in Watts
|
| 32 |
+
outlet_temp_2 = inlet_temp_2 + (heat_duty / (flow_rate_2 * cp_2)) # Estimate outlet temperature for tube side
|
| 33 |
+
|
| 34 |
+
# Display results
|
| 35 |
+
st.header("Design Results")
|
| 36 |
+
st.write(f"**Heat Duty:** {heat_duty / 1000:.2f} kW")
|
| 37 |
+
st.write(f"**Estimated Outlet Temperature (Tube Side):** {outlet_temp_2:.2f} °C")
|
| 38 |
+
|
| 39 |
+
# Preliminary sizing
|
| 40 |
+
U = 500 # Overall heat transfer coefficient (W/m^2.K), assumed
|
| 41 |
+
LMTD = ((desired_outlet_temp_1 - inlet_temp_2) - (inlet_temp_1 - outlet_temp_2)) / np.log(
|
| 42 |
+
(desired_outlet_temp_1 - inlet_temp_2) / (inlet_temp_1 - outlet_temp_2)
|
| 43 |
+
)
|
| 44 |
+
area = heat_duty / (U * LMTD) # Heat transfer area (m^2)
|
| 45 |
+
|
| 46 |
+
st.write(f"**Log Mean Temperature Difference (LMTD):** {LMTD:.2f} °C")
|
| 47 |
+
st.write(f"**Required Heat Transfer Area:** {area:.2f} m²")
|
| 48 |
+
|
| 49 |
+
# Additional features
|
| 50 |
+
st.header("Additional Options")
|
| 51 |
+
if st.checkbox("View Example Tube and Shell Details"):
|
| 52 |
+
st.write("**Example Tube Details:**")
|
| 53 |
+
st.write("- Material: Copper")
|
| 54 |
+
st.write("- Inner Diameter: 15 mm")
|
| 55 |
+
st.write("- Outer Diameter: 18 mm")
|
| 56 |
+
st.write("- Length: 2.0 m")
|
| 57 |
+
st.write("")
|
| 58 |
+
st.write("**Example Shell Details:**")
|
| 59 |
+
st.write("- Material: Carbon Steel")
|
| 60 |
+
st.write("- Diameter: 0.5 m")
|
| 61 |
+
st.write("- Length: 2.0 m")
|
| 62 |
+
st.write("- Number of Tubes: 50")
|
| 63 |
+
|
| 64 |
+
# Footer
|
| 65 |
+
st.sidebar.write("Developed by a Chemical Engineering Enthusiast")
|