Skip to content

Commit b7f35e2

Browse files
committed
added Optimize.py and Plot_Mission.py
1 parent 78f8229 commit b7f35e2

File tree

5 files changed

+448
-256
lines changed

5 files changed

+448
-256
lines changed

Lithium_Air_Sizing/Mission.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Missions.py
22
#
3-
# Created: May 2015, T. Lukaczyk
3+
# Created: Jan 2017, M. Vegh
44
# Modified:
55

66

@@ -84,7 +84,7 @@ def base(analyses):
8484
segment.analyses.extend( analyses.cruise )
8585

8686
segment.altitude_end = 2.0 * Units.km
87-
segment.air_speed = 80.* Units['m/s']
87+
segment.air_speed = 100.* Units['m/s']
8888
segment.climb_rate = 6.0 * Units['m/s']
8989
segment.state.numerics.tolerance_solution = sol_tol
9090
# add to mission

Lithium_Air_Sizing/Optimize.py

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
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

Comments
 (0)