diff --git a/_posts/2015-06-14-Boeing_737-800.md b/_posts/2015-06-14-Boeing_737-800.md
index a05b3931..00b492a9 100644
--- a/_posts/2015-06-14-Boeing_737-800.md
+++ b/_posts/2015-06-14-Boeing_737-800.md
@@ -3,6 +3,7 @@ layout: post
title: Boeing 737-800
date: 2016-02-14 13:25:00
categories: blog
+description: Setup and analyze a conventional aircraft configuration
permalink: /guides/boeing_737-800.html
---
@@ -15,7 +16,7 @@ permalink: /guides/boeing_737-800.html
The tutorial shows how the user can set up a conventional aircraft configuration and a mission the aircraft is to fly and then simulate the aircraft's performance over the defined mission. The code is divided into a number of functions that are called from the main function. The descriptions in the functions clearly explain the function's inputs and outputs and the actions performed on the functions.
-###Steps to simulate the aircraft's performance over a mission :
+### Steps to simulate the aircraft's performance over a mission :
1) Locate the tutorial script folder, /Tutorials, from your project folder as described in the Download guide. If using the command line, cd to this directory.
2) Open the tut_mission_B737.py script in your favorite editor or IDE.
@@ -26,14 +27,14 @@ The tutorial shows how the user can set up a conventional aircraft configuration
3) A few plots depicting the variation of the different aircraft performance parameters (Cl,Cd,etc) over the course of the mission are shown.
-###Important Functions :
+### Important Functions :
The script is divided into a set of functions that setup different aspects of the modeling process. The important functions are:
#### vehicle_setup()
function is where the aircraft's geometry is specified.
-#####Setting up a wing
+##### Setting up a wing
The code below shows how the main wing of the aircraft is set up. The basic geometric inputs that define the wing are specified. Then the wing is then appended to the vehicle, which is an instance of the aircraft class.
In SUAVE units are identified through the use of a units package called Pint. Notice, that for the wing sweep that the units are specified in degrees through *Units.deg. To get results into a desired unit use /Units.deg.
@@ -41,76 +42,83 @@ In SUAVE units are identified through the use of a units package called Pint. No
The wing sweep is defined as the sweep of the quarter chord. Additionally, a symmetric wing means that it is symmetric about the root, i.e. there is right and left side.
-
wing = SUAVE.Components.Wings.Main_Wing()
-wing.tag = 'main_wing'
+
+ wing = SUAVE.Components.Wings.Main_Wing()
+ wing.tag = 'main_wing'
-wing.aspect_ratio = 10.18
-wing.sweep = 25 * Units.deg
-wing.thickness_to_chord = 0.1
-wing.taper = 0.16
-wing.span_efficiency = 0.9
+ wing.aspect_ratio = 10.18 # Not set
+ wing.thickness_to_chord = 0.1 # Not set
+ wing.taper = 0.1
+ wing.span_efficiency = 0.9
-wing.spans.projected = 35.66
+ wing.spans.projected = 34.32
-wing.chords.root = 6.81
-wing.chords.tip = 1.09
-wing.chords.mean_aerodynamic = 4.235
+ wing.chords.root = 7.760 * Units.meter
+ wing.chords.tip = 0.782 * Units.meter
+ wing.chords.mean_aerodynamic = 4.235 * Units.meter
-wing.areas.reference = 124.862
+ wing.areas.reference = 124.862 # Not set
+ wing.sweeps.quarter_chord = 25. * Units.degrees
-wing.twists.root = 4.0 * Units.degrees
-wing.twists.tip = -4.0 * Units.degrees
+ wing.twists.root = 4.0 * Units.degrees
+ wing.twists.tip = 0.0 * Units.degrees
+ wing.dihedral = 2.5 * Units.degrees
-wing.origin = [20,0,0]
-wing.aerodynamic_center = [3,0,0]
+ wing.origin = [13.61,0,-1.27]
+ wing.aerodynamic_center = [0,0,0]
-wing.vertical = False
-wing.symmetric = True
-wing.high_lift = True
+ wing.vertical = False
+ wing.symmetric = True
+ wing.high_lift = True
-wing.dynamic_pressure_ratio = 1.0
+ wing.dynamic_pressure_ratio = 1.0
+
+ # add to vehicle
+ vehicle.append_component(wing)
-vehicle.append_component(wing)
-#####Setting up the fuselage
+##### Setting up the fuselage
Similar to the wing above, the code below illustrates how a fuselage can be added to the vehicle. Again the user is required to specify the basic fuselage geometric parameters and then add the fuselage object to the vehicle.
-fuselage = SUAVE.Components.Fuselages.Fuselage()
-fuselage.tag = 'fuselage'
+
+ fuselage = SUAVE.Components.Fuselages.Fuselage()
+ fuselage.tag = 'fuselage'
+
+ fuselage.seats_abreast = 6
+ fuselage.seat_pitch = 1
-fuselage.seats_abreast = 6
-fuselage.seat_pitch = 1
+ fuselage.fineness.nose = 1.57
+ fuselage.fineness.tail = 3.2
-fuselage.fineness.nose = 1.6
-fuselage.fineness.tail = 2.
+ fuselage.lengths.nose = 8.0
+ fuselage.lengths.tail = 12.
+ fuselage.lengths.cabin = 28.85
+ fuselage.lengths.total = 38.02
+ fuselage.lengths.fore_space = 6.
+ fuselage.lengths.aft_space = 5.
-fuselage.lengths.nose = 6.4
-fuselage.lengths.tail = 8.0
-fuselage.lengths.cabin = 28.85
-fuselage.lengths.total = 38.02
-fuselage.lengths.fore_space = 6.
-fuselage.lengths.aft_space = 5.
+ fuselage.width = 3.76
-fuselage.width = 3.74
+ fuselage.heights.maximum = 3.76
+ fuselage.heights.at_quarter_length = 3.76
+ fuselage.heights.at_three_quarters_length = 3.65
+ fuselage.heights.at_wing_root_quarter_chord = 3.76
-fuselage.heights.maximum = 3.74
-fuselage.heights.at_quarter_length = 4.
-fuselage.heights.at_three_quarters_length = 4.
-fuselage.heights.at_wing_root_quarter_chord = 4.
+ fuselage.areas.side_projected = 142.1948
+ fuselage.areas.wetted = 446.718
+ fuselage.areas.front_projected = 12.57
-fuselage.areas.side_projected = 3.74* 38.02
-fuselage.areas.wetted = 446.718
-fuselage.areas.front_projected = 12.57
+ fuselage.effective_diameter = 3.76
-fuselage.effective_diameter = 3.74
+ fuselage.differential_pressure = 5.0e4 * Units.pascal # Maximum differential pressure
-fuselage.differential_pressure = 5.0e4 * Units.pascal # Maximum differential pressure
-vehicle.append_component(fuselage)
+ # add to vehicle
+ vehicle.append_component(fuselage)
-#####Setting up the propulsion system
+##### Setting up the propulsion system
The aircraft uses a turbofan engine. This engine can be constructed piece by piece using the energy network framework. We instantiate the network as shown below.
@@ -118,21 +126,23 @@ The aircraft uses a turbofan engine. This engine can be constructed piece by pie
# Turbofan Network
# ------------------------------------------------------------------
-#instantiate the gas turbine network
-turbofan = SUAVE.Components.Energy.Networks.Turbofan()
-turbofan.tag = 'turbo_fan'
+ #instantiate the gas turbine network
+ turbofan = SUAVE.Components.Energy.Networks.Turbofan()
+ turbofan.tag = 'turbofan'
+
+ # setup
+ turbofan.number_of_engines = 2.0
+ turbofan.bypass_ratio = 5.4
+ turbofan.engine_length = 4.1
+ turbofan.nacelle_diameter = 0.85
+ turbofan.origin = [[13.72, 4.86,-1.9],[13.72, -4.86,-1.9]]
-# setup
-turbofan.number_of_engines = 2.0
-turbofan.bypass_ratio = 5.4
-turbofan.engine_length = 2.71
-turbofan.nacelle_diameter = 2.05
+ # working fluid
+ turbofan.working_fluid = SUAVE.Attributes.Gases.Air()
-# working fluid
-turbofan.working_fluid = SUAVE.Attributes.Gases.Air()
-Next the components of the turbofan are initialized and added to the engine as shown in the energy networks section. The turbofan is composed of an inlet diffuser(nozzle), low and high pressure compressors, a combustor, a fan, a low and high pressure turbine and exit nozzles for the core and the fan.
+Next the components of the turbofan are initialized and added to the engine as shown in the energy networks section. The turbofan is composed of an inlet diffuser (nozzle), low and high pressure compressors, a combustor, a fan, a low and high pressure turbine and exit nozzles for the core and the fan.
Finally the network is added to the aircraft as shown below.
@@ -149,15 +159,15 @@ print "engine length : ",turbofan.engine_length
vehicle.append_component(turbofan)
-####Data Structure Visualization
+#### Data Structure Visualization
The data structure associated with the Boeing 737-800 can be visualized [here](/guides/data_structures/B737.html).
[](/guides/data_structures/B737.html)
This visualization shows the hierarchy of data in a SUAVE vehicle. Some of the values are defaulted, for example costs. This is because we are not performing cost analysis on the Boeing 737-800. Additionally, this snapshot of the data structure was taken prior to analysis. Therefore weights have not been calculated and are not part of the data. During the mission analysis component weights will be determined and weights will be populated.
-####configs_setup() :
-The aircraft geometry created is converted into configurations that can be used to make simple modifications to the geometric paramaters while not modifying the aircraft geometry completely. An example of the use of this feature is when high-lift devices need to be deployed during landing and takeoff. Thus a landing and takeoff configuration can be added as shown below and then during say the flaps and slats settings can be set differently for each of the configurtaions.
+#### configs_setup()
+The aircraft geometry created is converted into configurations that can be used to make simple modifications to the geometric parameters while not modifying the aircraft geometry completely. An example of the use of this feature is when high-lift devices need to be deployed during landing and takeoff. Thus a landing and takeoff configuration can be added as shown below and then during say the flaps and slats settings can be set differently for each of the configurations.
# ------------------------------------------------------------------
# Cruise Configuration
@@ -185,7 +195,7 @@ configs.append(config)
-####mission_setup()
+#### mission_setup()
To modify the baseline mission that the aircraft flies, go to the mission_setup() function and add or delete segments of the mission
segment = Segments.Cruise.Constant_Speed_Constant_Altitude(base_segment)
@@ -199,44 +209,44 @@ mission.append_segment(segment)
-####base_analysis()
+#### base_analysis()
Also to leverage SUAVE's multifidelity capability and use a different fidelity analysis for any of the disciplines (aerodynamics,propulsion, stability, etc), the base_analysis function can be modified by switching out an analysis module for a different one.
-###Other Functions :
+### Other Functions :
-####main()
+#### main()
The main function is the driver function for the mission simulation. It calls the various routines in the appropriate order in order to set up the geometry and the mission, evaluate the performance of the aircraft over the mission and return the results.
-####full_setup()
+#### full_setup()
This function (called from the main() function) sets up the aircraft geometry, configs and the missions the aircraft is to be analysed for by calling the vehicle_setup, configs_setup, analyses_setup, mission_setup and missions_setup functions.
-####simple_sizing()
+#### simple_sizing()
The simple sizing function sizes the aircraft's geometric components based on the geometric inputs specified by the user in the vehicle_setup() function.
-####base_analysis()
+#### base_analysis()
The method takes in the vehicle and assigns different analysis methods (for aero, propulsion, weights, stability) to the analyses object.
-####analyses_setup()
+#### analyses_setup()
This functions takes in the base analysis and sets up different analysis methods for different configurations.
-####missions_setup()
+#### missions_setup()
This method allows the user to set up a variety of missions that need to be evaluated for an aircraft.
-####plot_mission()
+#### plot_mission()
This is a post processing function that takes in the results data structure and generates the necessary plots.
-###RESULTS
+### RESULTS
The plots shown below should be generated if the mission analysis executes correctly. The results show the aerodynamic, propulsion and mission properties of the B737-800 for the defined mission.
@@ -249,13 +259,14 @@ The plots shown below should be generated if the mission analysis executes corre

