sheikhzain185's picture
Create app.py
8989648 verified
import gradio as gr
import numpy as np
# Function to calculate heat exchanger parameters
def design_heat_exchanger(shell_fluid, tube_fluid, flow_rate_shell, inlet_temp_shell, inlet_temp_tube, outlet_temp_shell):
# Constants (properties from the book, approximated for common fluids like water)
fluid_properties = {
"Water": {"cp": 4186, "density": 997},
"Oil": {"cp": 2000, "density": 900},
"Air": {"cp": 1005, "density": 1.2},
}
# Assumptions
U = 500 # Overall heat transfer coefficient (W/m^2.K)
tube_outer_diameter = 0.025 # 25 mm (outer diameter)
tube_inner_diameter = 0.022 # 22 mm (inner diameter)
tube_length = 4.0 # 4 meters (standard length)
# Extract properties
cp_shell = fluid_properties[shell_fluid]["cp"]
cp_tube = fluid_properties[tube_fluid]["cp"]
# Heat duty
heat_duty = flow_rate_shell * cp_shell * (outlet_temp_shell - inlet_temp_shell)
# Estimate outlet temperature of tube-side fluid
flow_rate_tube = heat_duty / (cp_tube * (inlet_temp_tube - outlet_temp_shell))
outlet_temp_tube = inlet_temp_tube + (heat_duty / (flow_rate_tube * cp_tube))
# Log Mean Temperature Difference (LMTD)
delta_t1 = outlet_temp_shell - inlet_temp_tube
delta_t2 = inlet_temp_shell - outlet_temp_tube
LMTD = (delta_t1 - delta_t2) / np.log(delta_t1 / delta_t2)
# Required heat transfer area
area = heat_duty / (U * LMTD)
# Number of tubes
tube_cross_sectional_area = np.pi * (tube_outer_diameter / 2) ** 2
number_of_tubes = np.ceil(area / (tube_length * tube_cross_sectional_area))
# Shell diameter (based on tube layout factor)
shell_diameter = np.sqrt(number_of_tubes) * tube_outer_diameter * 1.25 # Approximation for tube bundle arrangement
# Results
results = {
"Heat Duty (kW)": heat_duty / 1000,
"Outlet Temp (Tube Side) [°C]": outlet_temp_tube,
"Log Mean Temp Diff (°C)": LMTD,
"Heat Transfer Area (m²)": area,
"Number of Tubes": int(number_of_tubes),
"Shell Diameter (m)": shell_diameter,
}
return results
# Gradio Interface
def heat_exchanger_interface(shell_fluid, tube_fluid, flow_rate_shell, inlet_temp_shell, inlet_temp_tube, outlet_temp_shell):
results = design_heat_exchanger(shell_fluid, tube_fluid, flow_rate_shell, inlet_temp_shell, inlet_temp_tube, outlet_temp_shell)
return results
# Define inputs and outputs for the Gradio app
inputs = [
gr.Dropdown(["Water", "Oil", "Air"], label="Shell Side Fluid"),
gr.Dropdown(["Water", "Oil", "Air"], label="Tube Side Fluid"),
gr.Number(label="Flow Rate (Shell Side) [kg/s]", value=1.0),
gr.Number(label="Inlet Temperature (Shell Side) [°C]", value=50.0),
gr.Number(label="Inlet Temperature (Tube Side) [°C]", value=20.0),
gr.Number(label="Outlet Temperature (Shell Side) [°C]", value=70.0),
]
outputs = gr.JSON(label="Heat Exchanger Design Results")
# Launch the Gradio app
gr.Interface(fn=heat_exchanger_interface, inputs=inputs, outputs=outputs, title="Shell and Tube Heat Exchanger Design").launch()