Coupled Aircraft-Mission Optimization#

One of the most exciting features of Aviary is the ability to formulate and solve coupled aircraft-mission design optimization problems. Here, we mean that we are finding the optimal aircraft design parameters while simultaneously finding the optimal mission trajectory. The reason why this is so valuable is that it enables exploration of a larger design space much more efficiently.

Solving coupled design-mission problems leads to optimal designs that would not be findable without simultaneously designing the aircraft and the trajectory. This is especially useful for unconventional aircraft designs, operations with complex missions, and many more future-focused studies than what is commonly flying today.

This doc page builds up a coupled design problem and explains what we’re doing along the way. This process is relatively straightforward in Aviary. We will briefly discuss the optimal results, but that is not necessarily the focus here. Instead, we want to showcase how to do a simple coupled design study in Aviary.

You can use this as a starting point for your own exciting aircraft and mission design studies.

Problem Definition and Explanation#

We will use a conventional single-aisle commercial aircraft design as our starting point. For all of these examples we allow the aircraft to be sized by the optimizer. This means the gross takeoff weight is controlled to meet a mass balance.

We will perform four different optimization cases as part of this study:

  • fixed mission profile, fixed aircraft wing aspect ratio

  • fixed mission profile, optimized aircraft wing aspect ratio

  • optimized mission profile, fixed aircraft wing aspect ratio

  • optimized mission profile, optimized aircraft wing aspect ratio

We’ll provide more detail individually for each case.

When we call Aviary, we will use a common phase_info object that we modify for each optimization case shown here:

phase_info = {
    "pre_mission": {"include_takeoff": False, "optimize_mass": True},
    "climb_1": {
        "subsystem_options": {"core_aerodynamics": {"method": "computed"}},
        "user_options": {
            "optimize_mach": False,
            "optimize_altitude": False,
            "polynomial_control_order": 1,
            "num_segments": 5,
            "order": 3,
            "solve_for_distance": False,
            "initial_mach": (0.2, "unitless"),
            "final_mach": (0.72, "unitless"),
            "mach_bounds": ((0.18, 0.84), "unitless"),
            "initial_altitude": (0.0, "ft"),
            "final_altitude": (32500.0, "ft"),
            "altitude_bounds": ((0.0, 33000.0), "ft"),
            "throttle_enforcement": "path_constraint",
            "fix_initial": True,
            "constrain_final": False,
            "fix_duration": False,
            "initial_bounds": ((0.0, 0.0), "min"),
            "duration_bounds": ((35.0, 105.0), "min"),
        },
        "initial_guesses": {"time": ([0, 70], "min")},
    },
    "cruise": {
        "subsystem_options": {"core_aerodynamics": {"method": "computed"}},
        "user_options": {
            "optimize_mach": False,
            "optimize_altitude": False,
            "polynomial_control_order": 1,
            "num_segments": 5,
            "order": 3,
            "solve_for_distance": False,
            "initial_mach": (0.72, "unitless"),
            "final_mach": (0.80, "unitless"),
            "mach_bounds": ((0.7, 0.84), "unitless"),
            "initial_altitude": (32500.0, "ft"),
            "final_altitude": (36000.0, "ft"),
            "altitude_bounds": ((32000.0, 36500.0), "ft"),
            "throttle_enforcement": "boundary_constraint",
            "fix_initial": False,
            "constrain_final": False,
            "fix_duration": False,
            "initial_bounds": ((35.0, 105.0), "min"),
            "duration_bounds": ((91.5, 274.5), "min"),
        },
        "initial_guesses": {"time": ([70, 183], "min")},
    },
    "descent_1": {
        "subsystem_options": {"core_aerodynamics": {"method": "computed"}},
        "user_options": {
            "optimize_mach": False,
            "optimize_altitude": False,
            "polynomial_control_order": 1,
            "num_segments": 5,
            "order": 3,
            "solve_for_distance": False,
            "initial_mach": (0.72, "unitless"),
            "final_mach": (0.21, "unitless"),
            "mach_bounds": ((0.19, 0.84), "unitless"),
            "initial_altitude": (36000.0, "ft"),
            "final_altitude": (0.0, "ft"),
            "altitude_bounds": ((0.0, 36500.0), "ft"),
            "throttle_enforcement": "path_constraint",
            "fix_initial": False,
            "constrain_final": True,
            "fix_duration": False,
            "initial_bounds": ((126.5, 379.5), "min"),
            "duration_bounds": ((25.0, 75.0), "min"),
        },
        "initial_guesses": {"time": ([253, 50], "min")},
    },
    "post_mission": {
        "include_landing": False,
        "constrain_range": True,
        "target_range": (2080, "nmi"),
    },
}

Now, let us explain each case, formulate the Aviary problem, and optimize. We’ll discuss the results from each case and explain why they vary.

Fixed Mission Profile, Fixed Aircraft Wing Aspect Ratio#

First, let us run Aviary with a simple setup: fly a prescribed mission profile with an unchanged wing design. Here we are varying the durations of each of the phases (climb, cruise, and descent) to minimize fuel burn across the mission. The altitude and Mach profiles of the mission are fixed because optimize_altitude = False and optimize_mach = False for each of the phases in the phase_info object.

import aviary.api as av

aircraft_filename = 'models/test_aircraft/aircraft_for_bench_FwFm.csv'
optimizer = "IPOPT"
make_plots = True
max_iter = 200

