def main(): #initialize the problem nexus = Nexus() vehicle = vehicle_setup() nexus.vehicle_configurations = configs_setup(vehicle) nexus.analyses = Analyses.setup(nexus.vehicle_configurations) nexus.missions = Missions.setup(nexus.analyses) #problem = Data() #nexus.optimization_problem = problem nexus.procedure = setup() nexus.sizing_loop = Sizing_Loop() nexus.total_number_of_iterations = 0 evaluate_problem(nexus) results = nexus.results err = nexus.sizing_loop.norm_error err_true = 0.00975078 #for 1E-2 tol error = abs((err-err_true)/err) print 'error = ', error assert(error<1e-5), 'sizing loop regression failed' #output=nexus._really_evaluate() #run; use optimization setup without inputs return
def main(): vehicle = vehicle_setup() configs = configs_setup(vehicle) analyses = mission_B737.analyses_setup(configs) mission = mission_setup(configs,analyses) configs.finalize() analyses.finalize() results = mission.evaluate() results = results.merged() plot_results(results) distance_regression = 4317710.33719722 distance_calc = results.conditions.frames.inertial.position_vector[-1,0] error_distance = abs((distance_regression - distance_calc )/distance_regression) assert error_distance < 1e-6 error_weight = abs(mission.target_landing_weight - results.conditions.weights.total_mass[-1,0]) print('landing weight error' , error_weight) assert error_weight < 1e-6 return
def main(): vehicle = vehicle_setup() configs = configs_setup(vehicle) analyses = mission_B737.analyses_setup(configs) mission = mission_setup(configs, analyses) configs.finalize() analyses.finalize() results = mission.evaluate() results = results.merged() plot_results(results) distance_regression = 4317710.33719722 distance_calc = results.conditions.frames.inertial.position_vector[-1, 0] error_distance = abs( (distance_regression - distance_calc) / distance_regression) assert error_distance < 1e-6 error_weight = abs(mission.target_landing_weight - results.conditions.weights.total_mass[-1, 0]) print('landing weight error', error_weight) assert error_weight < 1e-6 return
def main(): # vehicle data vehicle = vehicle_setup() configs = configs_setup(vehicle) # vehicle analyses configs_analyses = analyses_setup(configs) aerodynamics = SUAVE.Analyses.Aerodynamics.AVL() stability = SUAVE.Analyses.Stability.AVL() aerodynamics.geometry = copy.deepcopy(configs.cruise) stability.geometry = copy.deepcopy(configs.cruise) aerodynamics.process.compute.lift.inviscid.training_file = 'base_data_aerodynamics.txt' stability.training_file = 'base_data_stability.txt' configs_analyses.cruise.append(aerodynamics) configs_analyses.cruise.append(stability) # mission analyses mission = mission_setup(configs_analyses) missions_analyses = missions_setup(mission) analyses = SUAVE.Analyses.Analysis.Container() analyses.configs = configs_analyses analyses.missions = missions_analyses simple_sizing(configs, analyses) configs.finalize() analyses.finalize() # mission analysis mission = analyses.missions.base results = mission.evaluate() # lift coefficient check lift_coefficient = results.conditions.cruise.aerodynamics.lift_coefficient[ 0] lift_coefficient_true = 0.59571034 print lift_coefficient diff_CL = np.abs(lift_coefficient - lift_coefficient_true) print 'CL difference' print diff_CL assert np.abs((lift_coefficient - lift_coefficient_true) / lift_coefficient_true) < 1e-6 # moment coefficient check moment_coefficient = results.conditions.cruise.stability.static.CM[0][0] moment_coefficient_true = -0.62167644 print moment_coefficient diff_CM = np.abs(moment_coefficient - moment_coefficient_true) print 'CM difference' print diff_CM assert np.abs((moment_coefficient - moment_coefficient_true) / moment_coefficient_true) < 1e-6 return
def main(): # Setup for converging on weight vehicle = vehicle_setup() configs = configs_setup(vehicle) analyses = mission_B737.analyses_setup(configs) mission = mission_setup(configs, analyses) configs.finalize() analyses.finalize() results = mission.evaluate() results = results.merged() plot_results(results) distance_regression = 3804806.720225211 distance_calc = results.conditions.frames.inertial.position_vector[-1, 0] print('distance_calc = ', distance_calc) error_distance = abs( (distance_regression - distance_calc) / distance_regression) assert error_distance < 1e-6 error_weight = abs(mission.target_landing_weight - results.conditions.weights.total_mass[-1, 0]) print('landing weight error', error_weight) assert error_weight < 1e-6 # Setup for converging on SOC, using the stopped rotor vehicle vehicle_SR, analyses_SR = full_setup_SR() analyses_SR.finalize() mission_SR = analyses_SR.mission results_SR = mission_SR.evaluate() results_SR = results_SR.merged() distance_regression_SR = 101649.83535243798 distance_calc_SR = results_SR.conditions.frames.inertial.position_vector[ -1, 0] print('distance_calc_SR = ', distance_calc_SR) error_distance_SR = abs( (distance_regression_SR - distance_calc_SR) / distance_regression_SR) assert error_distance_SR < 1e-6 error_soc = abs( mission_SR.target_state_of_charge - results_SR.conditions.propulsion.battery_state_of_charge[-1, 0]) print('landing state of charge error', error_soc) assert error_soc < 1e-6 return
def main(): #initialize the problem nexus = Nexus() vehicle = vehicle_setup() nexus.vehicle_configurations = configs_setup(vehicle) nexus.analyses = Analyses.setup(nexus.vehicle_configurations) nexus.missions = Missions.setup(nexus.analyses) problem = Data() problem_inputs = np.array([ ['dummy', 1., (.1, 10.), 1., ' continuous', Units.less], ['dummy2', 2., (.1, 10.), 1., ' continuous', Units.less], ]) #create dummy inputs for optimization to test io problem.inputs = problem_inputs nexus.optimization_problem = problem nexus.procedure = setup() sizing_loop = Sizing_Loop() sizing_loop.output_filename = 'sizing_outputs.txt' nexus.sizing_loop = sizing_loop #create a fake array of data to test outputs write_sizing_outputs(sizing_loop, np.array([6.]), [5., 5.]) write_sizing_outputs(sizing_loop, np.array([12.]), [4., 1.]) write_sizing_outputs(sizing_loop, np.array([11.]), [1., 3.]) nexus.total_number_of_iterations = 0 evaluate_problem(nexus) results = nexus.results err = nexus.sizing_loop.norm_error err_true = 0.0008433474527249522 #for 1E-2 tol error = abs((err - err_true) / err_true) data_inputs, data_outputs, read_success = read_sizing_residuals( sizing_loop, problem.inputs) check_read_res = -0.06803060191281879 error_res = (data_outputs[1][0] - check_read_res) / check_read_res #remove files for later os.remove('sizing_outputs.txt') os.remove('y_err_values.txt') print('error = ', error) print('error_res = ', error_res) assert (error < 1e-4), 'sizing loop regression failed' assert (error_res < 1e-4), 'sizing loop io failed' return
def full_setup(): # vehicle data vehicle = vehicle_setup() configs = configs_setup(vehicle) # vehicle analyses configs_analyses = analyses_setup(configs) # mission analyses mission = mission_setup(configs_analyses) missions_analyses = missions_setup(mission) analyses = SUAVE.Analyses.Analysis.Container() analyses.configs = configs_analyses analyses.missions = missions_analyses return configs, analyses
def full_setup(): # vehicle data vehicle = vehicle_setup() configs = configs_setup(vehicle) # vehicle analyses configs_analyses = analyses_setup(configs) # mission analyses mission = mission_setup(configs_analyses) missions_analyses = missions_setup(mission) analyses = SUAVE.Analyses.Analysis.Container() analyses.configs = configs_analyses analyses.missions = missions_analyses return configs, analyses
def main(): vehicle = vehicle_setup() configs = configs_setup(vehicle) analyses = mission_B737.analyses_setup(configs) mission = mission_setup(configs,analyses) vehicle.mass_properties.takeoff = 70000 * Units.kg configs.finalize() analyses.finalize() results = mission.evaluate() results = results.merged() plot_results(results) error = abs(mission.target_landing_weight - results.conditions.weights.total_mass[-1,0]) print 'landing weight error' , error assert error < 1. return
def main(): vehicle = vehicle_setup() configs = configs_setup(vehicle) analyses = mission_B737.analyses_setup(configs) mission = mission_setup(configs, analyses) vehicle.mass_properties.takeoff = 70000 * Units.kg configs.finalize() analyses.finalize() results = mission.evaluate() results = results.merged() plot_results(results) error = abs(mission.target_landing_weight - results.conditions.weights.total_mass[-1, 0]) print 'landing weight error', error assert error < 1. return
def main(): #initialize the problem nexus = Nexus() vehicle = vehicle_setup() nexus.vehicle_configurations = configs_setup(vehicle) nexus.analyses = Analyses.setup(nexus.vehicle_configurations) nexus.missions = Missions.setup(nexus.analyses) nexus.procedure = setup() nexus.sizing_loop = Sizing_Loop() nexus.total_number_of_iterations = 0 evaluate_problem(nexus) results = nexus.results err = nexus.sizing_loop.norm_error err_true = 0.0096907307307155348#for 1E-2 tol error = abs((err_true-err)/err_true) print 'error = ', error assert(error<1e-6), 'sizing loop regression failed' return
def main(): #initialize the problem nexus = Nexus() vehicle = vehicle_setup() nexus.vehicle_configurations = configs_setup(vehicle) nexus.analyses = Analyses.setup(nexus.vehicle_configurations) nexus.missions = Missions.setup(nexus.analyses) nexus.procedure = setup() nexus.sizing_loop = Sizing_Loop() nexus.total_number_of_iterations = 0 evaluate_problem(nexus) results = nexus.results err = nexus.sizing_loop.norm_error err_true = 0.0096907307307155348 #for 1E-2 tol error = abs((err_true - err) / err_true) print 'error = ', error assert (error < 1e-6), 'sizing loop regression failed' return
def main(): # vehicle data vehicle = vehicle_setup() configs = configs_setup(vehicle) # vehicle analyses configs_analyses = analyses_setup(configs) # append AVL aerodynamic analysis aerodynamics = SUAVE.Analyses.Aerodynamics.AVL() aerodynamics.process.compute.lift.inviscid.regression_flag = True aerodynamics.process.compute.lift.inviscid.keep_files = True aerodynamics.geometry = copy.deepcopy(configs.cruise) aerodynamics.process.compute.lift.inviscid.training_file = 'cruise_data_aerodynamics.txt' configs_analyses.cruise.append(aerodynamics) # append AVL stability analysis stability = SUAVE.Analyses.Stability.AVL() stability.regression_flag = True stability.keep_files = True stability.geometry = copy.deepcopy(configs.cruise) stability.training_file = 'cruise_data_stability.txt' configs_analyses.cruise.append(stability) # ------------------------------------------------------------------ # Initialize the Mission # ------------------------------------------------------------------ mission = SUAVE.Analyses.Mission.Sequential_Segments() mission.tag = 'the_mission' #airport airport = SUAVE.Attributes.Airports.Airport() airport.altitude = 0.0 * Units.ft airport.delta_isa = 0.0 airport.atmosphere = SUAVE.Attributes.Atmospheres.Earth.US_Standard_1976() mission.airport = airport # unpack Segments module Segments = SUAVE.Analyses.Mission.Segments # base segment base_segment = Segments.Segment() # ------------------------------------------------------------------ # Cruise Segment: constant speed, constant altitude # ------------------------------------------------------------------ segment = Segments.Cruise.Constant_Speed_Constant_Altitude(base_segment) segment.tag = "cruise" segment.analyses.extend( configs_analyses.cruise ) segment.air_speed = 230. * Units['m/s'] segment.distance = 4000. * Units.km segment.altitude = 10.668 * Units.km segment.state.numerics.number_control_points = 4 # add to mission mission.append_segment(segment) missions_analyses = missions_setup(mission) analyses = SUAVE.Analyses.Analysis.Container() analyses.configs = configs_analyses analyses.missions = missions_analyses simple_sizing(configs, analyses) configs.finalize() analyses.finalize() # mission analysis mission = analyses.missions.base results = mission.evaluate() # lift coefficient check lift_coefficient = results.segments.cruise.conditions.aerodynamics.lift_coefficient[0][0] lift_coefficient_true = 0.6118979131570086 print(lift_coefficient) diff_CL = np.abs(lift_coefficient - lift_coefficient_true) print('CL difference') print(diff_CL) assert np.abs((lift_coefficient - lift_coefficient_true)/lift_coefficient_true) < 1e-6 # moment coefficient check moment_coefficient = results.segments.cruise.conditions.stability.static.CM[0][0] moment_coefficient_true = -0.6267104237340391 print(moment_coefficient) diff_CM = np.abs(moment_coefficient - moment_coefficient_true) print('CM difference') print(diff_CM) assert np.abs((moment_coefficient - moment_coefficient_true)/moment_coefficient_true) < 1e-6 return
def setup(): nexus = Nexus() problem = Data() nexus.optimization_problem = problem # ------------------------------------------------------------------- # Inputs # ------------------------------------------------------------------- # [ tag , initial, [lb,ub], scaling, units ] problem.inputs = np.array([ ['wing_area', 124.8, (70., 200.), 124.8, Units.meter**2], ['wing_aspect_ratio', 10.18, (5., 20.), 10.18, Units.less], ['wing_sweep', 25., (0., 35.), 25., Units.degrees], ['wing_thickness', 0.105, (0.07, 0.20), 0.105, Units.less], ['design_thrust', 52700., (10000., 70000.), 52700., Units.N], ['MTOW', 79090., (20000., 100000.), 79090., Units.kg], ['MZFW_ratio', 0.77, (0.6, 0.99), 0.77, Units.less], ['flap_takeoff_angle', 10., (0., 20.), 10., Units.degrees], ['flap_landing_angle', 40., (0., 50.), 40., Units.degrees], ['short_field_TOW', 64030., (20000., 100000.), 64030., Units.kg], ['design_TOW', 68520., (20000., 100000.), 68520., Units.kg], ['noise_takeoff_speed_increase', 10.0, (10., 20.), 10.0, Units.knots], ['noise_cutback_altitude', 304.8, (240., 400.), 304.8, Units.meter], ]) # ------------------------------------------------------------------- # Objective # ------------------------------------------------------------------- problem.objective = np.array([ ['noise_cumulative_margin', 17, Units.less], ]) # ------------------------------------------------------------------- # Constraints # ------------------------------------------------------------------- # [ tag, sense, edge, scaling, units ] problem.constraints = np.array([ ['MZFW consistency', '>', 0., 10, Units.less], ['design_range_fuel_margin', '>', 0., 10, Units.less], ['short_field_fuel_margin', '>', 0., 10, Units.less], ['max_range_fuel_margin', '>', 0., 10, Units.less], ['wing_span', '<', 35.9664, 35.9664, Units.less], ['noise_flyover_margin', '>', 0., 10., Units.less], ['noise_sideline_margin', '>', 0., 10., Units.less], ['noise_approach_margin', '>', 0., 10., Units.less], ['takeoff_field_length', '<', 1985., 1985., Units.meters], ['landing_field_length', '<', 1385., 1385., Units.meters], ['2nd_segment_climb_max_range', '>', 0.024, 0.024, Units.less], ['2nd_segment_climb_short_field', '>', 0.024, 0.024, Units.less], ['max_throttle', '<', 1., 1., Units.less], ['short_takeoff_field_length', '<', 1330., 1330., Units.meters], ['noise_cumulative_margin', '>', 10., 10., Units.less], ]) # ------------------------------------------------------------------- # Aliases # ------------------------------------------------------------------- problem.aliases = [ [ 'wing_area', [ 'vehicle_configurations.*.wings.main_wing.areas.reference', 'vehicle_configurations.*.reference_area' ] ], [ 'wing_aspect_ratio', 'vehicle_configurations.*.wings.main_wing.aspect_ratio' ], [ 'wing_incidence', 'vehicle_configurations.*.wings.main_wing.twists.root' ], [ 'wing_tip_twist', 'vehicle_configurations.*.wings.main_wing.twists.tip' ], [ 'wing_sweep', 'vehicle_configurations.*.wings.main_wing.sweeps.quarter_chord' ], [ 'wing_thickness', 'vehicle_configurations.*.wings.main_wing.thickness_to_chord' ], ['wing_taper', 'vehicle_configurations.*.wings.main_wing.taper'], [ 'wing_location', 'vehicle_configurations.*.wings.main_wing.origin[0]' ], [ 'horizontal_tail_area', 'vehicle_configurations.*.wings.horizontal_stabilizer.areas.reference' ], [ 'horizontal_tail_aspect_ratio', 'vehicle_configurations.*.wings.horizontal_stabilizer.aspect_ratio' ], [ 'vertical_tail_area', 'vehicle_configurations.*.wings.vertical_stabilizer.areas.reference' ], [ 'vertical_tail_aspect_ratio', 'vehicle_configurations.*.wings.vertical_stabilizer.aspect_ratio' ], [ 'design_thrust', 'vehicle_configurations.*.propulsors.turbofan.thrust.total_design' ], [ 'MTOW', [ 'vehicle_configurations.*.mass_properties.takeoff', 'vehicle_configurations.*.mass_properties.max_takeoff' ] ], ['design_TOW', 'vehicle_configurations.base.mass_properties.takeoff'], [ 'short_field_TOW', 'vehicle_configurations.short_field_takeoff.mass_properties.takeoff' ], [ 'flap_takeoff_angle', [ 'vehicle_configurations.takeoff.wings.main_wing.control_surfaces.flap.deflection', 'vehicle_configurations.short_field_takeoff.wings.main_wing.control_surfaces.flap.deflection' ] ], [ 'flap_landing_angle', 'vehicle_configurations.landing.wings.main_wing.control_surfaces.flap.deflection' ], [ 'slat_takeoff_angle', [ 'vehicle_configurations.takeoff.wings.main_wing.control_surfaces.slat.deflection', 'vehicle_configurations.short_field_takeoff.wings.main_wing.control_surfaces.slat.deflection' ] ], [ 'slat_landing_angle', 'vehicle_configurations.landing.wings.main_wing.control_surfaces.slat.deflection' ], [ 'wing_span', 'vehicle_configurations.base.wings.main_wing.spans.projected' ], ['noise_approach_margin', 'summary.noise_approach_margin'], ['noise_sideline_margin', 'summary.noise_sideline_margin'], ['noise_flyover_margin', 'summary.noise_flyover_margin'], ['static_stability', 'summary.static_stability'], [ 'vertical_tail_volume_coefficient', 'summary.vertical_tail_volume_coefficient' ], [ 'horizontal_tail_volume_coefficient', 'summary.horizontal_tail_volume_coefficient' ], ['wing_max_cl_norm', 'summary.maximum_cl_norm'], ['design_range_fuel_margin', 'summary.design_range_fuel_margin'], ['takeoff_field_length', 'summary.takeoff_field_length'], ['landing_field_length', 'summary.landing_field_length'], ['short_takeoff_field_length', 'summary.short_takeoff_field_length'], [ '2nd_segment_climb_max_range', 'summary.second_segment_climb_gradient_takeoff' ], [ '2nd_segment_climb_short_field', 'summary.second_segment_climb_gradient_short_field' ], ['max_throttle', 'summary.max_throttle'], ['short_field_fuel_margin', 'summary.short_field_fuel_margin'], ['max_range_fuel_margin', 'summary.max_range_fuel_margin'], ['max_range', 'missions.max_range_distance'], ['MZFW consistency', 'summary.MZFW_consistency'], ['MZFW_ratio', 'MZFW_ratio'], ['noise_takeoff_speed_increase', 'noise_V2_increase'], [ 'noise_cutback_altitude', 'missions.takeoff.segments.climb.altitude_end' ], ['noise_cumulative_margin', 'summary.noise_margin'], ['weighted_sum_objective', 'summary.weighted_sum_objective'], ] # ------------------------------------------------------------------- # Vehicles # ------------------------------------------------------------------- vehicle = vehicle_setup() nexus.vehicle_configurations = configs_setup(vehicle) # ------------------------------------------------------------------- # Analyses # ------------------------------------------------------------------- nexus.analyses = Analyses.setup(nexus.vehicle_configurations) # ------------------------------------------------------------------- # Missions # ------------------------------------------------------------------- nexus.missions = Missions.setup(nexus.analyses) # ------------------------------------------------------------------- # Procedure # ------------------------------------------------------------------- nexus.procedure = Procedure.setup() # ------------------------------------------------------------------- # Summary # ------------------------------------------------------------------- nexus.summary = Data() return nexus
def main(): # vehicle data vehicle = vehicle_setup() configs = configs_setup(vehicle) # vehicle analyses configs_analyses = analyses_setup(configs) run_new_regression = False # append AVL aerodynamic analysis aerodynamics = SUAVE.Analyses.Aerodynamics.AVL() aerodynamics.settings.number_spanwise_vortices = 30 aerodynamics.settings.keep_files = True aerodynamics.geometry = copy.deepcopy(configs.cruise) configs_analyses.cruise.append(aerodynamics) # append AVL stability analysis stability = SUAVE.Analyses.Stability.AVL() stability.settings.number_spanwise_vortices = 30 stability.settings.keep_files = True stability.geometry = copy.deepcopy(configs.cruise) if run_new_regression: # append AVL aerodynamic analysis aerodynamics.settings.regression_flag = False aerodynamics.process.compute.lift.inviscid.settings.filenames.avl_bin_name = 'CHANGE/TO/AVL/PATH' aerodynamics.settings.save_regression_results = True stability.settings.regression_flag = False stability.settings.save_regression_results = True stability.settings.filenames.avl_bin_name = 'CHANGE/TO/AVL/PATH' else: aerodynamics.settings.regression_flag = True aerodynamics.settings.save_regression_results = False aerodynamics.settings.training_file = 'cruise_aero_data.txt' stability.settings.regression_flag = True stability.settings.save_regression_results = False stability.training_file = 'cruise_stability_data.txt' configs_analyses.cruise.append(aerodynamics) configs_analyses.cruise.append(stability) # ------------------------------------------------------------------ # Initialize the Mission # ------------------------------------------------------------------ mission = SUAVE.Analyses.Mission.Sequential_Segments() mission.tag = 'the_mission' #airport airport = SUAVE.Attributes.Airports.Airport() airport.altitude = 0.0 * Units.ft airport.delta_isa = 0.0 airport.atmosphere = SUAVE.Attributes.Atmospheres.Earth.US_Standard_1976() mission.airport = airport # unpack Segments module Segments = SUAVE.Analyses.Mission.Segments # base segment base_segment = Segments.Segment() # ------------------------------------------------------------------ # Cruise Segment: constant speed, constant altitude # ------------------------------------------------------------------ segment = Segments.Cruise.Constant_Speed_Constant_Altitude(base_segment) segment.tag = "cruise" segment.analyses.extend(configs_analyses.cruise) segment.air_speed = 230. * Units['m/s'] segment.distance = 4000. * Units.km segment.altitude = 10.668 * Units.km segment.state.numerics.number_control_points = 4 # add to mission mission.append_segment(segment) missions_analyses = missions_setup(mission) analyses = SUAVE.Analyses.Analysis.Container() analyses.configs = configs_analyses analyses.missions = missions_analyses simple_sizing(configs, analyses) configs.finalize() analyses.finalize() # mission analysis mission = analyses.missions.base results = mission.evaluate() # lift coefficient check lift_coefficient = results.segments.cruise.conditions.aerodynamics.lift_coefficient[ 0][0] lift_coefficient_true = 0.6124936427552575 print(lift_coefficient) diff_CL = np.abs(lift_coefficient - lift_coefficient_true) print('CL difference') print(diff_CL) assert np.abs((lift_coefficient - lift_coefficient_true) / lift_coefficient_true) < 1e-6 # moment coefficient check moment_coefficient = results.segments.cruise.conditions.stability.static.CM[ 0][0] moment_coefficient_true = -0.5764235338199974 print(moment_coefficient) diff_CM = np.abs(moment_coefficient - moment_coefficient_true) print('CM difference') print(diff_CM) assert np.abs((moment_coefficient - moment_coefficient_true) / moment_coefficient_true) < 1e-6 return
def setup(): nexus = Nexus() problem = Data() nexus.optimization_problem = problem # ------------------------------------------------------------------- # Inputs # ------------------------------------------------------------------- # [ tag , initial, [lb,ub], scaling, units ] problem.inputs = np.array([ [ 'wing_area' , 124.8 , ( 70. , 200. ) , 124.8 , Units.meter**2], [ 'wing_aspect_ratio' , 10.18, ( 5. , 20. ) , 10.18, Units.less], [ 'wing_sweep' , 25. , ( 0. , 35. ) , 25. , Units.degrees], [ 'wing_thickness' , 0.105 , ( 0.07 , 0.20 ) , 0.105, Units.less], [ 'design_thrust' , 52700. , ( 10000. , 70000. ) , 52700. , Units.N], [ 'MTOW' , 79090. , ( 20000. ,100000. ) , 79090. , Units.kg], [ 'MZFW_ratio' , 0.77 , ( 0.6 , 0.99 ) , 0.77 , Units.less], [ 'flap_takeoff_angle' , 10. , ( 0. , 20. ) , 10. , Units.degrees], [ 'flap_landing_angle' , 40. , ( 0. , 50. ) , 40. , Units.degrees], [ 'short_field_TOW' , 64030. , ( 20000. ,100000. ) , 64030. , Units.kg], [ 'design_TOW' , 68520. , ( 20000. ,100000. ) , 68520. , Units.kg], [ 'noise_takeoff_speed_increase' , 10.0 , ( 10. , 20. ) , 10.0 , Units.knots], [ 'noise_cutback_altitude' , 304.8 , ( 240. , 400. ) , 304.8 , Units.meter], ]) # ------------------------------------------------------------------- # Objective # ------------------------------------------------------------------- problem.objective = np.array([ [ 'noise_cumulative_margin', 17, Units.less ], ]) # ------------------------------------------------------------------- # Constraints # ------------------------------------------------------------------- # [ tag, sense, edge, scaling, units ] problem.constraints = np.array([ [ 'MZFW consistency' , '>' , 0. , 10 , Units.less], [ 'design_range_fuel_margin' , '>', 0., 10, Units.less], [ 'short_field_fuel_margin' , '>' , 0. , 10, Units.less], [ 'max_range_fuel_margin' , '>' , 0. , 10, Units.less], [ 'wing_span' , '<', 35.9664, 35.9664, Units.less], [ 'noise_flyover_margin' , '>', 0. , 10., Units.less], [ 'noise_sideline_margin' , '>', 0. , 10. , Units.less], [ 'noise_approach_margin' , '>', 0., 10., Units.less], [ 'takeoff_field_length' , '<', 1985., 1985., Units.meters], [ 'landing_field_length' , '<', 1385., 1385., Units.meters], [ '2nd_segment_climb_max_range' , '>', 0.024, 0.024, Units.less], [ '2nd_segment_climb_short_field' , '>', 0.024, 0.024, Units.less], [ 'max_throttle' , '<', 1., 1., Units.less], [ 'short_takeoff_field_length' , '<', 1330., 1330., Units.meters], [ 'noise_cumulative_margin' , '>', 10., 10., Units.less], ]) # ------------------------------------------------------------------- # Aliases # ------------------------------------------------------------------- problem.aliases = [ [ 'wing_area' , ['vehicle_configurations.*.wings.main_wing.areas.reference', 'vehicle_configurations.*.reference_area' ]], [ 'wing_aspect_ratio' , 'vehicle_configurations.*.wings.main_wing.aspect_ratio' ], [ 'wing_incidence' , 'vehicle_configurations.*.wings.main_wing.twists.root' ], [ 'wing_tip_twist' , 'vehicle_configurations.*.wings.main_wing.twists.tip' ], [ 'wing_sweep' , 'vehicle_configurations.*.wings.main_wing.sweeps.quarter_chord' ], [ 'wing_thickness' , 'vehicle_configurations.*.wings.main_wing.thickness_to_chord' ], [ 'wing_taper' , 'vehicle_configurations.*.wings.main_wing.taper' ], [ 'wing_location' , 'vehicle_configurations.*.wings.main_wing.origin[0]' ], [ 'horizontal_tail_area' , 'vehicle_configurations.*.wings.horizontal_stabilizer.areas.reference'], [ 'horizontal_tail_aspect_ratio' , 'vehicle_configurations.*.wings.horizontal_stabilizer.aspect_ratio' ], [ 'vertical_tail_area' , 'vehicle_configurations.*.wings.vertical_stabilizer.areas.reference' ], [ 'vertical_tail_aspect_ratio' , 'vehicle_configurations.*.wings.vertical_stabilizer.aspect_ratio' ], [ 'design_thrust' , 'vehicle_configurations.*.propulsors.turbofan.thrust.total_design' ], [ 'MTOW' , ['vehicle_configurations.*.mass_properties.takeoff' , 'vehicle_configurations.*.mass_properties.max_takeoff' ]], [ 'design_TOW' , 'vehicle_configurations.base.mass_properties.takeoff' ], [ 'short_field_TOW' , 'vehicle_configurations.short_field_takeoff.mass_properties.takeoff' ], [ 'flap_takeoff_angle' , ['vehicle_configurations.takeoff.wings.main_wing.flaps.angle', 'vehicle_configurations.short_field_takeoff.wings.main_wing.flaps.angle']], [ 'flap_landing_angle' , 'vehicle_configurations.landing.wings.main_wing.flaps.angle' ], [ 'slat_takeoff_angle' , ['vehicle_configurations.takeoff.wings.main_wing.slats.angle', 'vehicle_configurations.short_field_takeoff.wings.main_wing.slats.angle']], [ 'slat_landing_angle' , 'vehicle_configurations.landing.wings.main_wing.slats.angle' ], [ 'wing_span' , 'vehicle_configurations.base.wings.main_wing.spans.projected' ], [ 'noise_approach_margin' , 'summary.noise_approach_margin' ], [ 'noise_sideline_margin' , 'summary.noise_sideline_margin' ], [ 'noise_flyover_margin' , 'summary.noise_flyover_margin' ], [ 'static_stability' , 'summary.static_stability' ], [ 'vertical_tail_volume_coefficient' , 'summary.vertical_tail_volume_coefficient' ], [ 'horizontal_tail_volume_coefficient', 'summary.horizontal_tail_volume_coefficient' ], [ 'wing_max_cl_norm' , 'summary.maximum_cl_norm' ], [ 'design_range_fuel_margin' , 'summary.design_range_fuel_margin' ], [ 'takeoff_field_length' , 'summary.takeoff_field_length' ], [ 'landing_field_length' , 'summary.landing_field_length' ], [ 'short_takeoff_field_length' , 'summary.short_takeoff_field_length' ], [ '2nd_segment_climb_max_range' , 'summary.second_segment_climb_gradient_takeoff' ], [ '2nd_segment_climb_short_field' , 'summary.second_segment_climb_gradient_short_field' ], [ 'max_throttle' , 'summary.max_throttle' ], [ 'short_field_fuel_margin' , 'summary.short_field_fuel_margin' ], [ 'max_range_fuel_margin' , 'summary.max_range_fuel_margin' ], [ 'max_range' , 'missions.max_range_distance' ], [ 'MZFW consistency' , 'summary.MZFW_consistency' ], [ 'MZFW_ratio' , 'MZFW_ratio' ], [ 'noise_takeoff_speed_increase' , 'noise_V2_increase' ], [ 'noise_cutback_altitude' , 'missions.takeoff.segments.climb.altitude_end' ], [ 'noise_cumulative_margin' , 'summary.noise_margin' ], [ 'weighted_sum_objective' , 'summary.weighted_sum_objective' ], ] # ------------------------------------------------------------------- # Vehicles # ------------------------------------------------------------------- vehicle = vehicle_setup() nexus.vehicle_configurations = configs_setup(vehicle) # ------------------------------------------------------------------- # Analyses # ------------------------------------------------------------------- nexus.analyses = Analyses.setup(nexus.vehicle_configurations) # ------------------------------------------------------------------- # Missions # ------------------------------------------------------------------- nexus.missions = Missions.setup(nexus.analyses) # ------------------------------------------------------------------- # Procedure # ------------------------------------------------------------------- nexus.procedure = Procedure.setup() # ------------------------------------------------------------------- # Summary # ------------------------------------------------------------------- nexus.summary = Data() return nexus
def main(): # vehicle data vehicle = vehicle_setup() configs = configs_setup(vehicle) # vehicle analyses configs_analyses = analyses_setup(configs) # append AVL aerodynamic analysis aerodynamics = SUAVE.Analyses.Aerodynamics.AVL() aerodynamics.process.compute.lift.inviscid.regression_flag = True aerodynamics.process.compute.lift.inviscid.keep_files = True aerodynamics.geometry = copy.deepcopy(configs.cruise) aerodynamics.process.compute.lift.inviscid.training_file = 'cruise_data_aerodynamics.txt' configs_analyses.cruise.append(aerodynamics) # append AVL stability analysis stability = SUAVE.Analyses.Stability.AVL() stability.regression_flag = True stability.keep_files = True stability.geometry = copy.deepcopy(configs.cruise) stability.training_file = 'cruise_data_stability.txt' configs_analyses.cruise.append(stability) # mission analyses mission = mission_setup(configs_analyses) missions_analyses = missions_setup(mission) analyses = SUAVE.Analyses.Analysis.Container() analyses.configs = configs_analyses analyses.missions = missions_analyses simple_sizing(configs, analyses) configs.finalize() analyses.finalize() # mission analysis mission = analyses.missions.base results = mission.evaluate() # lift coefficient check lift_coefficient = results.conditions.cruise.aerodynamics.lift_coefficient[0] lift_coefficient_true = 0.59495841 print lift_coefficient diff_CL = np.abs(lift_coefficient - lift_coefficient_true) print 'CL difference' print diff_CL assert np.abs((lift_coefficient - lift_coefficient_true)/lift_coefficient_true) < 1e-3 # moment coefficient check moment_coefficient = results.conditions.cruise.stability.static.CM[0][0] moment_coefficient_true = -0.620326644 print moment_coefficient diff_CM = np.abs(moment_coefficient - moment_coefficient_true) print 'CM difference' print diff_CM assert np.abs((moment_coefficient - moment_coefficient_true)/moment_coefficient_true) < 1e-3 return