-###Modifying the Aircraft's Geometry or Mission :
+### Modifying the Aircraft's Geometry or Mission :
Suppose we want to simulate a high span variant of the B737-800. The span is increased to 40.0 m. We assume the wing chords, sweep, taper ratio, thickness to chord ratio remain the same. Thus changing the span only changes the aspect ratio and the wing area.
Now we try to fly the aircraft at a lower cruise speed of 200m/s at a cruise altitude of 25000 ft
1) To update the geometry, scroll to the vehicle_setup() function
+
2) Modify the parameters of the main wing
wing.aspect_ratio = 10.12
@@ -269,6 +280,7 @@ You may also need to update the reference area for the aircraft.
3) Update the mission parameters by moving to the mission_setup() function
+
4) First update the end altitude of the final climb segment. Although the original script has the altitude stated in m, courtesy of the Units package it is easy to modify the altitude to 25,000ft without worrying about the units conversion as shown below.
diff --git a/_posts/2015-06-15-Lithium_Air_Regional_Jet_Optimization.md b/_posts/2015-06-15-Lithium_Air_Regional_Jet_Optimization.md
new file mode 100644
index 00000000..95b84c16
--- /dev/null
+++ b/_posts/2015-06-15-Lithium_Air_Regional_Jet_Optimization.md
@@ -0,0 +1,71 @@
+--
+layout: post
+title: Lithium Air Regional Jet Optimization
+date: 2015-06-15 14:25:00
+categories: blog
+description: Learn the sizing and regression framework in an optimization problemx
+
+
+
+permalink: /guides/lithium_air_regional_jet_optimization.html
+---
+
+
+
+
+## Introduction
+The purpose of this tutorial is to introduce the user to the sizing/optimization process, which uses machine learning regression techniques to accelerate convergence.
+
+The user, is he/she so chooses, could directly run Optimize.py (located in Tutorials/Lithium_Air_Jet_Sizing). However this would be a relatively slow process (~5,200 SUAVE mission evaluations), due to the fact that each step in the optimizer would have to use the same initial guess for y to converge on mass, energy, and power. Here we're going to be smarter, and tabulate the converged solutions, using them to inform the initial guesses. Go to Sizing.py, in the "setup" function, and uncomment "procedure.write_optimization."
+
+
+def setup():
+
+ # ------------------------------------------------------------------
+ # Analysis Procedure
+ # ------------------------------------------------------------------
+
+ # size the base config
+ procedure = Process()
+ procedure.run_sizing_loop = run_sizing_loop #size aircraft and run mission
+ procedure.evaluate_field_length = evaluate_field_length
+ procedure.evaluate_constraints = evaluate_constraints
+ #procedure.write_optimization = write_optimization #only use when writing an optimization problem
+ return procedure
+
+
+
+
+What this does is makes it so, at each converged step, SUAVE tabulates the optimization variables, constraints, as well as objective, which allows the user use to view how the optimization proceeds, as well as whether it can satisfy the constraints.
+
+Additionally,SUAVE automatically creates a file called "sizing_outputs.txt" which outputs the converged sizing results vs. the optimization variables, allowing it to be read in and used to choose a more informed initial guess.. This saves a large amount of computational time, especially for gradient-based optimization. To use this, go to the "run_sizing_loop" function, to the section where you choose your sizing options, and change "sizing_loop.initial_step" from "Default" to "Table"
+
+
+
+ sizing_loop.tolerance = 1E-4 #percentage difference in mass and energy between iterations
+ sizing_loop.initial_step = 'Default' #Default, Table, SVR
+ sizing_loop.update_method = 'successive_substitution' #'successive_substitution','newton-raphson', 'broyden'
+ sizing_loop.default_y = y
+ sizing_loop.min_y = min_y
+ sizing_loop.max_y = max_y
+ sizing_loop.default_scaling = scaling
+ sizing_loop.sizing_evaluation = sizing_evaluation
+
+
+
+At this point, it is worth looking into changes to the optimizer options to ensure consistency. Because the solution is converged to 1E-4, the user needs to ensure that the finite differencing step is taken reduced to account for this. Go to Optimize.py, and look at the line where the Optimizer is called
+
+
+ def main():
+
+ problem = setup()
+
+ output = scipy_setup.SciPy_Solve(problem, sense_step = 1E-2, solver = 'SLSQP')
+ print output
+
+ Plot_Mission.plot_mission(problem)
+
+ return
+
+
+Note that, the "sense_step," that is, the finite differencing step is set to 1E-2 (it is recommended to set the finite differencing step to the square root of the solution tolerance). Now try running the problem (type "python Optimize.py" while in the Lithium_Air_Sizing), and observe the weight reduction as well as the number of iterations it takes to converge; in this case, it takes ~1,000 SUAVE sizing/mission evaluations to converge, decreasing computational cost by a factor of 5. Feel free to play with the optimization options, as well as sizing options to observe there impact on the solution path.
diff --git a/_posts/2015-06-15-Lithium_Air_Regional_Jet_Sizing.md b/_posts/2015-06-15-Lithium_Air_Regional_Jet_Sizing.md
index f0ba4588..58447e35 100644
--- a/_posts/2015-06-15-Lithium_Air_Regional_Jet_Sizing.md
+++ b/_posts/2015-06-15-Lithium_Air_Regional_Jet_Sizing.md
@@ -3,41 +3,38 @@ layout: post
title: Lithium Air Regional Jet Sizing
date: 2015-06-15 14:25:00
categories: blog
+description: Incorporate more novel propulsion configurations, introduce sizing methodology
-permalink: /guides/lithium_air_regional_jet_analysis.html
+
+
+permalink: /guides/lithium_air_regional_jet_sizing.html
---
-##Introduction
-The purpose of this tutorial is to highlight some of SUAVE's more exotic propulsion system capabilities. This tutorial assumes that the user has completed the Boeing 737-800 tutorial, and has some familiarity with SUAVE's propulsion system data structures.
+## Introduction
+The purpose of this tutorial is to highlight some of SUAVE's more exotic propulsion system capabilities, as well as the sizing methodology recently introduced
-##Baseline Case
- Open the file called "tut_lithium_air_jet_sizing.py" in
-a text editor or IDE.
+## Baseline Case
+ Open the file called "Lithium_Air_Sizing/Sizing.py" in a text editor or IDE. Type "python Sizing.py" to run the file.
- Run the program (cd to the folder, then type python tut_lithium_air_jet_sizing.py).
- Look over the plots, to gain a feel for the various idiosyncrasies of the design. Note the significant rise in aircraft mass, as a result of the lithium-air batteries.
+ Look over the plots, to gain a feel for the various idiosyncrasies of the design. Note the significant rise in aircraft mass, as a result of the lithium-air batteries, which accumulates oxygen as it discharges.

