def simple_sizing(nexus): configs = nexus.vehicle_configurations analyses = nexus.analyses base = configs.base m_guess = nexus.m_guess #take in sizing inputs base.mass_properties.max_takeoff = m_guess #find conditions air_speed = nexus.missions.base.segments['cruise'].air_speed altitude = nexus.missions.base.segments['climb_3'].altitude_end atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() freestream = atmosphere.compute_values(altitude) freestream0 = atmosphere.compute_values(6000. * Units.ft) #cabin altitude diff_pressure = np.max(freestream0.pressure - freestream.pressure, 0) fuselage = base.fuselages['fuselage'] fuselage.differential_pressure = diff_pressure #now size engine mach_number = air_speed / freestream.speed_of_sound #now add to freestream data object freestream.velocity = air_speed freestream.mach_number = mach_number freestream.gravity = SUAVE.Attributes.Planets.Earth().sea_level_gravity #assign conditions in form for propulsor sizing conditions = SUAVE.Analyses.Mission.Segments.Conditions.Aerodynamics() conditions.freestream = freestream nose_load_fraction = .06 #now evaluate all of the vehicle configurations for config in configs: config.wings.horizontal_stabilizer.areas.reference = ( 26.0 / 92.0) * config.wings.main_wing.areas.reference for wing in config.wings: wing = SUAVE.Methods.Geometry.Two_Dimensional.Planform.wing_planform( wing) wing.areas.exposed = 0.8 * wing.areas.wetted wing.areas.affected = 0.6 * wing.areas.reference fuselage = config.fuselages['fuselage'] fuselage.differential_pressure = diff_pressure # now evaluate weights # diff the new data config.mass_properties.max_takeoff = m_guess #take in parameters config.mass_properties.takeoff = m_guess config.mass_properties.max_zero_fuel = base.mass_properties.max_zero_fuel config.store_diff() # now evaluate the weights weights = analyses.base.weights.evaluate() # update zfw empty_weight = base.mass_properties.operating_empty payload = base.mass_properties.max_payload zfw = empty_weight + payload base.max_zero_fuel = zfw base.store_diff() for config in configs: config.pull_base() # ------------------------------------------------------------------ # Landing Configuration # ------------------------------------------------------------------ landing = nexus.vehicle_configurations.landing landing_conditions = Data() landing_conditions.freestream = Data() # landing weight landing.mass_properties.landing = base.mass_properties.max_zero_fuel # Landing CL_max altitude = nexus.missions.base.segments[-1].altitude_end atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() freestream = atmosphere.compute_values(altitude) mu = freestream.dynamic_viscosity rho = freestream.density landing_conditions.freestream.velocity = nexus.missions.base.segments[ 'descent_3'].air_speed landing_conditions.freestream.density = rho landing_conditions.freestream.dynamic_viscosity = mu / rho CL_max_landing, CDi = compute_max_lift_coeff(landing, landing_conditions) landing.maximum_lift_coefficient = CL_max_landing # diff the new data landing.store_diff() #Takeoff CL_max takeoff = nexus.vehicle_configurations.takeoff takeoff_conditions = Data() takeoff_conditions.freestream = Data() altitude = nexus.missions.base.airport.altitude atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() freestream = atmosphere.compute_values(altitude) mu = freestream.dynamic_viscosity rho = freestream.density takeoff_conditions.freestream.velocity = nexus.missions.base.segments.climb_1.air_speed takeoff_conditions.freestream.density = rho takeoff_conditions.freestream.dynamic_viscosity = mu / rho max_CL_takeoff, CDi = compute_max_lift_coeff(takeoff, takeoff_conditions) takeoff.maximum_lift_coefficient = max_CL_takeoff takeoff.store_diff() #Base config CL_max base = nexus.vehicle_configurations.base base_conditions = Data() base_conditions.freestream = Data() altitude = nexus.missions.base.airport.altitude atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() freestream = atmosphere.compute_values(altitude) mu = freestream.dynamic_viscosity rho = freestream.density base_conditions.freestream.velocity = nexus.missions.base.segments.climb_1.air_speed base_conditions.freestream.density = rho base_conditions.freestream.dynamic_viscosity = mu / rho max_CL_base, CDi = compute_max_lift_coeff(base, base_conditions) base.maximum_lift_coefficient = max_CL_base base.store_diff() # done! return nexus
def simple_sizing(nexus): configs = nexus.vehicle_configurations base = configs.base #find conditions air_speed = nexus.missions.base.segments['cruise'].air_speed altitude = nexus.missions.base.segments['climb_5'].altitude_end atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() freestream = atmosphere.compute_values(altitude) freestream0 = atmosphere.compute_values(6000. * Units.ft) #cabin altitude diff_pressure = np.max(freestream0.pressure - freestream.pressure, 0) fuselage = base.fuselages['fuselage'] fuselage.differential_pressure = diff_pressure #now size engine mach_number = air_speed / freestream.speed_of_sound #now add to freestream data object freestream.velocity = air_speed freestream.mach_number = mach_number freestream.gravity = 9.81 conditions = SUAVE.Analyses.Mission.Segments.Conditions.Aerodynamics( ) #assign conditions in form for propulsor sizing conditions.freestream = freestream for config in configs: config.wings.horizontal_stabilizer.areas.reference = ( 26.0 / 92.0) * config.wings.main_wing.areas.reference for wing in config.wings: wing = SUAVE.Methods.Geometry.Two_Dimensional.Planform.wing_planform( wing) wing.areas.exposed = 0.8 * wing.areas.wetted wing.areas.affected = 0.6 * wing.areas.reference fuselage = config.fuselages['fuselage'] fuselage.differential_pressure = diff_pressure turbofan_sizing(config.propulsors['turbofan'], mach_number, altitude) compute_turbofan_geometry(config.propulsors['turbofan'], conditions) # diff the new data #config.store_diff() # ------------------------------------------------------------------ # Landing Configuration # ------------------------------------------------------------------ landing = nexus.vehicle_configurations.landing landing_conditions = Data() landing_conditions.freestream = Data() # landing weight landing.mass_properties.landing = 0.85 * config.mass_properties.takeoff # Landing CL_max altitude = nexus.missions.base.segments[-1].altitude_end atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() p, T, rho, a, mu = atmosphere.compute_values(altitude) landing_conditions.freestream.velocity = nexus.missions.base.segments[ 'descent_3'].air_speed landing_conditions.freestream.density = rho landing_conditions.freestream.dynamic_viscosity = mu / rho CL_max_landing, CDi = compute_max_lift_coeff(landing, landing_conditions) landing.maximum_lift_coefficient = CL_max_landing # diff the new data #landing.store_diff() #Takeoff CL_max takeoff = nexus.vehicle_configurations.takeoff takeoff_conditions = Data() takeoff_conditions.freestream = Data() altitude = nexus.missions.base.airport.altitude atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() p, T, rho, a, mu = atmosphere.compute_values(altitude) takeoff_conditions.freestream.velocity = nexus.missions.base.segments.climb_1.air_speed takeoff_conditions.freestream.density = rho takeoff_conditions.freestream.dynamic_viscosity = mu / rho max_CL_takeoff, CDi = compute_max_lift_coeff(takeoff, takeoff_conditions) takeoff.maximum_lift_coefficient = max_CL_takeoff #takeoff.store_diff() #Base config CL_max base = nexus.vehicle_configurations.base base_conditions = Data() base_conditions.freestream = Data() altitude = nexus.missions.base.airport.altitude atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() p, T, rho, a, mu = atmosphere.compute_values(altitude) base_conditions.freestream.velocity = nexus.missions.base.segments.climb_1.air_speed base_conditions.freestream.density = rho base_conditions.freestream.dynamic_viscosity = mu / rho max_CL_base, CDi = compute_max_lift_coeff(base, base_conditions) base.maximum_lift_coefficient = max_CL_base #base.store_diff() # done! return nexus
def simple_sizing(nexus): configs = nexus.vehicle_configurations #find conditions air_speed = nexus.missions.base.segments['cruise'].air_speed altitude = nexus.missions.base.segments['climb_5'].altitude_end atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() freestream = atmosphere.compute_values(altitude) #now size engine mach_number = air_speed/freestream.speed_of_sound #now add to freestream data object freestream.velocity = air_speed freestream.mach_number = mach_number freestream.gravity = 9.81 conditions = SUAVE.Analyses.Mission.Segments.Conditions.Aerodynamics() #assign conditions in form for propulsor sizing conditions.freestream = freestream HT_volume = 1.42542 * Units.less # E170 VT_volume = 0.11458 * Units.less # E170 lht = 14.24 * Units.m lvt = 13.54 * Units.m for config in configs: wing_planform(config.wings.main_wing) config.wings.horizontal_stabilizer.areas.reference = (HT_volume/lht)*(config.wings.main_wing.areas.reference * 3.194) config.wings.vertical_stabilizer.areas.reference = (VT_volume/lvt)*(config.wings.main_wing.areas.reference * 26.0) SUAVE.Methods.Geometry.Two_Dimensional.Planform.wing_fuel_volume(config.wings.main_wing) nexus.summary.available_fuel = config.wings.main_wing.fuel_volume * 803.0 * 1.0197 for wing in config.wings: wing_planform(wing) wing.areas.wetted = 2.0 * wing.areas.reference wing.areas.exposed = 0.8 * wing.areas.wetted wing.areas.affected = 0.6 * wing.areas.wetted turbofan_sizing(config.propulsors['turbofan'], mach_number=mach_number, altitude=altitude) compute_turbofan_geometry(config.propulsors['turbofan'], conditions) config.propulsors['turbofan'].nacelle_diameter = config.propulsors['turbofan'].nacelle_diameter * 1.1462135 config.propulsors['turbofan'].engine_length = config.propulsors['turbofan'].engine_length * 1.24868 config.propulsors['turbofan'].areas.wetted = 1.1*np.pi * (config.propulsors['turbofan'].engine_length * config.propulsors['turbofan'].nacelle_diameter) # ------------------------------------------------------------------ # Landing Configuration # ------------------------------------------------------------------ landing = nexus.vehicle_configurations.landing landing_conditions = Data() landing_conditions.freestream = Data() # landing weight landing.mass_properties.landing = 0.863 * config.mass_properties.takeoff # Landing CL_max altitude = nexus.missions.base.segments[-1].altitude_end atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() freestream_landing = atmosphere.compute_values(altitude) landing_conditions.freestream.velocity = nexus.missions.base.segments['descent_3'].air_speed landing_conditions.freestream.density = freestream_landing.density landing_conditions.freestream.dynamic_viscosity = freestream_landing.dynamic_viscosity CL_max_landing,CDi = compute_max_lift_coeff(landing, landing_conditions) landing.maximum_lift_coefficient = CL_max_landing #Takeoff CL_max takeoff = nexus.vehicle_configurations.takeoff takeoff_conditions = Data() takeoff_conditions.freestream = Data() altitude = nexus.missions.base.airport.altitude freestream_takeoff = atmosphere.compute_values(altitude) takeoff_conditions.freestream.velocity = nexus.missions.base.segments.climb_1.air_speed takeoff_conditions.freestream.density = freestream_takeoff.density takeoff_conditions.freestream.dynamic_viscosity = freestream_takeoff.dynamic_viscosity max_CL_takeoff, CDi = compute_max_lift_coeff(takeoff, takeoff_conditions) takeoff.maximum_lift_coefficient = max_CL_takeoff #Base config CL_max base = nexus.vehicle_configurations.base base_conditions = Data() base_conditions.freestream = takeoff_conditions.freestream max_CL_base, CDi = compute_max_lift_coeff(base, base_conditions) base.maximum_lift_coefficient = max_CL_base return nexus
def simple_sizing(nexus): configs = nexus.vehicle_configurations base = configs.base #find conditions air_speed = nexus.missions.mission.segments['cruise'].air_speed altitude = nexus.missions.mission.segments['climb_2'].altitude_end atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() freestream = atmosphere.compute_values(altitude) freestream0 = atmosphere.compute_values(6000. * Units.ft) #cabin altitude diff_pressure = np.max(freestream0.pressure - freestream.pressure, 0) fuselage = base.fuselages['fuselage'] fuselage.differential_pressure = diff_pressure #now size engine mach_number = air_speed / freestream.speed_of_sound #now add to freestream data object freestream.velocity = air_speed freestream.mach_number = mach_number freestream.gravity = 9.81 conditions = SUAVE.Analyses.Mission.Segments.Conditions.Aerodynamics( ) #assign conditions in form for propulsor sizing conditions.freestream = freestream for config in configs: # fuselage fuselage = config.fuselages['fuselage'] fuselage.differential_pressure = diff_pressure # Main Wing main_wing_span = config.wings.main_wing.spans.projected main_wing_root_chord = config.wings.main_wing.chords.root config.wings.main_wing.chords.tip = config.wings.main_wing.chords.root * config.wings.main_wing.taper config.wings.main_wing.chords.mean_aerodynamic = ( main_wing_root_chord * (2.0 / 3.0) * ((1.0 + config.wings.main_wing.taper + config.wings.main_wing.taper**2.0) / (1.0 + config.wings.main_wing.taper))) config.wings.main_wing.areas.reference = ( main_wing_root_chord + config.wings.main_wing.chords.tip) * main_wing_span / 2.0 config.wings.main_wing.areas.wetted = 2.0 * config.wings.main_wing.areas.reference config.wings.main_wing.areas.exposed = config.wings.main_wing.areas.wetted config.wings.main_wing.areas.affected = config.wings.main_wing.areas.wetted config.wings.main_wing.aspect_ratio = ( main_wing_span * main_wing_span) / config.wings.main_wing.areas.reference config.wings.main_wing.flaps.chord = main_wing_root_chord * 0.15 config.wings.main_wing.flaps.span_start = 0.3 * main_wing_span config.wings.main_wing.flaps.span_end = 0.8 * main_wing_span config.wings.main_wing.flaps.area = config.wings.main_wing.flaps.chord * ( config.wings.main_wing.flaps.span_end - config.wings.main_wing.flaps.span_start) # Horizontal Stabilizer config.wings.horizontal_stabilizer.areas.reference = 0.145 * config.wings.main_wing.areas.reference config.wings.horizontal_stabilizer.spans.projected = np.sqrt( config.wings.horizontal_stabilizer.aspect_ratio * config.wings.horizontal_stabilizer.areas.reference) config.wings.horizontal_stabilizer.chords.root = config.wings.horizontal_stabilizer.areas.reference / config.wings.horizontal_stabilizer.spans.projected config.wings.horizontal_stabilizer.chords.tip = config.wings.horizontal_stabilizer.chords.root config.wings.horizontal_stabilizer.chords.mean_aerodynamic = ( config.wings.horizontal_stabilizer.chords.root * (2.0 / 3.0) * ((1.0 + config.wings.horizontal_stabilizer.taper + config.wings.horizontal_stabilizer.taper**2.0) / (1.0 + config.wings.horizontal_stabilizer.taper))) config.wings.horizontal_stabilizer.areas.wetted = 2.0 * config.wings.horizontal_stabilizer.areas.reference config.wings.horizontal_stabilizer.areas.exposed = config.wings.horizontal_stabilizer.areas.wetted config.wings.horizontal_stabilizer.areas.affected = config.wings.horizontal_stabilizer.areas.wetted # Vertical Stabilizer config.wings.vertical_stabilizer.areas.reference = 0.099 * config.wings.main_wing.areas.reference config.wings.vertical_stabilizer.areas.wetted = 2.0 * config.wings.vertical_stabilizer.areas.reference config.wings.vertical_stabilizer.areas.exposed = config.wings.vertical_stabilizer.areas.wetted config.wings.vertical_stabilizer.areas.affected = config.wings.vertical_stabilizer.areas.wetted config.wings.vertical_stabilizer.spans.projected = np.sqrt( config.wings.vertical_stabilizer.aspect_ratio * config.wings.vertical_stabilizer.areas.reference) config.wings.vertical_stabilizer.chords.root = ( 2.0 * config.wings.vertical_stabilizer.areas.reference) / ( config.wings.vertical_stabilizer.spans.projected * (1 + config.wings.vertical_stabilizer.taper)) config.wings.vertical_stabilizer.chords.tip = config.wings.vertical_stabilizer.chords.root * config.wings.vertical_stabilizer.taper config.wings.vertical_stabilizer.chords.mean_aerodynamic = ( config.wings.vertical_stabilizer.chords.root * (2.0 / 3.0) * ((1.0 + config.wings.vertical_stabilizer.taper + config.wings.vertical_stabilizer.taper**2.0) / (1.0 + config.wings.vertical_stabilizer.taper))) # Resize the motor kv = config.propulsors.propulsor.motor_forward.speed_constant config.propulsors.propulsor.motor_forward = size_from_kv( config.propulsors.propulsor.motor_forward, kv) kv = config.propulsors.propulsor.motor_lift.speed_constant config.propulsors.propulsor.motor_lift = size_from_kv( config.propulsors.propulsor.motor_lift, kv) # diff the new data config.store_diff() #turbofan_sizing(config.propulsors['turbofan'], mach_number = mach_number, altitude = altitude) #compute_turbofan_geometry(config.propulsors['turbofan'], conditions) # ------------------------------------------------------------------ # Landing Configuration # ------------------------------------------------------------------ landing = nexus.vehicle_configurations.landing landing_conditions = Data() landing_conditions.freestream = Data() # landing weight landing.mass_properties.landing = 1.0 * config.mass_properties.takeoff # Landing CL_max altitude = nexus.missions.mission.segments[-1].altitude_end atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() freestream_landing = atmosphere.compute_values(0.) landing_conditions.freestream.velocity = nexus.missions.mission.segments[ 'descent_2'].air_speed landing_conditions.freestream.density = freestream_landing.density landing_conditions.freestream.dynamic_viscosity = freestream_landing.dynamic_viscosity CL_max_landing, CDi = compute_max_lift_coeff(landing, landing_conditions) landing.maximum_lift_coefficient = CL_max_landing #Takeoff CL_max takeoff = nexus.vehicle_configurations.takeoff takeoff_conditions = Data() takeoff_conditions.freestream = Data() altitude = nexus.missions.mission.airport.altitude freestream_takeoff = atmosphere.compute_values(altitude) takeoff_conditions.freestream.velocity = nexus.missions.mission.segments.climb_1.air_speed takeoff_conditions.freestream.density = freestream_takeoff.density takeoff_conditions.freestream.dynamic_viscosity = freestream_takeoff.dynamic_viscosity max_CL_takeoff, CDi = compute_max_lift_coeff(takeoff, takeoff_conditions) takeoff.maximum_lift_coefficient = max_CL_takeoff #Base config CL_max base = nexus.vehicle_configurations.base base_conditions = Data() base_conditions.freestream = takeoff_conditions.freestream max_CL_base, CDi = compute_max_lift_coeff(base, base_conditions) base.maximum_lift_coefficient = max_CL_base return nexus
def simple_sizing(nexus): configs = nexus.vehicle_configurations base = configs.base # find conditions air_speed = nexus.missions.base.segments['cruise_2'].air_speed altitude = 18.5 * Units.km #nexus.missions.base.segments['climb_8'].altitude_end #FIXME atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() freestream = atmosphere.compute_values(altitude) freestream0 = atmosphere.compute_values(6000. * Units.ft) # cabin altitude diff_pressure = np.max(freestream0.pressure - freestream.pressure, 0) fuselage = base.fuselages['fuselage'] fuselage.differential_pressure = diff_pressure # now size engine mach_number = air_speed / freestream.speed_of_sound # now add to freestream data object freestream.velocity = air_speed freestream.mach_number = mach_number freestream.gravity = 9.81 conditions = SUAVE.Analyses.Mission.Segments.Conditions.Aerodynamics() # assign conditions in form for propulsor sizing conditions.freestream = freestream # conditions.weights.vehicle_mass_rate = -200 * Units['kg/s'] for config in configs: config.wings.horizontal_stabilizer.areas.reference = (26.0 / 92.0) * config.wings.main_wing.areas.reference for wing in config.wings: wing = SUAVE.Methods.Geometry.Two_Dimensional.Planform.wing_planform(wing) wing.areas.exposed = 0.8 * wing.areas.wetted wing.areas.affected = 0.6 * wing.areas.reference fuselage = config.fuselages['fuselage'] fuselage.differential_pressure = diff_pressure turbofan_sizing(config.propulsors['turbofan'], mach_number, altitude) compute_turbofan_geometry(config.propulsors['turbofan'], conditions) # engine_length, nacelle_diameter, areas.wette # diff the new data config.store_diff() # ------------------------------------------------------------------ # Landing Configuration # ------------------------------------------------------------------ landing = nexus.vehicle_configurations.landing landing_conditions = Data() landing_conditions.freestream = Data() # landing weight # landing.mass_properties.landing = 0.85 * config.mass_properties.takeoff # Landing CL_max altitude = nexus.missions.base.segments[-1].altitude_end atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() p, T, rho, a, mu = atmosphere.compute_values(altitude) landing_conditions.freestream.velocity = nexus.missions.base.segments['descent_final'].air_speed landing_conditions.freestream.density = rho landing_conditions.freestream.dynamic_viscosity = mu / rho CL_max_landing, CDi = compute_max_lift_coeff(landing, landing_conditions) landing.maximum_lift_coefficient = CL_max_landing # diff the new data landing.store_diff() # Takeoff CL_max takeoff = nexus.vehicle_configurations.takeoff takeoff_conditions = Data() takeoff_conditions.freestream = Data() altitude = nexus.missions.base.airport.altitude atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() p, T, rho, a, mu = atmosphere.compute_values(altitude) takeoff_conditions.freestream.velocity = nexus.missions.base.segments.climb_1.air_speed takeoff_conditions.freestream.density = rho takeoff_conditions.freestream.dynamic_viscosity = mu / rho max_CL_takeoff, CDi = compute_max_lift_coeff(takeoff, takeoff_conditions) takeoff.maximum_lift_coefficient = max_CL_takeoff takeoff.store_diff() # Base config CL_max base = nexus.vehicle_configurations.base base_conditions = Data() base_conditions.freestream = Data() altitude = nexus.missions.base.airport.altitude atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() p, T, rho, a, mu = atmosphere.compute_values(altitude) base_conditions.freestream.velocity = nexus.missions.base.segments.climb_1.air_speed base_conditions.freestream.density = rho base_conditions.freestream.dynamic_viscosity = mu / rho max_CL_base, CDi = compute_max_lift_coeff(base, base_conditions) base.maximum_lift_coefficient = max_CL_base base.store_diff() # done! return nexus
def simple_sizing(nexus): configs = nexus.vehicle_configurations base = configs.base #find conditions air_speed = nexus.missions.base.segments['cruise'].air_speed altitude = nexus.missions.base.segments['climb_2'].altitude_end atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() freestream = atmosphere.compute_values(altitude) freestream0 = atmosphere.compute_values(6000. * Units.ft) #cabin altitude diff_pressure = np.max(freestream0.pressure - freestream.pressure, 0) fuselage = base.fuselages['fuselage'] fuselage.differential_pressure = diff_pressure #now size engine mach_number = air_speed / freestream.speed_of_sound #now add to freestream data object freestream.velocity = air_speed freestream.mach_number = mach_number freestream.gravity = 9.81 conditions = SUAVE.Analyses.Mission.Segments.Conditions.Aerodynamics( ) #assign conditions in form for propulsor sizing conditions.freestream = freestream for config in configs: config.wings.horizontal_stabilizer.areas.reference = ( 26.0 / 92.0) * config.wings.main_wing.areas.reference for wing in config.wings: wing = SUAVE.Methods.Geometry.Two_Dimensional.Planform.wing_planform( wing) wing.areas.exposed = 0.8 * wing.areas.wetted wing.areas.affected = 0.6 * wing.areas.reference fuselage = config.fuselages['fuselage'] fuselage.differential_pressure = diff_pressure #turbofan_sizing(config.propulsors['turbofan'], mach_number = mach_number, altitude = altitude) #compute_turbofan_geometry(config.propulsors['turbofan'], conditions) # Change the dynamic pressure based on the, add a factor of safety base.envelope.maximum_dynamic_pressure = nexus.missions.mission.segments.cruise.dynamic_pressure * 1.2 # Scale the horizontal and vertical tails based on the main wing area #For more or less "normal" looking designs the stabilizer and elevators together should be between 15 to 20% of the wing area. #The fin and rudder together should be around 12 to 15% base.wings.horizontal_stabilizer.areas.reference = 0.17 * base.reference_area base.wings.vertical_stabilizer.areas.reference = 0.13 * base.reference_area # ------------------------------------------------------------------ # Landing Configuration # ------------------------------------------------------------------ landing = nexus.vehicle_configurations.landing landing_conditions = Data() landing_conditions.freestream = Data() # landing weight landing.mass_properties.landing = 1.0 * config.mass_properties.takeoff # Landing CL_max altitude = nexus.missions.base.segments[-1].altitude_end atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() freestream_landing = atmosphere.compute_values(0.) landing_conditions.freestream.velocity = nexus.missions.base.segments[ 'descent_2'].air_speed landing_conditions.freestream.density = freestream_landing.density landing_conditions.freestream.dynamic_viscosity = freestream_landing.dynamic_viscosity CL_max_landing, CDi = compute_max_lift_coeff(landing, landing_conditions) landing.maximum_lift_coefficient = CL_max_landing #Takeoff CL_max takeoff = nexus.vehicle_configurations.takeoff takeoff_conditions = Data() takeoff_conditions.freestream = Data() altitude = nexus.missions.base.airport.altitude freestream_takeoff = atmosphere.compute_values(altitude) takeoff_conditions.freestream.velocity = nexus.missions.base.segments.climb_1.air_speed takeoff_conditions.freestream.density = freestream_takeoff.density takeoff_conditions.freestream.dynamic_viscosity = freestream_takeoff.dynamic_viscosity max_CL_takeoff, CDi = compute_max_lift_coeff(takeoff, takeoff_conditions) takeoff.maximum_lift_coefficient = max_CL_takeoff #Base config CL_max base = nexus.vehicle_configurations.base base_conditions = Data() base_conditions.freestream = takeoff_conditions.freestream max_CL_base, CDi = compute_max_lift_coeff(base, base_conditions) base.maximum_lift_coefficient = max_CL_base return nexus
def estimate_clmax(nexus): # Condition to CLmax calculation: 90KTAS @ 10000ft, ISA state = Data() state.conditions = Data() state.conditions.freestream = Data() state.conditions.freestream.density = 0.90477283 state.conditions.freestream.dynamic_viscosity = 1.69220918e-05 state.conditions.freestream.velocity = 90. * Units.knots #Takeoff CL_max config = nexus.vehicle_configurations.takeoff settings = nexus.analyses.takeoff.aerodynamics.settings maximum_lift_coefficient, CDi = compute_max_lift_coeff( state, settings, config) config.maximum_lift_coefficient = maximum_lift_coefficient # diff the new data config.store_diff() #Takeoff CL_max - for short field config config = nexus.vehicle_configurations.short_field_takeoff settings = nexus.analyses.short_field_takeoff.aerodynamics.settings maximum_lift_coefficient, CDi = compute_max_lift_coeff( state, settings, config) config.maximum_lift_coefficient = maximum_lift_coefficient # diff the new data config.store_diff() # compute V2 speed for noise, based in MTOW config = nexus.vehicle_configurations.takeoff weight = config.mass_properties.max_takeoff reference_area = config.wings.main_wing.areas.reference max_CL_takeoff = config.maximum_lift_coefficient stall_speed = (2 * 9.81 * weight / (1.225 * reference_area * max_CL_takeoff))**0.5 V2_speed = 1.20 * stall_speed speed_for_noise = V2_speed + nexus.noise_V2_increase #nexus.missions.takeoff_initialization.segments.climb.air_speed = speed_for_noise nexus.missions.takeoff.segments.climb.air_speed = speed_for_noise nexus.missions.takeoff.segments.cutback.air_speed = speed_for_noise nexus.missions.sideline_takeoff.segments.climb.air_speed = speed_for_noise # ------------------------------------------------------------------ # Landing Configuration # ------------------------------------------------------------------ landing = nexus.vehicle_configurations.landing landing_conditions = Data() landing_conditions.freestream = Data() # landing weight landing.mass_properties.takeoff = 0.85 * config.mass_properties.takeoff landing.mass_properties.landing = 0.85 * config.mass_properties.takeoff # Landing CL_max settings = nexus.analyses.landing.aerodynamics.settings maximum_lift_coefficient, CDi = compute_max_lift_coeff( state, settings, landing) landing.maximum_lift_coefficient = maximum_lift_coefficient # compute approach speed weight = landing.mass_properties.landing stall_speed = (2 * 9.81 * weight / (1.225 * reference_area * maximum_lift_coefficient))**0.5 Vref_speed = 1.23 * stall_speed nexus.missions.landing.segments.descent.air_speed = Vref_speed + 10. * Units.knots # diff the new data landing.store_diff() return nexus
def estimate_clmax(nexus): # Condition to CLmax calculation: 90KTAS @ 10000ft, ISA conditions = Data() conditions.freestream = Data() conditions.freestream.density = 0.90477283 conditions.freestream.dynamic_viscosity = 1.69220918e-05 conditions.freestream.velocity = 90. * Units.knots #Takeoff CL_max config = nexus.vehicle_configurations.takeoff maximum_lift_coefficient,CDi = compute_max_lift_coeff(config,conditions) config.maximum_lift_coefficient = maximum_lift_coefficient # diff the new data config.store_diff() #Takeoff CL_max - for short field config config = nexus.vehicle_configurations.short_field_takeoff maximum_lift_coefficient,CDi = compute_max_lift_coeff(config,conditions) config.maximum_lift_coefficient = maximum_lift_coefficient # diff the new data config.store_diff() # compute V2 speed for noise, based in MTOW config = nexus.vehicle_configurations.takeoff weight = config.mass_properties.max_takeoff reference_area = config.wings.main_wing.areas.reference max_CL_takeoff = config.maximum_lift_coefficient stall_speed = (2 * 9.81 * weight / (1.225 * reference_area * max_CL_takeoff)) ** 0.5 V2_speed = 1.20 * stall_speed speed_for_noise = V2_speed + nexus.noise_V2_increase #nexus.missions.takeoff_initialization.segments.climb.air_speed = speed_for_noise nexus.missions.takeoff.segments.climb.air_speed = speed_for_noise nexus.missions.takeoff.segments.cutback.air_speed = speed_for_noise nexus.missions.sideline_takeoff.segments.climb.air_speed = speed_for_noise # ------------------------------------------------------------------ # Landing Configuration # ------------------------------------------------------------------ landing = nexus.vehicle_configurations.landing landing_conditions = Data() landing_conditions.freestream = Data() # landing weight landing.mass_properties.takeoff = 0.85 * config.mass_properties.takeoff landing.mass_properties.landing = 0.85 * config.mass_properties.takeoff # Landing CL_max maximum_lift_coefficient,CDi = compute_max_lift_coeff(landing,conditions) landing.maximum_lift_coefficient = maximum_lift_coefficient # compute approach speed weight = landing.mass_properties.landing stall_speed = (2 * 9.81 * weight / (1.225 * reference_area * maximum_lift_coefficient)) ** 0.5 Vref_speed = 1.23 * stall_speed nexus.missions.landing.segments.descent.air_speed = Vref_speed + 10. * Units.knots # diff the new data landing.store_diff() return nexus
def simple_sizing(nexus): configs = nexus.vehicle_configurations analyses = nexus.analyses base = configs.base m_guess = nexus.m_guess #take in sizing inputs base.mass_properties.max_takeoff = m_guess #find conditions air_speed = nexus.missions.base.segments['cruise'].air_speed altitude = nexus.missions.base.segments['climb_3'].altitude_end atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() freestream = atmosphere.compute_values(altitude) freestream0 = atmosphere.compute_values(6000.*Units.ft) #cabin altitude diff_pressure = np.max(freestream0.pressure-freestream.pressure,0) fuselage = base.fuselages['fuselage'] fuselage.differential_pressure = diff_pressure #now size engine mach_number = air_speed/freestream.speed_of_sound #now add to freestream data object freestream.velocity = air_speed freestream.mach_number = mach_number freestream.gravity = 9.81 conditions = SUAVE.Analyses.Mission.Segments.Conditions.Aerodynamics() #assign conditions in form for propulsor sizing conditions.freestream = freestream nose_load_fraction = .06 #now evaluate all of the vehicle configurations for config in configs: config.wings.horizontal_stabilizer.areas.reference = (26.0/92.0)*config.wings.main_wing.areas.reference for wing in config.wings: wing = SUAVE.Methods.Geometry.Two_Dimensional.Planform.wing_planform(wing) wing.areas.exposed = 0.8 * wing.areas.wetted wing.areas.affected = 0.6 * wing.areas.reference fuselage = config.fuselages['fuselage'] fuselage.differential_pressure = diff_pressure #now evaluate weights # diff the new data config.mass_properties.max_takeoff = m_guess #take in parameters config.mass_properties.takeoff = m_guess config.mass_properties.max_zero_fuel = base.mass_properties.max_zero_fuel config.store_diff() #now evaluate the weights weights = analyses.base.weights.evaluate() #base.weights.evaluate() #update zfw empty_weight = base.mass_properties.operating_empty payload = base.mass_properties.max_payload zfw = empty_weight + payload base.max_zero_fuel = zfw base.store_diff() for config in configs: config.pull_base() # ------------------------------------------------------------------ # Landing Configuration # ------------------------------------------------------------------ landing = nexus.vehicle_configurations.landing landing_conditions = Data() landing_conditions.freestream = Data() # landing weight landing.mass_properties.landing = base.mass_properties.max_zero_fuel # Landing CL_max altitude = nexus.missions.base.segments[-1].altitude_end atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() freestream = atmosphere.compute_values(altitude) mu = freestream.dynamic_viscosity rho = freestream.density landing_conditions.freestream.velocity = nexus.missions.base.segments['descent_3'].air_speed landing_conditions.freestream.density = rho landing_conditions.freestream.dynamic_viscosity = mu/rho CL_max_landing,CDi = compute_max_lift_coeff(landing,landing_conditions) landing.maximum_lift_coefficient = CL_max_landing # diff the new data landing.store_diff() #Takeoff CL_max takeoff = nexus.vehicle_configurations.takeoff takeoff_conditions = Data() takeoff_conditions.freestream = Data() altitude = nexus.missions.base.airport.altitude atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() freestream = atmosphere.compute_values(altitude) mu = freestream.dynamic_viscosity rho = freestream.density takeoff_conditions.freestream.velocity = nexus.missions.base.segments.climb_1.air_speed takeoff_conditions.freestream.density = rho takeoff_conditions.freestream.dynamic_viscosity = mu/rho max_CL_takeoff,CDi = compute_max_lift_coeff(takeoff,takeoff_conditions) takeoff.maximum_lift_coefficient = max_CL_takeoff takeoff.store_diff() #Base config CL_max base = nexus.vehicle_configurations.base base_conditions = Data() base_conditions.freestream = Data() altitude = nexus.missions.base.airport.altitude atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() freestream = atmosphere.compute_values(altitude) mu = freestream.dynamic_viscosity rho = freestream.density base_conditions.freestream.velocity = nexus.missions.base.segments.climb_1.air_speed base_conditions.freestream.density = rho base_conditions.freestream.dynamic_viscosity = mu/rho max_CL_base,CDi = compute_max_lift_coeff(base,base_conditions) base.maximum_lift_coefficient = max_CL_base base.store_diff() # done! return nexus