prob = av.run_aviary(aircraft_filename, phase_info, optimizer=optimizer,
                     make_plots=make_plots, max_iter=max_iter)
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/pyoptsparse/pyOpt_MPI.py:68: UserWarning: mpi4py could not be imported. mpi4py is required to use the parallel gradient analysis and parallel objective analysis for non-gradient based optimizers. Continuing using a dummy MPI module from pyOptSparse.
  warnings.warn(warn)
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/dymos/phase/phase.py:897: OMDeprecationWarning:None: The method `add_polynomial_control` is deprecated and will be removed in Dymos 2.1. Please use `add_control` with the appropriate options to define a polynomial control.
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/dymos/phase/phase.py:2323: RuntimeWarning: Invalid options for non-optimal control 'mach' in phase 'climb_1': lower, upper, ref
  warnings.warn(f"Invalid options for non-optimal control '{name}' in phase "
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/dymos/phase/phase.py:2323: RuntimeWarning: Invalid options for non-optimal control 'altitude' in phase 'climb_1': lower, upper, ref
  warnings.warn(f"Invalid options for non-optimal control '{name}' in phase "
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/dymos/phase/phase.py:2323: RuntimeWarning: Invalid options for non-optimal control 'mach' in phase 'cruise': lower, upper, ref
  warnings.warn(f"Invalid options for non-optimal control '{name}' in phase "
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/dymos/phase/phase.py:2323: RuntimeWarning: Invalid options for non-optimal control 'altitude' in phase 'cruise': lower, upper, ref
  warnings.warn(f"Invalid options for non-optimal control '{name}' in phase "
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/dymos/phase/phase.py:2323: RuntimeWarning: Invalid options for non-optimal control 'mach' in phase 'descent_1': lower, upper, ref
  warnings.warn(f"Invalid options for non-optimal control '{name}' in phase "
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/dymos/phase/phase.py:2323: RuntimeWarning: Invalid options for non-optimal control 'altitude' in phase 'descent_1': lower, upper, ref
  warnings.warn(f"Invalid options for non-optimal control '{name}' in phase "
The following variables have been overridden:
  'aircraft:design:touchdown_mass  152800  lbm
  'aircraft:engine:mass  [7400.]  lbm
  'aircraft:fins:mass  0  lbm
  'aircraft:fuel:auxiliary_fuel_capacity  0  lbm
  'aircraft:fuel:fuselage_fuel_capacity  0  lbm
  'aircraft:fuel:total_capacity  45694  lbm
  'aircraft:fuselage:planform_area  1578.24  ft**2
  'aircraft:fuselage:wetted_area  4158.62  ft**2
  'aircraft:horizontal_tail:wetted_area  592.65  ft**2
  'aircraft:landing_gear:main_gear_oleo_length  102  inch
  'aircraft:landing_gear:nose_gear_oleo_length  67  inch
  'aircraft:vertical_tail:wetted_area  581.13  ft**2
  'aircraft:wing:aspect_ratio  11.22091  unitless
  'aircraft:wing:control_surface_area  137  ft**2
  'aircraft:wing:wetted_area  2396.56  ft**2
--- Constraint Report [traj] ---
    --- climb_1 ---
        [path]    0.0000e+00 <= throttle <= 1.0000e+00  [unitless]
    --- cruise ---
        [initial] 0.0000e+00 <= throttle <= 1.0000e+00  [unitless]
        [final]   0.0000e+00 <= throttle <= 1.0000e+00  [unitless]
    --- descent_1 ---
        [path]    0.0000e+00 <= throttle <= 1.0000e+00  [unitless]
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/openmdao/solvers/linear/linear_rhs_checker.py:178: SolverWarning:DirectSolver in 'traj.phases.cruise.indep_states' <class StateIndependentsComp>: 'rhs_checking' is active but no redundant adjoint dependencies were found, so caching has been disabled.
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/openmdao/solvers/linear/linear_rhs_checker.py:178: SolverWarning:DirectSolver in 'traj.phases.descent_1.indep_states' <class StateIndependentsComp>: 'rhs_checking' is active but no redundant adjoint dependencies were found, so caching has been disabled.
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/openmdao/recorders/sqlite_recorder.py:226: UserWarning:The existing case recorder file, problem_history.db, is being overwritten.
Model viewer data has already been recorded for Driver.
Model viewer data has already been recorded for Driver.
Full total jacobian for problem 'aircraft_for_bench_FwFm' was computed 3 times, taking 0.6637867079999751 seconds.
Total jacobian shape: (137, 96) 


Jacobian shape: (137, 96)  (7.93% nonzero)
FWD solves: 12   REV solves: 0
Total colors vs. total size: 12 vs 96  (87.50% improvement)

Sparsity computed using tolerance: 1e-25
Time to compute sparsity:   0.6638 sec
Time to compute coloring:   0.0526 sec
Memory to compute coloring:   0.1250 MB
Coloring created on: 2024-11-19 19:01:17
This is Ipopt version 3.14.16, running with linear solver MUMPS 5.7.3.

Number of nonzeros in equality constraint Jacobian...:      672
Number of nonzeros in inequality constraint Jacobian.:      369
Number of nonzeros in Lagrangian Hessian.............:        0

Total number of variables............................:       96
                     variables with only lower bounds:        2
                variables with lower and upper bounds:       94
                     variables with only upper bounds:        0
Total number of equality constraints.................:       94
Total number of inequality constraints...............:       42
        inequality constraints with only lower bounds:        0
   inequality constraints with lower and upper bounds:       42
        inequality constraints with only upper bounds:        0

iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
   0  3.0000000e-01 2.07e+02 3.34e-02  -5.0 0.00e+00    -  0.00e+00 0.00e+00   0
  10  2.6750522e+00 7.93e-13 4.42e-02  -5.0 4.18e-04    -  6.61e-01 1.00e+00h  1
Number of Iterations....: 18

                                   (scaled)                 (unscaled)
Objective...............:   2.6162332481284043e+00    2.6162332481284043e+00
Dual infeasibility......:   5.3420717187063623e-07    5.3420717187063623e-07
Constraint violation....:   9.2258695297424742e-16    9.2258695297424742e-16
Variable bound violation:   0.0000000000000000e+00    0.0000000000000000e+00
Complementarity.........:   9.5920737410744833e-08    9.5920737410744833e-08
Overall NLP error.......:   5.3420717187063623e-07    5.3420717187063623e-07


Number of objective function evaluations             = 27
Number of objective gradient evaluations             = 19
Number of equality constraint evaluations            = 27
Number of inequality constraint evaluations          = 27
Number of equality constraint Jacobian evaluations   = 20
Number of inequality constraint Jacobian evaluations = 20
Number of Lagrangian Hessian evaluations             = 0
Total seconds in IPOPT                               = 11.156

EXIT: Optimal Solution Found.
minimal_print is not available for this solution


Optimization Problem -- Optimization using pyOpt_sparse
================================================================================
    Objective Function: _objfunc

    Solution: 
--------------------------------------------------------------------------------
    Total Time:                   11.1576
       User Objective Time :       9.2505
       User Sensitivity Time :     1.7831
       Interface Time :            0.0562
       Opt Solver Time:            0.0678
    Calls to Objective Function :      28
    Calls to Sens Function :           21


   Objectives
      Index  Name                               Value
          0  mission:objectives:fuel     2.616233E+00

   Variables (c - continuous, i - integer, d - discrete)
      Index  Name                                Type      Lower Bound            Value      Upper Bound     Status
          0  mission:design:gross_mass_0            c     5.714286E-05     9.144013E-01     1.000000E+30           
          1  mission:summary:gross_mass_0           c     5.714286E-05     9.144013E-01     1.000000E+30           
          2  traj.climb_1.t_duration_0              c     5.000000E-01     6.105531E-01     1.500000E+00           
          3  traj.climb_1.states:mass_0             c     0.000000E+00     7.258396E+00     1.000000E+17           
          4  traj.climb_1.states:mass_1             c     0.000000E+00     7.245468E+00     1.000000E+17           
          5  traj.climb_1.states:mass_2             c     0.000000E+00     7.229700E+00     1.000000E+17           
          6  traj.climb_1.states:mass_3             c     0.000000E+00     7.225045E+00     1.000000E+17           
          7  traj.climb_1.states:mass_4             c     0.000000E+00     7.204817E+00     1.000000E+17           
          8  traj.climb_1.states:mass_5             c     0.000000E+00     7.179560E+00     1.000000E+17           
          9  traj.climb_1.states:mass_6             c     0.000000E+00     7.171877E+00     1.000000E+17           
         10  traj.climb_1.states:mass_7             c     0.000000E+00     7.151413E+00     1.000000E+17           
         11  traj.climb_1.states:mass_8             c     0.000000E+00     7.123555E+00     1.000000E+17           
         12  traj.climb_1.states:mass_9             c     0.000000E+00     7.114702E+00     1.000000E+17           
         13  traj.climb_1.states:mass_10            c     0.000000E+00     7.097651E+00     1.000000E+17           
         14  traj.climb_1.states:mass_11            c     0.000000E+00     7.073993E+00     1.000000E+17           
         15  traj.climb_1.states:mass_12            c     0.000000E+00     7.066448E+00     1.000000E+17           
         16  traj.climb_1.states:mass_13            c     0.000000E+00     7.057965E+00     1.000000E+17           
         17  traj.climb_1.states:mass_14            c     0.000000E+00     7.046182E+00     1.000000E+17           
         18  traj.climb_1.states:mass_15            c     0.000000E+00     7.042429E+00     1.000000E+17           
         19  traj.climb_1.states:distance_0         c     0.000000E+00     7.645341E-03     1.000000E+15           
         20  traj.climb_1.states:distance_1         c     0.000000E+00     1.942090E-02     1.000000E+15           
         21  traj.climb_1.states:distance_2         c     0.000000E+00     2.344157E-02     1.000000E+15           
         22  traj.climb_1.states:distance_3         c     0.000000E+00     4.409419E-02     1.000000E+15           
         23  traj.climb_1.states:distance_4         c     0.000000E+00     7.749856E-02     1.000000E+15           
         24  traj.climb_1.states:distance_5         c     0.000000E+00     8.923161E-02     1.000000E+15           
         25  traj.climb_1.states:distance_6         c     0.000000E+00     1.239359E-01     1.000000E+15           
         26  traj.climb_1.states:distance_7         c     0.000000E+00     1.782763E-01     1.000000E+15           
         27  traj.climb_1.states:distance_8         c     0.000000E+00     1.969907E-01     1.000000E+15           
         28  traj.climb_1.states:distance_9         c     0.000000E+00     2.350312E-01     1.000000E+15           
         29  traj.climb_1.states:distance_10        c     0.000000E+00     2.917168E-01     1.000000E+15           
         30  traj.climb_1.states:distance_11        c     0.000000E+00     3.106441E-01     1.000000E+15           
         31  traj.climb_1.states:distance_12        c     0.000000E+00     3.324169E-01     1.000000E+15           
         32  traj.climb_1.states:distance_13        c     0.000000E+00     3.633989E-01     1.000000E+15           
         33  traj.climb_1.states:distance_14        c     0.000000E+00     3.734283E-01     1.000000E+15           
         34  traj.cruise.t_duration_0               c     5.000000E-01     1.268901E+00     1.500000E+00           
         35  traj.cruise.states:mass_0              c     0.000000E+00     7.009305E+00     1.000000E+17           
         36  traj.cruise.states:mass_1              c     0.000000E+00     6.963675E+00     1.000000E+17           
         37  traj.cruise.states:mass_2              c     0.000000E+00     6.949250E+00     1.000000E+17           
         38  traj.cruise.states:mass_3              c     0.000000E+00     6.881883E+00     1.000000E+17           
         39  traj.cruise.states:mass_4              c     0.000000E+00     6.789145E+00     1.000000E+17           
         40  traj.cruise.states:mass_5              c     0.000000E+00     6.759835E+00     1.000000E+17           
         41  traj.cruise.states:mass_6              c     0.000000E+00     6.680108E+00     1.000000E+17           
         42  traj.cruise.states:mass_7              c     0.000000E+00     6.570188E+00     1.000000E+17           
         43  traj.cruise.states:mass_8              c     0.000000E+00     6.535402E+00     1.000000E+17           
         44  traj.cruise.states:mass_9              c     0.000000E+00     6.468326E+00     1.000000E+17           
         45  traj.cruise.states:mass_10             c     0.000000E+00     6.375513E+00     1.000000E+17           
         46  traj.cruise.states:mass_11             c     0.000000E+00     6.346049E+00     1.000000E+17           
         47  traj.cruise.states:mass_12             c     0.000000E+00     6.312915E+00     1.000000E+17           
         48  traj.cruise.states:mass_13             c     0.000000E+00     6.267000E+00     1.000000E+17           
         49  traj.cruise.states:mass_14             c     0.000000E+00     6.252413E+00     1.000000E+17           
         50  traj.cruise.states:distance_0          c     0.000000E+00     4.991418E-01     1.000000E+15           
         51  traj.cruise.states:distance_1          c     0.000000E+00     6.734207E-01     1.000000E+15           
         52  traj.cruise.states:distance_2          c     0.000000E+00     7.287772E-01     1.000000E+15           
         53  traj.cruise.states:distance_3          c     0.000000E+00     9.889184E-01     1.000000E+15           
         54  traj.cruise.states:distance_4          c     0.000000E+00     1.351258E+00     1.000000E+15           
         55  traj.cruise.states:distance_5          c     0.000000E+00     1.466756E+00     1.000000E+15           
         56  traj.cruise.states:distance_6          c     0.000000E+00     1.783181E+00     1.000000E+15           
         57  traj.cruise.states:distance_7          c     0.000000E+00     2.224538E+00     1.000000E+15           
         58  traj.cruise.states:distance_8          c     0.000000E+00     2.365370E+00     1.000000E+15           
         59  traj.cruise.states:distance_9          c     0.000000E+00     2.638166E+00     1.000000E+15           
         60  traj.cruise.states:distance_10         c     0.000000E+00     3.017897E+00     1.000000E+15           
         61  traj.cruise.states:distance_11         c     0.000000E+00     3.138882E+00     1.000000E+15           
         62  traj.cruise.states:distance_12         c     0.000000E+00     3.274992E+00     1.000000E+15           
         63  traj.cruise.states:distance_13         c     0.000000E+00     3.463589E+00     1.000000E+15           
         64  traj.cruise.states:distance_14         c     0.000000E+00     3.523470E+00     1.000000E+15           
         65  traj.descent_1.t_duration_0            c     5.000000E-01     7.504809E-01     1.500000E+00           
         66  traj.descent_1.states:mass_0           c     0.000000E+00     6.250000E+00     1.000000E+17           
         67  traj.descent_1.states:mass_1           c     0.000000E+00     6.246737E+00     1.000000E+17           
         68  traj.descent_1.states:mass_2           c     0.000000E+00     6.245719E+00     1.000000E+17           
         69  traj.descent_1.states:mass_3           c     0.000000E+00     6.241087E+00     1.000000E+17           
         70  traj.descent_1.states:mass_4           c     0.000000E+00     6.235070E+00     1.000000E+17           
         71  traj.descent_1.states:mass_5           c     0.000000E+00     6.233268E+00     1.000000E+17           
         72  traj.descent_1.states:mass_6           c     0.000000E+00     6.228618E+00     1.000000E+17           
         73  traj.descent_1.states:mass_7           c     0.000000E+00     6.223037E+00     1.000000E+17           
         74  traj.descent_1.states:mass_8           c     0.000000E+00     6.221508E+00     1.000000E+17           
         75  traj.descent_1.states:mass_9           c     0.000000E+00     6.218581E+00     1.000000E+17           
         76  traj.descent_1.states:mass_10          c     0.000000E+00     6.214388E+00     1.000000E+17           
         77  traj.descent_1.states:mass_11          c     0.000000E+00     6.212942E+00     1.000000E+17           
         78  traj.descent_1.states:mass_12          c     0.000000E+00     6.211227E+00     1.000000E+17           
         79  traj.descent_1.states:mass_13          c     0.000000E+00     6.208648E+00     1.000000E+17           
         80  traj.descent_1.states:mass_14          c     0.000000E+00     6.207770E+00     1.000000E+17           
         81  traj.descent_1.states:distance_0       c     0.000000E+00     3.543194E+00     1.000000E+15           
         82  traj.descent_1.states:distance_1       c     0.000000E+00     3.569650E+00     1.000000E+15           
         83  traj.descent_1.states:distance_2       c     0.000000E+00     3.577836E+00     1.000000E+15           
         84  traj.descent_1.states:distance_3       c     0.000000E+00     3.614899E+00     1.000000E+15           
         85  traj.descent_1.states:distance_4       c     0.000000E+00     3.662629E+00     1.000000E+15           
         86  traj.descent_1.states:distance_5       c     0.000000E+00     3.676885E+00     1.000000E+15           
         87  traj.descent_1.states:distance_6       c     0.000000E+00     3.713556E+00     1.000000E+15           
         88  traj.descent_1.states:distance_7       c     0.000000E+00     3.758840E+00     1.000000E+15           
         89  traj.descent_1.states:distance_8       c     0.000000E+00     3.771846E+00     1.000000E+15           
         90  traj.descent_1.states:distance_9       c     0.000000E+00     3.795045E+00     1.000000E+15           
         91  traj.descent_1.states:distance_10      c     0.000000E+00     3.822951E+00     1.000000E+15           
         92  traj.descent_1.states:distance_11      c     0.000000E+00     3.830767E+00     1.000000E+15           
         93  traj.descent_1.states:distance_12      c     0.000000E+00     3.838940E+00     1.000000E+15           
         94  traj.descent_1.states:distance_13      c     0.000000E+00     3.849175E+00     1.000000E+15           
         95  traj.descent_1.states:distance_14      c     0.000000E+00     3.852160E+00     1.000000E+15           

   Constraints (i - inequality, e - equality)
      Index  Name                                                      Type          Lower           Value           Upper    Status  Lagrange Multiplier (N/A)
          0  mission:constraints:range_residual                           e   0.000000E+00    0.000000E+00    0.000000E+00              9.00000E+100
          1  gtow_constraint.GTOW                                         e   0.000000E+00    0.000000E+00    0.000000E+00              9.00000E+100
          2  link_climb_1_mass.mass                                       e   0.000000E+00    2.910383E-16    0.000000E+00              9.00000E+100
          3  mission:constraints:mass_residual                            e   0.000000E+00   -2.910383E-16    0.000000E+00              9.00000E+100
          4  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    9.225870E-16    0.000000E+00              9.00000E+100
          5  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    6.245672E-16    0.000000E+00              9.00000E+100
          6  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    4.107596E-16    0.000000E+00              9.00000E+100
          7  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    7.036494E-16    0.000000E+00              9.00000E+100
          8  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    2.150154E-16    0.000000E+00              9.00000E+100
          9  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00   -6.587748E-17    0.000000E+00              9.00000E+100
         10  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00   -1.499848E-16    0.000000E+00              9.00000E+100
         11  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00   -3.284319E-16    0.000000E+00              9.00000E+100
         12  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00   -4.793506E-16    0.000000E+00              9.00000E+100
         13  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00   -4.824868E-16    0.000000E+00              9.00000E+100
         14  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00   -6.636926E-16    0.000000E+00              9.00000E+100
         15  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00   -7.551492E-16    0.000000E+00              9.00000E+100
         16  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00   -4.611430E-16    0.000000E+00              9.00000E+100
         17  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00   -4.790857E-16    0.000000E+00              9.00000E+100
         18  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00   -5.528799E-16    0.000000E+00              9.00000E+100
         19  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    1.011347E-16    0.000000E+00              9.00000E+100
         20  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    9.178111E-17    0.000000E+00              9.00000E+100
         21  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    8.120745E-17    0.000000E+00              9.00000E+100
         22  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    1.604282E-16    0.000000E+00              9.00000E+100
         23  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    1.382655E-16    0.000000E+00              9.00000E+100
         24  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    1.164963E-16    0.000000E+00              9.00000E+100
         25  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    1.328897E-16    0.000000E+00              9.00000E+100
         26  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    1.184937E-16    0.000000E+00              9.00000E+100
         27  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    1.033182E-16    0.000000E+00              9.00000E+100
         28  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    8.174409E-17    0.000000E+00              9.00000E+100
         29  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    7.859672E-17    0.000000E+00              9.00000E+100
         30  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    7.107801E-17    0.000000E+00              9.00000E+100
         31  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    3.818505E-17    0.000000E+00              9.00000E+100
         32  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    3.304805E-17    0.000000E+00              9.00000E+100
         33  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    3.035112E-17    0.000000E+00              9.00000E+100
         34  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    2.402191E-16    0.000000E+00              9.00000E+100
         35  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    3.116306E-16    0.000000E+00              9.00000E+100
         36  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    2.751071E-16    0.000000E+00              9.00000E+100
         37  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    5.329011E-16    0.000000E+00              9.00000E+100
         38  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    5.069240E-16    0.000000E+00              9.00000E+100
         39  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    3.360320E-16    0.000000E+00              9.00000E+100
         40  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    5.512824E-16    0.000000E+00              9.00000E+100
         41  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    3.794341E-16    0.000000E+00              9.00000E+100
         42  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    2.770751E-16    0.000000E+00              9.00000E+100
         43  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    1.957558E-16    0.000000E+00              9.00000E+100
         44  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    1.573468E-16    0.000000E+00              9.00000E+100
         45  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    1.059493E-16    0.000000E+00              9.00000E+100
         46  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    7.813479E-17    0.000000E+00              9.00000E+100
         47  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    3.815885E-17    0.000000E+00              9.00000E+100
         48  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    6.359808E-19    0.000000E+00              9.00000E+100
         49  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    1.395524E-18    0.000000E+00              9.00000E+100
         50  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    6.977618E-19    0.000000E+00              9.00000E+100
         51  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    4.419158E-18    0.000000E+00              9.00000E+100
         52  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00   -2.850056E-18    0.000000E+00              9.00000E+100
         53  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    4.750093E-19    0.000000E+00              9.00000E+100
         54  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    1.425028E-18    0.000000E+00              9.00000E+100
         55  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    3.953174E-18    0.000000E+00              9.00000E+100
         56  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    5.647391E-19    0.000000E+00              9.00000E+100
         57  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    7.906347E-18    0.000000E+00              9.00000E+100
         58  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    1.377527E-17    0.000000E+00              9.00000E+100
         59  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00   -9.025177E-18    0.000000E+00              9.00000E+100
         60  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    1.045021E-17    0.000000E+00              9.00000E+100
         61  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    1.837440E-17    0.000000E+00              9.00000E+100
         62  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    2.325873E-19    0.000000E+00              9.00000E+100
         63  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    9.070904E-18    0.000000E+00              9.00000E+100
         64  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -3.793021E-17    0.000000E+00              9.00000E+100
         65  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00    6.753588E-19    0.000000E+00              9.00000E+100
         66  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00    1.418254E-17    0.000000E+00              9.00000E+100
         67  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -4.213534E-17    0.000000E+00              9.00000E+100
         68  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00    1.175382E-17    0.000000E+00              9.00000E+100
         69  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -1.728591E-17    0.000000E+00              9.00000E+100
         70  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00    2.953460E-17    0.000000E+00              9.00000E+100
         71  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00    1.046277E-17    0.000000E+00              9.00000E+100
         72  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -3.668209E-17    0.000000E+00              9.00000E+100
         73  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00    3.104867E-17    0.000000E+00              9.00000E+100
         74  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00    1.673870E-17    0.000000E+00              9.00000E+100
         75  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -2.589888E-17    0.000000E+00              9.00000E+100
         76  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00    5.566205E-17    0.000000E+00              9.00000E+100
         77  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -1.648389E-17    0.000000E+00              9.00000E+100
         78  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00    1.868615E-17    0.000000E+00              9.00000E+100
         79  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00   -2.405452E-18    0.000000E+00              9.00000E+100
         80  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00    3.833689E-18    0.000000E+00              9.00000E+100
         81  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00   -1.653748E-18    0.000000E+00              9.00000E+100
         82  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00   -3.837982E-18    0.000000E+00              9.00000E+100
         83  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00    8.827358E-18    0.000000E+00              9.00000E+100
         84  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00   -8.366800E-18    0.000000E+00              9.00000E+100
         85  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00   -1.195501E-17    0.000000E+00              9.00000E+100
         86  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00    1.177249E-17    0.000000E+00              9.00000E+100
         87  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00   -6.753211E-18    0.000000E+00              9.00000E+100
         88  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00    1.109177E-17    0.000000E+00              9.00000E+100
         89  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00    4.413679E-18    0.000000E+00              9.00000E+100
         90  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00   -1.803851E-18    0.000000E+00              9.00000E+100
         91  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00    5.337096E-18    0.000000E+00              9.00000E+100
         92  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00   -1.277896E-18    0.000000E+00              9.00000E+100
         93  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00   -3.457837E-18    0.000000E+00              9.00000E+100
         94  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    5.506694E-01    1.000000E+00              9.00000E+100
         95  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    5.160099E-01    1.000000E+00              9.00000E+100
         96  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    4.876026E-01    1.000000E+00              9.00000E+100
         97  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    4.818771E-01    1.000000E+00              9.00000E+100
         98  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    4.818771E-01    1.000000E+00              9.00000E+100
         99  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    4.714830E-01    1.000000E+00              9.00000E+100
        100  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    4.904548E-01    1.000000E+00              9.00000E+100
        101  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    5.011426E-01    1.000000E+00              9.00000E+100
        102  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    5.011426E-01    1.000000E+00              9.00000E+100
        103  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    5.463805E-01    1.000000E+00              9.00000E+100
        104  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    6.293791E-01    1.000000E+00              9.00000E+100
        105  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    6.598083E-01    1.000000E+00              9.00000E+100
        106  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    6.598083E-01    1.000000E+00              9.00000E+100
        107  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    7.241270E-01    1.000000E+00              9.00000E+100
        108  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    8.303171E-01    1.000000E+00              9.00000E+100
        109  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    8.689060E-01    1.000000E+00              9.00000E+100
        110  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    8.689060E-01    1.000000E+00              9.00000E+100
        111  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    9.168215E-01    1.000000E+00              9.00000E+100
        112  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    9.784879E-01    1.000000E+00              9.00000E+100
        113  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    9.999997E-01    1.000000E+00         u    9.00000E+100
        114  traj.phases.cruise->initial_boundary_constraint->throttle    i   0.000000E+00    7.118051E-01    1.000000E+00              9.00000E+100
        115  traj.phases.cruise->final_boundary_constraint->throttle      i   0.000000E+00    7.962235E-01    1.000000E+00              9.00000E+100
        116  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    3.601038E-01    1.000000E+00              9.00000E+100
        117  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    3.306614E-01    1.000000E+00              9.00000E+100
        118  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    2.931038E-01    1.000000E+00              9.00000E+100
        119  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    2.824289E-01    1.000000E+00              9.00000E+100
        120  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    2.824289E-01    1.000000E+00              9.00000E+100
        121  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    2.348545E-01    1.000000E+00              9.00000E+100
        122  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    1.759962E-01    1.000000E+00              9.00000E+100
        123  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    1.602818E-01    1.000000E+00              9.00000E+100
        124  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    1.602818E-01    1.000000E+00              9.00000E+100
        125  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    1.226105E-01    1.000000E+00              9.00000E+100
        126  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    6.863037E-02    1.000000E+00              9.00000E+100
        127  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    4.865030E-02    1.000000E+00              9.00000E+100
        128  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    4.865030E-02    1.000000E+00              9.00000E+100
        129  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    1.897675E-02    1.000000E+00              9.00000E+100
        130  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    1.141109E-06    1.000000E+00              9.00000E+100
        131  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    8.335781E-04    1.000000E+00              9.00000E+100
        132  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    8.335781E-04    1.000000E+00              9.00000E+100
        133  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    6.848460E-03    1.000000E+00              9.00000E+100
        134  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    2.643340E-02    1.000000E+00              9.00000E+100
        135  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    3.615133E-02    1.000000E+00              9.00000E+100

--------------------------------------------------------------------------------
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/openmdao/core/driver.py:143: OMDeprecationWarning:boolean evaluation of DriverResult is temporarily implemented to mimick the previous `failed` return behavior of run_driver.
Use the `success` attribute of the returned DriverResult object to test for successful driver completion.

Now that we’ve run the case successfully, let’s save and print out the fuel burn value:

fixed_mission_fixed_wing_fuel_burn = prob.get_val(av.Mission.Summary.FUEL_BURNED, units='kg')[0]
fixed_mission_fixed_wing_aspect_ratio = prob.get_val(av.Aircraft.Wing.ASPECT_RATIO)[0]
print('Mission fuel burn, kg:', fixed_mission_fixed_wing_fuel_burn)
print('Aspect ratio:', fixed_mission_fixed_wing_aspect_ratio)
Mission fuel burn, kg: 10506.25728491361
Aspect ratio: 11.22091

Fixed Mission Profile, Optimized Aircraft Wing Aspect Ratio#

Now we will use the exact same phase_info object but set up our Aviary problem such that the aspect ratio of the wing is a design variable. This means that Aviary is optimizing the wing aspect ratio while flying the same mission profile as above. We would expect that by varying the wing aspect ratio, Aviary could find a lower fuel burn value.

Note

All of the realistic design tradeoffs associated with varying the wing aspect ratio are not necessarily captured in this problem, e.g. the wing structure would need to change. We are simply using this as an example of an aircraft design variable available in Aviary.

When we want to add an aircraft design variable to the Aviary problem, we need to use the Level 2 interface for Aviary. This means we can no longer use the all-inclusive run_aviary function and instead need to call its constituent methods individually. This allows us to insert a line adding the wing aspect ratio as a design variable as shown below. This line is highlighted with an in-line comment.

prob = av.AviaryProblem(av.AnalysisScheme.COLLOCATION)

# Load aircraft and options data from user
# Allow for user overrides here
prob.load_inputs(aircraft_filename, phase_info)

prob.check_and_preprocess_inputs()

prob.add_pre_mission_systems()

prob.add_phases()

prob.add_post_mission_systems()

# Link phases and variables
prob.link_phases()

prob.add_driver(optimizer, max_iter=max_iter)

prob.add_design_variables()

# The following line is an example of how to add a design variable for the aspect ratio of the wing
prob.model.add_design_var(av.Aircraft.Wing.ASPECT_RATIO, lower=10., upper=14., ref=12.)

# Load optimization problem formulation
# Detail which variables the optimizer can control
prob.add_objective()

prob.setup()

prob.set_initial_guesses()

prob.run_aviary_problem(make_plots=make_plots)
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/dymos/phase/phase.py:897: OMDeprecationWarning:None: The method `add_polynomial_control` is deprecated and will be removed in Dymos 2.1. Please use `add_control` with the appropriate options to define a polynomial control.
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/dymos/phase/phase.py:2323: RuntimeWarning: Invalid options for non-optimal control 'mach' in phase 'climb_1': lower, upper, ref
  warnings.warn(f"Invalid options for non-optimal control '{name}' in phase "
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/dymos/phase/phase.py:2323: RuntimeWarning: Invalid options for non-optimal control 'altitude' in phase 'climb_1': lower, upper, ref
  warnings.warn(f"Invalid options for non-optimal control '{name}' in phase "
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/dymos/phase/phase.py:2323: RuntimeWarning: Invalid options for non-optimal control 'mach' in phase 'cruise': lower, upper, ref
  warnings.warn(f"Invalid options for non-optimal control '{name}' in phase "
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/dymos/phase/phase.py:2323: RuntimeWarning: Invalid options for non-optimal control 'altitude' in phase 'cruise': lower, upper, ref
  warnings.warn(f"Invalid options for non-optimal control '{name}' in phase "
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/dymos/phase/phase.py:2323: RuntimeWarning: Invalid options for non-optimal control 'mach' in phase 'descent_1': lower, upper, ref
  warnings.warn(f"Invalid options for non-optimal control '{name}' in phase "
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/dymos/phase/phase.py:2323: RuntimeWarning: Invalid options for non-optimal control 'altitude' in phase 'descent_1': lower, upper, ref
  warnings.warn(f"Invalid options for non-optimal control '{name}' in phase "
The following variables have been overridden:
  'aircraft:design:touchdown_mass  152800  lbm
  'aircraft:engine:mass  [7400.]  lbm
  'aircraft:fins:mass  0  lbm
  'aircraft:fuel:auxiliary_fuel_capacity  0  lbm
  'aircraft:fuel:fuselage_fuel_capacity  0  lbm
  'aircraft:fuel:total_capacity  45694  lbm
  'aircraft:fuselage:planform_area  1578.24  ft**2
  'aircraft:fuselage:wetted_area  4158.62  ft**2
  'aircraft:horizontal_tail:wetted_area  592.65  ft**2
  'aircraft:landing_gear:main_gear_oleo_length  102  inch
  'aircraft:landing_gear:nose_gear_oleo_length  67  inch
  'aircraft:vertical_tail:wetted_area  581.13  ft**2
  'aircraft:wing:aspect_ratio  11.22091  unitless
  'aircraft:wing:control_surface_area  137  ft**2
  'aircraft:wing:wetted_area  2396.56  ft**2

--- Constraint Report [traj] ---
    --- climb_1 ---
        [path]    0.0000e+00 <= throttle <= 1.0000e+00  [unitless]
    --- cruise ---
        [initial] 0.0000e+00 <= throttle <= 1.0000e+00  [unitless]
        [final]   0.0000e+00 <= throttle <= 1.0000e+00  [unitless]
    --- descent_1 ---
        [path]    0.0000e+00 <= throttle <= 1.0000e+00  [unitless]
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/openmdao/solvers/linear/linear_rhs_checker.py:178: SolverWarning:DirectSolver in 'traj.phases.cruise.indep_states' <class StateIndependentsComp>: 'rhs_checking' is active but no redundant adjoint dependencies were found, so caching has been disabled.
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/openmdao/solvers/linear/linear_rhs_checker.py:178: SolverWarning:DirectSolver in 'traj.phases.descent_1.indep_states' <class StateIndependentsComp>: 'rhs_checking' is active but no redundant adjoint dependencies were found, so caching has been disabled.
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/openmdao/recorders/sqlite_recorder.py:226: UserWarning:The existing case recorder file, problem_history.db, is being overwritten.
Model viewer data has already been recorded for Driver.
Model viewer data has already been recorded for Driver.
Full total jacobian for problem 'problem' was computed 3 times, taking 0.6887075590000222 seconds.
Total jacobian shape: (137, 97) 


Jacobian shape: (137, 97)  (9.59% nonzero)
FWD solves: 15   REV solves: 0
Total colors vs. total size: 15 vs 97  (84.54% improvement)

Sparsity computed using tolerance: 1e-25
Time to compute sparsity:   0.6887 sec
Time to compute coloring:   0.0624 sec
Memory to compute coloring:   0.0000 MB
Coloring created on: 2024-11-19 19:01:35
This is Ipopt version 3.14.16, running with linear solver MUMPS 5.7.3.

Number of nonzeros in equality constraint Jacobian...:      772
Number of nonzeros in inequality constraint Jacobian.:      501
Number of nonzeros in Lagrangian Hessian.............:        0

Total number of variables............................:       97
                     variables with only lower bounds:        2
                variables with lower and upper bounds:       95
                     variables with only upper bounds:        0
Total number of equality constraints.................:       94
Total number of inequality constraints...............:       42
        inequality constraints with only lower bounds:        0
   inequality constraints with lower and upper bounds:       42
        inequality constraints with only upper bounds:        0

iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
   0  3.0000000e-01 2.07e+02 7.44e-02  -5.0 0.00e+00    -  0.00e+00 0.00e+00   0
  10  2.4659635e+00 3.42e-03 2.43e-01  -5.0 9.97e-02    -  8.57e-02 6.34e-01h  1
  20  2.4573099e+00 6.69e-15 1.08e-06  -7.0 8.32e-06    -  1.00e+00 1.00e+00f  1
Number of Iterations....: 21

                                   (scaled)                 (unscaled)
Objective...............:   2.4573098852226862e+00    2.4573098852226862e+00
Dual infeasibility......:   3.4981989527338442e-10    3.4981989527338442e-10
Constraint violation....:   3.3870757766702815e-13    3.3870757766702815e-13
Variable bound violation:   0.0000000000000000e+00    0.0000000000000000e+00
Complementarity.........:   9.0909093189540712e-08    9.0909093189540712e-08
Overall NLP error.......:   9.0909093189540712e-08    9.0909093189540712e-08


Number of objective function evaluations             = 39
Number of objective gradient evaluations             = 22
Number of equality constraint evaluations            = 39
Number of inequality constraint evaluations          = 39
Number of equality constraint Jacobian evaluations   = 23
Number of inequality constraint Jacobian evaluations = 23
Number of Lagrangian Hessian evaluations             = 0
Total seconds in IPOPT                               = 13.513

EXIT: Optimal Solution Found.
minimal_print is not available for this solution


Optimization Problem -- Optimization using pyOpt_sparse
================================================================================
    Objective Function: _objfunc

    Solution: 
--------------------------------------------------------------------------------
    Total Time:                   13.5143
       User Objective Time :      11.1556
       User Sensitivity Time :     2.2035
       Interface Time :            0.0676
       Opt Solver Time:            0.0877
    Calls to Objective Function :      40
    Calls to Sens Function :           24


   Objectives
      Index  Name                               Value
          0  mission:objectives:fuel     2.457310E+00

   Variables (c - continuous, i - integer, d - discrete)
      Index  Name                                Type      Lower Bound            Value      Upper Bound     Status
          0  mission:design:gross_mass_0            c     5.714286E-05     9.031997E-01     1.000000E+30           
          1  mission:summary:gross_mass_0           c     5.714286E-05     9.031997E-01     1.000000E+30           
          2  aircraft:wing:aspect_ratio_0           c     8.333333E-01     1.166666E+00     1.166667E+00          u
          3  traj.climb_1.t_duration_0              c     5.000000E-01     5.126794E-01     1.500000E+00           
          4  traj.climb_1.states:mass_0             c     0.000000E+00     7.169479E+00     1.000000E+17           
          5  traj.climb_1.states:mass_1             c     0.000000E+00     7.159980E+00     1.000000E+17           
          6  traj.climb_1.states:mass_2             c     0.000000E+00     7.148042E+00     1.000000E+17           
          7  traj.climb_1.states:mass_3             c     0.000000E+00     7.144452E+00     1.000000E+17           
          8  traj.climb_1.states:mass_4             c     0.000000E+00     7.128518E+00     1.000000E+17           
          9  traj.climb_1.states:mass_5             c     0.000000E+00     7.107971E+00     1.000000E+17           
         10  traj.climb_1.states:mass_6             c     0.000000E+00     7.101628E+00     1.000000E+17           
         11  traj.climb_1.states:mass_7             c     0.000000E+00     7.084560E+00     1.000000E+17           
         12  traj.climb_1.states:mass_8             c     0.000000E+00     7.061161E+00     1.000000E+17           
         13  traj.climb_1.states:mass_9             c     0.000000E+00     7.053737E+00     1.000000E+17           
         14  traj.climb_1.states:mass_10            c     0.000000E+00     7.039412E+00     1.000000E+17           
         15  traj.climb_1.states:mass_11            c     0.000000E+00     7.019502E+00     1.000000E+17           
         16  traj.climb_1.states:mass_12            c     0.000000E+00     7.013149E+00     1.000000E+17           
         17  traj.climb_1.states:mass_13            c     0.000000E+00     7.006011E+00     1.000000E+17           
         18  traj.climb_1.states:mass_14            c     0.000000E+00     6.996103E+00     1.000000E+17           
         19  traj.climb_1.states:mass_15            c     0.000000E+00     6.992949E+00     1.000000E+17           
         20  traj.climb_1.states:distance_0         c     0.000000E+00     6.416001E-03     1.000000E+15           
         21  traj.climb_1.states:distance_1         c     0.000000E+00     1.629904E-02     1.000000E+15           
         22  traj.climb_1.states:distance_2         c     0.000000E+00     1.967377E-02     1.000000E+15           
         23  traj.climb_1.states:distance_3         c     0.000000E+00     3.700963E-02     1.000000E+15           
         24  traj.climb_1.states:distance_4         c     0.000000E+00     6.505203E-02     1.000000E+15           
         25  traj.climb_1.states:distance_5         c     0.000000E+00     7.490220E-02     1.000000E+15           
         26  traj.climb_1.states:distance_6         c     0.000000E+00     1.040382E-01     1.000000E+15           
         27  traj.climb_1.states:distance_7         c     0.000000E+00     1.496615E-01     1.000000E+15           
         28  traj.climb_1.states:distance_8         c     0.000000E+00     1.653740E-01     1.000000E+15           
         29  traj.climb_1.states:distance_9         c     0.000000E+00     1.973133E-01     1.000000E+15           
         30  traj.climb_1.states:distance_10        c     0.000000E+00     2.449077E-01     1.000000E+15           
         31  traj.climb_1.states:distance_11        c     0.000000E+00     2.607997E-01     1.000000E+15           
         32  traj.climb_1.states:distance_12        c     0.000000E+00     2.790809E-01     1.000000E+15           
         33  traj.climb_1.states:distance_13        c     0.000000E+00     3.050945E-01     1.000000E+15           
         34  traj.climb_1.states:distance_14        c     0.000000E+00     3.135156E-01     1.000000E+15           
         35  traj.cruise.t_duration_0               c     5.000000E-01     1.255492E+00     1.500000E+00           
         36  traj.cruise.states:mass_0              c     0.000000E+00     6.962491E+00     1.000000E+17           
         37  traj.cruise.states:mass_1              c     0.000000E+00     6.920442E+00     1.000000E+17           
         38  traj.cruise.states:mass_2              c     0.000000E+00     6.907127E+00     1.000000E+17           
         39  traj.cruise.states:mass_3              c     0.000000E+00     6.844803E+00     1.000000E+17           
         40  traj.cruise.states:mass_4              c     0.000000E+00     6.758644E+00     1.000000E+17           
         41  traj.cruise.states:mass_5              c     0.000000E+00     6.731332E+00     1.000000E+17           
         42  traj.cruise.states:mass_6              c     0.000000E+00     6.656891E+00     1.000000E+17           
         43  traj.cruise.states:mass_7              c     0.000000E+00     6.553856E+00     1.000000E+17           
         44  traj.cruise.states:mass_8              c     0.000000E+00     6.521129E+00     1.000000E+17           
         45  traj.cruise.states:mass_9              c     0.000000E+00     6.457897E+00     1.000000E+17           
         46  traj.cruise.states:mass_10             c     0.000000E+00     6.369995E+00     1.000000E+17           
         47  traj.cruise.states:mass_11             c     0.000000E+00     6.341959E+00     1.000000E+17           
         48  traj.cruise.states:mass_12             c     0.000000E+00     6.310447E+00     1.000000E+17           
         49  traj.cruise.states:mass_13             c     0.000000E+00     6.266762E+00     1.000000E+17           
         50  traj.cruise.states:mass_14             c     0.000000E+00     6.252868E+00     1.000000E+17           
         51  traj.cruise.states:distance_0          c     0.000000E+00     4.379005E-01     1.000000E+15           
         52  traj.cruise.states:distance_1          c     0.000000E+00     6.103378E-01     1.000000E+15           
         53  traj.cruise.states:distance_2          c     0.000000E+00     6.651093E-01     1.000000E+15           
         54  traj.cruise.states:distance_3          c     0.000000E+00     9.225014E-01     1.000000E+15           
         55  traj.cruise.states:distance_4          c     0.000000E+00     1.281012E+00     1.000000E+15           
         56  traj.cruise.states:distance_5          c     0.000000E+00     1.395289E+00     1.000000E+15           
         57  traj.cruise.states:distance_6          c     0.000000E+00     1.708371E+00     1.000000E+15           
         58  traj.cruise.states:distance_7          c     0.000000E+00     2.145063E+00     1.000000E+15           
         59  traj.cruise.states:distance_8          c     0.000000E+00     2.284407E+00     1.000000E+15           
         60  traj.cruise.states:distance_9          c     0.000000E+00     2.554321E+00     1.000000E+15           
         61  traj.cruise.states:distance_10         c     0.000000E+00     2.930039E+00     1.000000E+15           
         62  traj.cruise.states:distance_11         c     0.000000E+00     3.049745E+00     1.000000E+15           
         63  traj.cruise.states:distance_12         c     0.000000E+00     3.184417E+00     1.000000E+15           
         64  traj.cruise.states:distance_13         c     0.000000E+00     3.371020E+00     1.000000E+15           
         65  traj.cruise.states:distance_14         c     0.000000E+00     3.430269E+00     1.000000E+15           
         66  traj.descent_1.t_duration_0            c     5.000000E-01     9.630513E-01     1.500000E+00           
         67  traj.descent_1.states:mass_0           c     0.000000E+00     6.249590E+00     1.000000E+17           
         68  traj.descent_1.states:mass_1           c     0.000000E+00     6.245120E+00     1.000000E+17           
         69  traj.descent_1.states:mass_2           c     0.000000E+00     6.243715E+00     1.000000E+17           
         70  traj.descent_1.states:mass_3           c     0.000000E+00     6.237279E+00     1.000000E+17           
         71  traj.descent_1.states:mass_4           c     0.000000E+00     6.228816E+00     1.000000E+17           
         72  traj.descent_1.states:mass_5           c     0.000000E+00     6.226264E+00     1.000000E+17           
         73  traj.descent_1.states:mass_6           c     0.000000E+00     6.219617E+00     1.000000E+17           
         74  traj.descent_1.states:mass_7           c     0.000000E+00     6.211444E+00     1.000000E+17           
         75  traj.descent_1.states:mass_8           c     0.000000E+00     6.209154E+00     1.000000E+17           
         76  traj.descent_1.states:mass_9           c     0.000000E+00     6.205000E+00     1.000000E+17           
         77  traj.descent_1.states:mass_10          c     0.000000E+00     6.199325E+00     1.000000E+17           
         78  traj.descent_1.states:mass_11          c     0.000000E+00     6.197443E+00     1.000000E+17           
         79  traj.descent_1.states:mass_12          c     0.000000E+00     6.195249E+00     1.000000E+17           
         80  traj.descent_1.states:mass_13          c     0.000000E+00     6.192021E+00     1.000000E+17           
         81  traj.descent_1.states:mass_14          c     0.000000E+00     6.190939E+00     1.000000E+17           
         82  traj.descent_1.states:distance_0       c     0.000000E+00     3.455583E+00     1.000000E+15           
         83  traj.descent_1.states:distance_1       c     0.000000E+00     3.489536E+00     1.000000E+15           
         84  traj.descent_1.states:distance_2       c     0.000000E+00     3.500042E+00     1.000000E+15           
         85  traj.descent_1.states:distance_3       c     0.000000E+00     3.547608E+00     1.000000E+15           
         86  traj.descent_1.states:distance_4       c     0.000000E+00     3.608867E+00     1.000000E+15           
         87  traj.descent_1.states:distance_5       c     0.000000E+00     3.627164E+00     1.000000E+15           
         88  traj.descent_1.states:distance_6       c     0.000000E+00     3.674230E+00     1.000000E+15           
         89  traj.descent_1.states:distance_7       c     0.000000E+00     3.732354E+00     1.000000E+15           
         90  traj.descent_1.states:distance_8       c     0.000000E+00     3.749048E+00     1.000000E+15           
         91  traj.descent_1.states:distance_9       c     0.000000E+00     3.778827E+00     1.000000E+15           
         92  traj.descent_1.states:distance_10      c     0.000000E+00     3.814653E+00     1.000000E+15           
         93  traj.descent_1.states:distance_11      c     0.000000E+00     3.824688E+00     1.000000E+15           
         94  traj.descent_1.states:distance_12      c     0.000000E+00     3.835182E+00     1.000000E+15           
         95  traj.descent_1.states:distance_13      c     0.000000E+00     3.848326E+00     1.000000E+15           
         96  traj.descent_1.states:distance_14      c     0.000000E+00     3.852160E+00     1.000000E+15           

   Constraints (i - inequality, e - equality)
      Index  Name                                                      Type          Lower           Value           Upper    Status  Lagrange Multiplier (N/A)
          0  mission:constraints:range_residual                           e   0.000000E+00    0.000000E+00    0.000000E+00              9.00000E+100
          1  gtow_constraint.GTOW                                         e   0.000000E+00    0.000000E+00    0.000000E+00              9.00000E+100
          2  link_climb_1_mass.mass                                       e   0.000000E+00    2.910383E-16    0.000000E+00              9.00000E+100
          3  mission:constraints:mass_residual                            e   0.000000E+00    2.910383E-16    0.000000E+00              9.00000E+100
          4  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    1.931217E-13    0.000000E+00              9.00000E+100
          5  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    1.818018E-13    0.000000E+00              9.00000E+100
          6  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    1.692483E-13    0.000000E+00              9.00000E+100
          7  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    3.387076E-13    0.000000E+00              9.00000E+100
          8  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    3.113620E-13    0.000000E+00              9.00000E+100
          9  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    2.835493E-13    0.000000E+00              9.00000E+100
         10  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    3.289106E-13    0.000000E+00              9.00000E+100
         11  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    3.170949E-13    0.000000E+00              9.00000E+100
         12  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    3.037991E-13    0.000000E+00              9.00000E+100
         13  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    2.496105E-13    0.000000E+00              9.00000E+100
         14  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    2.398795E-13    0.000000E+00              9.00000E+100
         15  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    2.394847E-13    0.000000E+00              9.00000E+100
         16  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    1.155822E-13    0.000000E+00              9.00000E+100
         17  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    1.212088E-13    0.000000E+00              9.00000E+100
         18  traj.climb_1.collocation_constraint.defects:mass             e   0.000000E+00    1.192846E-13    0.000000E+00              9.00000E+100
         19  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00   -1.078381E-19    0.000000E+00              9.00000E+100
         20  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    8.986508E-20    0.000000E+00              9.00000E+100
         21  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00   -1.078381E-19    0.000000E+00              9.00000E+100
         22  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    3.303541E-19    0.000000E+00              9.00000E+100
         23  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00   -1.468240E-19    0.000000E+00              9.00000E+100
         24  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00   -7.341201E-20    0.000000E+00              9.00000E+100
         25  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00   -1.221915E-18    0.000000E+00              9.00000E+100
         26  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00   -1.745592E-19    0.000000E+00              9.00000E+100
         27  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00   -7.855166E-19    0.000000E+00              9.00000E+100
         28  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00   -2.202360E-19    0.000000E+00              9.00000E+100
         29  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00   -1.468240E-19    0.000000E+00              9.00000E+100
         30  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00   -1.174592E-18    0.000000E+00              9.00000E+100
         31  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    2.480276E-18    0.000000E+00              9.00000E+100
         32  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00   -1.365949E-18    0.000000E+00              9.00000E+100
         33  traj.climb_1.collocation_constraint.defects:distance         e   0.000000E+00    2.120816E-18    0.000000E+00              9.00000E+100
         34  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00   -7.062455E-15    0.000000E+00              9.00000E+100
         35  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00   -6.625839E-15    0.000000E+00              9.00000E+100
         36  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00   -5.943811E-15    0.000000E+00              9.00000E+100
         37  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00   -1.176333E-14    0.000000E+00              9.00000E+100
         38  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00   -9.689313E-15    0.000000E+00              9.00000E+100
         39  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00   -8.236935E-15    0.000000E+00              9.00000E+100
         40  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00   -8.773580E-15    0.000000E+00              9.00000E+100
         41  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00   -6.573637E-15    0.000000E+00              9.00000E+100
         42  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00   -3.551253E-15    0.000000E+00              9.00000E+100
         43  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00   -2.225841E-15    0.000000E+00              9.00000E+100
         44  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00   -8.329464E-16    0.000000E+00              9.00000E+100
         45  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    1.052153E-15    0.000000E+00              9.00000E+100
         46  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    7.570897E-16    0.000000E+00              9.00000E+100
         47  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    1.162423E-15    0.000000E+00              9.00000E+100
         48  traj.cruise.collocation_constraint.defects:mass              e   0.000000E+00    1.585106E-15    0.000000E+00              9.00000E+100
         49  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00   -3.221811E-18    0.000000E+00              9.00000E+100
         50  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    2.301294E-19    0.000000E+00              9.00000E+100
         51  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    2.301294E-19    0.000000E+00              9.00000E+100
         52  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    1.879958E-18    0.000000E+00              9.00000E+100
         53  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    4.699896E-19    0.000000E+00              9.00000E+100
         54  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    4.699896E-19    0.000000E+00              9.00000E+100
         55  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    1.117542E-18    0.000000E+00              9.00000E+100
         56  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00   -5.587712E-19    0.000000E+00              9.00000E+100
         57  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00   -1.117542E-18    0.000000E+00              9.00000E+100
         58  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    9.399792E-19    0.000000E+00              9.00000E+100
         59  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00   -1.409969E-18    0.000000E+00              9.00000E+100
         60  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00    5.639875E-18    0.000000E+00              9.00000E+100
         61  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00   -2.048152E-17    0.000000E+00              9.00000E+100
         62  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00   -1.058595E-17    0.000000E+00              9.00000E+100
         63  traj.cruise.collocation_constraint.defects:distance          e   0.000000E+00   -2.071164E-18    0.000000E+00              9.00000E+100
         64  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -4.204201E-17    0.000000E+00              9.00000E+100
         65  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -7.441897E-18    0.000000E+00              9.00000E+100
         66  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -1.526060E-17    0.000000E+00              9.00000E+100
         67  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -6.993219E-17    0.000000E+00              9.00000E+100
         68  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -9.030584E-17    0.000000E+00              9.00000E+100
         69  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -7.929176E-17    0.000000E+00              9.00000E+100
         70  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -1.710539E-16    0.000000E+00              9.00000E+100
         71  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -8.904363E-17    0.000000E+00              9.00000E+100
         72  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -1.663192E-16    0.000000E+00              9.00000E+100
         73  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -9.387459E-17    0.000000E+00              9.00000E+100
         74  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -5.463753E-17    0.000000E+00              9.00000E+100
         75  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -6.367966E-18    0.000000E+00              9.00000E+100
         76  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00   -4.078442E-17    0.000000E+00              9.00000E+100
         77  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00    1.336715E-17    0.000000E+00              9.00000E+100
         78  traj.descent_1.collocation_constraint.defects:mass           e   0.000000E+00    2.551440E-17    0.000000E+00              9.00000E+100
         79  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00   -1.118960E-17    0.000000E+00              9.00000E+100
         80  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00   -8.392199E-18    0.000000E+00              9.00000E+100
         81  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00    6.366496E-18    0.000000E+00              9.00000E+100
         82  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00   -1.507072E-17    0.000000E+00              9.00000E+100
         83  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00    9.062135E-18    0.000000E+00              9.00000E+100
         84  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00   -6.895103E-19    0.000000E+00              9.00000E+100
         85  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00    2.002555E-17    0.000000E+00              9.00000E+100
         86  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00   -3.747472E-18    0.000000E+00              9.00000E+100
         87  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00    1.194507E-17    0.000000E+00              9.00000E+100
         88  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00   -2.782666E-17    0.000000E+00              9.00000E+100
         89  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00   -3.989309E-18    0.000000E+00              9.00000E+100
         90  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00    3.102796E-18    0.000000E+00              9.00000E+100
         91  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00   -4.967796E-18    0.000000E+00              9.00000E+100
         92  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00   -1.157545E-18    0.000000E+00              9.00000E+100
         93  traj.descent_1.collocation_constraint.defects:distance       e   0.000000E+00    7.331116E-18    0.000000E+00              9.00000E+100
         94  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    4.814478E-01    1.000000E+00              9.00000E+100
         95  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    4.617117E-01    1.000000E+00              9.00000E+100
         96  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    4.483926E-01    1.000000E+00              9.00000E+100
         97  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    4.465226E-01    1.000000E+00              9.00000E+100
         98  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    4.465226E-01    1.000000E+00              9.00000E+100
         99  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    4.501055E-01    1.000000E+00              9.00000E+100
        100  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    4.813669E-01    1.000000E+00              9.00000E+100
        101  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    4.948198E-01    1.000000E+00              9.00000E+100
        102  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    4.948198E-01    1.000000E+00              9.00000E+100
        103  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    5.453131E-01    1.000000E+00              9.00000E+100
        104  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    6.293177E-01    1.000000E+00              9.00000E+100
        105  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    6.595185E-01    1.000000E+00              9.00000E+100
        106  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    6.595185E-01    1.000000E+00              9.00000E+100
        107  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    7.251680E-01    1.000000E+00              9.00000E+100
        108  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    8.325402E-01    1.000000E+00              9.00000E+100
        109  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    8.710209E-01    1.000000E+00              9.00000E+100
        110  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    8.710209E-01    1.000000E+00              9.00000E+100
        111  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    9.184425E-01    1.000000E+00              9.00000E+100
        112  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    9.793290E-01    1.000000E+00              9.00000E+100
        113  traj.phases.climb_1->path_constraint->throttle               i   0.000000E+00    9.999994E-01    1.000000E+00         u    9.00000E+100
        114  traj.phases.cruise->initial_boundary_constraint->throttle    i   0.000000E+00    6.580383E-01    1.000000E+00              9.00000E+100
        115  traj.phases.cruise->final_boundary_constraint->throttle      i   0.000000E+00    7.661868E-01    1.000000E+00              9.00000E+100
        116  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    3.846426E-01    1.000000E+00              9.00000E+100
        117  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    3.568024E-01    1.000000E+00              9.00000E+100
        118  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    3.203738E-01    1.000000E+00              9.00000E+100
        119  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    3.099545E-01    1.000000E+00              9.00000E+100
        120  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    3.099545E-01    1.000000E+00              9.00000E+100
        121  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    2.637136E-01    1.000000E+00              9.00000E+100
        122  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    2.037196E-01    1.000000E+00              9.00000E+100
        123  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    1.868159E-01    1.000000E+00              9.00000E+100
        124  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    1.868159E-01    1.000000E+00              9.00000E+100
        125  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    1.467619E-01    1.000000E+00              9.00000E+100
        126  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    1.010225E-01    1.000000E+00              9.00000E+100
        127  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    8.438774E-02    1.000000E+00              9.00000E+100
        128  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    8.438774E-02    1.000000E+00              9.00000E+100
        129  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    4.668807E-02    1.000000E+00              9.00000E+100
        130  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    1.031891E-02    1.000000E+00              9.00000E+100
        131  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    3.793792E-03    1.000000E+00              9.00000E+100
        132  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    3.793792E-03    1.000000E+00              9.00000E+100
        133  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    7.653828E-07    1.000000E+00         l    9.00000E+100
        134  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    2.232907E-03    1.000000E+00              9.00000E+100
        135  traj.phases.descent_1->path_constraint->throttle             i   0.000000E+00    5.171007E-03    1.000000E+00              9.00000E+100

--------------------------------------------------------------------------------
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/openmdao/core/driver.py:143: OMDeprecationWarning:boolean evaluation of DriverResult is temporarily implemented to mimick the previous `failed` return behavior of run_driver.
Use the `success` attribute of the returned DriverResult object to test for successful driver completion.
fixed_mission_optimized_wing_fuel_burn = prob.get_val(av.Mission.Summary.FUEL_BURNED, units='kg')[0]
fixed_mission_optimized_wing_aspect_ratio = prob.get_val(av.Aircraft.Wing.ASPECT_RATIO)[0]
print('Mission fuel burn, kg:', fixed_mission_optimized_wing_fuel_burn)
print('Aspect ratio:', fixed_mission_optimized_wing_aspect_ratio)
Mission fuel burn, kg: 9785.393036625861
Aspect ratio: 13.99999759096459

As expected, the optimal fuel burn value is lower for this case. We’ll discuss this in more detail after running two more cases.

Optimized Mission Profile, Fixed Aircraft Wing Aspect Ratio#

We just investigated giving the optimizer flexibility with the aircraft design while not varying the mission. Let’s now look at the results when we optimize the mission but keep the wing aspect ratio unchanged.

To do this, we will allow the optimizer to control the Mach and altitude profiles by modifying the phase_info object:

phase_info['climb_1']['user_options']['optimize_mach'] = True
phase_info['climb_1']['user_options']['optimize_altitude'] = True
phase_info['cruise']['user_options']['optimize_mach'] = True
phase_info['cruise']['user_options']['optimize_altitude'] = True
phase_info['descent_1']['user_options']['optimize_mach'] = True
phase_info['descent_1']['user_options']['optimize_altitude'] = True

prob = av.run_aviary(aircraft_filename, phase_info, optimizer=optimizer,
                     make_plots=make_plots, max_iter=max_iter)
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/dymos/phase/phase.py:897: OMDeprecationWarning:None: The method `add_polynomial_control` is deprecated and will be removed in Dymos 2.1. Please use `add_control` with the appropriate options to define a polynomial control.
The following variables have been overridden:
  'aircraft:design:touchdown_mass  152800  lbm
  'aircraft:engine:mass  [7400.]  lbm
  'aircraft:fins:mass  0  lbm
  'aircraft:fuel:auxiliary_fuel_capacity  0  lbm
  'aircraft:fuel:fuselage_fuel_capacity  0  lbm
  'aircraft:fuel:total_capacity  45694  lbm
  'aircraft:fuselage:planform_area  1578.24  ft**2
  'aircraft:fuselage:wetted_area  4158.62  ft**2
  'aircraft:horizontal_tail:wetted_area  592.65  ft**2
  'aircraft:landing_gear:main_gear_oleo_length  102  inch
  'aircraft:landing_gear:nose_gear_oleo_length  67  inch
  'aircraft:vertical_tail:wetted_area  581.13  ft**2
  'aircraft:wing:aspect_ratio  11.22091  unitless
  'aircraft:wing:control_surface_area  137  ft**2
  'aircraft:wing:wetted_area  2396.56  ft**2

--- Constraint Report [traj] ---
    --- climb_1 ---
        [initial] 2.0000e-01 == mach [unitless]
        [initial] 0.0000e+00 == altitude [ft]
        [path]    0.0000e+00 <= throttle <= 1.0000e+00  [unitless]
    --- cruise ---
        [initial] 0.0000e+00 <= throttle <= 1.0000e+00  [unitless]
        [final]   0.0000e+00 <= throttle <= 1.0000e+00  [unitless]
    --- descent_1 ---
        [final]   2.1000e-01 == mach [unitless]
        [final]   0.0000e+00 == altitude [ft]
        [path]    0.0000e+00 <= throttle <= 1.0000e+00  [unitless]
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/openmdao/solvers/linear/linear_rhs_checker.py:178: SolverWarning:DirectSolver in 'traj.phases.cruise.indep_states' <class StateIndependentsComp>: 'rhs_checking' is active but no redundant adjoint dependencies were found, so caching has been disabled.
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/openmdao/solvers/linear/linear_rhs_checker.py:178: SolverWarning:DirectSolver in 'traj.phases.descent_1.indep_states' <class StateIndependentsComp>: 'rhs_checking' is active but no redundant adjoint dependencies were found, so caching has been disabled.
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/openmdao/recorders/sqlite_recorder.py:226: UserWarning:The existing case recorder file, problem_history.db, is being overwritten.
Model viewer data has already been recorded for Driver.
Model viewer data has already been recorded for Driver.
Full total jacobian for problem 'aircraft_for_bench_FwFm' was computed 3 times, taking 0.7134715020000044 seconds.
Total jacobian shape: (145, 108) 


Jacobian shape: (145, 108)  (9.30% nonzero)
FWD solves: 16   REV solves: 0
Total colors vs. total size: 16 vs 108  (85.19% improvement)

Sparsity computed using tolerance: 1e-25
Time to compute sparsity:   0.7135 sec
Time to compute coloring:   0.0621 sec
Memory to compute coloring:   0.2500 MB
Coloring created on: 2024-11-19 19:01:55
This is Ipopt version 3.14.16, running with linear solver MUMPS 5.7.3.

Number of nonzeros in equality constraint Jacobian...:      920
Number of nonzeros in inequality constraint Jacobian.:      534
Number of nonzeros in Lagrangian Hessian.............:        0

Total number of variables............................:      108
                     variables with only lower bounds:        2
                variables with lower and upper bounds:      106
                     variables with only upper bounds:        0
Total number of equality constraints.................:      102
Total number of inequality constraints...............:       42
        inequality constraints with only lower bounds:        0
   inequality constraints with lower and upper bounds:       42
        inequality constraints with only upper bounds:        0

iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
   0  3.0000000e-01 2.07e+02 9.94e-02  -5.0 0.00e+00    -  0.00e+00 0.00e+00   0
  10  5.8268604e-01 1.91e+02 1.39e+00  -5.0 4.55e+00    -  7.94e-04 4.93e-03h  1
  20  8.7109150e-01 1.64e+02 1.13e+00  -5.0 3.46e+00    -  2.08e-03 1.19e-01h  1
  30  2.6914441e+00 5.55e-06 4.40e-01  -5.0 5.72e-02    -  1.27e-01 1.00e+00h  1
  40  2.5836129e+00 2.32e-03 9.57e-03  -5.0 7.57e-02    -  1.00e+00 1.00e+00h  1
  50  2.5836614e+00 2.94e-08 2.81e-03  -5.0 6.54e-04    -  1.00e+00 5.00e-01h  2
  60  2.5837304e+00 4.17e-13 2.19e-03  -5.0 2.48e-03    -  1.00e+00 1.00e+00H  1
  70  2.5837800e+00 2.36e-13 4.06e-03  -5.0 1.96e-03    -  1.00e+00 7.63e-06h 18
  80  2.5836511e+00 1.68e-07 1.20e-02  -5.0 4.02e-03    -  1.00e+00 1.00e+00h  1
  90  2.5836923e+00 6.08e-12 1.09e-03  -5.0 1.10e-03    -  1.00e+00 1.00e+00H  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
 100  2.5836610e+00 1.59e-07 1.31e-02  -5.0 2.04e-03    -  1.00e+00 6.25e-02h  5
 110  2.5836777e+00 3.60e-09 1.02e-02  -5.0 1.57e-04    -  1.00e+00 1.00e+00h  1
 120  2.5836780e+00 2.56e-09 2.32e-03  -5.0 1.73e-04    -  1.00e+00 1.00e+00h  1
 130  2.5836896e+00 1.21e-12 1.03e-03  -5.0 4.81e-04    -  1.00e+00 1.00e+00H  1
 140  2.5836536e+00 2.54e-08 9.14e-03  -5.0 3.18e-04    -  1.00e+00 1.25e-01h  4
 150  2.5836599e+00 1.34e-08 9.80e-03  -5.0 7.46e-04    -  1.00e+00 1.00e+00h  1
 160  2.5836727e+00 1.37e-08 2.16e-03  -5.0 8.52e-04    -  1.00e+00 1.00e+00h  1
 170  2.5836320e+00 7.26e-08 4.76e-03  -5.0 3.28e-03    -  1.00e+00 1.00e+00h  1
 180  2.5836093e+00 3.52e-08 1.63e-03  -5.0 7.78e-04    -  1.00e+00 1.95e-03h 10
 190  2.5836823e+00 2.49e-09 9.78e-03  -5.0 1.61e-04    -  1.00e+00 1.00e+00h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
 200  2.5836630e+00 1.82e-08 1.10e-02  -5.0 1.10e-03    -  1.00e+00 5.00e-01h  2

Number of Iterations....: 200

                                   (scaled)                 (unscaled)
Objective...............:   2.5836629839380709e+00    2.5836629839380709e+00
Dual infeasibility......:   1.0970096173293170e-02    1.0970096173293170e-02
Constraint violation....:   1.8161019338755411e-08    1.8161019338755411e-08
Variable bound violation:   0.0000000000000000e+00    0.0000000000000000e+00
Complementarity.........:   1.0047919043607404e-05    1.0047919043607404e-05
Overall NLP error.......:   1.0970096173293170e-02    1.0970096173293170e-02


Number of objective function evaluations             = 511
Number of objective gradient evaluations             = 201
Number of equality constraint evaluations            = 511
Number of inequality constraint evaluations          = 511
Number of equality constraint Jacobian evaluations   = 201
Number of inequality constraint Jacobian evaluations = 201
Number of Lagrangian Hessian evaluations             = 0
Total seconds in IPOPT                               = 172.583

EXIT: Maximum Number of Iterations Exceeded.
minimal_print is not available for this solution


Optimization Problem -- Optimization using pyOpt_sparse
================================================================================
    Objective Function: _objfunc

    Solution: 
--------------------------------------------------------------------------------
    Total Time:                  172.5841
       User Objective Time :     151.8927
       User Sensitivity Time :    19.0223
       Interface Time :            0.6906
       Opt Solver Time:            0.9785
    Calls to Objective Function :     512
    Calls to Sens Function :          202


   Objectives
      Index  Name                               Value
          0  mission:objectives:fuel     2.583663E+00

   Variables (c - continuous, i - integer, d - discrete)
      Index  Name                                 Type      Lower Bound            Value      Upper Bound     Status
          0  mission:design:gross_mass_0             c     5.714286E-05     9.123645E-01     1.000000E+30           
          1  mission:summary:gross_mass_0            c     5.714286E-05     9.123645E-01     1.000000E+30           
          2  traj.climb_1.t_duration_0               c     5.000000E-01     5.976008E-01     1.500000E+00           
          3  traj.climb_1.states:mass_0              c     0.000000E+00     7.242228E+00     1.000000E+17           
          4  traj.climb_1.states:mass_1              c     0.000000E+00     7.229541E+00     1.000000E+17           
          5  traj.climb_1.states:mass_2              c     0.000000E+00     7.214117E+00     1.000000E+17           
          6  traj.climb_1.states:mass_3              c     0.000000E+00     7.209568E+00     1.000000E+17           
          7  traj.climb_1.states:mass_4              c     0.000000E+00     7.189805E+00     1.000000E+17           
          8  traj.climb_1.states:mass_5              c     0.000000E+00     7.165085E+00     1.000000E+17           
          9  traj.climb_1.states:mass_6              c     0.000000E+00     7.157541E+00     1.000000E+17           
         10  traj.climb_1.states:mass_7              c     0.000000E+00     7.137379E+00     1.000000E+17           
         11  traj.climb_1.states:mass_8              c     0.000000E+00     7.109794E+00     1.000000E+17           
         12  traj.climb_1.states:mass_9              c     0.000000E+00     7.101008E+00     1.000000E+17           
         13  traj.climb_1.states:mass_10             c     0.000000E+00     7.084077E+00     1.000000E+17           
         14  traj.climb_1.states:mass_11             c     0.000000E+00     7.060515E+00     1.000000E+17           
         15  traj.climb_1.states:mass_12             c     0.000000E+00     7.052983E+00     1.000000E+17           
         16  traj.climb_1.states:mass_13             c     0.000000E+00     7.044509E+00     1.000000E+17           
         17  traj.climb_1.states:mass_14             c     0.000000E+00     7.032728E+00     1.000000E+17           
         18  traj.climb_1.states:mass_15             c     0.000000E+00     7.028971E+00     1.000000E+17           
         19  traj.climb_1.states:distance_0          c     0.000000E+00     7.495405E-03     1.000000E+15           
         20  traj.climb_1.states:distance_1          c     0.000000E+00     1.907927E-02     1.000000E+15           
         21  traj.climb_1.states:distance_2          c     0.000000E+00     2.304293E-02     1.000000E+15           
         22  traj.climb_1.states:distance_3          c     0.000000E+00     4.345200E-02     1.000000E+15           
         23  traj.climb_1.states:distance_4          c     0.000000E+00     7.658218E-02     1.000000E+15           
         24  traj.climb_1.states:distance_5          c     0.000000E+00     8.824324E-02     1.000000E+15           
         25  traj.climb_1.states:distance_6          c     0.000000E+00     1.227871E-01     1.000000E+15           
         26  traj.climb_1.states:distance_7          c     0.000000E+00     1.769906E-01     1.000000E+15           
         27  traj.climb_1.states:distance_8          c     0.000000E+00     1.956817E-01     1.000000E+15           
         28  traj.climb_1.states:distance_9          c     0.000000E+00     2.337045E-01     1.000000E+15           
         29  traj.climb_1.states:distance_10         c     0.000000E+00     2.904230E-01     1.000000E+15           
         30  traj.climb_1.states:distance_11         c     0.000000E+00     3.093745E-01     1.000000E+15           
         31  traj.climb_1.states:distance_12         c     0.000000E+00     3.311822E-01     1.000000E+15           
         32  traj.climb_1.states:distance_13         c     0.000000E+00     3.622257E-01     1.000000E+15           
         33  traj.climb_1.states:distance_14         c     0.000000E+00     3.722778E-01     1.000000E+15           
         34  traj.climb_1.controls:mach_0            c     3.600000E-01     4.000000E-01     1.680000E+00           
         35  traj.climb_1.controls:mach_1            c     3.600000E-01     1.473893E+00     1.680000E+00           
         36  traj.climb_1.controls:altitude_0        c     0.000000E+00     9.946794E-36     1.000000E+00          l
         37  traj.climb_1.controls:altitude_1        c     0.000000E+00     9.814110E-01     1.000000E+00           
         38  traj.cruise.t_duration_0                c     5.000000E-01     1.304779E+00     1.500000E+00           
         39  traj.cruise.states:mass_0               c     0.000000E+00     6.994260E+00     1.000000E+17           
         40  traj.cruise.states:mass_1               c     0.000000E+00     6.946719E+00     1.000000E+17           
         41  traj.cruise.states:mass_2               c     0.000000E+00     6.931756E+00     1.000000E+17           
         42  traj.cruise.states:mass_3               c     0.000000E+00     6.862322E+00     1.000000E+17           
         43  traj.cruise.states:mass_4               c     0.000000E+00     6.767958E+00     1.000000E+17           
         44  traj.cruise.states:mass_5               c     0.000000E+00     6.738438E+00     1.000000E+17           
         45  traj.cruise.states:mass_6               c     0.000000E+00     6.658903E+00     1.000000E+17           
         46  traj.cruise.states:mass_7               c     0.000000E+00     6.551145E+00     1.000000E+17           
         47  traj.cruise.states:mass_8               c     0.000000E+00     6.517513E+00     1.000000E+17           
         48  traj.cruise.states:mass_9               c     0.000000E+00     6.453310E+00     1.000000E+17           
         49  traj.cruise.states:mass_10              c     0.000000E+00     6.365892E+00     1.000000E+17           
         50  traj.cruise.states:mass_11              c     0.000000E+00     6.338499E+00     1.000000E+17           
         51  traj.cruise.states:mass_12              c     0.000000E+00     6.307943E+00     1.000000E+17           
         52  traj.cruise.states:mass_13              c     0.000000E+00     6.266042E+00     1.000000E+17           
         53  traj.cruise.states:mass_14              c     0.000000E+00     6.252840E+00     1.000000E+17           
         54  traj.cruise.states:distance_0           c     0.000000E+00     5.043423E-01     1.000000E+15           
         55  traj.cruise.states:distance_1           c     0.000000E+00     6.864025E-01     1.000000E+15           
         56  traj.cruise.states:distance_2           c     0.000000E+00     7.439848E-01     1.000000E+15           
         57  traj.cruise.states:distance_3           c     0.000000E+00     1.013026E+00     1.000000E+15           
         58  traj.cruise.states:distance_4           c     0.000000E+00     1.383570E+00     1.000000E+15           
         59  traj.cruise.states:distance_5           c     0.000000E+00     1.500682E+00     1.000000E+15           
         60  traj.cruise.states:distance_6           c     0.000000E+00     1.819116E+00     1.000000E+15           
         61  traj.cruise.states:distance_7           c     0.000000E+00     2.257528E+00     1.000000E+15           
         62  traj.cruise.states:distance_8           c     0.000000E+00     2.396051E+00     1.000000E+15           
         63  traj.cruise.states:distance_9           c     0.000000E+00     2.662539E+00     1.000000E+15           
         64  traj.cruise.states:distance_10          c     0.000000E+00     3.029554E+00     1.000000E+15           
         65  traj.cruise.states:distance_11          c     0.000000E+00     3.145547E+00     1.000000E+15           
         66  traj.cruise.states:distance_12          c     0.000000E+00     3.275522E+00     1.000000E+15           
         67  traj.cruise.states:distance_13          c     0.000000E+00     3.454794E+00     1.000000E+15           
         68  traj.cruise.states:distance_14          c     0.000000E+00     3.511533E+00     1.000000E+15           
         69  traj.cruise.controls:mach_0             c     1.400000E+00     1.473893E+00     1.680000E+00           
         70  traj.cruise.controls:mach_1             c     1.400000E+00     1.474356E+00     1.680000E+00           
         71  traj.cruise.controls:altitude_0         c     8.767123E-01     8.873031E-01     1.000000E+00           
         72  traj.cruise.controls:altitude_1         c     8.767123E-01     9.999473E-01     1.000000E+00           
         73  traj.descent_1.t_duration_0             c     5.000000E-01     7.646693E-01     1.500000E+00           
         74  traj.descent_1.states:mass_0            c     0.000000E+00     6.250309E+00     1.000000E+17           
         75  traj.descent_1.states:mass_1            c     0.000000E+00     6.246886E+00     1.000000E+17           
         76  traj.descent_1.states:mass_2            c     0.000000E+00     6.245815E+00     1.000000E+17           
         77  traj.descent_1.states:mass_3            c     0.000000E+00     6.240944E+00     1.000000E+17           
         78  traj.descent_1.states:mass_4            c     0.000000E+00     6.234627E+00     1.000000E+17           
         79  traj.descent_1.states:mass_5            c     0.000000E+00     6.232737E+00     1.000000E+17           
         80  traj.descent_1.states:mass_6            c     0.000000E+00     6.227853E+00     1.000000E+17           
         81  traj.descent_1.states:mass_7            c     0.000000E+00     6.221992E+00     1.000000E+17           
         82  traj.descent_1.states:mass_8            c     0.000000E+00     6.220401E+00     1.000000E+17           
         83  traj.descent_1.states:mass_9            c     0.000000E+00     6.217387E+00     1.000000E+17           
         84  traj.descent_1.states:mass_10           c     0.000000E+00     6.213112E+00     1.000000E+17           
         85  traj.descent_1.states:mass_11           c     0.000000E+00     6.211641E+00     1.000000E+17           
         86  traj.descent_1.states:mass_12           c     0.000000E+00     6.209898E+00     1.000000E+17           
         87  traj.descent_1.states:mass_13           c     0.000000E+00     6.207271E+00     1.000000E+17           
         88  traj.descent_1.states:mass_14           c     0.000000E+00     6.206376E+00     1.000000E+17           
         89  traj.descent_1.states:distance_0        c     0.000000E+00     3.532075E+00     1.000000E+15           
         90  traj.descent_1.states:distance_1        c     0.000000E+00     3.559598E+00     1.000000E+15           
         91  traj.descent_1.states:distance_2        c     0.000000E+00     3.568117E+00     1.000000E+15           
         92  traj.descent_1.states:distance_3        c     0.000000E+00     3.606664E+00     1.000000E+15           
         93  traj.descent_1.states:distance_4        c     0.000000E+00     3.656272E+00     1.000000E+15           
         94  traj.descent_1.states:distance_5        c     0.000000E+00     3.671079E+00     1.000000E+15           
         95  traj.descent_1.states:distance_6        c     0.000000E+00     3.709141E+00     1.000000E+15           
         96  traj.descent_1.states:distance_7        c     0.000000E+00     3.756069E+00     1.000000E+15           
         97  traj.descent_1.states:distance_8        c     0.000000E+00     3.769525E+00     1.000000E+15           
         98  traj.descent_1.states:distance_9        c     0.000000E+00     3.793494E+00     1.000000E+15           
         99  traj.descent_1.states:distance_10       c     0.000000E+00     3.822244E+00     1.000000E+15           
        100  traj.descent_1.states:distance_11       c     0.000000E+00     3.830273E+00     1.000000E+15           
        101  traj.descent_1.states:distance_12       c     0.000000E+00     3.838652E+00     1.000000E+15           
        102  traj.descent_1.states:distance_13       c     0.000000E+00     3.849116E+00     1.000000E+15           
        103  traj.descent_1.states:distance_14       c     0.000000E+00     3.852160E+00     1.000000E+15           
        104  traj.descent_1.controls:mach_0          c     3.800000E-01     1.474356E+00     1.680000E+00           
        105  traj.descent_1.controls:mach_1          c     3.800000E-01     4.200000E-01     1.680000E+00           
        106  traj.descent_1.controls:altitude_0      c     0.000000E+00     9.999473E-01     1.000000E+00           
        107  traj.descent_1.controls:altitude_1      c     0.000000E+00     1.138882E-37     1.000000E+00          l

   Constraints (i - inequality, e - equality)
      Index  Name                                                           Type          Lower           Value           Upper    Status  Lagrange Multiplier (N/A)
          0  mission:constraints:range_residual                                e   0.000000E+00    0.000000E+00    0.000000E+00              9.00000E+100
          1  gtow_constraint.GTOW                                              e   0.000000E+00    0.000000E+00    0.000000E+00              9.00000E+100
          2  link_climb_1_mass.mass                                            e   0.000000E+00    0.000000E+00    0.000000E+00              9.00000E+100
          3  mission:constraints:mass_residual                                 e   0.000000E+00   -1.254375E-13    0.000000E+00              9.00000E+100
          4  traj.linkages.climb_1:altitude_final|cruise:altitude_initial      e   0.000000E+00    0.000000E+00    0.000000E+00              9.00000E+100
          5  traj.linkages.climb_1:mach_final|cruise:mach_initial              e   0.000000E+00    0.000000E+00    0.000000E+00              9.00000E+100
          6  traj.linkages.cruise:altitude_final|descent_1:altitude_initial    e   0.000000E+00    0.000000E+00    0.000000E+00              9.00000E+100
          7  traj.linkages.cruise:mach_final|descent_1:mach_initial            e   0.000000E+00    0.000000E+00    0.000000E+00              9.00000E+100
          8  traj.phases.climb_1->initial_boundary_constraint->mach            e   2.000000E-01    2.000000E-01    2.000000E-01              9.00000E+100
          9  traj.phases.climb_1->initial_boundary_constraint->altitude        e   0.000000E+00    3.282442E-35    0.000000E+00              9.00000E+100
         10  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00   -3.872688E-13    0.000000E+00              9.00000E+100
         11  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00   -2.501109E-12    0.000000E+00              9.00000E+100
         12  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00   -1.066950E-12    0.000000E+00              9.00000E+100
         13  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00   -5.547756E-14    0.000000E+00              9.00000E+100
         14  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    1.423546E-11    0.000000E+00              9.00000E+100
         15  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    4.235356E-11    0.000000E+00              9.00000E+100
         16  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    6.402065E-11    0.000000E+00              9.00000E+100
         17  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    1.026078E-10    0.000000E+00              9.00000E+100
         18  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    1.445239E-10    0.000000E+00              9.00000E+100
         19  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    1.367993E-10    0.000000E+00              9.00000E+100
         20  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    1.850982E-10    0.000000E+00              9.00000E+100
         21  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    2.453178E-10    0.000000E+00              9.00000E+100
         22  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    1.280561E-10    0.000000E+00              9.00000E+100
         23  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    1.482791E-10    0.000000E+00              9.00000E+100
         24  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    1.719929E-10    0.000000E+00              9.00000E+100
         25  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00    4.414862E-14    0.000000E+00              9.00000E+100
         26  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00   -2.344211E-12    0.000000E+00              9.00000E+100
         27  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00   -5.585368E-12    0.000000E+00              9.00000E+100
         28  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00   -1.347509E-11    0.000000E+00              9.00000E+100
         29  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00   -2.297285E-11    0.000000E+00              9.00000E+100
         30  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00   -3.559919E-11    0.000000E+00              9.00000E+100
         31  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00   -4.693487E-11    0.000000E+00              9.00000E+100
         32  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00   -5.913922E-11    0.000000E+00              9.00000E+100
         33  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00   -7.512049E-11    0.000000E+00              9.00000E+100
         34  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00   -6.726030E-11    0.000000E+00              9.00000E+100
         35  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00   -7.486133E-11    0.000000E+00              9.00000E+100
         36  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00   -8.479904E-11    0.000000E+00              9.00000E+100
         37  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00   -4.299505E-11    0.000000E+00              9.00000E+100
         38  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00   -4.460812E-11    0.000000E+00              9.00000E+100
         39  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00   -4.676538E-11    0.000000E+00              9.00000E+100
         40  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    9.027010E-10    0.000000E+00              9.00000E+100
         41  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    8.967860E-10    0.000000E+00              9.00000E+100
         42  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    9.210970E-10    0.000000E+00              9.00000E+100
         43  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    1.912623E-09    0.000000E+00              9.00000E+100
         44  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    2.158112E-09    0.000000E+00              9.00000E+100
         45  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    2.754156E-09    0.000000E+00              9.00000E+100
         46  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    3.569662E-09    0.000000E+00              9.00000E+100
         47  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    4.538619E-09    0.000000E+00              9.00000E+100
         48  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    6.249684E-09    0.000000E+00              9.00000E+100
         49  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    5.783728E-09    0.000000E+00              9.00000E+100
         50  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    7.213419E-09    0.000000E+00              9.00000E+100
         51  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    9.019695E-09    0.000000E+00              9.00000E+100
         52  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    4.715675E-09    0.000000E+00              9.00000E+100
         53  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    1.816102E-08    0.000000E+00              9.00000E+100
         54  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    3.251033E-09    0.000000E+00              9.00000E+100
         55  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00   -2.746789E-10    0.000000E+00              9.00000E+100
         56  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00   -2.007807E-10    0.000000E+00              9.00000E+100
         57  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00   -9.877807E-11    0.000000E+00              9.00000E+100
         58  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00   -1.357818E-10    0.000000E+00              9.00000E+100
         59  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    1.727689E-10    0.000000E+00              9.00000E+100
         60  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    5.988419E-10    0.000000E+00              9.00000E+100
         61  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    8.723859E-10    0.000000E+00              9.00000E+100
         62  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    1.309391E-09    0.000000E+00              9.00000E+100
         63  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    1.912907E-09    0.000000E+00              9.00000E+100
         64  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    1.769809E-09    0.000000E+00              9.00000E+100
         65  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    2.079615E-09    0.000000E+00              9.00000E+100
         66  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    2.507531E-09    0.000000E+00              9.00000E+100
         67  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    1.292332E-09    0.000000E+00              9.00000E+100
         68  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    1.369024E-09    0.000000E+00              9.00000E+100
         69  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    1.473374E-09    0.000000E+00              9.00000E+100
         70  traj.phases.descent_1->final_boundary_constraint->mach            e   2.100000E-01    2.100000E-01    2.100000E-01              9.00000E+100
         71  traj.phases.descent_1->final_boundary_constraint->altitude        e   0.000000E+00    4.156920E-37    0.000000E+00              9.00000E+100
         72  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    5.308415E-10    0.000000E+00              9.00000E+100
         73  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    6.559527E-10    0.000000E+00              9.00000E+100
         74  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    5.736689E-10    0.000000E+00              9.00000E+100
         75  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    1.082402E-09    0.000000E+00              9.00000E+100
         76  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    2.569144E-09    0.000000E+00              9.00000E+100
         77  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    6.906196E-10    0.000000E+00              9.00000E+100
         78  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    6.537094E-10    0.000000E+00              9.00000E+100
         79  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    2.105988E-10    0.000000E+00              9.00000E+100
         80  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    4.376311E-10    0.000000E+00              9.00000E+100
         81  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    2.899310E-10    0.000000E+00              9.00000E+100
         82  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    1.428909E-10    0.000000E+00              9.00000E+100
         83  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    3.093618E-11    0.000000E+00              9.00000E+100
         84  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    7.364742E-12    0.000000E+00              9.00000E+100
         85  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    5.215960E-11    0.000000E+00              9.00000E+100
         86  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00   -3.081102E-13    0.000000E+00              9.00000E+100
         87  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -1.750848E-10    0.000000E+00              9.00000E+100
         88  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -1.687009E-10    0.000000E+00              9.00000E+100
         89  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -1.600590E-10    0.000000E+00              9.00000E+100
         90  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -3.212125E-10    0.000000E+00              9.00000E+100
         91  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -2.941299E-10    0.000000E+00              9.00000E+100
         92  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -2.553025E-10    0.000000E+00              9.00000E+100
         93  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -2.885085E-10    0.000000E+00              9.00000E+100
         94  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -2.466360E-10    0.000000E+00              9.00000E+100
         95  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -1.865643E-10    0.000000E+00              9.00000E+100
         96  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -1.404749E-10    0.000000E+00              9.00000E+100
         97  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -1.081960E-10    0.000000E+00              9.00000E+100
         98  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -6.238807E-11    0.000000E+00              9.00000E+100
         99  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -2.330222E-11    0.000000E+00              9.00000E+100
        100  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -1.509451E-11    0.000000E+00              9.00000E+100
        101  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -3.623208E-12    0.000000E+00              9.00000E+100
        102  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    5.528490E-01    1.000000E+00              9.00000E+100
        103  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    5.161514E-01    1.000000E+00              9.00000E+100
        104  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    4.862080E-01    1.000000E+00              9.00000E+100
        105  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    4.802220E-01    1.000000E+00              9.00000E+100
        106  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    4.802220E-01    1.000000E+00              9.00000E+100
        107  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    4.693322E-01    1.000000E+00              9.00000E+100
        108  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    4.890391E-01    1.000000E+00              9.00000E+100
        109  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    5.002307E-01    1.000000E+00              9.00000E+100
        110  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    5.002307E-01    1.000000E+00              9.00000E+100
        111  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    5.468525E-01    1.000000E+00              9.00000E+100
        112  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    6.302411E-01    1.000000E+00              9.00000E+100
        113  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    6.605143E-01    1.000000E+00              9.00000E+100
        114  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    6.605143E-01    1.000000E+00              9.00000E+100
        115  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    7.248795E-01    1.000000E+00              9.00000E+100
        116  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    8.316905E-01    1.000000E+00              9.00000E+100
        117  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    8.695791E-01    1.000000E+00              9.00000E+100
        118  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    8.695791E-01    1.000000E+00              9.00000E+100
        119  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    9.176228E-01    1.000000E+00              9.00000E+100
        120  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    9.785432E-01    1.000000E+00              9.00000E+100
        121  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    9.999688E-01    1.000000E+00              9.00000E+100
        122  traj.phases.cruise->initial_boundary_constraint->throttle         i   0.000000E+00    7.105312E-01    1.000000E+00              9.00000E+100
        123  traj.phases.cruise->final_boundary_constraint->throttle           i   0.000000E+00    7.657332E-01    1.000000E+00              9.00000E+100
        124  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    3.766304E-01    1.000000E+00              9.00000E+100
        125  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    3.459401E-01    1.000000E+00              9.00000E+100
        126  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    3.064431E-01    1.000000E+00              9.00000E+100
        127  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    2.952536E-01    1.000000E+00              9.00000E+100
        128  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    2.952536E-01    1.000000E+00              9.00000E+100
        129  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    2.471150E-01    1.000000E+00              9.00000E+100
        130  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    1.841893E-01    1.000000E+00              9.00000E+100
        131  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    1.673682E-01    1.000000E+00              9.00000E+100
        132  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    1.673682E-01    1.000000E+00              9.00000E+100
        133  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    1.283474E-01    1.000000E+00              9.00000E+100
        134  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    7.516258E-02    1.000000E+00              9.00000E+100
        135  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    5.365967E-02    1.000000E+00              9.00000E+100
        136  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    5.365967E-02    1.000000E+00              9.00000E+100
        137  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    2.144768E-02    1.000000E+00              9.00000E+100
        138  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    1.590185E-04    1.000000E+00              9.00000E+100
        139  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    6.578323E-04    1.000000E+00              9.00000E+100
        140  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    6.578323E-04    1.000000E+00              9.00000E+100
        141  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    6.617511E-03    1.000000E+00              9.00000E+100
        142  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    2.691017E-02    1.000000E+00              9.00000E+100
        143  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    3.712307E-02    1.000000E+00              9.00000E+100

--------------------------------------------------------------------------------
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/openmdao/core/driver.py:143: OMDeprecationWarning:boolean evaluation of DriverResult is temporarily implemented to mimick the previous `failed` return behavior of run_driver.
Use the `success` attribute of the returned DriverResult object to test for successful driver completion.

Now, let’s see the fuel burn:

optimized_mission_fixed_wing_fuel_burn = prob.get_val(av.Mission.Summary.FUEL_BURNED, units='kg')[0]
optimized_mission_fixed_wing_aspect_ratio = prob.get_val(av.Aircraft.Wing.ASPECT_RATIO)[0]
print('Mission fuel burn, kg:', optimized_mission_fixed_wing_fuel_burn)
print('Aspect ratio:', optimized_mission_fixed_wing_aspect_ratio)
Mission fuel burn, kg: 10358.521051657415
Aspect ratio: 11.22091

Optimizing the mission did not have nearly as large of an impact on the fuel burn as optimizing the aspect ratio did. However, the fuel burn still decreased. Let us now look at the fully coupled case.

Optimized Mission Profile, Optimized Aircraft Wing Aspect Ratio#

Remember we have already modified the phase_info object so that the Mach and altitude profiles are optimized. Now we return to the Level 2 way of running the problem with the wing aspect ratio as a design variable.

prob = av.AviaryProblem(av.AnalysisScheme.COLLOCATION)

# Load aircraft and options data from user
# Allow for user overrides here
prob.load_inputs(aircraft_filename, phase_info)

prob.check_and_preprocess_inputs()
# Preprocess inputs
prob.add_pre_mission_systems()

prob.add_phases()

prob.add_post_mission_systems()

# Link phases and variables
prob.link_phases()

prob.add_driver(optimizer, max_iter=max_iter)

prob.add_design_variables()

# prob.model.add_design_var(av.Aircraft.Engine.SCALED_SLS_THRUST, lower=25.e3, upper=30.e3, units='lbf', ref=28.e3)
prob.model.add_design_var(av.Aircraft.Wing.ASPECT_RATIO, lower=10., upper=14., ref=12.)

# Load optimization problem formulation
# Detail which variables the optimizer can control
prob.add_objective()

prob.setup()

prob.set_initial_guesses()

prob.run_aviary_problem(make_plots=make_plots)
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/dymos/phase/phase.py:897: OMDeprecationWarning:None: The method `add_polynomial_control` is deprecated and will be removed in Dymos 2.1. Please use `add_control` with the appropriate options to define a polynomial control.
The following variables have been overridden:
  'aircraft:design:touchdown_mass  152800  lbm
  'aircraft:engine:mass  [7400.]  lbm
  'aircraft:fins:mass  0  lbm
  'aircraft:fuel:auxiliary_fuel_capacity  0  lbm
  'aircraft:fuel:fuselage_fuel_capacity  0  lbm
  'aircraft:fuel:total_capacity  45694  lbm
  'aircraft:fuselage:planform_area  1578.24  ft**2
  'aircraft:fuselage:wetted_area  4158.62  ft**2
  'aircraft:horizontal_tail:wetted_area  592.65  ft**2
  'aircraft:landing_gear:main_gear_oleo_length  102  inch
  'aircraft:landing_gear:nose_gear_oleo_length  67  inch
  'aircraft:vertical_tail:wetted_area  581.13  ft**2
  'aircraft:wing:aspect_ratio  11.22091  unitless
  'aircraft:wing:control_surface_area  137  ft**2
  'aircraft:wing:wetted_area  2396.56  ft**2

--- Constraint Report [traj] ---
    --- climb_1 ---
        [initial] 2.0000e-01 == mach [unitless]
        [initial] 0.0000e+00 == altitude [ft]
        [path]    0.0000e+00 <= throttle <= 1.0000e+00  [unitless]
    --- cruise ---
        [initial] 0.0000e+00 <= throttle <= 1.0000e+00  [unitless]
        [final]   0.0000e+00 <= throttle <= 1.0000e+00  [unitless]
    --- descent_1 ---
        [final]   2.1000e-01 == mach [unitless]
        [final]   0.0000e+00 == altitude [ft]
        [path]    0.0000e+00 <= throttle <= 1.0000e+00  [unitless]
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/openmdao/solvers/linear/linear_rhs_checker.py:178: SolverWarning:DirectSolver in 'traj.phases.cruise.indep_states' <class StateIndependentsComp>: 'rhs_checking' is active but no redundant adjoint dependencies were found, so caching has been disabled.
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/openmdao/solvers/linear/linear_rhs_checker.py:178: SolverWarning:DirectSolver in 'traj.phases.descent_1.indep_states' <class StateIndependentsComp>: 'rhs_checking' is active but no redundant adjoint dependencies were found, so caching has been disabled.
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/openmdao/recorders/sqlite_recorder.py:226: UserWarning:The existing case recorder file, problem_history.db, is being overwritten.
Model viewer data has already been recorded for Driver.
Model viewer data has already been recorded for Driver.
Full total jacobian for problem 'problem' was computed 3 times, taking 0.7321044310000389 seconds.
Total jacobian shape: (145, 109) 


Jacobian shape: (145, 109)  (10.08% nonzero)
FWD solves: 18   REV solves: 0
Total colors vs. total size: 18 vs 109  (83.49% improvement)

Sparsity computed using tolerance: 1e-25
Time to compute sparsity:   0.7321 sec
Time to compute coloring:   0.0691 sec
Memory to compute coloring:   0.0000 MB
Coloring created on: 2024-11-19 19:04:55
This is Ipopt version 3.14.16, running with linear solver MUMPS 5.7.3.

Number of nonzeros in equality constraint Jacobian...:      962
Number of nonzeros in inequality constraint Jacobian.:      629
Number of nonzeros in Lagrangian Hessian.............:        0

Total number of variables............................:      109
                     variables with only lower bounds:        2
                variables with lower and upper bounds:      107
                     variables with only upper bounds:        0
Total number of equality constraints.................:      102
Total number of inequality constraints...............:       42
        inequality constraints with only lower bounds:        0
   inequality constraints with lower and upper bounds:       42
        inequality constraints with only upper bounds:        0

iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
   0  3.0000000e-01 2.07e+02 8.69e-02  -5.0 0.00e+00    -  0.00e+00 0.00e+00   0
  10  4.7414344e-01 1.91e+02 1.06e+00  -5.0 8.86e+00    -  7.01e-05 9.22e-05h  1
  20  9.2165448e-01 1.58e+02 1.23e+00  -5.0 2.96e+00    -  8.64e-02 1.33e-02h  1
  30  2.5234578e+00 2.72e-01 3.10e-01  -5.0 1.06e+00    -  7.92e-02 1.15e-01f  1
  40  2.3796601e+00 4.21e-02 7.96e-02  -5.0 6.65e-01    -  5.48e-01 7.02e-01h  1
Number of Iterations....: 49

                                   (scaled)                 (unscaled)
Objective...............:   2.3887855407823286e+00    2.3887855407823286e+00
Dual infeasibility......:   5.0964944842135651e-07    5.0964944842135651e-07
Constraint violation....:   9.4142373270468412e-12    9.4142373270468412e-12
Variable bound violation:   4.3247145469229573e-41    4.3247145469229573e-41
Complementarity.........:   9.0909677431568982e-08    9.0909677431568982e-08
Overall NLP error.......:   5.0964944842135651e-07    5.0964944842135651e-07


Number of objective function evaluations             = 50
Number of objective gradient evaluations             = 50
Number of equality constraint evaluations            = 50
Number of inequality constraint evaluations          = 50
Number of equality constraint Jacobian evaluations   = 50
Number of inequality constraint Jacobian evaluations = 50
Number of Lagrangian Hessian evaluations             = 0
Total seconds in IPOPT                               = 20.502

EXIT: Optimal Solution Found.
minimal_print is not available for this solution


Optimization Problem -- Optimization using pyOpt_sparse
================================================================================
    Objective Function: _objfunc

    Solution: 
--------------------------------------------------------------------------------
    Total Time:                   20.5034
       User Objective Time :      14.9947
       User Sensitivity Time :     5.1988
       Interface Time :            0.1512
       Opt Solver Time:            0.1588
    Calls to Objective Function :      51
    Calls to Sens Function :           51


   Objectives
      Index  Name                               Value
          0  mission:objectives:fuel     2.388786E+00

   Variables (c - continuous, i - integer, d - discrete)
      Index  Name                                 Type      Lower Bound            Value      Upper Bound     Status
          0  mission:design:gross_mass_0             c     5.714286E-05     8.989198E-01     1.000000E+30           
          1  mission:summary:gross_mass_0            c     5.714286E-05     8.989198E-01     1.000000E+30           
          2  aircraft:wing:aspect_ratio_0            c     8.333333E-01     1.166667E+00     1.166667E+00          u
          3  traj.climb_1.t_duration_0               c     5.000000E-01     5.379544E-01     1.500000E+00           
          4  traj.climb_1.states:mass_0              c     0.000000E+00     7.135505E+00     1.000000E+17           
          5  traj.climb_1.states:mass_1              c     0.000000E+00     7.125765E+00     1.000000E+17           
          6  traj.climb_1.states:mass_2              c     0.000000E+00     7.113500E+00     1.000000E+17           
          7  traj.climb_1.states:mass_3              c     0.000000E+00     7.109809E+00     1.000000E+17           
          8  traj.climb_1.states:mass_4              c     0.000000E+00     7.093420E+00     1.000000E+17           
          9  traj.climb_1.states:mass_5              c     0.000000E+00     7.072301E+00     1.000000E+17           
         10  traj.climb_1.states:mass_6              c     0.000000E+00     7.065792E+00     1.000000E+17           
         11  traj.climb_1.states:mass_7              c     0.000000E+00     7.048319E+00     1.000000E+17           
         12  traj.climb_1.states:mass_8              c     0.000000E+00     7.024422E+00     1.000000E+17           
         13  traj.climb_1.states:mass_9              c     0.000000E+00     7.016838E+00     1.000000E+17           
         14  traj.climb_1.states:mass_10             c     0.000000E+00     7.002252E+00     1.000000E+17           
         15  traj.climb_1.states:mass_11             c     0.000000E+00     6.982045E+00     1.000000E+17           
         16  traj.climb_1.states:mass_12             c     0.000000E+00     6.975608E+00     1.000000E+17           
         17  traj.climb_1.states:mass_13             c     0.000000E+00     6.968383E+00     1.000000E+17           
         18  traj.climb_1.states:mass_14             c     0.000000E+00     6.958362E+00     1.000000E+17           
         19  traj.climb_1.states:mass_15             c     0.000000E+00     6.955177E+00     1.000000E+17           
         20  traj.climb_1.states:distance_0          c     0.000000E+00     6.724829E-03     1.000000E+15           
         21  traj.climb_1.states:distance_1          c     0.000000E+00     1.705748E-02     1.000000E+15           
         22  traj.climb_1.states:distance_2          c     0.000000E+00     2.058008E-02     1.000000E+15           
         23  traj.climb_1.states:distance_3          c     0.000000E+00     3.864228E-02     1.000000E+15           
         24  traj.climb_1.states:distance_4          c     0.000000E+00     6.777764E-02     1.000000E+15           
         25  traj.climb_1.states:distance_5          c     0.000000E+00     7.799478E-02     1.000000E+15           
         26  traj.climb_1.states:distance_6          c     0.000000E+00     1.081787E-01     1.000000E+15           
         27  traj.climb_1.states:distance_7          c     0.000000E+00     1.553593E-01     1.000000E+15           
         28  traj.climb_1.states:distance_8          c     0.000000E+00     1.715900E-01     1.000000E+15           
         29  traj.climb_1.states:distance_9          c     0.000000E+00     2.045594E-01     1.000000E+15           
         30  traj.climb_1.states:distance_10         c     0.000000E+00     2.536404E-01     1.000000E+15           
         31  traj.climb_1.states:distance_11         c     0.000000E+00     2.700175E-01     1.000000E+15           
         32  traj.climb_1.states:distance_12         c     0.000000E+00     2.888507E-01     1.000000E+15           
         33  traj.climb_1.states:distance_13         c     0.000000E+00     3.156390E-01     1.000000E+15           
         34  traj.climb_1.states:distance_14         c     0.000000E+00     3.243083E-01     1.000000E+15           
         35  traj.climb_1.controls:mach_0            c     3.600000E-01     4.000000E-01     1.680000E+00           
         36  traj.climb_1.controls:mach_1            c     3.600000E-01     1.415829E+00     1.680000E+00           
         37  traj.climb_1.controls:altitude_0        c     0.000000E+00     4.719363E-38     1.000000E+00          l
         38  traj.climb_1.controls:altitude_1        c     0.000000E+00     9.999994E-01     1.000000E+00          u
         39  traj.cruise.t_duration_0                c     5.000000E-01     1.356620E+00     1.500000E+00           
         40  traj.cruise.states:mass_0               c     0.000000E+00     6.923592E+00     1.000000E+17           
         41  traj.cruise.states:mass_1               c     0.000000E+00     6.880326E+00     1.000000E+17           
         42  traj.cruise.states:mass_2               c     0.000000E+00     6.866708E+00     1.000000E+17           
         43  traj.cruise.states:mass_3               c     0.000000E+00     6.803500E+00     1.000000E+17           
         44  traj.cruise.states:mass_4               c     0.000000E+00     6.717569E+00     1.000000E+17           
         45  traj.cruise.states:mass_5               c     0.000000E+00     6.690679E+00     1.000000E+17           
         46  traj.cruise.states:mass_6               c     0.000000E+00     6.618213E+00     1.000000E+17           
         47  traj.cruise.states:mass_7               c     0.000000E+00     6.519962E+00     1.000000E+17           
         48  traj.cruise.states:mass_8               c     0.000000E+00     6.489273E+00     1.000000E+17           
         49  traj.cruise.states:mass_9               c     0.000000E+00     6.430647E+00     1.000000E+17           
         50  traj.cruise.states:mass_10              c     0.000000E+00     6.350815E+00     1.000000E+17           
         51  traj.cruise.states:mass_11              c     0.000000E+00     6.325802E+00     1.000000E+17           
         52  traj.cruise.states:mass_12              c     0.000000E+00     6.297898E+00     1.000000E+17           
         53  traj.cruise.states:mass_13              c     0.000000E+00     6.259640E+00     1.000000E+17           
         54  traj.cruise.states:mass_14              c     0.000000E+00     6.247589E+00     1.000000E+17           
         55  traj.cruise.states:distance_0           c     0.000000E+00     4.558279E-01     1.000000E+15           
         56  traj.cruise.states:distance_1           c     0.000000E+00     6.370571E-01     1.000000E+15           
         57  traj.cruise.states:distance_2           c     0.000000E+00     6.943573E-01     1.000000E+15           
         58  traj.cruise.states:distance_3           c     0.000000E+00     9.619575E-01     1.000000E+15           
         59  traj.cruise.states:distance_4           c     0.000000E+00     1.330187E+00     1.000000E+15           
         60  traj.cruise.states:distance_5           c     0.000000E+00     1.446488E+00     1.000000E+15           
         61  traj.cruise.states:distance_6           c     0.000000E+00     1.762522E+00     1.000000E+15           
         62  traj.cruise.states:distance_7           c     0.000000E+00     2.197166E+00     1.000000E+15           
         63  traj.cruise.states:distance_8           c     0.000000E+00     2.334387E+00     1.000000E+15           
         64  traj.cruise.states:distance_9           c     0.000000E+00     2.598218E+00     1.000000E+15           
         65  traj.cruise.states:distance_10          c     0.000000E+00     2.961250E+00     1.000000E+15           
         66  traj.cruise.states:distance_11          c     0.000000E+00     3.075907E+00     1.000000E+15           
         67  traj.cruise.states:distance_12          c     0.000000E+00     3.204353E+00     1.000000E+15           
         68  traj.cruise.states:distance_13          c     0.000000E+00     3.381440E+00     1.000000E+15           
         69  traj.cruise.states:distance_14          c     0.000000E+00     3.437464E+00     1.000000E+15           
         70  traj.cruise.controls:mach_0             c     1.400000E+00     1.415829E+00     1.680000E+00           
         71  traj.cruise.controls:mach_1             c     1.400000E+00     1.400004E+00     1.680000E+00           
         72  traj.cruise.controls:altitude_0         c     8.767123E-01     9.041090E-01     1.000000E+00           
         73  traj.cruise.controls:altitude_1         c     8.767123E-01     9.999996E-01     1.000000E+00          u
         74  traj.descent_1.t_duration_0             c     5.000000E-01     9.683688E-01     1.500000E+00           
         75  traj.descent_1.states:mass_0            c     0.000000E+00     6.244497E+00     1.000000E+17           
         76  traj.descent_1.states:mass_1            c     0.000000E+00     6.240291E+00     1.000000E+17           
         77  traj.descent_1.states:mass_2            c     0.000000E+00     6.238969E+00     1.000000E+17           
         78  traj.descent_1.states:mass_3            c     0.000000E+00     6.232912E+00     1.000000E+17           
         79  traj.descent_1.states:mass_4            c     0.000000E+00     6.224925E+00     1.000000E+17           
         80  traj.descent_1.states:mass_5            c     0.000000E+00     6.222500E+00     1.000000E+17           
         81  traj.descent_1.states:mass_6            c     0.000000E+00     6.216155E+00     1.000000E+17           
         82  traj.descent_1.states:mass_7            c     0.000000E+00     6.208340E+00     1.000000E+17           
         83  traj.descent_1.states:mass_8            c     0.000000E+00     6.206164E+00     1.000000E+17           
         84  traj.descent_1.states:mass_9            c     0.000000E+00     6.202098E+00     1.000000E+17           
         85  traj.descent_1.states:mass_10           c     0.000000E+00     6.196460E+00     1.000000E+17           
         86  traj.descent_1.states:mass_11           c     0.000000E+00     6.194576E+00     1.000000E+17           
         87  traj.descent_1.states:mass_12           c     0.000000E+00     6.192376E+00     1.000000E+17           
         88  traj.descent_1.states:mass_13           c     0.000000E+00     6.189134E+00     1.000000E+17           
         89  traj.descent_1.states:mass_14           c     0.000000E+00     6.188048E+00     1.000000E+17           
         90  traj.descent_1.states:distance_0        c     0.000000E+00     3.462176E+00     1.000000E+15           
         91  traj.descent_1.states:distance_1        c     0.000000E+00     3.495312E+00     1.000000E+15           
         92  traj.descent_1.states:distance_2        c     0.000000E+00     3.505575E+00     1.000000E+15           
         93  traj.descent_1.states:distance_3        c     0.000000E+00     3.552060E+00     1.000000E+15           
         94  traj.descent_1.states:distance_4        c     0.000000E+00     3.612012E+00     1.000000E+15           
         95  traj.descent_1.states:distance_5        c     0.000000E+00     3.629940E+00     1.000000E+15           
         96  traj.descent_1.states:distance_6        c     0.000000E+00     3.676116E+00     1.000000E+15           
         97  traj.descent_1.states:distance_7        c     0.000000E+00     3.733284E+00     1.000000E+15           
         98  traj.descent_1.states:distance_8        c     0.000000E+00     3.749742E+00     1.000000E+15           
         99  traj.descent_1.states:distance_9        c     0.000000E+00     3.779159E+00     1.000000E+15           
        100  traj.descent_1.states:distance_10       c     0.000000E+00     3.814685E+00     1.000000E+15           
        101  traj.descent_1.states:distance_11       c     0.000000E+00     3.824675E+00     1.000000E+15           
        102  traj.descent_1.states:distance_12       c     0.000000E+00     3.835146E+00     1.000000E+15           
        103  traj.descent_1.states:distance_13       c     0.000000E+00     3.848308E+00     1.000000E+15           
        104  traj.descent_1.states:distance_14       c     0.000000E+00     3.852160E+00     1.000000E+15           
        105  traj.descent_1.controls:mach_0          c     3.800000E-01     1.400004E+00     1.680000E+00           
        106  traj.descent_1.controls:mach_1          c     3.800000E-01     4.200000E-01     1.680000E+00           
        107  traj.descent_1.controls:altitude_0      c     0.000000E+00     9.999996E-01     1.000000E+00          u
        108  traj.descent_1.controls:altitude_1      c     0.000000E+00    -4.324715E-41     1.000000E+00          l

   Constraints (i - inequality, e - equality)
      Index  Name                                                           Type          Lower           Value           Upper    Status  Lagrange Multiplier (N/A)
          0  mission:constraints:range_residual                                e   0.000000E+00    0.000000E+00    0.000000E+00              9.00000E+100
          1  gtow_constraint.GTOW                                              e   0.000000E+00    0.000000E+00    0.000000E+00              9.00000E+100
          2  link_climb_1_mass.mass                                            e   0.000000E+00    2.910383E-16    0.000000E+00              9.00000E+100
          3  mission:constraints:mass_residual                                 e   0.000000E+00    2.910383E-16    0.000000E+00              9.00000E+100
          4  traj.linkages.climb_1:altitude_final|cruise:altitude_initial      e   0.000000E+00   -7.275958E-16    0.000000E+00              9.00000E+100
          5  traj.linkages.climb_1:mach_final|cruise:mach_initial              e   0.000000E+00    0.000000E+00    0.000000E+00              9.00000E+100
          6  traj.linkages.cruise:altitude_final|descent_1:altitude_initial    e   0.000000E+00    0.000000E+00    0.000000E+00              9.00000E+100
          7  traj.linkages.cruise:mach_final|descent_1:mach_initial            e   0.000000E+00    0.000000E+00    0.000000E+00              9.00000E+100
          8  traj.phases.climb_1->initial_boundary_constraint->mach            e   2.000000E-01    2.000000E-01    2.000000E-01              9.00000E+100
          9  traj.phases.climb_1->initial_boundary_constraint->altitude        e   0.000000E+00    1.557390E-37    0.000000E+00              9.00000E+100
         10  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    6.146882E-17    0.000000E+00              9.00000E+100
         11  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    2.787019E-15    0.000000E+00              9.00000E+100
         12  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    9.305277E-15    0.000000E+00              9.00000E+100
         13  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    2.460970E-14    0.000000E+00              9.00000E+100
         14  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    6.284913E-14    0.000000E+00              9.00000E+100
         15  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    1.527985E-13    0.000000E+00              9.00000E+100
         16  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    2.277577E-13    0.000000E+00              9.00000E+100
         17  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    3.933563E-13    0.000000E+00              9.00000E+100
         18  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    7.158159E-13    0.000000E+00              9.00000E+100
         19  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    6.966970E-13    0.000000E+00              9.00000E+100
         20  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    8.932838E-13    0.000000E+00              9.00000E+100
         21  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    1.249643E-12    0.000000E+00              9.00000E+100
         22  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    6.617063E-13    0.000000E+00              9.00000E+100
         23  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    7.668682E-13    0.000000E+00              9.00000E+100
         24  traj.climb_1.collocation_constraint.defects:mass                  e   0.000000E+00    8.546614E-13    0.000000E+00              9.00000E+100
         25  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00    4.903361E-19    0.000000E+00              9.00000E+100
         26  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00    8.882627E-18    0.000000E+00              9.00000E+100
         27  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00    2.049982E-17    0.000000E+00              9.00000E+100
         28  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00    4.841411E-17    0.000000E+00              9.00000E+100
         29  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00    8.330925E-17    0.000000E+00              9.00000E+100
         30  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00    1.288347E-16    0.000000E+00              9.00000E+100
         31  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00    1.694276E-16    0.000000E+00              9.00000E+100
         32  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00    2.161347E-16    0.000000E+00              9.00000E+100
         33  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00    2.756633E-16    0.000000E+00              9.00000E+100
         34  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00    2.468080E-16    0.000000E+00              9.00000E+100
         35  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00    2.766961E-16    0.000000E+00              9.00000E+100
         36  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00    3.152887E-16    0.000000E+00              9.00000E+100
         37  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00    1.613206E-16    0.000000E+00              9.00000E+100
         38  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00    1.682230E-16    0.000000E+00              9.00000E+100
         39  traj.climb_1.collocation_constraint.defects:distance              e   0.000000E+00    1.761438E-16    0.000000E+00              9.00000E+100
         40  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    5.190511E-12    0.000000E+00              9.00000E+100
         41  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    4.981413E-12    0.000000E+00              9.00000E+100
         42  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    4.698026E-12    0.000000E+00              9.00000E+100
         43  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    9.414237E-12    0.000000E+00              9.00000E+100
         44  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    8.585516E-12    0.000000E+00              9.00000E+100
         45  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    7.484989E-12    0.000000E+00              9.00000E+100
         46  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    8.496761E-12    0.000000E+00              9.00000E+100
         47  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    7.431045E-12    0.000000E+00              9.00000E+100
         48  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    6.031319E-12    0.000000E+00              9.00000E+100
         49  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    4.716778E-12    0.000000E+00              9.00000E+100
         50  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    4.047150E-12    0.000000E+00              9.00000E+100
         51  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    3.158192E-12    0.000000E+00              9.00000E+100
         52  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    1.397751E-12    0.000000E+00              9.00000E+100
         53  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    1.217706E-12    0.000000E+00              9.00000E+100
         54  traj.cruise.collocation_constraint.defects:mass                   e   0.000000E+00    9.668024E-13    0.000000E+00              9.00000E+100
         55  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    9.424438E-17    0.000000E+00              9.00000E+100
         56  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    9.349838E-17    0.000000E+00              9.00000E+100
         57  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    8.976839E-17    0.000000E+00              9.00000E+100
         58  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    1.675893E-16    0.000000E+00              9.00000E+100
         59  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    1.630187E-16    0.000000E+00              9.00000E+100
         60  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    1.477833E-16    0.000000E+00              9.00000E+100
         61  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    1.575864E-16    0.000000E+00              9.00000E+100
         62  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    1.461146E-16    0.000000E+00              9.00000E+100
         63  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    1.207558E-16    0.000000E+00              9.00000E+100
         64  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    6.246511E-17    0.000000E+00              9.00000E+100
         65  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    9.141236E-17    0.000000E+00              9.00000E+100
         66  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    6.652789E-17    0.000000E+00              9.00000E+100
         67  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    1.516862E-17    0.000000E+00              9.00000E+100
         68  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    3.406723E-17    0.000000E+00              9.00000E+100
         69  traj.cruise.collocation_constraint.defects:distance               e   0.000000E+00    1.914727E-17    0.000000E+00              9.00000E+100
         70  traj.phases.descent_1->final_boundary_constraint->mach            e   2.100000E-01    2.100000E-01    2.100000E-01              9.00000E+100
         71  traj.phases.descent_1->final_boundary_constraint->altitude        e   0.000000E+00   -1.578521E-40    0.000000E+00              9.00000E+100
         72  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    1.654946E-13    0.000000E+00              9.00000E+100
         73  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    1.673942E-13    0.000000E+00              9.00000E+100
         74  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    1.538074E-13    0.000000E+00              9.00000E+100
         75  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    3.044488E-13    0.000000E+00              9.00000E+100
         76  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    2.585604E-13    0.000000E+00              9.00000E+100
         77  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    1.941322E-13    0.000000E+00              9.00000E+100
         78  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    2.039258E-13    0.000000E+00              9.00000E+100
         79  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    1.541733E-13    0.000000E+00              9.00000E+100
         80  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    9.211030E-14    0.000000E+00              9.00000E+100
         81  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    4.125271E-14    0.000000E+00              9.00000E+100
         82  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    1.991489E-14    0.000000E+00              9.00000E+100
         83  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    5.319702E-15    0.000000E+00              9.00000E+100
         84  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    1.544072E-15    0.000000E+00              9.00000E+100
         85  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    7.168181E-16    0.000000E+00              9.00000E+100
         86  traj.descent_1.collocation_constraint.defects:mass                e   0.000000E+00    1.003147E-16    0.000000E+00              9.00000E+100
         87  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00    3.831289E-18    0.000000E+00              9.00000E+100
         88  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -7.905066E-18    0.000000E+00              9.00000E+100
         89  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -2.861343E-18    0.000000E+00              9.00000E+100
         90  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -1.723389E-17    0.000000E+00              9.00000E+100
         91  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00    4.952267E-18    0.000000E+00              9.00000E+100
         92  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -2.872315E-18    0.000000E+00              9.00000E+100
         93  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00    5.416735E-18    0.000000E+00              9.00000E+100
         94  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -8.478368E-18    0.000000E+00              9.00000E+100
         95  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00    2.355102E-17    0.000000E+00              9.00000E+100
         96  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -3.243735E-17    0.000000E+00              9.00000E+100
         97  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -1.188544E-18    0.000000E+00              9.00000E+100
         98  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -1.495585E-17    0.000000E+00              9.00000E+100
         99  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00    2.427292E-17    0.000000E+00              9.00000E+100
        100  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00    1.770153E-18    0.000000E+00              9.00000E+100
        101  traj.descent_1.collocation_constraint.defects:distance            e   0.000000E+00   -1.602837E-17    0.000000E+00              9.00000E+100
        102  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    4.708302E-01    1.000000E+00              9.00000E+100
        103  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    4.528271E-01    1.000000E+00              9.00000E+100
        104  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    4.410077E-01    1.000000E+00              9.00000E+100
        105  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    4.394710E-01    1.000000E+00              9.00000E+100
        106  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    4.394710E-01    1.000000E+00              9.00000E+100
        107  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    4.439610E-01    1.000000E+00              9.00000E+100
        108  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    4.753405E-01    1.000000E+00              9.00000E+100
        109  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    4.887876E-01    1.000000E+00              9.00000E+100
        110  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    4.887876E-01    1.000000E+00              9.00000E+100
        111  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    5.388265E-01    1.000000E+00              9.00000E+100
        112  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    6.256268E-01    1.000000E+00              9.00000E+100
        113  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    6.543322E-01    1.000000E+00              9.00000E+100
        114  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    6.543322E-01    1.000000E+00              9.00000E+100
        115  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    7.209206E-01    1.000000E+00              9.00000E+100
        116  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    8.284828E-01    1.000000E+00              9.00000E+100
        117  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    8.686014E-01    1.000000E+00              9.00000E+100
        118  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    8.686014E-01    1.000000E+00              9.00000E+100
        119  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    9.143822E-01    1.000000E+00              9.00000E+100
        120  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    9.779896E-01    1.000000E+00              9.00000E+100
        121  traj.phases.climb_1->path_constraint->throttle                    i   0.000000E+00    9.999995E-01    1.000000E+00         u    9.00000E+100
        122  traj.phases.cruise->initial_boundary_constraint->throttle         i   0.000000E+00    6.581805E-01    1.000000E+00              9.00000E+100
        123  traj.phases.cruise->final_boundary_constraint->throttle           i   0.000000E+00    6.950000E-01    1.000000E+00              9.00000E+100
        124  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    3.776298E-01    1.000000E+00              9.00000E+100
        125  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    3.485058E-01    1.000000E+00              9.00000E+100
        126  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    3.111974E-01    1.000000E+00              9.00000E+100
        127  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    3.004591E-01    1.000000E+00              9.00000E+100
        128  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    3.004591E-01    1.000000E+00              9.00000E+100
        129  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    2.548713E-01    1.000000E+00              9.00000E+100
        130  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    1.965564E-01    1.000000E+00              9.00000E+100
        131  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    1.802329E-01    1.000000E+00              9.00000E+100
        132  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    1.802329E-01    1.000000E+00              9.00000E+100
        133  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    1.423170E-01    1.000000E+00              9.00000E+100
        134  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    9.653949E-02    1.000000E+00              9.00000E+100
        135  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    7.867897E-02    1.000000E+00              9.00000E+100
        136  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    7.867897E-02    1.000000E+00              9.00000E+100
        137  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    4.357953E-02    1.000000E+00              9.00000E+100
        138  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    9.726228E-03    1.000000E+00              9.00000E+100
        139  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    3.631670E-03    1.000000E+00              9.00000E+100
        140  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    3.631670E-03    1.000000E+00              9.00000E+100
        141  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    5.466826E-07    1.000000E+00         l    9.00000E+100
        142  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    1.725778E-03    1.000000E+00              9.00000E+100
        143  traj.phases.descent_1->path_constraint->throttle                  i   0.000000E+00    4.265474E-03    1.000000E+00              9.00000E+100

--------------------------------------------------------------------------------
/usr/share/miniconda/envs/test/lib/python3.12/site-packages/openmdao/core/driver.py:143: OMDeprecationWarning:boolean evaluation of DriverResult is temporarily implemented to mimick the previous `failed` return behavior of run_driver.
Use the `success` attribute of the returned DriverResult object to test for successful driver completion.

All right, let’s check out this final case’s fuel burn value:

optimized_mission_optimized_wing_fuel_burn = prob.get_val(av.Mission.Summary.FUEL_BURNED, units='kg')[0]
optimized_mission_optimized_wing_aspect_ratio = prob.get_val(av.Aircraft.Wing.ASPECT_RATIO)[0]
print('Mission fuel burn, kg:', optimized_mission_optimized_wing_fuel_burn)
print('Aspect ratio:', optimized_mission_optimized_wing_aspect_ratio)
Mission fuel burn, kg: 9474.57183865188
Aspect ratio: 13.999998491340742

Cool, it’s the lowest yet! Let’s discuss these results in more detail now.

Summary and Takeaways#

We have showcased one of Aviary’s most powerful capabilities here – the ability to simultaneously design an aircraft and optimal trajectory. By building up problem complexity, we can see how optimizing different parts of the problem lead to optimization objective improvements.

Here is a summary table of the results:

Hide code cell source
import pandas as pd

# Create a dictionary with the data
data = {
    'Case': ['Fixed Mission, Fixed Wing', 'Fixed Mission, Optimized Wing', 'Optimized Mission, Fixed Wing', 'Optimized Mission, Optimized Wing'],
    'Optimize Mission': ['-', '-', '✓', '✓'],
    'Optimize Wing': ['-', '✓', '-', '✓'],
    'Aspect Ratio': [fixed_mission_fixed_wing_aspect_ratio, fixed_mission_optimized_wing_aspect_ratio, optimized_mission_fixed_wing_aspect_ratio, optimized_mission_optimized_wing_aspect_ratio],
    'Fuel Burn Value': [fixed_mission_fixed_wing_fuel_burn, fixed_mission_optimized_wing_fuel_burn, optimized_mission_fixed_wing_fuel_burn, optimized_mission_optimized_wing_fuel_burn]
}

# Create a DataFrame from the dictionary
df = pd.DataFrame(data).round(2)

# Display the DataFrame
df
Case Optimize Mission Optimize Wing Aspect Ratio Fuel Burn Value
0 Fixed Mission, Fixed Wing - - 11.22 10506.26
1 Fixed Mission, Optimized Wing - 14.00 9785.39
2 Optimized Mission, Fixed Wing - 11.22 10358.52
3 Optimized Mission, Optimized Wing 14.00 9474.57

We see that the fully coupled case finds the lowest fuel burn value, as expected. In both cases where the wing aspect ratio is optimized, it moves to the higher bound.

If we didn’t simultaneously design the aircraft and the mission, you would have to manually iterate by first optimizing the aircraft, then the mission, then the aircraft again, etc. This cumbersome process is known as sequential optimization and can lead to non-optimal results for coupled systems, as detailed in Section 13.1 of the Engineering Design Optimization textbook (available for free).

Aviary is unique in its ability to solve these coupled systems using efficient gradient-based optimization.

This doc page contains a simple example, but the true power of coupled multidisciplinary optimization lies in solving more complex design problems. We hope that you can effectively use Aviary to optimally design the next generation of exciting aircraft!