NOADS in 10 minutes#
This guide walks you through a complete optimization — from setting up an aviation decarbonization scenario to interpreting the results.
Prerequisites
Make sure you have installed NOADS and are familiar with the core concepts.
Step 1: Run a single-policy optimization#
The fastest way to get results is through the high-level API. This sets up a complete scenario (fleet, energy system, traffic demand, constraints) and runs the optimizer:
from noads.application.examples import single_policy_scenario_optimization
output = single_policy_scenario_optimization(
global_scenario_name="SSP2-26", # (1)!
technology_index=1, # (2)!
carbon_budget_percent=3.0, # (3)!
drop_in_only=False, # (4)!
fossil_kerosene_only=False, # (5)!
plot_optimum=True, # (6)!
save_optimum=True, # (7)!
)
Climate scenario: SSP2 pathway with 2.6 W/m² forcing (≈2°C target).
Technology level:
0= pessimistic,1= mid,2= optimistic assumptions for battery density, motor power, structural efficiency, etc.Carbon budget share: aviation gets 3% of the global remaining CO₂ budget.
Drop-in only: if
True, restricts to kerosene-compatible fuels (no hydrogen, no batteries).Fossil kerosene only: if
True, disables all alternative fuels (baseline scenario).Plot: automatically generates result plots.
Save: writes the optimal solution to disk for later reuse.
The optimizer (NLOPT SLSQP with JAX-computed gradients) typically converges in a few minutes. You will see an optimization history and result plots showing emissions, fleet composition, and energy mix trajectories from 2025 to 2075.
Step 2: Understand the scenario setup#
Behind the scenes, single_policy_scenario_optimization calls single_scenario_setup,
which you can also use directly for more control:
from noads.application.scenario_setup import single_scenario_setup
scenario, design_space, constraints, energy_mix, fleet = single_scenario_setup(
name="my_scenario",
background_scenario_name="SSP2-26",
start_year=2025,
end_year=2075,
technology_index=1,
)
This returns five objects:
Object |
Type |
What it contains |
|---|---|---|
|
|
The assembled time-dependent model (fleet + energy + traffic) |
|
GEMSEO |
Decision variables: fuel blend shares, aircraft entry dates, market shares |
|
|
Inequality constraints: carbon budget, resource limits, feasibility bounds |
|
|
The energy production system (pathways, carriers, impacts) |
|
|
The aircraft fleet (current + new aircraft, market segments) |
Step 3: Run the optimizer with GEMSEO#
With these objects, you have full control over the optimization:
from gemseo import create_scenario
gemseo_scenario = create_scenario(
disciplines=[scenario.discipline],
formulation_name="DisciplinaryOpt",
objective_name="cumulative.CO2",
design_space=design_space,
)
# Add constraints
for name, (value, positive) in constraints.items():
gemseo_scenario.add_constraint(name, "ineq", value=value, positive=positive)
# Run
gemseo_scenario.execute(
algo_name="NLOPT_SLSQP",
max_iter=2000,
ftol_rel=1e-15,
ineq_tolerance=1e-4,
)
# Retrieve optimal outputs
x_opt = gemseo_scenario.optimization_result.x_opt_as_dict
output = scenario.discipline.execute(x_opt)
Step 4: Visualize results#
from noads.application.visualization import plot_single_scenario_result
plot_single_scenario_result(
scenario_name="SSP2-26",
output_optimal={**x_opt, **output},
energy_mix=energy_mix,
fleet=fleet,
low_demand=False, # True only for the low-demand (supply-cap) formulation
save_figs=True,
directory_path="results/my_scenario", # created automatically if missing
)
This generates plots for:
Emissions: CO₂ trajectory vs. the allocated carbon budget
Fleet composition: market shares of conventional and new aircraft over time
Energy mix: evolution of fuel types (fossil kerosene, biofuel, e-fuel, hydrogen)
Traffic: RPK demand trajectory with demand avoidance effects
Step 5: Compare scenarios#
To explore how results change across climate futures or technology assumptions, loop over configurations:
import itertools
scenarios = ["SSP1-19", "SSP2-26", "SSP5-45"]
tech_levels = [0, 1, 2] # lower, mid, upper
for scenario_name, tech in itertools.product(scenarios, tech_levels):
output = single_policy_scenario_optimization(
global_scenario_name=scenario_name,
technology_index=tech,
save_optimum=True,
plot_optimum=False, # plot later in batch
)
For robust optimization across multiple SSP pathways simultaneously, use the multi-scenario API:
from noads.application.scenario_setup import multi_scenario_setup
multi_scenario, design_space, constraints, energy_mix, fleet = multi_scenario_setup(
name="robust",
background_scenario_names=["SSP1-19", "SSP2-26", "SSP5-45"],
start_year=2025,
end_year=2075,
technology_index=1,
)
This finds a single policy that performs well across all three climate futures.
Step 6: Load and replot saved results#
Saved results can be reloaded without re-running the optimization:
output = single_policy_scenario_optimization(
global_scenario_name="SSP2-26",
technology_index=1,
load_optimum=True, # load from disk
plot_optimum=True, # regenerate plots
)
What’s next?#
Extended paper: the companion paper with the full models, formulations, and results.
Extending the analysis: add aircraft, energy pathways, or resources, and quantify uncertainty.
Examples: runnable scripts covering aircraft design, energy pathways, demand calibration, and the optimized scenario families.
API reference: full class and function documentation.