-##Different Propulsion System Assumptions
-Go to the following line (search battery.specific_energy), and change the battery specific energy from 2000 W-h/kg to 1500 W-h/kg
battery = configs.base.energy_network['battery']
battery.specific_energy=2000*Units.Wh/Units.kg
battery.specific_power =.67*Units.kW/Units.kg
-run the script (python tut_lithium_air_jet.py).
-
-
-Now try changing the motor efficiency from .95 to .9 and running the script (line 513).
+## Sizing Procedure
+Now try changing the motor efficiency from .95 to .9 and running the script by going to Vehicle.py
net.nacelle_diameter = ducted_fan.nacelle_diameter
@@ -48,23 +45,173 @@ Now try changing the motor efficiency from .95 to .9 and running the script (lin
Note the sensitivity of vehicle energy and mass requirements to these various propulsion system assumptions.
-Now try changing the cruise range of the aircraft (line 868, segment.distance).
+Now try changing the cruise range of the aircraft. Go to Mission.py, find the cruise segment, and change segment.distance
segment = Segments.Cruise.Constant_Speed_Constant_Altitude()
segment.tag = "cruise"
-
- # connect vehicle configuration
+
segment.analyses.extend( analyses.cruise )
+
+ segment.air_speed = 230 * Units['m/s']
+ segment.distance = 2000 * Units.nautical_miles
+
+
+
+Try changing other parameters (e.g. specific power, cruise altitude), and observe their effects on the overall design.
+
+Now look into how a an aircraft sizing problem is set up within SUAVE. A diagram of the process with a summary can be seen below, for reference
+
+
+
+
+Go to the function "run_sizing_loop" within Sizing.py. The default initial guesses for your sizing parameters can be seen in the lines below
+
+
+ #initial guesses
+ m_guess = 60000.
+ Ereq_guess = 100000000000.
+ Preq_guess= 200000.
+
+
+ scaling = np.array([1E4,1E11,1E7])
+ y = np.array([m_guess, Ereq_guess, Preq_guess])/scaling
+ min_y = [.05, 1E-5,10.]
+ max_y = [10., 10., 10.]
+
+
+
- # segment attributes
- segment.atmosphere = atmosphere
- segment.planet = planet
+For a given aircraft, a numpy array we call "y" is used to define its set of sizing parameters. In this case, because it is a battery-powered aircraft, we iterate on aircraft total mass, battery energy, as well as battery power. Scaling is used to make the parameter guesses of order 1, as it makes some of the sizing methods more stable and robust. The default initial guess is then assigned to the sizing loop object, as seen below
- segment.air_speed = 230.
- segment.distance = 1947. * Units.nmi
+
+ sizing_loop.tolerance = 1E-4 #percentage difference in mass and energy between iterations
+ sizing_loop.initial_step = 'Default' #Default, Table, SVR
+ sizing_loop.update_method = 'successive_substitution' #'successive_substitution','newton-raphson', 'broyden'
+ sizing_loop.default_y = y
+ sizing_loop.min_y = min_y
+ sizing_loop.max_y = max_y
+ sizing_loop.default_scaling = scaling
+ sizing_loop.sizing_evaluation = sizing_evaluation
+
-Try changing other parameters (e.g. specific power, cruise altitude), and observe their effects on the overall design.
\ No newline at end of file
+
+
+In this case, only successive substitution is used to solve the problem, although that can be changed to newton-raphson or Broyden's method if the user chooses. Let's look at how the sizing loop works; it queries a function called "sizing_evaluation." Go to that script to see how it's set up.
+
+
+
+def sizing_evaluation(y,nexus, scaling):
+
+ #unpack inputs
+ m_guess = y[0]*scaling[0]
+ Ereq_guess = y[1]*scaling[1]
+ Preq_guess = y[2]*scaling[2]
+
-
+
+How it works is it takes the initial guesses, unpacks them, then assigns them to the aircraft, as seen below
+
+
+
+ #assign guesses to aircraft
+ configs.base.m_guess = m_guess
+ configs.base.Ereq = Ereq_guess
+ configs.base.Preq = Preq_guess
+
+
+
+
+This function acts as an interface to allow communication between the Sizing_Loop object, which contains a number of methods to aid in evaluating the aircraft, with the specific aircraft observed here. It then calls the simple_sizing function, and evaluates the mission, as seen below.
+
+
+ #run size aircraft geometry/mass based on guess
+ simple_sizing(nexus)
+ analyses.finalize()
+ results = evaluate_mission(configs,mission)
+
+
+
+Now let's look at how they communicate. Go to the simple_sizing script within Sizing.py, and observe that it unpacks your mass, energy, and power scripts
+
+
+ #unpack guesses
+ m_guess = base.m_guess
+ Ereq = base.Ereq
+ Preq = base.Preq
+
+
+then assigns them to the aircraft
+
+
+ base.mass_properties.max_takeoff = m_guess
+ base.mass_properties.max_zero_fuel = m_guess #just used for weight calculation
+ design_thrust = base.thrust_loading*m_guess*9.81
+ Sref = m_guess/base.wing_loading
+
+ #assign area
+ base.reference_area = Sref
+ base.wings['main_wing'].areas.reference = base.reference_area
+
+
+
+
+It also uses the guess for battery and power to determine battery characteristics, as well as determine the takeoff weight.
+
+
+ # battery calcs
+ SUAVE.Methods.Power.Battery.Sizing.initialize_from_energy_and_power(battery,Ereq,Preq, max='soft')
+ battery.current_energy = [battery.max_energy] #initialize list of current energy
+ m_air =SUAVE.Methods.Power.Battery.Variable_Mass.find_total_mass_gain(battery)
+
+
+
+
+Remember that this is a lithium-air aircraft, so the difference in takeoff and landing weight is the oxygen accumulated during flight.
+
+
+
+
+ #evaluate total mass breakdown
+ breakdown = analyses.base.weights.evaluate()
+ breakdown.battery = battery.mass_properties.mass
+ breakdown.air = m_air
+ base.mass_properties.breakdown = breakdown
+ base.mass_properties.operating_empty = breakdown.empty
+
+ #m_full = GTOW, m_end = GLW
+ m_full = breakdown.empty+battery.mass_properties.mass+breakdown.payload
+ m_end = m_full+m_air
+ base.mass_properties.takeoff = m_full
+
+
+
+
+Now go back to the sizing_evaluation in Sizing.py to observe how this framework handles outputs.
+
+
+
+ # battery calcs
+
+ mass_out = results.segments[-1].conditions.weights.total_mass[-1,0] #actual landing weight
+ Ereq_out = results.e_total
+ Preq_out = results.Pmax
+
+ #errors
+ dm = (mass_out-m_guess)/m_guess
+ dE_total = (Ereq_out-Ereq_guess)/Ereq_guess
+ dPower = (Preq_out-Preq_guess)/Preq_guess
+
+ #pack up results
+ nexus.results = results
+
+ # return it to sizing loop (within SUAVE/Sizing/Sizing_Loop.py
+ f = np.array([dm, dE_total, dPower])
+ y_out = np.array([mass_out, Ereq_out, Preq_out ])/scaling
+
+
+
+
+It calculates the norm of the errors, then assigns them to an array f, and returns the expected y parameters to the Sizing_Loop object.
\ No newline at end of file
diff --git a/_posts/2016-06-15-Turbofan_Network.md b/_posts/2015-06-15-Turbofan_Network.md
similarity index 96%
rename from _posts/2016-06-15-Turbofan_Network.md
rename to _posts/2015-06-15-Turbofan_Network.md
index 773ddc74..8ca19bec 100644
--- a/_posts/2016-06-15-Turbofan_Network.md
+++ b/_posts/2015-06-15-Turbofan_Network.md
@@ -3,6 +3,7 @@ layout: post
title: Turbofan Network
date: 2015-06-15 14:20:03
categories: blog
+description: Get familiar with SUAVE’s energy and propulsion network
permalink: /guides/turbofan_network.html
---
@@ -16,7 +17,7 @@ permalink: /guides/turbofan_network.html
The tutorial describes how the energy network in SUAVE can be used to build a model of a turbofan engine. Once this is clear to the user, then the understanding the setup of the other gasturbine models, the ducted fan and the turbojet should not be very difficult. The turbofan model is built using the different turbofan components as its building blocks and then linking the inputs and outputs of the different components. The script to follow is the tut_mission_B737.py script that was used in the [Boeing 737-800 Analysis Tutorial](/guides/boeing_737-800.html)
-###Setting up the Turbofan model
+### Setting up the Turbofan model
First the turbofan energy energy network is instantiated. The parameters associated with the network as a whole are assigned.
@@ -41,14 +42,14 @@ turbofan.working_fluid = SUAVE.Attributes.Gases.Air()
Then the different components are added
-###Components :
+### Components :
The basic components used to model the turbofan are described below.
-####Ram
+#### Ram
-The 'Ram' component is used to convert the freestream quantities that are passed into the Turbofan network into stagnation quantities. As the turbofan network as based on a 1D gasdynamic analysis, most of the energy transfer across the different components are modelled as changes in the stagnation quantities. Thus the Ram component acts as a preprocessor converting the input 'Conditions' into quantities required by the network.
+The 'Ram' component is used to convert the freestream quantities that are passed into the Turbofan network into stagnation quantities. As the turbofan network is based on a 1D gasdynamic analysis, most of the energy transfer across the different components are modelled as changes in the stagnation quantities. Thus the Ram component acts as a preprocessor converting the input 'Conditions' into quantities required by the network.
# ------------------------------------------------------------------
# Component 1 - Ram
@@ -63,7 +64,7 @@ ram.tag = 'ram'
turbofan.append(ram)
-####Nozzle
+#### Nozzle
The 'Nozzle' component is used to model the inlet diffuser and the outlet fan and compressor nozzles as shown below.
@@ -111,7 +112,7 @@ nozzle.pressure_ratio = 0.99
turbofan.append(nozzle)
-####Compressor
+#### Compressor
Two compressors are used in the turbofan model, a low and a high pressure compressor.
@@ -144,7 +145,7 @@ compressor.pressure_ratio = 13.415
turbofan.append(compressor)
-####Fan
+#### Fan
A fan component is also added to the network. To model turbojets, the fan component and the fan nozzle are not added but all the other components remain the same.
@@ -164,7 +165,7 @@ turbofan.append(fan)
-####Combustor
+#### Combustor
The combustor component is where the the fuel to air ratio is computed and this is used to compute the sfc and the thrust later in the network.
@@ -186,7 +187,7 @@ combustor.fuel_data = SUAVE.Attributes.Propellants.Jet_A()
turbofan.append(combustor)
-####Turbine
+#### Turbine
The work done by the fan and the compressors is used to compute the turbine work required. This is used to compute the change in the stagnation quantities across the turbine.
@@ -221,7 +222,7 @@ turbofan.append(turbine)
-####Thrust
+#### Thrust
The thrust component takes in the initial (inputs of the inlet nozzle) and final (exit of the fan and core exirt nozzles) stagnation quantities of the network and the fuel to air ratio and computes the specific fuel conspumption (sfc) and thrust generated by the network (turbofan engine).
diff --git a/_posts/2015-06-17-Payload_Range_Diagram.md b/_posts/2015-06-17-Payload_Range_Diagram.md
index 26832e21..327f1f14 100644
--- a/_posts/2015-06-17-Payload_Range_Diagram.md
+++ b/_posts/2015-06-17-Payload_Range_Diagram.md
@@ -3,44 +3,47 @@ layout: post
title: Payload Range Diagram
date: 2015-06-17 23:22:21
categories: blog
+description: Learn how to use SUAVE for creating a payload-range diagram
permalink: /guides/payload_range_diagram.html
---
### Embraer E-190 Payload Range Diagram Tutorial
-1) Locate the tutorial script folder, SUAVE/scripts/tutorial. If necessary cd to this directory.
+1) Locate the tutorial script folder. If necessary cd to this directory.
2) Open the test_payload_range.py script in your favorite editor or IDE.
-3) For the Payload Range Diagram, besides the vehicle and mission, the user must provide the following inputs:
+3) Similar to the B737-800 Tutorial, the setup is divided into steps, but in this case the setup is imported from other script (test_mission_Embraer_E190_constThr).
+
+4) For the Payload Range Diagram, besides the vehicle and mission, the user must provide the following inputs:
* **cruise_segment_tag**: You must inform the tag of the segment that will have the length modified in order to comply with required fuel burn for each one of the payload range diagram points.
* **reserves**: This will be considered as a fixed fuel reserve for all the diagram points.
-4) The tutorial presents the following definition (line 50):
+5) The tutorial presents the following definition (line 36):
+
~~~
# run payload diagram
-config = configs.base
cruise_segment_tag = "Cruise"
reserves = 1750.
payload_range_results = payload_range(vehicle,mission,cruise_segment_tag,reserves)
~~~
-5) First, let's just run it as it is for now. Run the script in either the IDE or in a terminal:
+
+6) First, let's just run it as it is for now. Run the script in either the IDE or in a terminal:
+
~~~
-$python test_payload_range.py
+$python tut_payload_range.py
~~~
-6) After all the calculation the payload diagram will be ploted, and the data will be stored in a file named 'PayloadRangeDiagram.dat', in the folder where you run the script.
+7) After all the calculation the payload diagram will be ploted, and the data will be stored in a file named 'PayloadRangeDiagram.dat', in the folder where you run the script.
-![Reference Payload Range Diagram] (/images/PayloadRange_ref.png)
+8) You can try to modify vehicle and/or mission parameters, e see how the payload range diagram is affected. For now, let's add some drag counts to the airplane:
-7) You can try to modify vehicle and/or mission parameters, e see how the payload range diagram is affected. For now, let's add some drag counts to the airplane:
-* Locate ``` base_analysis() ``` and then the Aerodynamics Analysis text block (line 129)
+* Locate and open the script test_mission_Embraer_E190_constThr.py, in the tutorial folder (this is the script that contains the vehicle and mission setups)
+* Locate ``` base_analysis() ``` and then the Aerodynamics Analysis text block (line 144)
* Add 50 drag counts to the vehicle (line 132):
`aerodynamics.settings.drag_coefficient_increment = 0.0050 `
* Rerun the script as before and notice the changes in the results.
-![Modified Payload Range Diagram] (/images/PayloadRange_+50dc.png)
-
-8) Similarly the mission parameters can be changed. Again, let's the user decide what changes they want to explore.
+9) Similarly the mission parameters can be changed. Again, let's the user decide what changes they want to explore.
diff --git a/_posts/2015-06-18-Solar_UAV.md b/_posts/2015-06-18-Solar_UAV.md
index c860548a..8a8fed22 100644
--- a/_posts/2015-06-18-Solar_UAV.md
+++ b/_posts/2015-06-18-Solar_UAV.md
@@ -3,6 +3,7 @@ layout: post
title: Solar UAV
date: 2015-06-18 23:22:20
categories: blog
+description: Analyze an unconventional aircraft and energy network
permalink: /guides/solar_uav.html
---
@@ -11,32 +12,32 @@ permalink: /guides/solar_uav.html
-##Introduction
+## Introduction
The purpose of this tutorial is to educate users on how to setup a preconfigured solar energy network to work with a high altitude solar UAV. In this tutorial it is assumed that the user has some familiarity with SUAVE having completed the fundamental tutorial for the Boeing 737-800. You will learn about setting up the following:
* Solar missions,
-* human powered/solar weight estimation,
-* boundary layer transition
-* solar panels,
-* batteries,
-* electric motors,
-* propellers,
-* electric network integration in a solar UAV
+* Human powered/solar weight estimation,
+* Boundary layer transition
+* Solar panels,
+* Batteries,
+* Electric motors,
+* Propellers,
+* Electric network integration in a solar UAV
Because of the flexible nature of SUAVE, the approach shown is just one way to setup the UAV for analysis. By experimenting and eventually developing your own code you will be able to do far more than what is shown in this tutorial. The original script can be found in /scripts/tutorials/tut_solar_uav.py.
-##Vehicle and Mission
+## Vehicle and Mission
The vehicle is similar to the Qinetiq Zephyr but far larger at 40 meters in wing span and weighs in at 200 kg. However, it does carry double the payload of the Zephyr at 5 kg and accounts for constant payload power usage. The battery energy density is set to an optimistic estimate of 450 Watt-hours per kg. Additionally, 90 percent of the wings are covered with solar panels that have a 25 percent efficiency.
This mission exercises the methods developed for solar radiation estimation, propeller and motor integration, as well as the human powered aircraft weight estimation. The mission setup is a constant altitude cruise at 15 km at Mach 0.12 for about 24 hours. The location is over the California Bay Area during the summer solstice.
-##Setup
+## Setup
This tutorial highlights the differences between setting up a typical aircraft like a Boeing 737 and a solar UAV.
-###Mission Setup
+### Mission Setup
For a solar UAV, the starting location as well as the day and time are critical. So the first segment must be modified to include this information. It is important to note that the start times provided are in "Zulu" time or Greenwich Mean Time. This is typical for aircraft navigation to prevent time zone errors and ambiguity.
@@ -52,7 +53,7 @@ segment.longitude = -122.1700
Additionally, this mission is highly simplified. It consists of only one mission segment. To provide ample resolution the number of control points have been increased to 64.
-###Structural Weight Sizing
+### Structural Weight Sizing
The vehicle sizing of the human powered aircraft or solar UAV requires the dimensions of the vehicle like in other weight estimation methods. However, it also requires information about the number of wing ribs and the number of end ribs. The end ribs are relevant for wing designs where the sections can come apart for transportation.
@@ -60,7 +61,7 @@ The vehicle sizing of the human powered aircraft or solar UAV requires the dimen
wing.number_end_ribs = 2.
-###Wing Boundary Layer Transition
+### Wing Boundary Layer Transition
The transition location of the boundary layer can have a great impact on the drag of the wing. This is especially important in properly designed low Reynolds number flows when laminar flow can be extended for larger percentages of the surface. The code snippet below is how surfaces have transition points set. These are estimates provided from the designer based on experience.
@@ -68,7 +69,7 @@ The transition location of the boundary layer can have a great impact on the dra
wing.transition_x_lower = 1.0
-###Solar Panels
+### Solar Panels
The solar panel model is quite simple and only requires a capture area, an efficiency, and mass. In this case we assume that 90% of the wing area is covered in solar panels.
@@ -78,7 +79,7 @@ panel.mass_properties.mass = panel.area*(0.60 * Units.kg)
-###Batteries
+### Batteries
The batteries are set up with knowledge of the mass of the battery and the specific energy. In this case a futuristic specific energy of 450 Watt-hr/kg is set for lithium ion type batteries. The resistance of the batteries is another important input to determine charging and discharging losses.
@@ -91,7 +92,7 @@ net.battery = bat
-###Propeller
+### Propeller
To setup the propeller we will actually design an optimized propeller. This is done through the methods provided by Adkins and Liebeck. The attributes of the propeller design are then seeded to the motor and network to accelerate convergence of the propeller and motor models.
@@ -112,7 +113,7 @@ prop.prop_attributes = prop_attributes
net.propeller = prop
-###Motor
+### Motor
This motor model relies on data that is generally available from motor manufacturers. This includes the resistance, no load current, and the speed constant. Additionally, any gearbox is specified here and basic information about the propeller is entered here to help inform the solver when converging the motor and propeller analyses.
@@ -130,13 +131,13 @@ net.motor = motor
-##Running
+## Running
As you should be familiar with by now, running this script is just like any other.
python tut_solar_uav.py
-##Results
+## Results
If all went well the script ran and it provided you with more plots than you ever wanted. Here are some of the plots that were generated when we ran it:
diff --git a/_posts/2015-07-15-Concorde.md b/_posts/2015-07-15-Concorde.md
index 703701c8..b500cc3b 100644
--- a/_posts/2015-07-15-Concorde.md
+++ b/_posts/2015-07-15-Concorde.md
@@ -3,6 +3,7 @@ layout: post
title: Concorde
date: 2015-07-15 14:25:00
categories: blog
+description: Go Supersonic !
permalink: /guides/concorde.html
---
@@ -18,7 +19,7 @@ This tutorial gives an overview of changes made to the setup to evaluate a super
### Aerodynamics Module:
-To allow aerodynamic calculations in supersonic flight, we use the zero fidelity supersonic module. This is quite easy to swap with the subsonic zero fidelity model. This model and the zero fidelity subsonic module are in the same directory, so they can be switched by changing a single line in the analysis section (line 125 in the base file)
+To allow aerodynamic calculations in supersonic flight, we use the zero fidelity supersonic module. This is quite easy to swap with the subsonic zero fidelity model. This model and the zero fidelity subsonic module are in the same directory, so they can be switched by changing a single line in the analysis section:
```
aerodynamics = SUAVE.Analyses.Aerodynamics.Fidelity_Zero()
@@ -29,14 +30,14 @@ to
```
aerodynamics = SUAVE.Analyses.Aerodynamics.Supersonic_Zero()
```
-However, the supersonic aerodynamics can still handle the subsonic portions of the flight.
+The supersonic aerodynamics module can still handle the subsonic portions of the flight.
### Wing Additions:
Some of the calculations are changed to account for different properties that are not automatically captured in the model.
* Vortex lift is set to true. This causes the vortex lift module to add a Cl increment to the aircraft.
-* High mach is set to true. This changes the way that high subsonic compressibility drag is calculated and brings it more in line with Concorde behavior.
+* High Mach is set to true. This changes the way that high subsonic compressibility drag is calculated and brings it more in line with Concorde behavior.
```
wing.vortex_lift = True
@@ -50,7 +51,7 @@ Note also that Concorde does not have a horizontal tail, so this is not included
### Turbojet Module:
-Since Concorde has a diverging nozzle that allows for supersonic outflow, a modified turbojet is used that can account for this. This turbojet is again switched out with a single line (line 434).
+Since Concorde has a diverging nozzle that allows for supersonic outflow, a modified turbojet is used that can account for this. This turbojet is again switched out with a single line.
```
nozzle = SUAVE.Components.Energy.Converters.Supersonic_Nozzle()
@@ -64,8 +65,8 @@ nozzle = SUAVE.Components.Energy.Converters.Expansion_Nozzle()
### Mission Segments:
-The mission typically flown by Concorde calls for mission segments that are not utilized in the Boeing 737 case. These are mach number dependent, and require different inputs from the segments previously given.
-The new mission segments are linear mach constant rate (climb and descent). Both require a starting and ending mach number, which will vary linearly in time over the descent. For example check the third climb segment (line 903):
+The mission typically flown by Concorde calls for mission segments that are not utilized in the Boeing 737 case. These are Mach number dependent, and require different inputs from the segments previously given.
+The new mission segments are linear Mach constant rate (climb and descent). Both require a starting and ending Mach number, which will vary linearly in time over the descent. For example check the third climb segment:
segment = Segments.Climb.Linear_Mach_Constant_Rate(base_segment)
@@ -80,4 +81,4 @@ The new mission segments are linear mach constant rate (climb and descent). Both
### Takeoff and Landing Configuration
-Since Concorde does not have flaps or slats, the takeoff and landing configurations are set to 0 for both. In this case, we are essentially flying the cruise configuration. Since the first and final segments and takeoff and landing segments, these configurations are left in the model for clarity, even though they do not change the analysis.
+Since Concorde does not have flaps or slats, specific takeoff and landing configurations are not used.
diff --git a/_posts/2016-02-112-Regional Jet Optimization.md b/_posts/2016-02-11-Regional_Jet_Optimization.md
similarity index 75%
rename from _posts/2016-02-112-Regional Jet Optimization.md
rename to _posts/2016-02-11-Regional_Jet_Optimization.md
index ad5fcf58..5a435966 100644
--- a/_posts/2016-02-112-Regional Jet Optimization.md
+++ b/_posts/2016-02-11-Regional_Jet_Optimization.md
@@ -1,33 +1,39 @@
---
layout: post
title: Regional Jet Optimization
-date: 2015-06-17 23:22:21
+date: 2015-06-14 23:22:25
categories: blog
+description: Learn the optimization framework within SUAVE
permalink: /guides/regional_jet_optimization.html
---
+
+
+
+
### Regional Jet Optimization Tutorial
This tutorial assumes familiarity with SUAVE, and that the user has completed the Boeing 737-800 Analysis Tutorial. It teaches the user the structure of running an optimization problem using SUAVE's framework, as well as how to modify it for their own needs
Some important files for the optimization problem can be seen below
-###Important Files :
-####Optimize.py:
+### Important Files :
+
+#### Optimize.py:
Defines the optimization framework of the problem, wherein one minimizes an assigned objective, subject to certain constraints, by altering some design variables.
- In order to ensure that the subfunctions can communicate with eachother, as well as that SUAVE can communicate with the external optimizer, a special data object called the "nexus" is used. The nexus object contains all of the vehicles, missions, as well as results, altering them at each optimizer iteration, depending on the input parameters defined in Optimize.py.
+ In order to ensure that the subfunctions can communicate with eachother, as well as that SUAVE can communicate with the external optimizer, a special data object called the "Nexus" is used. The nexus object contains all of the vehicles, missions, as well as results, altering them at each optimizer iteration, depending on the input parameters defined in Optimize.py.
In this particular setup, there are two design variables: wing area and cruise altitude. The objective is fuel burn, while there is only one constraint: fuel margin.. The default inputs are defined in the following lines.
- # [ tag , initial, (lb,ub) , scaling , units ]
- problem.inputs = np.array([
- [ 'wing_area' , 95 , ( 90. , 130. ) , 100. , Units.meter**2],
- [ 'cruise_altitude' , 11 , ( 9 , 14. ) , 10. , Units.km],
- ])
+ # [ tag, initial, (lb,ub), scaling, units]
+ problem.inputs = np.array([
+ [ 'wing_area' , 95., ( 90., 130.), 100., Units.meter**2],
+ [ 'cruise_altitude', 11., ( 9., 14.), 10., Units.km ],
+ ])
Each input parameter takes in 5 values; a tag (an identification to communicate between the optimizer and SUAVE), an initial value, set of bounds, a scale factor (many optimizers tend to be more effective when the input values are of order 1), as well as the units used.
@@ -42,7 +48,7 @@ The objective and constraints are defined in the lines below.
# [ tag, sense, edge, scaling, units ]
problem.constraints = np.array([
- [ 'design_range_fuel_margin' , '>', 0., 1E-1, Units.less], #fuel margin defined here as fuel
+ [ 'design_range_fuel_margin' , '>', 0., 1E-1, Units.less],
])
@@ -50,7 +56,7 @@ Note that in this case, only a single constraint is used; Multiple constraints m
- This file also defines the "aliasing," i.e. how the design variables, constraints, and objective "map" to the variables used in Procedure.py (which is runs the problem). The aliases for this problem are defined in the lines below. Note that the first entry refers to the tag defined in either problem.inputs, problem.objective, or problem.constraints.
+This file also defines the "aliasing," i.e. how the design variables, constraints, and objective "map" to the variables used in Procedure.py (which is runs the problem). The aliases for this problem are defined in the lines below. Note that the first entry refers to the tag defined in either problem.inputs, problem.objective, or problem.constraints.
problem.aliases = [
@@ -63,18 +69,14 @@ Note that in this case, only a single constraint is used; Multiple constraints m
- Note that, sometimes, a single input can map to multiple outputs, such as the "wing_area" design variable; in this case, use a list for the outputs, as seen above.
-
+Note that, sometimes, a single input can map to multiple outputs, such as the "wing_area" design variable; in this case, use a list for the outputs, as seen above. The use of a wild card "*", can also allow values to map to multiple outputs. Values to be outputted cannot contain wild cards as that would be ambiguous to an optimizer.
-
-
-
-####Procedure.py:
+#### Procedure.py:
Links everything together, defining the steps you would use to size and analyze the aircraft at each optimizer iteration.
This file contains a number of subfunctions to alter the vehicle and mission. The function setup() instantiates the procedure, defining the functions that are called at each step of the optimizer in their order of execution.
-1. simple_sizing defines the geometry of the aircraft based on the input parameters (in this case, wing area and cruise altitude).
+1. simple_sizing() defines the geometry of the aircraft based on the input parameters (in this case, wing area and cruise altitude).
2. weights() determines the weight breakdown of the aircraft
@@ -85,26 +87,24 @@ This file contains a number of subfunctions to alter the vehicle and mission. Th
Each step of the procedure takes as the nexus object as an input, and returns the object as an output, ensuring that the data is available for handling.
-####Vehicles.py:
+#### Vehicles.py:
Initializes whatever vehicles are used in the optimization problem. This includes two subfunctions: base_setup(), where the vehicle structure is itself defined, including the fuselage, wing, vertical and horizontal tail, as well as the propulsion system.
- configs_setup() takes in the vehicle that was defined in base_setup() and defines other configurations (such as takeoff and landing, which include different flap settings). This may be used to define other parameters, such as changing the sweep angle of a variable-sweep-wing at higher Mach Numbers, or the use of afterburners.
+configs_setup() takes in the vehicle that was defined in base_setup() and defines other configurations (such as takeoff and landing, which include different flap settings). This may be used to define other parameters, such as changing the sweep angle of a variable-sweep-wing at higher Mach Numbers, or the use of afterburners.
-####Missions.py:
+#### Missions.py:
Initializes the missions that are run at each iteration. In this case, only a single mission is run.
-####Analyses.py:
+#### Analyses.py:
Defines the set of features that are used in this particular problem (e.g. weights correlations, aerodynamics correlations, etc.).
-
-
-####Plot_Mission.py:
+#### Plot_Mission.py:
Plots the mission outputs using matplotlib.
-###Running the Problem:
+### Running the Problem:
1. Locate the tutorial script folder "regional_jet_optimization." If necessary cd to this directory.
-2. Open the Optimize.py script in a text editor or IDE
+2. Open the Optimize.py script in a text editor or IDE
3. Run it with the default set of inputs; uncomment out the following line in Optimize.py;
@@ -112,11 +112,11 @@ Plots the mission outputs using matplotlib.
output = problem.objective()
-open up a terminal, and type "python Optimize.py." You should see a set of output plots.
+Open up a terminal, and type "python Optimize.py." You should see a set of output plots.
-###Running a Sweep of the Inputs
-Now try running a 2D sweep of the problem to observe the shape of the design space: recomment "output = problem.objective" then uncomment the following.
+### Running a Sweep of the Inputs
+Now try running a 2D sweep of the problem to observe the shape of the design space: re-comment "output = problem.objective" then uncomment the following.
variable_sweep(problem)
@@ -124,14 +124,14 @@ variable_sweep(problem)
Then run the program(python Optimize.py). This could take a few minutes. The results should look like the plot below
-
+
The labeled lines depict the fuel margin (i.e. fraction of the aircraft remaining weight that can be loaded with fuel). Positive values indicate a feasible design. Fuel burn is shown in the colored contours. Note that, a smoother plot may be had by changing the number of points in the sweep function, but this will take more time. A carpet plot run using 20 points can be seen below.
-
+
-###Optimizing:
+### Optimizing:
Now, try running an Optimization; recomment "variable_sweep(problem)", then comment out
@@ -142,7 +142,7 @@ and run python Optimize.py in the terminal.
From the default inputs, the terminal should display an optimum of [ 1.14127857 1.05251198], which corresponds to a wing area of 114.1 m^2, and 10.5 km (which, from the 2D sweep section of this tutorial, is not quite the true minimum, but it is close). A zoomed-in-plot of the objective function shape near the optimum is shown below to illustrate.
-
+
As can be seen in the plot above, there is a large region of local optima near the "true" optimum
@@ -171,7 +171,7 @@ or set up the optimization problem and change the inputs manually by uncommentin
The latter starts the optimization problem above the feasible region (wing area =128 m^2, altitude = 13.8 km), and results in a fuel burn that is 30 kg lower than the result using the initial guess; this illustrates the important of choosing a starting point when running optimization problem. Additionally, this demonstrates SUAVE's ability to handle even strongly infeasible cases, and that it can converge to a feasible case even when starting from an infeasible set of initial inputs. Plots of the default optimization history for both sets of inputs can be seen below.
-
+
At this point, explore other starting points, or alter the vehicle or mission properties in Vehicles.py or Missions.py. Additionally, feel free to start using this as the basis for creating custom optimization scripts.
\ No newline at end of file
diff --git a/_posts/2016-05-10-BWB.md b/_posts/2016-05-10-BWB.md
new file mode 100644
index 00000000..c326a202
--- /dev/null
+++ b/_posts/2016-05-10-BWB.md
@@ -0,0 +1,232 @@
+---
+layout: post
+title: Blended Wing Body with CFD
+date: 2015-06-13 23:22:21
+categories: blog
+description: Run an unconventional configuration with SU2!
+
+permalink: /guides/BWB.html
+---
+
+
+
+
+
+## Blended Wing Body using CFD
+
+The purpose of this tutorial is to show a user how to generate geometry, mesh, and run CFD via SU2 from SUAVE. We assume you are familiar with SUAVE and have some CFD experience already. For the design example we an unconventional configuration, a Blended Wing Body (BWB). The BWB used here is most similar to the Boeing BWB-450 by Liebeck.
+
+There are several ways this tutorial could be useful. First it shows how geometry is generated in SUAVE and sent to OpenVSP. Secondly it shows the chain of tools from geometry generation in OpenVSP, to mesh generation using GMSH, to CFD using SU2. Finally, if you already have CFD or other aerodynamic data you will learn how to input it into SUAVE directly.
+
+# Other Software You need
+
+For the full tool chain 3 additional pieces of software are needed. These include OpenVSP, GMSH, and SU2. Fortunately for you, these are all open source and freely available online.
+
+First, you will need [OpenVSP](http://openvsp.org) compiled with Python support. Unfortunately, you cannot use the precompiled binary versions of OpenVSP. You must compile it from scratch.
+
+Second, you must install [GMSH](http://gmsh.info). In this case you can use the precompiled binaries. Make sure to add GMSH to your command line path, so it can be called from a terminal.
+
+Finally, you need to install [SU2](http://su2.stanford.edu). If you want parallel support then you must also compile the code. Otherwise, you can the precompiled versions.
+
+# Vehicle Setup
+
+Here is the first time look at multi-segment wings. With multi-segments we can tune in more complex shapes such as cranks, yehudis, and winglets. We can also specify an airfoil to the wing or a wing segment. However, if you do not specify an airfoil it will default to a symmetrical airfoil profile.
+
+This BWB is broken down into 7 segments. We first specify the top level overal parameters of the wing and then add each segment sequentially as shown below.
+
+
+
+
+ # ------------------------------------------------------------------
+ # Main Wing
+ # ------------------------------------------------------------------
+
+ wing = SUAVE.Components.Wings.Main_Wing()
+ wing.tag = 'main_wing'
+
+ wing.aspect_ratio = 289.**2 / (7840. * 2)
+ wing.thickness_to_chord = 0.15
+ wing.taper = 0.0138
+ wing.span_efficiency = 0.95
+
+ wing.spans.projected = 289.0 * Units.feet
+
+ wing.chords.root = 145.0 * Units.feet
+ wing.chords.tip = 3.5 * Units.feet
+ wing.chords.mean_aerodynamic = 86. * Units.feet
+
+ wing.areas.reference = 15680. * Units.feet**2
+ wing.sweeps.quarter_chord = 33. * Units.degrees
+
+ wing.twists.root = 0.0 * Units.degrees
+ wing.twists.tip = 0.0 * Units.degrees
+ wing.dihedral = 2.5 * Units.degrees
+
+ wing.origin = [0.,0.,0]
+ wing.aerodynamic_center = [0,0,0]
+
+ wing.vertical = False
+ wing.symmetric = True
+ wing.high_lift = True
+
+ wing.dynamic_pressure_ratio = 1.0
+
+ segment = SUAVE.Components.Wings.Segment()
+ segment.tag = 'section_1'
+ segment.percent_span_location = 0.0
+ segment.twist = 0. * Units.deg
+ segment.root_chord_percent = 1.
+ segment.dihedral_outboard = 0. * Units.degrees
+ segment.sweeps.quarter_chord = 30.0 * Units.degrees
+ segment.thickness_to_chord = 0.165
+ wing.Segments.append(segment)
+
+ segment = SUAVE.Components.Wings.Segment()
+ segment.tag = 'section_2'
+ segment.percent_span_location = 0.052
+ segment.twist = 0. * Units.deg
+ segment.root_chord_percent = 0.921
+ segment.dihedral_outboard = 0. * Units.degrees
+ segment.sweeps.quarter_chord = 52.5 * Units.degrees
+ segment.thickness_to_chord = 0.167
+ wing.Segments.append(segment)
+
+ segment = SUAVE.Components.Wings.Segment()
+ segment.tag = 'section_3'
+ segment.percent_span_location = 0.138
+ segment.twist = 0. * Units.deg
+ segment.root_chord_percent = 0.76
+ segment.dihedral_outboard = 1.85 * Units.degrees
+ segment.sweeps.quarter_chord = 36.9 * Units.degrees
+ segment.thickness_to_chord = 0.171
+ wing.Segments.append(segment)
+
+ segment = SUAVE.Components.Wings.Segment()
+ segment.tag = 'section_4'
+ segment.percent_span_location = 0.221
+ segment.twist = 0. * Units.deg
+ segment.root_chord_percent = 0.624
+ segment.dihedral_outboard = 1.85 * Units.degrees
+ segment.sweeps.quarter_chord = 30.4 * Units.degrees
+ segment.thickness_to_chord = 0.175
+ wing.Segments.append(segment)
+
+ segment = SUAVE.Components.Wings.Segment()
+ segment.tag = 'section_5'
+ segment.percent_span_location = 0.457
+ segment.twist = 0. * Units.deg
+ segment.root_chord_percent = 0.313
+ segment.dihedral_outboard = 1.85 * Units.degrees
+ segment.sweeps.quarter_chord = 30.85 * Units.degrees
+ segment.thickness_to_chord = 0.118
+ wing.Segments.append(segment)
+
+ segment = SUAVE.Components.Wings.Segment()
+ segment.tag = 'section_6'
+ segment.percent_span_location = 0.568
+ segment.twist = 0. * Units.deg
+ segment.root_chord_percent = 0.197
+ segment.dihedral_outboard = 1.85 * Units.degrees
+ segment.sweeps.quarter_chord = 34.3 * Units.degrees
+ segment.thickness_to_chord = 0.10
+ wing.Segments.append(segment)
+
+ segment = SUAVE.Components.Wings.Segment()
+ segment.tag = 'section_7'
+ segment.percent_span_location = 0.97
+ segment.twist = 0. * Units.deg
+ segment.root_chord_percent = 0.086
+ segment.dihedral_outboard = 73. * Units.degrees
+ segment.sweeps.quarter_chord = 55. * Units.degrees
+ segment.thickness_to_chord = 0.10
+ wing.Segments.append(segment)
+
+ # add to vehicle
+ vehicle.append_component(wing)
+
+
+
+When we specify the configuration then we can write the OpenVSP file. If there are multiple configurations then you will need multiple writes to OpenVSP. We highly suggest you only have one configuration to minimize computational costs.
+
+
+# ----------------------------------------------------------------------
+# Define the Configurations
+# ---------------------------------------------------------------------
+
+def configs_setup(vehicle):
+
+ # ------------------------------------------------------------------
+ # Initialize Configurations
+ # ------------------------------------------------------------------
+
+ configs = SUAVE.Components.Configs.Config.Container()
+
+ base_config = SUAVE.Components.Configs.Config(vehicle)
+ base_config.tag = 'base'
+ configs.append(base_config)
+
+ write(vehicle,base_config.tag)
+
+
+ # done!
+ return configs
+
+
+
+# Analyses Setup
+
+Here we setup the SU2 analysis. We left commented out the parallel setting if you want to parallelize the computation along with the number of processors to use.
+
+The next setting which is commented out is the input file for pregenerated CFD data. We have included an example of this, even if you don't have SU2 and GMSH installed you can still run this file to generate the surrogate and run the mission.
+
+After that we specify the points we want generate the surrogate on. Default values are within SUAVE, but we suggest the user specify their own Mach numbers and angles of attack.
+
+Next we use a trick to refine the mesh. This is optional. We change the source parameters at specific segments. Here we make the sources more compact which refines the mesh at the root area.
+
+
+
+ # ------------------------------------------------------------------
+ # Aerodynamics Analysis
+ aerodynamics = SUAVE.Analyses.Aerodynamics.SU2_Euler()
+ aerodynamics.geometry = vehicle
+
+ #aerodynamics.process.compute.lift.inviscid.settings.parallel = True
+ #aerodynamics.process.compute.lift.inviscid.settings.processors = 12
+ #aerodynamics.process.compute.lift.inviscid.training_file = 'base_data.txt'
+ aerodynamics.settings.drag_coefficient_increment = 0.0000
+
+ aerodynamics.process.compute.lift.inviscid.training.Mach = np.array([.3, .5, .7, .85])
+ aerodynamics.process.compute.lift.inviscid.training.angle_of_attack = np.array([0.,3.,6.]) * Units.deg
+
+ wing_segments = vehicle.wings.main_wing.Segments
+ wing_segments.section_1.vsp_mesh = Data()
+ wing_segments.section_1.vsp_mesh.inner_radius = 4.
+ wing_segments.section_1.vsp_mesh.outer_radius = 4.
+ wing_segments.section_1.vsp_mesh.inner_length = .14
+ wing_segments.section_1.vsp_mesh.outer_length = .14
+
+ wing_segments.section_2.vsp_mesh = Data()
+ wing_segments.section_2.vsp_mesh.inner_radius = 4.
+ wing_segments.section_2.vsp_mesh.outer_radius = 4.
+ wing_segments.section_2.vsp_mesh.inner_length = .14
+ wing_segments.section_2.vsp_mesh.outer_length = .14
+
+ wing_segments.section_3.vsp_mesh = Data()
+ wing_segments.section_3.vsp_mesh.inner_radius = 4.
+ wing_segments.section_3.vsp_mesh.outer_radius = 4.
+ wing_segments.section_3.vsp_mesh.inner_length = .14
+ wing_segments.section_3.vsp_mesh.outer_length = .14
+
+ wing_segments.section_4.vsp_mesh = Data()
+ wing_segments.section_4.vsp_mesh.inner_radius = 4.
+ wing_segments.section_4.vsp_mesh.outer_radius = 2.8
+ wing_segments.section_4.vsp_mesh.inner_length = .14
+ wing_segments.section_4.vsp_mesh.outer_length = .14
+
+ analyses.append(aerodynamics)
+
+
+
+
+
+The rest of the code runs as usual. However, we add in an extra plot which shows the surrogate and the points interpolated.
\ No newline at end of file
diff --git a/_posts/2016-05-11-solar_uav_optimization_tutorial.md b/_posts/2016-05-11-solar_uav_optimization_tutorial.md
new file mode 100644
index 00000000..6d8829a9
--- /dev/null
+++ b/_posts/2016-05-11-solar_uav_optimization_tutorial.md
@@ -0,0 +1,255 @@
+---
+layout: post
+title: Solar UAV Optimization
+date: 2015-06-14 23:22:21
+categories: blog
+description: Use SUAVE’s optimization for unconventional configurations
+
+permalink: /guides/solar_uav_optimization.html
+---
+
+## Solar UAV Optimization Tutorial
+
+The purpose of this tutorial is to illustrate a different type of problem. We assume you have gone through the first optimization tutorial: Regional Jet Optimization. This tutorial will illustrate a little more complex setup that modifies a mission parameter.
+
+Your objective is simple: get a small UAV to fly from San Francisco to San Diego. In fact you can pose that as an optimization problem, with some constraints that govern how it works. There is no requirement to minimize this or maximize that. Of course you could try to minimize something, but you just want something that works for now. Later iterations can do fancier things.
+
+Next we will go into detail about some of the required files. *Analyses.py* and *Plot_mission.py* are straightforward from prior tutorials. So we will not go into those in detail, except to say that we are using a UAV weight model in *Analyses.py*.
+
+### Optimize.py:
+
+Let’s pose the optimization problem first and then setup the rest. We start with the *Nexus* first as usual. With this design problem there are things you are uncertain of and want to solve for.
+
+You're not sure if you really need any solar panels on the airplane, so to start there will be none. The solar ratio is the ratio of wing area to solar area. A value of 1 would the whole top of the wing covered with solar panels.
+
+
+ # [ tag , initial, [lb,ub], scaling, units ]
+ problem.inputs = np.array([
+ [ 'wing_area' , 0.5, ( 0.1, 1.5 ), 0.5, Units.meter ],
+ [ 'aspect_ratio' , 10.0, ( 5.0, 20.0 ), 10.0, Units.less ],
+ [ 'dynamic_pressure', 125.0, ( 1.0, 2000.0 ), 125.0, Units.pascals ],
+ [ 'solar_ratio' , 0.0, ( 0.0, 0.97), 1.0, Units.less ],
+ [ 'kv' , 800.0, ( 10.0, 1500.0 ), 800.0, Units['rpm/volt']],
+ ])
+
+
+Next come the constraints. The first constraint is that the battery energy can never go negative, the math behind this will be elaborated on later. The next constraint is that the plane must have a battery. Finally there are limits to coefficients of lift and throttle settings.
+
+
+ # [ tag, sense, edge, scaling, units ]
+ problem.constraints = np.array([
+ [ 'energy_constraint', '=', 0.0, 1.0, Units.less],
+ [ 'battery_mass' , '>', 0.0, 1.0, Units.kg ],
+ [ 'CL' , '>', 0.0, 1.0, Units.less],
+ [ 'Throttle_min' , '>', 0.0, 1.0, Units.less],
+ [ 'Throttle_max' , '>', 0.0, 1.0, Units.less],
+ ])
+
+
+Notice here that all constraints are greater than zero. This is because SciPy’s SLSQP optimization algorithm assumes this form. To correct for these, the values are adjusted in Procedure.py. Other optimization packages such as PyOpt don’t require this strict form.
+
+Finally, the objective. It’s nothing of course! As long as the constraints are met, the goal of the design is satisfied.
+
+
+ # [ tag, scaling, units ]
+ problem.objective = np.array([
+ [ 'Nothing', 1. , Units.kg],
+ ])
+
+
+### Vehicles.py:
+
+Next, you will setup the vehicle. This is very similar to the prior Solar UAV tutorial. So we will gloss over this, the one noticeable difference is that a lower fidelity energy network is used. This means that most components operate with prescribed efficiencies. For example:
+
+
+ # Component 4 the Motor
+ motor = SUAVE.Components.Energy.Converters.Motor_Lo_Fid()
+ kv = 800. * Units['rpm/volt'] # RPM/volt is standard
+ motor = size_from_kv(motor, kv)
+ motor.gear_ratio = 1. # Gear ratio, no gearbox
+ motor.gearbox_efficiency = 1. # Gear box efficiency, no gearbox
+ motor.motor_efficiency = 0.825;
+ net.motor = motor
+ ])
+
+
+### Missions.py:
+
+Now for the mission setup. Here we assume it will take 1000 km and the plane will cruise off the coast at 1000 feet in altitude. The distance is a bit longer than the straight line distance, but we're not going to fly through populated areas. The heading, or body rotation, must be set to account for the changes in latitude and longitude to accurately calculate the solar radiation. We will cruise at a constant altitude and assume it takes no time to climb and descend compared to the cruise time.
+
+
+ segment.state.numerics.number_control_points = 50
+ segment.dynamic_pressure = 115.0 * Units.pascals
+ segment.start_time = time.strptime("Tue, Jun 21 11:00:00 2016", "%a, %b %d %H:%M:%S %Y",)
+ segment.altitude = 1000.0 * Units.feet
+ segment.distance = 1000.0 * Units.km
+ segment.charge_ratio = 1.0
+ segment.latitude = 37.4
+ segment.longitude = -122.15
+ segment.state.conditions.frames.wind.body_rotations[:,2] = 125.* Units.degrees
+
+
+### Procedure.py:
+
+Finally we have the procedure setup. In the procedure, we resize the vehicle, calculate weights, finalize the analyses, solve the mission, and post process.
+
+Some notes about sizing. Each wing component (main wing, horizontal tail, and vertical tail) needs the surfaces sized based on its area and aspect ratio. Next the solar panels are sized based on the wing area and solar_ratio. Finally the motor is resized based on correlations for the speed constant of the motor.
+
+
+def simple_sizing(nexus):
+
+ # Pull out the vehicle
+ vec = nexus.vehicle_configurations.base
+
+ # Change the dynamic pressure based on the, add a factor of safety
+ vec.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
+ vec.wings.horizontal_stabilizer.areas.reference = 0.15 * vec.reference_area
+ vec.wings.vertical_stabilizer.areas.reference = 0.08 * vec.reference_area
+
+ # wing spans,areas, and chords
+ for wing in vec.wings:
+
+ # Unpack
+ AR = wing.aspect_ratio
+ S = wing.areas.reference
+
+ # Set the spans
+ wing.spans.projected = np.sqrt(AR*S)
+
+ # Set all of the areas for the surfaces
+ wing.areas.wetted = 2.0 * S
+ wing.areas.exposed = 1.0 * wing.areas.wetted
+ wing.areas.affected = 1.0 * wing.areas.wetted
+
+ # Set all of the chord lengths
+ chord = wing.areas.reference/wing.spans.projected
+ wing.chords.mean_aerodynamic = chord
+ wing.chords.mean_geometric = chord
+ wing.chords.root = chord
+ wing.chords.tip = chord
+
+ # Size solar panel area
+ wing_area = vec.reference_area
+ spanel = vec.propulsors.network.solar_panel
+ sratio = spanel.ratio
+ solar_area = wing_area*sratio
+ spanel.area = solar_area
+ spanel.mass_properties.mass = solar_area*(0.60 * Units.kg)
+
+ # Resize the motor
+ motor = vec.propulsors.network.motor
+ kv = motor.speed_constant
+ motor = size_from_kv(motor, kv)
+
+ # diff the new data
+ vec.store_diff()
+
+ return nexus
+
+
+Here the battery is sized and charged. The battery weight consists of everything that is left over from sizing.
+
+
+def weights_battery(nexus):
+
+ # Evaluate weights for all of the configurations
+ config = nexus.analyses.base
+ config.weights.evaluate()
+
+ vec = nexus.vehicle_configurations.base
+ payload = vec.propulsors.network.payload.mass_properties.mass
+ msolar = vec.propulsors.network.solar_panel.mass_properties.mass
+ MTOW = vec.mass_properties.max_takeoff
+ empty = vec.weight_breakdown.empty
+ mmotor = vec.propulsors.network.motor.mass_properties.mass
+
+ # Calculate battery mass
+ batmass = MTOW - empty - payload - msolar -mmotor
+ bat = vec.propulsors.network.battery
+ initialize_from_mass(bat,batmass)
+ vec.propulsors.network.battery.mass_properties.mass = batmass
+
+ # Set Battery Charge
+ maxcharge = nexus.vehicle_configurations.base.propulsors.network.battery.max_energy
+ charge = maxcharge
+
+ nexus.missions.mission.segments.cruise.battery_energy = charge
+
+ return nexus
+
+
+The next we run the mission and post process the results. The post_process function will setup the information of importance for the user. The energy constraint is a way of ensuring that nowhere in the mission the battery energy goes negative. The coefficient of lift is limited to 1.2. The throttle is limited to 0.9, to make sure there is excess throttle to climb. Throttle is also limited from going negative. Finally, the objective, nothing is specified to be zero.
+
+
+def post_process(nexus):
+
+ # Unpack
+ mis = nexus.missions.mission.segments.cruise
+ vec = nexus.vehicle_configurations.base
+ res = nexus.results.mission.segments.cruise.conditions
+
+ # Final Energy
+ maxcharge = vec.propulsors.network.battery.max_energy
+
+ # Energy constraints, the battery doesn't go to zero anywhere, using a P norm
+ p = 8.
+ energies = res.propulsion.battery_energy[:,0]/np.abs(maxcharge)
+ energies[energies>0] = 0.0 # Exclude the values greater than zero
+ energy_constraint = np.sum((np.abs(energies)**p))**(1/p)
+
+ # CL max constraint, it is the same throughout the mission
+ CL = res.aerodynamics.lift_coefficient[0]
+
+ # Pack up
+ summary = nexus.summary
+ summary.CL = 1.2 - CL
+ summary.energy_constraint = energy_constraint
+ summary.throttle_min = res.propulsion.throttle[0]
+ summary.throttle_max = 0.9 - res.propulsion.throttle[0]
+ summary.nothing = 0.0
+
+ return nexus
+
+
+### Results
+Let’s look at the results:
+
+
+Optimization terminated successfully. (Exit mode 0)
+ Current function value: [0.0]
+ Iterations: 4
+ Function evaluations: 29
+ Gradient evaluations: 4
+[ 1.12963146 1.43880081 1.39329626 0.65589785 0.97171879]
+Design Variable Table:
+
+[['wing_area' 0.5648157324099996 (0.1, 1.5) 0.5 1.0]
+ ['aspect_ratio' 14.388008119672202 (5.0, 20.0) 10.0 1.0]
+ ['dynamic_pressure' 174.16203234031317 (1.0, 2000.0) 125.0 1.0]
+ ['solar_ratio' 0.6558978486767236 (0.0, 0.97) 1.0 1.0]
+ ['kv' 777.3750338508712 (10.0, 1500.0) 800.0 0.10471975511965977]]
+
+Constraint Table:
+
+[['energy_constraint' 0.0 '=' 0.0 1.0 ]
+ ['battery_mass' 4.939962596982861 '>' 0.0 1.0 ]
+ ['CL' 0.5309682332699428 '>' 0.0 1.0 ]
+ ['Throttle_min' 0.7319219623084848 '>' 0.0 1.0 ]
+ ['Throttle_max' 0.1680780376915152 '>' 0.0 1.0 ]]
+
+
+Okay looks like SciPy found a feasible solution without too much time. Now let’s review the plots.
+
+
+
+So we can tell now that the battery energy doesn't go all the way to zero. Let's look at how the solar flux varies throughout the day and how that affects the draw from the battery.
+
+
+
+
+
+So maybe those solar panels actually are worth it. They seem to decrease the load on the battery considerably during the daytime.
+
+
diff --git a/_posts/2018-06-15-FAQ.md b/_posts/2018-06-15-FAQ.md
index a3612492..8dde04ee 100644
--- a/_posts/2018-06-15-FAQ.md
+++ b/_posts/2018-06-15-FAQ.md
@@ -1,35 +1,82 @@
----
-layout: post
-title: Frequently Asked Questions
-date: 2010-06-15 14:20:00
-categories: blog
-
-permalink: /faq.html
----
-
-
-
-
-
-Alright, you dove in and now you're stuck. You've come to a good starting point. If this FAQ fails you then we suggest you go through tutorials, maybe our [paper](http://adl.stanford.edu/papers/suave-open-source.pdf), send us a question in the forum, or if all else fails start reading code. Don't worry the code is more readable than most engineering textbooks.
-
- - [How can I be more SUAVE?](#how-can-i-be-more-suave)
- - [What can SUAVE do for me?](#What-can-SUAVE-do-for-me)
- - [Will SUAVE change the world?](#will-suave-change-the-world)
- - [Will SUAVE give me super powers?](#will-suave-give-me-super-powers)
-
-
-
-
-## How can I be more SUAVE
-A: Try running SUAVE daily. Unpeer reviewed non-statistical unpublished research has shown time and again that SUAVE developers are amazing. That is because they work with SUAVE on a daily basis. This gives them power over aerospace that only super humans posses. In turn that power is manifested in confidence, smoothness, and elegance that every human will adore.
-
-## What can SUAVE do for me
-A: SUAVE is designed to make cool airplanes. This will make you rich, famous, and more attractive.
-
-
-## Will SUAVE change the World
-A: Certainly. Why is this even a question?
-
-## Will SUAVE give me super powers
-A: Unfortunately SUAVE cannot give you super powers. However there is hope, SUAVE is the perfect starting point to perform conceptual design studies on your flying Iron Man suit (some code development required). The energy network in SUAVE is ideal for modeling the arc reactor and the power transfer to the propulsors. Although you will not gain super powers from SUAVE it might still make you a super hero, or maybe a super villain should you choose that route.
\ No newline at end of file
+---
+layout: post
+title: Frequently Asked Questions
+date: 2010-06-15 14:20:00
+categories: blog
+description: We know what you're thinking
+
+permalink: /faq.html
+---
+
+
+
+Alright, you dove in and now you're stuck. You've come to a good starting point. If this FAQ fails you then we suggest you go through tutorials, maybe our [paper](http://adl.stanford.edu/papers/suave-open-source.pdf), send us a question in the forum, or if all else fails start reading code. Don't worry the code is more readable than most engineering textbooks.
+
+[comment]: <> (lowercase, no question marks for tags, total freedom in text)
+
+ - [How do I get started?](#how-do-i-get-started)
+ - [What version of Python should I use?](#what-version-of-python-should-i-use)
+ - [Can I use SUAVE for my own research?](#can-i-use-suave-for-my-own-research)
+ - [How can I contribute?](#how-can-i-contribute)
+ - [How can I best get in touch with you?](#how-can-i-best-get-in-touch-with-you)
+ - [I am having trouble with my SUAVE code. Where can I find help?](#i-am-having-trouble-with-my-suave-code-where-can-i-find-help)
+ - [Where can I see the recent additions to the SUAVE environment?](#where-can-i-see-the-recent-additions-to-the-suave-environment)
+ - [Are there plans to make a Graphical User Interface?](#are-there-plans-to-make-a-graphical-user-interface)
+ - [How is a mission solved?](#how-is-a-mission-solved)
+ - [How can I be more SUAVE?](#how-can-i-be-more-suave)
+ - [What can SUAVE do for me?](#what-can-suave-do-for-me)
+ - [Will SUAVE change the world?](#will-suave-change-the-world)
+ - [Will SUAVE give me super powers?](#will-suave-give-me-super-powers)
+
+
+
+## How do I get started?
+
+* Download SUAVE’s current release on our [download](/download/) page. Specific steps and further instructions for additional software requirements are also listed there.
+* Get familiar with the code using our [guides](guides/). Be sure to start the [BOEING 737 Tutorial](/guides/boeing_737-800.html) for a basic introduction and the Regional Jet Optimization For the optimization tools
+* Ask any remaining questions on the [forum](/forum)
+
+## What version of Python should I use?
+SUAVE has been proven to work on 32bit versions of Python 2.7.
+
+## Can I use SUAVE for my own research?
+Yes, you may! Please cite our papers:
+
+- [T. Lukaczyk, A. Wendorff, E. Botero, T. MacDonald, T. Momose, A. Variyar, J. M. Vegh, M. Colonno, T. Economon, J. J. Alonso, T. Orra, C. Ilario, "SUAVE: An Open-Source Environment for Multi-Fidelity Conceptual Vehicle Design", 16th AIAA Multidisciplinary Analysis and Optimization Conference, Dallas, TX, June 2015.](http://adl.stanford.edu/papers/suave-open-source.pdf)
+
+- [E. Botero, A. Wendorff, T. MacDonald, A. Variyar, J. M. Vegh, T. Lukaczyk, J. J. Alonso, T. Orra, C. Ilario da Silva. "SUAVE: An Open-Source Environment for Conceptual Vehicle Design and Optimization", 54th AIAA Aerospace Sciences Meeting, San Diego, CA, January 2016.](http://adl.stanford.edu/papers/suave-optimization.pdf)
+
+## How can I contribute?
+We encourage SUAVE users to expand the environment according to their personal interests. The main areas to be developed are listed [here](/develop/#areas-of-development).
+
+## How can I best get in touch with you?
+The [forum](/forum) is our main point of contact for SUAVE discussions.
+
+## I am having trouble with my SUAVE code. Where can I find help?
+The [forum](/forum) is your best friend.
+
+## Where can I see the recent additions to the SUAVE environment?
+Go and check the develop branch on our [GitHub site](https://github.com/suavecode/SUAVE).
+
+## Are there plans to make a Graphical User Interface?
+The core development team is currently not planning on developing a GUI, but you can help! Contact us via the [forum](/forum).
+
+## How is a mission solved?
+
+A mission is divided into segments, for example climb, cruise, etc… Then the segment is divided into discrete points that are cosine spaced in time. These make up Chebyshev collocation points. One of the beauties of this method is the integration and differentiation operator. So if you know the velocity at every point, then you can get accelerations and vice-versa.
+
+The default value is 16 points in each segment for SUAVE. However, our internal numerical experiments have shown highly accurate results with ~0.1% error with only 4 control points and ~.0001% error with 8 as measured from a very highly refined answered.
+
+For each control point there are various unknowns and residuals. An example of an unknown would be pitch angle, and a residual would be the forces in the Z direction. After performing an analysis using the unknowns the residuals are calculated. These unknowns and residuals are iterated through a hybrid solver (much like a Newton method) in SciPy to converge the residual to zero. Voila, with a little magic you have results!
+
+## How can I be more SUAVE?
+Try running SUAVE daily. Unpeer reviewed non-statistical unpublished research has shown time and again that SUAVE developers are amazing. That is because they work with SUAVE on a daily basis. This gives them power over aerospace that only super humans posses. In turn that power is manifested in confidence, smoothness, and elegance that every human will adore.
+
+## What can SUAVE do for me?
+SUAVE is designed to make cool airplanes. This will make you rich, famous, and more attractive.
+
+## Will SUAVE change the World?
+Certainly. Why is this even a question?
+
+## Will SUAVE give me super powers?
+Unfortunately SUAVE cannot give you super powers. However there is hope, SUAVE is the perfect starting point to perform conceptual design studies on your flying Iron Man suit (some code development required). The energy network in SUAVE is ideal for modeling the arc reactor and the power transfer to the propulsors. Although you will not gain super powers from SUAVE it might still make you a super hero, or maybe a super villain should you choose that route.
diff --git a/_site/CNAME b/_site/CNAME
new file mode 100644
index 00000000..c952eece
--- /dev/null
+++ b/_site/CNAME
@@ -0,0 +1 @@
+suave.stanford.edu
\ No newline at end of file
diff --git a/_site/css/main.css b/_site/css/main.css
new file mode 100644
index 00000000..0e80c559
--- /dev/null
+++ b/_site/css/main.css
@@ -0,0 +1,591 @@
+.verticalLineR {
+ border-right: 1px solid #CCCCCC;
+ height: 150%; }
+
+.verticalLineL {
+ border-left: 1px solid #CCCCCC;
+ height: 100%; }
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ border: 1px solid #666666;
+ width: 70%;
+ margin-left: 15%;
+ margin-right: 15%; }
+
+th {
+ border: 1px solid #666666;
+ padding: 5px; }
+
+td {
+ border: 1px solid #666666;
+ padding: 5px; }
+
+/**
+ * DEFAULTS
+ */
+/* COLORS */
+/**
+ * Reset some basic elements
+ */
+body, h1, h2, h3, h4, h5, h6,
+p, blockquote, pre, hr,
+dl, dd, ol, ul, figure {
+ margin: 0;
+ padding: 0; }
+
+hr {
+ margin-bottom: 24px;
+ border: 0;
+ height: 1px;
+ background-color: #000000;
+ opacity: 0.2; }
+
+/**
+ * Basic styling
+ */
+body {
+ font-family: "Open Sans", sans-serif;
+ font-size: 16px;
+ line-height: 1.5em;
+ font-weight: 500;
+ color: #111;
+ background-color: #fdfdfd;
+ -webkit-text-size-adjust: 100%; }
+ @media screen and (min-width: 960px) {
+ body {
+ background: url("/images/bg.jpg") top center repeat-y; } }
+
+/**
+ * Set `margin-bottom` to maintain vertical rhythm
+ */
+h1, h2, h3, h4, h5, h6,
+p, blockquote, pre,
+ul, ol, dl, figure,
+.highlight {
+ margin-bottom: 24px; }
+
+/**
+ * Images
+ */
+img {
+ max-width: 100%;
+ vertical-align: middle; }
+
+/**
+ * Figures
+ */
+figure > img {
+ display: block; }
+
+figcaption {
+ font-size: 14px; }
+
+/**
+ * Lists
+ */
+ul, ol {
+ margin-left: 0px;
+ margin-right: 0px; }
+
+li > ul,
+li > ol {
+ margin-bottom: 0; }
+
+/**
+ * Headings
+ */
+h1, h2 {
+ font-weight: 700; }
+
+h3, h4, h5, h6 {
+ font-weight: 700; }
+
+/**
+ * Links
+ */
+a {
+ color: #B3995D;
+ text-decoration: none;
+ /* &:visited {
+ color: darken($burnt-red, 30%);
+ }
+ */ }
+ a:hover {
+ color: #8c1515;
+ text-decoration: underline; }
+
+a.social-media-link:hover {
+ text-decoration: none; }
+
+/**
+ * Blockquotes
+ */
+blockquote {
+ border-left: 4px solid #e8e8e8;
+ padding: 6px 12px;
+ margin: 24px;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 21px;
+ opacity: 0.8; }
+ blockquote > :last-child {
+ margin-bottom: 0; }
+
+article {
+ margin-bottom: 120px; }
+ article.content ul, article.content ol {
+ margin-left: 20px; }
+ article a {
+ padding: 0px 0px; }
+
+/**
+ * Code formatting
+ */
+pre,
+code {
+ font-size: 15px;
+ font-weight: normal;
+ border: 1px solid #e8e8e8;
+ border-radius: 3px;
+ background-color: #eef; }
+
+code {
+ padding: 1px 5px; }
+
+pre {
+ padding: 8px 12px;
+ overflow-x: auto; }
+ pre > code {
+ border: 0;
+ padding-right: 0;
+ padding-left: 0; }
+
+/**
+ * Wrapper
+ */
+.wrapper {
+ max-width: -webkit-calc(960px - (0px * 2));
+ max-width: calc(960px - (0px * 2));
+ margin-right: auto;
+ margin-left: auto;
+ padding-right: 0px;
+ padding-left: 0px; }
+ @media screen and (max-width: 800px) {
+ .wrapper {
+ max-width: -webkit-calc(960px - (0px));
+ max-width: calc(960px - (0px));
+ padding-right: 0px;
+ padding-left: 0px; } }
+
+.border-box, .left-nav, .main-content, .main-content footer, .post > div {
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box; }
+
+.valign {
+ position: relative;
+ top: 50%;
+ transform: translateY(-50%);
+ -webkit-transform: translateY(-50%);
+ -ms-transform: translateY(-50%); }
+
+/**
+ * Clearfix
+ */
+.wrapper:after {
+ content: "";
+ display: table;
+ clear: both; }
+
+/**
+ * Icons
+ */
+.icon > img {
+ display: inline-block;
+ width: 32px;
+ height: 32px;
+ vertical-align: middle; }
+
+.btn {
+ color: #ffffff !important;
+ display: inline-block;
+ padding: 6px 12px;
+ font-size: 14px;
+ text-decoration: none !important;
+ background-color: #8c1515;
+ border: 2px solid #8c1515;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ -ms-border-radius: 3px;
+ border-radius: 3px; }
+ .btn:hover {
+ background-color: #9e1818; }
+ .btn.active {
+ background-color: white;
+ color: #8c1515 !important; }
+
+::-webkit-scrollbar {
+ width: 8px;
+ height: 6px; }
+
+::-webkit-scrollbar-button:start:decrement,
+::-webkit-scrollbar-button:end:increment {
+ display: block;
+ height: 0px; }
+
+::-webkit-scrollbar-button:vertical:increment
+::-webkit-scrollbar-button:vertical:decrement {
+ background-color: #eee; }
+
+::-webkit-scrollbar-track-piece {
+ background-color: #eee;
+ -webkit-border-radius: 0px;
+ border: 1px solid #ccc; }
+
+::-webkit-scrollbar-thumb:vertical {
+ height: 50px;
+ background-color: #ccc;
+ -webkit-border-radius: 3px; }
+
+/**
+ * Side Nav
+ */
+.left-nav {
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ font-weight: 400;
+ color: #1a1a1a;
+ width: 320px;
+ float: left;
+ padding: 24px;
+ text-align: center;
+ overflow: auto;
+ margin: 0px;
+ padding: 0px; }
+ .left-nav .greetings {
+ font-size: 24px;
+ color: #8c1515;
+ margin-bottom: 44px; }
+ .left-nav .logo {
+ margin: auto auto;
+ width: 200px;
+ height: 222px;
+ display: block;
+ margin-bottom: 44px;
+ position: relative;
+ top: 30px; }
+ .left-nav .logo img {
+ width: 100%;
+ height: 90%; }
+ .left-nav .logo span {
+ display: inline-block;
+ text-indent: -10000px; }
+ .left-nav strong {
+ color: #8c1515;
+ font-weight: bold;
+ padding: 2px 5px;
+ border-bottom: 1px solid #df2828; }
+ .left-nav section {
+ margin-bottom: 44px; }
+ .left-nav ul {
+ list-style-type: none; }
+ .left-nav .main-nav h5 {
+ color: #ab1a1a;
+ font-size: 12px;
+ margin-bottom: 24px; }
+ .left-nav .main-nav ul li {
+ margin-bottom: 10px; }
+ .left-nav .main-nav ul li a {
+ width: 125px; }
+ @media screen and (max-width: 960px) {
+ .left-nav .main-nav ul li {
+ display: inline;
+ margin-right: 12px; } }
+ @media screen and (max-width: 580px) {
+ .left-nav .main-nav ul li {
+ display: block;
+ width: 100%; }
+ .left-nav .main-nav ul li a {
+ width: 90%; } }
+ @media screen and (max-width: 960px) {
+ .left-nav {
+ width: 100%;
+ float: none;
+ position: relative;
+ background-color: #F6F6F6;
+ border-bottom: 1px solid #CFCFCF; } }
+ .left-nav footer {
+ margin-top: 35px; }
+
+/**
+ * Main Content
+ */
+.main-content {
+ position: relative;
+ overflow: auto;
+ float: left;
+ width: 648px;
+ margin: 0px;
+ padding: 0px;
+ margin-left: 320px; }
+ @media screen and (max-width: 960px) {
+ .main-content {
+ width: 100%;
+ float: none !important;
+ margin-left: 0; } }
+ .main-content footer {
+ width: 100%;
+ bottom: 24px;
+ font-weight: 400;
+ color: #999999;
+ text-align: center;
+ padding: 24px;
+ margin-top: 88px; }
+ .main-content footer hr {
+ background-color: gray; }
+ .main-content footer ul {
+ margin-bottom: 24px; }
+ .main-content footer ul li {
+ display: inline;
+ margin-right: 6px; }
+ .main-content footer ul li a {
+ text-decoration: none !important; }
+ .main-content footer ul li a:hover {
+ opacity: 0.8; }
+ @media screen and (min-width: 960px) {
+ .main-content footer {
+ width: 264px;
+ position: fixed;
+ bottom: 0;
+ margin-top: 0px;
+ margin-left: -290px; } }
+
+/**
+ * hero
+ */
+.hero {
+ position: relative;
+ height: 160px;
+ text-align: center;
+ font-weight: bold; }
+ .hero .title {
+ font-family: "Palatino Linotype", "Book Antiqua", Palatino, serif;
+ font-size: 48px;
+ margin-top: 0px;
+ margin-bottom: 4px;
+ line-height: 1.2em;
+ font-weight: normal; }
+ @media screen and (max-width: 600px) {
+ .hero .title {
+ font-size: 38px; } }
+ .hero .subtitle {
+ color: #8c1515;
+ font-size: 14px;
+ text-transform: uppercase; }
+
+/**
+ * content
+ */
+.content {
+ padding: 24px; }
+ .content h1, .content h2 {
+ font-weight: normal; }
+ .content h1 {
+ text-align: center;
+ font-size: 36px; }
+ .content h2 {
+ font-size: 32px; }
+ .content p {
+ color: #1a1a1a; }
+
+/**
+ * post
+ */
+.post {
+ list-style-type: none;
+ overflow: auto;
+ border-bottom: 1px solid #e6e6e6;
+ padding: 4px 0; }
+ .post:last-child {
+ border-bottom: 0; }
+ .post > div {
+ float: left;
+ padding: 2px; }
+ .post > div.span-1 {
+ font-size: 11px;
+ width: 90px;
+ font-weight: bold;
+ text-transform: uppercase;
+ overflow: hidden; }
+ .post > div.span-1.comment-count {
+ width: 60px; }
+ .post > div.span-1.comment-count a, .post > div.span-1.comment-count a:active, .post > div.span-1.comment-count a:visited {
+ color: #8c1515;
+ text-decoration: none !important; }
+ .post > div.span-10 {
+ width: 420px; }
+ @media screen and (max-width: 960px) {
+ .post > div.span-10 {
+ float: none;
+ clear: both;
+ width: 100%; } }
+ .post .post-date {
+ color: #999999; }
+ .post .post-link {
+ color: #000000;
+ font-size: 18px;
+ font-weight: 700; }
+ .post .post-link:hover {
+ color: #8c1515; }
+
+.comment-icon {
+ width: 16px;
+ height: 16px;
+ margin-left: 3px; }
+
+em img {
+ float: left;
+ margin-right: 20px;
+ margin-bottom: 20px; }
+
+/**
+ * Syntax highlighting styles
+ */
+.highlight {
+ background: #fff; }
+ .highlight .c {
+ color: #998;
+ font-style: italic; }
+ .highlight .err {
+ color: #a61717;
+ background-color: #e3d2d2; }
+ .highlight .k {
+ font-weight: bold; }
+ .highlight .o {
+ font-weight: bold; }
+ .highlight .cm {
+ color: #998;
+ font-style: italic; }
+ .highlight .cp {
+ color: #999;
+ font-weight: bold; }
+ .highlight .c1 {
+ color: #998;
+ font-style: italic; }
+ .highlight .cs {
+ color: #999;
+ font-weight: bold;
+ font-style: italic; }
+ .highlight .gd {
+ color: #000;
+ background-color: #fdd; }
+ .highlight .gd .x {
+ color: #000;
+ background-color: #faa; }
+ .highlight .ge {
+ font-style: italic; }
+ .highlight .gr {
+ color: #a00; }
+ .highlight .gh {
+ color: #999; }
+ .highlight .gi {
+ color: #000;
+ background-color: #dfd; }
+ .highlight .gi .x {
+ color: #000;
+ background-color: #afa; }
+ .highlight .go {
+ color: #888; }
+ .highlight .gp {
+ color: #555; }
+ .highlight .gs {
+ font-weight: bold; }
+ .highlight .gu {
+ color: #aaa; }
+ .highlight .gt {
+ color: #a00; }
+ .highlight .kc {
+ font-weight: bold; }
+ .highlight .kd {
+ font-weight: bold; }
+ .highlight .kp {
+ font-weight: bold; }
+ .highlight .kr {
+ font-weight: bold; }
+ .highlight .kt {
+ color: #458;
+ font-weight: bold; }
+ .highlight .m {
+ color: #099; }
+ .highlight .s {
+ color: #d14; }
+ .highlight .na {
+ color: #008080; }
+ .highlight .nb {
+ color: #0086B3; }
+ .highlight .nc {
+ color: #458;
+ font-weight: bold; }
+ .highlight .no {
+ color: #008080; }
+ .highlight .ni {
+ color: #800080; }
+ .highlight .ne {
+ color: #900;
+ font-weight: bold; }
+ .highlight .nf {
+ color: #900;
+ font-weight: bold; }
+ .highlight .nn {
+ color: #555; }
+ .highlight .nt {
+ color: #000080; }
+ .highlight .nv {
+ color: #008080; }
+ .highlight .ow {
+ font-weight: bold; }
+ .highlight .w {
+ color: #bbb; }
+ .highlight .mf {
+ color: #099; }
+ .highlight .mh {
+ color: #099; }
+ .highlight .mi {
+ color: #099; }
+ .highlight .mo {
+ color: #099; }
+ .highlight .sb {
+ color: #d14; }
+ .highlight .sc {
+ color: #d14; }
+ .highlight .sd {
+ color: #d14; }
+ .highlight .s2 {
+ color: #d14; }
+ .highlight .se {
+ color: #d14; }
+ .highlight .sh {
+ color: #d14; }
+ .highlight .si {
+ color: #d14; }
+ .highlight .sx {
+ color: #d14; }
+ .highlight .sr {
+ color: #009926; }
+ .highlight .s1 {
+ color: #d14; }
+ .highlight .ss {
+ color: #990073; }
+ .highlight .bp {
+ color: #999; }
+ .highlight .vc {
+ color: #008080; }
+ .highlight .vg {
+ color: #008080; }
+ .highlight .vi {
+ color: #008080; }
+ .highlight .il {
+ color: #099; }
diff --git a/_site/develop/index.html b/_site/develop/index.html
new file mode 100644
index 00000000..408bca13
--- /dev/null
+++ b/_site/develop/index.html
@@ -0,0 +1,505 @@
+
+
+
+
+
+
+
+ Develop - SUAVE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+