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()