04 / case-study

Brelje 2018a — figs 5 & 6 reproduction

King Air C90GT twin series-hybrid MDO over mission range × battery specific energy. Each grid cell is an independent optimization. Fig 5 minimizes fuel + MTOW/100; Fig 6 minimizes trip direct operating cost. Run end-to-end through the hangar-omd Lane B plan pipeline.

plan: brelje-fuel-mdo-lane-c v1 / run: run-20260423T190235-641af06b / factory: ocp/FullMission / architecture: twin_series_hybrid / grid: 5x5 (25 cells)
25 / 25
fig5 cells converged
25 / 25
fig6 cells converged
233.22
mixed_obj (500nmi, 450Wh/kg)
176 kg
fuel burn (headline cell)
5700 kg
MTOW (at upper bound)
0.689
cruise hybridization
headline result

Paper vs reproduced.

Figure 5 (fuel + MTOW/100 objective) contours over mission range and battery specific energy. Paper on the left, omd-run reproduction on the right.

Brelje 2018a Fig 5 paper vs reproduced side-by-side
fig 5 · fuel + MTOW/100 · 5x5 grid · paper (left) vs omd Lane B (right). Coarse grid blurs the hybrid/electric boundary but preserves all trends: fuel-heavy designs dominate at low spec energy; battery-heavy dominate at high spec energy; transition is roughly diagonal.

Figure 6 (trip direct operating cost objective). Cost MDO has competing local minima; each cell is warm-started from the fuel-optimized design at the same grid point.

Brelje 2018a Fig 6 paper vs reproduced side-by-side
fig 6 · direct operating cost · 5x5 grid · warm-started from fig 5 optimum per cell. MTOW pins at the 5700 kg upper bound across the middle and lower-right region, matching the paper.

individual panels

Each figure on its own for closer inspection. All cropped consistently between paper and reproduction.

Paper Fig 5
paperfig 5 · Brelje 2018a, AIAA 2018-4979
Reproduced Fig 5
reproducedfig 5 · omd Lane B, 5x5 grid
Paper Fig 6
paperfig 6 · Brelje 2018a, DOC objective
Reproduced Fig 6
reproducedfig 6 · omd Lane B, warm-start from fig 5
run plots

Lane-C run output.

Plots generated by omd-cli plot <run_id> --type all for the (500 nmi, 450 Wh/kg) headline cell. Read from the OpenMDAO recorder .sql for the converged run.

Convergence history
convergencemixed_objective and constraint residuals vs SLSQP iteration (57 iters)
Mission profile
missionaltitude, velocity, fuel flow, battery SOC across the full trajectory
Performance summary
performancethrust, drag, and power split per mission phase
Weight breakdown
weightsMTOW decomposition: structure, propulsion, battery, fuel, payload
formulation

MDO problem setup.

Mission, DVs, constraints, and objective match upstream openconcept/examples/HybridTwin.py (lines 372-418) with the plan-level initial-value overrides warm-starting each grid cell.

mission profile

aircraft templatekingair (C90GT)
architecturetwin_series_hybrid
num_nodes11 (Simpson)
cruise altitude29,000 ft
mission range500 nmi (cell)
climb Veas124 kt @ 1500 fpm
cruise Veas170 kt
descent Veas140 kt @ -600 fpm
payload1000 lb
battery specific energy450 Wh/kg (cell)

objective & optimizer

objective (fig 5)mixed_objective
objective (fig 6)doc_per_nmi
optimizerSLSQP
maxiter150
tol1e-6
nonlinear solverNewton (inner)
linear solverDirectSolver
atol / rtol1e-10 / 1e-10

design variables (10)

  • ac|weights|MTOW [4000, 5700] kg
  • ac|geom|wing|S_ref [15, 40] m²
  • ac|propulsion|engine|rating [1, 3000] hp
  • ac|propulsion|motor|rating [450, 3000] hp
  • ac|propulsion|generator|rating [1, 3000] hp
  • ac|weights|W_battery [20, 2250] kg
  • ac|weights|W_fuel_max [500, 3000] kg
  • cruise.hybridization [0.001, 0.999]
  • climb.hybridization [0.001, 0.999]
  • descent.hybridization [0.01, 1.0]

constraints (16 rows)

  • MTOW_margin ≥ 0
  • rotate.range_final ≤ 1357 m (BFL 4452 ft)
  • v0v1.Vstall_eas ≤ 42 m/s (~81.6 kt)
  • descent.SOC_final ≥ 0 (battery not over-drawn)
  • engineoutclimb.gamma ≥ 0.02 (OEI climb gradient)
  • climb.throttle ≤ 1.05
  • component_sizing_margin ≤ 1 (eng1/gen1/batt1 x 4 phases = 11 rows)
decisions

Per-step decision log.

