|
| 1 | +# Optimize.py |
| 2 | +# |
| 3 | +# Created: Jan 2017, M. Vegh |
| 4 | +# Modified: |
| 5 | + |
| 6 | +# ---------------------------------------------------------------------- |
| 7 | +# Imports |
| 8 | +# ---------------------------------------------------------------------- |
| 9 | + |
| 10 | +import SUAVE |
| 11 | +from SUAVE.Core import Units, Data |
| 12 | +import numpy as np |
| 13 | +import Vehicle |
| 14 | +import Analyses |
| 15 | +import Mission |
| 16 | +import Sizing as Procedure |
| 17 | +import Plot_Mission |
| 18 | +from SUAVE.Optimization.Nexus import Nexus |
| 19 | +import SUAVE.Optimization.Package_Setups.pyopt_setup as pyopt_setup |
| 20 | +from SUAVE.Sizing.Sizing_Loop import Sizing_Loop |
| 21 | +# ---------------------------------------------------------------------- |
| 22 | +# Run the whole thing |
| 23 | +# ---------------------------------------------------------------------- |
| 24 | +def main(): |
| 25 | + |
| 26 | + problem = setup() |
| 27 | + |
| 28 | + output = pyopt_setup.Pyopt_Solve(problem, sense_step = 1E-2, solver='SNOPT') |
| 29 | + print output |
| 30 | + |
| 31 | + Plot_Mission.plot_mission(problem) |
| 32 | + |
| 33 | + |
| 34 | + return |
| 35 | + |
| 36 | +# ---------------------------------------------------------------------- |
| 37 | +# Inputs, Objective, & Constraints |
| 38 | +# ---------------------------------------------------------------------- |
| 39 | + |
| 40 | +def setup(): |
| 41 | + |
| 42 | + nexus = Nexus() |
| 43 | + problem = Data() |
| 44 | + nexus.optimization_problem = problem |
| 45 | + nexus.sizing_loop = Sizing_Loop() |
| 46 | + |
| 47 | + # ------------------------------------------------------------------- |
| 48 | + # Inputs |
| 49 | + # ------------------------------------------------------------------- |
| 50 | + |
| 51 | + # [ tag , initial, [lb,ub], scaling, units ] |
| 52 | + problem.inputs = np.array([ |
| 53 | + [ 'thrust_loading' , .2 , (.05 , .3 ) , .1, 'continuous', Units.less], |
| 54 | + [ 'fan_pressure_ratio' , 1.5 , (1.05 , 2.6 ) , 1., 'continuous', Units.less], |
| 55 | + #[ 'aspect_ratio' , 14. , (5. , 14. ) , 10., 'continuous', Units.less], |
| 56 | + [ 'wing_loading' , 400. , (200. , 800. ) , 100.,'continuous', Units.kg/Units.meter**2.], |
| 57 | + #[ 'taper' , 0.1000 , (.1 , .3 ) , .1, 'continuous', Units.less ], |
| 58 | + [ 'wing_thickness' , .105 , (0.07 , 0.20 ) , .1, 'continuous', Units.less ], |
| 59 | + [ 'v_climb_1' , 80. , (50. , 230. ) , 1E2, 'continuous', Units.meter/Units.second], |
| 60 | + [ 'v_climb_2' , 100. , (50. , 230 ) , 1E2, 'continuous', Units.meter/Units.second], |
| 61 | + [ 'v_climb_3' , 140 , (50. , 230 ) , 1E2, 'continuous', Units.meter/Units.second], |
| 62 | + [ 'cruise_altitude' , 33000. , (20000. , 35000 ) , 1E4, 'continuous', Units.ft], |
| 63 | + [ 'climb_alt_fraction_1' , 0.1 , (.1 , 1. ) , 1., 'continuous', Units.less], |
| 64 | + [ 'climb_alt_fraction_2' , .2 , (.2 , 1. ) , 1., 'continuous', Units.less], |
| 65 | + [ 'descent_alt_fraction_1' , .2 , (.1 , 1. ) , 1., 'continuous', Units.less], |
| 66 | + ]) |
| 67 | + |
| 68 | + |
| 69 | + |
| 70 | + |
| 71 | + |
| 72 | + |
| 73 | + # ------------------------------------------------------------------- |
| 74 | + # Objective |
| 75 | + # ------------------------------------------------------------------- |
| 76 | + |
| 77 | + # throw an error if the user isn't specific about wildcards |
| 78 | + # [ tag, scaling, units ] |
| 79 | + problem.objective = np.array([ |
| 80 | + [ 'landing_weight', 1E4, Units.kg ] |
| 81 | + ]) |
| 82 | + |
| 83 | + |
| 84 | + # ------------------------------------------------------------------- |
| 85 | + # Constraints |
| 86 | + # ------------------------------------------------------------------- |
| 87 | + |
| 88 | + # [ tag, sense, edge, scaling, units ] |
| 89 | + |
| 90 | + problem.constraints = np.array([ |
| 91 | + #[ 'power_margin' , '>', 0 , 1E6 , Units.meters], |
| 92 | + #['lithium_ion_energy_margin' , '>', 0 , 1E0 , Units.less], |
| 93 | + [ 'climb_constraint_1' , '>', 0 , 1E2 , Units.meters], |
| 94 | + [ 'climb_constraint_2' , '>', 0 , 1E3 , Units.meters], #handled by bounds |
| 95 | + [ 'descent_constraint_1' , '>', 0 , 1E2 , Units.meters], |
| 96 | + [ 'min_alpha_constraint' , '>', 0 , 1E1 , Units.degrees], |
| 97 | + [ 'max_alpha_constraint' , '>', 0 , 1E1 , Units.degrees], |
| 98 | + [ 'takeoff_field_constraint' , '>', 0 , 1E3 , Units.ft], |
| 99 | + [ 'landing_field_constraint' , '>', 0 , 1E3 , Units.ft], |
| 100 | + [ 'max_throttle_constraint' , '>', 0 , 1 , Units.less], |
| 101 | + ['climb_velocity_constraint_1' , '>', 0 , 1E2 , Units.meters/Units.second], |
| 102 | + ['climb_velocity_constraint_2' , '>', 0 , 1E2 , Units.meters/Units.second], |
| 103 | + [ 'iteration_constraint' , '>', 0 , 1 , Units.less], |
| 104 | + |
| 105 | + ]) |
| 106 | + |
| 107 | + ''' |
| 108 | + problem.constraints = np.array([ |
| 109 | + [ 'power_margin' , '>', 0 , 1E6 , Units.meters], |
| 110 | + #[ 'range_margin' , '>', 0 , 1E6 , Units.meters], |
| 111 | + [ 'washout' , '>', 0 , 1E0 , Units.radians], |
| 112 | + [ 'climb_constraint_1' , '>', 0 , 1E3 , Units.km], |
| 113 | + [ 'climb_constraint_2' , '>', 0 , 1E3 , Units.km], |
| 114 | + [ 'climb_constraint_3' , '>', 0 , 1E3 , Units.km], |
| 115 | + [ 'climb_constraint_4' , '>', 0 , 1E3 , Units.km], |
| 116 | + [ 'descent_constraint_1' , '>', 0 , 1E3 , Units.km], |
| 117 | + [ 'descent_constraint_2' , '>', 0 , 1E3 , Units.km], |
| 118 | + [ 'min_alpha_constraint' , '>', 0 , 1E1 , Units.degrees], |
| 119 | + [ 'max_alpha_constraint' , '>', 0 , 1E1 , Units.degrees], |
| 120 | + #[ 'takeoff_field_constraint' , '>', 0 , 1E3 , Units.ft], |
| 121 | + #[ 'landing_field_constraint' , '>', 0 , 1E3 , Units.ft], |
| 122 | + |
| 123 | + ]) |
| 124 | + ''' |
| 125 | + # ------------------------------------------------------------------- |
| 126 | + # Aliases |
| 127 | + # ------------------------------------------------------------------- |
| 128 | + |
| 129 | + # [ 'alias' , ['data.path1.name','data.path2.name'] ] |
| 130 | + |
| 131 | + problem.aliases = [ |
| 132 | + #Inputs |
| 133 | + |
| 134 | + |
| 135 | + [ 'thrust_loading' , 'vehicle_configurations.*.thrust_loading' ], |
| 136 | + [ 'fan_pressure_ratio' , 'vehicle_configurations.*.energy_network.propulsor.fan.pressure_ratio'], |
| 137 | + |
| 138 | + [ 'aspect_ratio' , 'vehicle_configurations.*.wings.main_wing.aspect_ratio' ], |
| 139 | + |
| 140 | + [ 'wing_loading' , 'vehicle_configurations.*.wing_loading'], |
| 141 | + [ 'wing_thickness' , 'vehicle_configurations.*.wings.main_wing.thickness_to_chord'], |
| 142 | + [ 'taper' , 'vehicle_configurations.*.wings.main_wing.taper'], |
| 143 | + |
| 144 | + [ 'climb_alt_fraction_1' , 'missions.base.climb_alt_fraction_1'], |
| 145 | + [ 'climb_alt_fraction_2' , 'missions.base.climb_alt_fraction_2'], |
| 146 | + [ 'descent_alt_fraction_1' , 'missions.base.descent_alt_fraction_1' ], |
| 147 | + [ 'cruise_altitude' , 'missions.base.segments.climb_3.altitude_end' ], |
| 148 | + [ 'v_climb_1' , 'missions.base.segments.climb_1.air_speed'], |
| 149 | + [ 'v_climb_2' , 'missions.base.segments.climb_2.air_speed'], |
| 150 | + [ 'v_climb_3' , 'missions.base.segments.climb_3.air_speed'], |
| 151 | + |
| 152 | + |
| 153 | + #outputs |
| 154 | + [ 'landing_weight' , 'results.segments[-1].conditions.weights.total_mass[-1,0]' ], |
| 155 | + [ 'total_range' , 'results.total_range' ], |
| 156 | + [ 'max_power' , 'results.Pmax' ], |
| 157 | + |
| 158 | + #constraints |
| 159 | + [ 'max_throttle_constraint' , 'results.max_throttle_constraint' ], |
| 160 | + [ 'climb_constraint_1' , 'results.climb_constraint_1' ], |
| 161 | + [ 'climb_constraint_2' , 'results.climb_constraint_2' ], |
| 162 | + [ 'descent_constraint_1' , 'results.descent_constraint_1' ], |
| 163 | + [ 'max_alpha_constraint' , 'results.max_alpha_constraint' ], |
| 164 | + [ 'min_alpha_constraint' , 'results.min_alpha_constraint' ], |
| 165 | + [ 'takeoff_field_constraint' , 'results.takeoff_field_constraint' ], |
| 166 | + [ 'landing_field_constraint' , 'results.landing_field_constraint' ], |
| 167 | + [ 'cost_constraint' , 'results.cost_constraint' ], |
| 168 | + [ 'climb_velocity_constraint_1' , 'results.climb_velocity_constraint_1' ], |
| 169 | + [ 'climb_velocity_constraint_2' , 'results.climb_velocity_constraint_2' ], |
| 170 | + [ 'iteration_constraint' , 'iteration_constraint'], |
| 171 | + |
| 172 | + ] |
| 173 | + |
| 174 | + # ------------------------------------------------------------------- |
| 175 | + # Vehicles |
| 176 | + # ------------------------------------------------------------------- |
| 177 | + nexus.vehicle_configurations = Vehicle.setup() |
| 178 | + |
| 179 | + |
| 180 | + # ------------------------------------------------------------------- |
| 181 | + # Analyses |
| 182 | + # ------------------------------------------------------------------- |
| 183 | + nexus.analyses = Analyses.setup(nexus.vehicle_configurations) |
| 184 | + |
| 185 | + |
| 186 | + # ------------------------------------------------------------------- |
| 187 | + # Missions |
| 188 | + # ------------------------------------------------------------------- |
| 189 | + nexus.missions = Mission.setup(nexus.analyses) |
| 190 | + |
| 191 | + |
| 192 | + # ------------------------------------------------------------------- |
| 193 | + # Procedure |
| 194 | + # ------------------------------------------------------------------- |
| 195 | + nexus.procedure = Procedure.setup() |
| 196 | + nexus.total_number_of_iterations = 0 |
| 197 | + |
| 198 | + return nexus |
| 199 | + |
| 200 | + |
| 201 | +if __name__ == '__main__': |
| 202 | + main() |
| 203 | + |
| 204 | + |
0 commit comments