import gradio as gr import numpy as np import matplotlib.pyplot as plt # Constants and helper functions (same as before) G_EARTH = 9.81 R_EARTH = 6371000 MU_EARTH = 3.986e14 R_GAS = 287 ATM_PRESSURE_SEA = 101325 TEMP_SEA = 288.15 LAPSE_RATE = 0.0065 def atmospheric_conditions(altitude): temp = TEMP_SEA - LAPSE_RATE * altitude if altitude < 11000 else 216.65 pressure = ATM_PRESSURE_SEA * (temp / TEMP_SEA) ** (-G_EARTH / (LAPSE_RATE * R_GAS)) density = pressure / (R_GAS * temp) return temp, pressure, density def orbital_velocity(altitude): return np.sqrt(MU_EARTH / (R_EARTH + altitude)) def drag_force(velocity, altitude, diameter, cd=0.3): _, _, rho = atmospheric_conditions(altitude) area = np.pi * (diameter / 2) ** 2 return 0.5 * rho * velocity ** 2 * cd * area material_density = {"Aluminum": 2700, "Titanium": 4500, "Composite": 1600} material_strength = {"Aluminum": 310e6, "Titanium": 950e6, "Composite": 600e6} tank_density = {"Aluminum": 2700, "Stainless Steel": 8000, "Composite": 1600} cost_factors = { "engines": 200000, "structural_material": {"Aluminum": 50, "Titanium": 150, "Composite": 200}, "tank_material": {"Aluminum": 40, "Stainless Steel": 60, "Composite": 180}, "payload": 100 } # Simulate rocket function (placeholder, same as before) def simulate_rocket( engine_type, num_engines, isp_vac, thrust_vac, chamber_pressure, nozzle_diameter, structural_material, structural_thickness, diameter, height, staging_enabled, stage1_fuel_mass, stage1_oxidizer_mass, stage2_fuel_mass, stage2_oxidizer_mass, control_system, payload_mass, tank_material, insulation_thickness, target_altitude ): return { "Delta-v (km/s)": "10.0 km/s", "TWR (Sea Level)": "1.5", "Structural Integrity (%)": "85", "Cost ($)": "$1000000" }, plt.figure() # Optimization function with multiple goals and constraints def optimize_design( delta_v_goal, twr_goal, integrity_goal, cost_goal, payload_mass, structural_material, control_system, target_altitude, max_engines, max_thickness, staging_enabled ): # Define design space engine_types = ["Liquid", "Solid", "Hybrid"] num_engines_options = range(1, max_engines + 1) isp_options = [250, 300, 350, 400] thrust_options = [100000, 200000, 500000, 1000000] structural_thickness_options = [t for t in [2, 5, 10, 15] if t <= max_thickness] best_design = None best_score = -float('inf') best_metrics = {} for engine_type in engine_types: for num_engines in num_engines_options: for isp in isp_options: for thrust in thrust_options: for thickness in structural_thickness_options: # Calculate design metrics chamber_pressure = 7e6 nozzle_diameter = 0.5 diameter = 3 height = 20 stage1_fuel_mass = 2000 if staging_enabled else 4000 stage1_oxidizer_mass = 2000 if staging_enabled else 4000 stage2_fuel_mass = 500 if staging_enabled else 0 stage2_oxidizer_mass = 500 if staging_enabled else 0 tank_material = "Aluminum" insulation_thickness = 10 results, _ = simulate_rocket( engine_type, num_engines, isp, thrust, chamber_pressure, nozzle_diameter, structural_material, thickness, diameter, height, staging_enabled, stage1_fuel_mass, stage1_oxidizer_mass, stage2_fuel_mass, stage2_oxidizer_mass, control_system, payload_mass, tank_material, insulation_thickness, target_altitude ) if "error" not in results: delta_v = float(results["Delta-v (km/s)"].split()[0]) twr = float(results["TWR (Sea Level)"].split()[0]) integrity = float(results["Structural Integrity (%)"]) cost = float(results["Cost ($)"].replace("$", "").replace(",", "")) # Check constraints (example thresholds for now) if twr > 1.1 and integrity >= 80: # Calculate score based on goals # Simple scoring: minimize deviation from goals delta_v_diff = abs(delta_v - delta_v_goal) / 15 # Normalize twr_diff = max(0, twr_goal - twr) / 2 # Normalize, penalize if below goal integrity_diff = max(0, integrity_goal - integrity) / 100 # Normalize cost_diff = max(0, cost - cost_goal) / 10000000 # Normalize score = -(delta_v_diff + twr_diff + integrity_diff + cost_diff) if score > best_score: best_score = score best_design = { "Engine Type": engine_type, "Num Engines": num_engines, "ISP": isp, "Thrust": thrust, "Thickness": thickness, "Staging": staging_enabled } best_metrics = results if best_design: return best_design, best_metrics else: return "No feasible design found", {} # Gradio interface with gr.Blocks(title="Rocket Design Optimizer") as app: gr.Markdown( """ # Rocket Design Optimizer Define your design goals (desired performance metrics) and constraints, and the app will find the optimal rocket design. """ ) with gr.Row(): with gr.Column(): gr.Markdown("### Design Goals (Performance Metrics)") delta_v_goal = gr.Slider(5, 15, value=10, label="Delta-v Goal (km/s)") twr_goal = gr.Slider(1.1, 2.0, value=1.5, label="TWR Goal (Sea Level)") integrity_goal = gr.Slider(80, 100, value=85, label="Structural Integrity Goal (%)") cost_goal = gr.Slider(100000, 10000000, value=5000000, label="Cost Goal ($)") with gr.Column(): gr.Markdown("### Constraints") payload_mass = gr.Slider(10, 1000, value=200, label="Payload Mass (kg)") structural_material = gr.Dropdown(choices=["Aluminum", "Titanium", "Composite"], value="Aluminum", label="Structural Material") control_system = gr.Dropdown(choices=["Gimbaled", "TVS", "RCS"], value="Gimbaled", label="Control System") target_altitude = gr.Slider(100000, 2000000, value=400000, label="Target Altitude (m)") max_engines = gr.Slider(1, 4, value=4, label="Max Number of Engines") max_thickness = gr.Slider(2, 15, value=15, label="Max Structural Thickness (mm)") staging_enabled = gr.Checkbox(value=True, label="Enable Staging") with gr.Row(): optimize_button = gr.Button("Optimize Design") design_output = gr.JSON(label="Optimized Design Parameters") performance_output = gr.JSON(label="Performance Metrics") radar_plot = gr.Plot(label="Performance Profile") def run_optimization( delta_v_goal, twr_goal, integrity_goal, cost_goal, payload_mass, structural_material, control_system, target_altitude, max_engines, max_thickness, staging_enabled ): design, metrics = optimize_design( delta_v_goal, twr_goal, integrity_goal, cost_goal, payload_mass, structural_material, control_system, target_altitude, max_engines, max_thickness, staging_enabled ) if design == "No feasible design found": return design, {}, plt.figure() else: # Simulate the design to get full metrics results, fig = simulate_rocket( design["Engine Type"], design["Num Engines"], design["ISP"], design["Thrust"], 7e6, 0.5, structural_material, design["Thickness"], 3, 20, staging_enabled, 2000 if staging_enabled else 4000, 2000 if staging_enabled else 4000, 500 if staging_enabled else 0, 500 if staging_enabled else 0, control_system, payload_mass, "Aluminum", 10, target_altitude ) return design, metrics, fig optimize_button.click( fn=run_optimization, inputs=[ delta_v_goal, twr_goal, integrity_goal, cost_goal, payload_mass, structural_material, control_system, target_altitude, max_engines, max_thickness, staging_enabled ], outputs=[design_output, performance_output, radar_plot] ) app.launch()