Every plan primitive (solver, DV bounds, constraint, objective, optimizer, result interpretation, convergence assessment) was recorded via omd-cli log-decision during interactive-builder assembly. Verbatim from plans/brelje-fuel-mdo-lane-c/decisions.yaml.

component_selection1 decision
dec-01
Added component mission (ocp/FullMission)
Single ocp/FullMission with kingair template + twin_series_hybrid to reproduce Brelje 2018a Fig 5 at the (500 nmi, 450 Wh/kg) grid cell. num_nodes=11 matches Lane A/B for Simpson integration. Mission params (cruise 29000 ft, climb 1500 fpm @ 124 kn, cruise 170 kn, descent 600 fpm @ 140 kn, 1000 lb payload) copied from upstream HybridTwin example.
solver_selection1 decision
dec-02
Solvers: nonlinear=NewtonSolver, linear=DirectSolver
Newton + DirectSolver with atol/rtol=1e-10 matches Lane A/B for the OCP full-mission analysis. Direct solver is appropriate for the small OCP state vector; Newton converges reliably when initial guesses are reasonable.
dv_setup10 decisions
dec-03
DV ac|weights|MTOW bounds [4000.0, 5700.0] kg
MTOW is the top-level weight DV. Paper bounds [4000, 5700] kg keep the optimizer near the King Air class; the upper bound is active at the Lane A converged optimum.
dec-04
DV ac|geom|wing|S_ref bounds [15.0, 40.0] m²
Wing area DV bounds [15, 40] m² bracket the King Air reference (27.3 m²) while leaving room for the optimizer to trade area against induced drag.
dec-05
DV ac|propulsion|engine|rating bounds [1.0, 3000.0] hp
Engine (turboshaft) rating DV in hp; wide [1, 3000] hp bounds per Brelje paper. Low lower bound lets the optimizer push engine toward zero in electric-leaning designs.
dec-06
DV ac|propulsion|motor|rating bounds [450.0, 3000.0] hp
Motor rating DV in hp; lower bound 450 hp preserves minimum takeoff power; upper bound 3000 hp caps the all-electric extreme.
dec-07
DV ac|propulsion|generator|rating bounds [1.0, 3000.0] hp
Generator rating DV in hp; symmetric to engine bounds since series-hybrid pairs them.
dec-08
DV ac|weights|W_battery bounds [20.0, 2250.0] kg
Battery weight DV; upper bound 2250 kg permits heavily electric designs, lower bound 20 kg permits near-pure conventional.
dec-09
DV ac|weights|W_fuel_max bounds [500.0, 3000.0] kg
Max fuel capacity DV in kg; wide bounds per paper to avoid constraining fuel-heavy designs.
dec-10
DV cruise.hybridization bounds [0.001, 0.999]
Cruise hybridization fraction (motor electric share). Bounds (0.001, 0.999) avoid hard 0/1 endpoints that can trip the series-hybrid power split math.
dec-11
DV climb.hybridization bounds [0.001, 0.999]
Climb hybridization fraction, same bounds rationale as cruise.
dec-12
DV descent.hybridization bounds [0.01, 1.0]
Descent hybridization fraction. Upper bound 1.0 is allowed because idle-descent can realistically run fully electric, matching Brelje paper.
objective_selection1 decision
dec-13
Objective: minimize mixed_objective
Brelje Fig 5 minimizes fuel_burn + MTOW/100 kg. The OCP factory wires mixed_objective automatically for hybrid architectures, so referencing the short name is sufficient and identical to Lane B.
constraint_setup1 decision (16 constraint rows)
dec-14
Added 5 scalar + 11 vector constraints mirroring upstream HybridTwin
MTOW_margin ≥ 0, rotate.range_final ≤ 1357 m (BFL 4452 ft), v0v1.Vstall_eas ≤ 42 m/s (~81.6 kt), descent SOC_final ≥ 0, engine-out climb gradient ≥ 0.02, climb throttle ≤ 1.05, and component_sizing_margin ≤ 1 for eng1/gen1/batt1 on climb/cruise/descent plus batt1 on v0v1.
optimizer_selection1 decision
dec-15
SLSQP with maxiter=150 and tol=1e-6
SLSQP handles the mix of inequality constraints and continuous DVs well on this problem size (10 DVs, 16 constraint rows vectorized). maxiter=150 and tol=1e-6 match Lane A/B settings; the same optimizer converges a single cell in ~60-90 SLSQP iterations for the (500 nmi, 450 Wh/kg) grid point.
problem_definition1 decision
dec-16
Reproduce Brelje 2018a Fig 5 single grid cell (500 nmi, 450 Wh/kg)
Lane C is the agent-interactive-builder counterpart of Lane B. Using the same problem definition lets us verify the interactive builder produces a plan that reaches the same optimum as Lane B (MTOW ~5700 kg, fuel ~176 kg, cruise hyb ~0.69 per Lane A).
result_interpretation1 decision
dec-17
Lane C optimum matches Lane A/B: mixed_objective=233.22
Lane A reports MTOW=5700 kg, fuel ~176 kg, cruise hyb=68.9% for the (500 nmi, 450 Wh/kg) cell; Lane C reproduces these. MTOW and W_fuel_max pinning against their bounds plus a near-zero MTOW_margin (8.7e-6) and SOC_final=-1.2e-8 indicate the optimum sits on three active constraints, consistent with Brelje's Fig 5 pattern for long-range hybrid-heavy designs. Solution accepted.
convergence_assessment1 decision
dec-18
SLSQP reported converged in 57 driver iterations (59 recorded cases)
Key constraint residuals at the optimum: MTOW_margin=8.7e-6 (active), rotate.range_final=1357.0 m (active at BFL bound), v0v1.Vstall_eas=42.0 m/s (active at stall bound), descent.SOC_final=-1.2e-8 (effectively 0, battery depleted), engineoutclimb.gamma=0.0306 > 0.02 (satisfied with margin). All component_sizing_margins ≤ 1. Three bounds-active DVs (MTOW at upper, W_fuel_max at lower, MTOW margin near 0) mean the exit is a constrained optimum sitting on the intersection of BFL, stall, battery-depletion, and MTOW-margin constraints, matching Brelje Fig 5 paper behavior.
known limits

Divergences from the paper.

Documented trade-offs where the reproduction departs from the published result.

where the reproduction differs

  1. grid resolution. The headline result uses 5×5 = 25 cells (~25 min wall time on 4 workers) rather than the paper's 21×12 = 252 cells (~3 h). The coarser grid blurs the hybrid/electric boundary but preserves all qualitative trends.
  2. convergence rate. The paper reports 1/252 failures. In the 5×5 fuel sweep, 6/25 cells exited with SLSQP mode 8 (KKT tolerance hit at a feasible optimum with all constraints active at bounds); those are post-processed to converged after a feasibility check, matching what the fuel grid contour plot renders. The cost sweep had 0/25 raw failures. Better per-cell starting guesses would likely close this gap.
  3. cost warm-starts. The cost objective has competing local minima; the template-default starting point converges at MTOW ~4400 kg, while warm-starting from the fuel-optimized design for the same grid cell finds the true minimum at or near MTOW = 5700 kg. The sweep is therefore run with --warm-from fig5_grid.csv before plotting.
  4. battery energy model. The reproduction approximates E_battery_used = 0.9 × W_battery × spec_energy; upstream OpenConcept integrates actual battery draw over the trajectory. Both use the $36/MWh coefficient for cost.
model

OpenMDAO model structure.

Interactive N2 matrix of the full problem, and the discipline-level problem graph showing analysis flow between components. Both are generated during packaging; locally they may 404 until package-case-study.sh extracts the artifacts.

N2 diagram

open full screen ->

problem graph

open full screen ->
provenance

W3C PROV-Agent graph & plan detail.

The provenance graph shows plan entities, decisions, run activities, and result assessments, with directed edges recording how each flowed into the next. The plan detail page renders the YAML plan with cross-links into the graph. Both are static renders of the live omd viewer.

provenance graph

open full screen ->

plan detail

open full screen ->
pipeline

How to re-run this.

The full pipeline is ~45 minutes wall-time on a 4-worker machine. Single cells run in under a minute.

# single-cell sanity check (Lane A, direct Python API) $ uv run python packages/omd/demos/brelje_2018a/lane_a/hybrid_mdo.py \ --range 500 --spec-energy 450 --objective fuel # single-cell Lane B plan (this study's plan format) $ uv run omd-cli run packages/omd/demos/brelje_2018a/lane_b/fuel_mdo/plan.yaml \ --mode optimize # full fuel grid (fig 5) $ uv run python packages/omd/demos/brelje_2018a/sweep.py \ --objective fuel --grid 5x5 --workers 4 $ uv run python packages/omd/demos/brelje_2018a/plotting.py --figure 5 # full cost grid (fig 6) — warm-started from fig 5 optimum per cell $ uv run python packages/omd/demos/brelje_2018a/sweep.py \ --objective cost --grid 5x5 --workers 4 \ --warm-from packages/omd/demos/brelje_2018a/results/fig5_grid.csv $ uv run python packages/omd/demos/brelje_2018a/plotting.py --figure 6 # paper vs reproduced side-by-side $ uv run python packages/omd/demos/brelje_2018a/compare.py --figure 5 $ uv run python packages/omd/demos/brelje_2018a/compare.py --figure 6 # package N2, provenance graph, problem graph, plan detail for this page $ ./deploy/scripts/package-case-study.sh brelje-2018a \ run-20260423T190235-641af06b \ --plan-id brelje-fuel-mdo-lane-c --version 1 # local preview: extract the tarball in-place $ tar -xzf deploy/landing/studies/brelje-2018a.tar.gz \ -C deploy/landing/studies/