Skip to content
Merged
4 changes: 0 additions & 4 deletions aviary/core/aviary_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -1021,10 +1021,6 @@ def link_phases(self, verbosity=None, comm=None):
phase_info2 = self.mission_info[phase2]['user_options']
vars2 = link_vars_dict[phase2]

if self.reserve_phases and phase2 == self.reserve_phases[0]:
# Don't link to first reserve phase.
continue

# Find common vars across 1-2 boundary
common = vars1.intersection(vars2)
upstream_analytic = [item for item in vars1 if item.startswith('initial_')]
Expand Down
22 changes: 16 additions & 6 deletions aviary/mission/energy_state_problem_configurator.py
Original file line number Diff line number Diff line change
Expand Up @@ -493,11 +493,16 @@ def set_phase_initial_guesses(
altitude_final = wrapped_convert_units(options['altitude_final'], 'ft')

if altitude_initial is None:
# TODO: Pull from downstream phase.
# TODO: Pull from upstream phase.
altitude_initial = wrapped_convert_units(options['altitude_bounds'], 'ft')[0]

if altitude_final is None:
# TODO: Pull from downstream phase.
if altitude_initial is None and altitude_final is None:
# No way to get an IC, so just some nominal values.
altitude_initial = 0.0
altitude_final = 0.0
elif altitude_initial is None:
altitude_initial = altitude_final
elif altitude_final is None:
altitude_final = altitude_initial

guess_dict['altitude'] = ([altitude_initial, altitude_final], 'ft')
Expand All @@ -508,11 +513,16 @@ def set_phase_initial_guesses(
mach_final = wrapped_convert_units(options['mach_final'], 'unitless')

if mach_initial is None:
# TODO: Pull from downstream phase.
# TODO: Pull from upstream phase.
mach_initial = wrapped_convert_units(options['mach_bounds'], 'unitless')[0]

if mach_final is None:
# TODO: Pull from downstream phase.
if mach_initial is None and mach_final is None:
# No way to get an IC, so just some nominal values.
mach_initial = 0.1
mach_final = 0.1
elif mach_initial is None:
mach_initial = mach_final
elif mach_final is None:
mach_final = mach_initial

guess_dict['mach'] = ([mach_initial, mach_final], 'unitless')
Expand Down
38 changes: 37 additions & 1 deletion aviary/run_all_benchmarks.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,39 @@
import subprocess

status = subprocess.run(['testflo', '--testmatch=bench_test*'])
returns = subprocess.run(
['testflo', '--nocapture', '--testmatch=bench_test*'],
capture_output=subprocess.PIPE,
text=True,
)

DEBUG = False
if DEBUG:
print(returns.stdout)

lines = returns.stdout.split('\n')

print('\n\n')
print('Benchmark Results')
print('\n')

j = 0
results = {}
for j, line in enumerate(lines):
if 'BENCH:' in line:
line = line.partition('BENCH: ')[-1]
if line in results:
raise RuntimeError(f'Use a unique name for test {line}!')
results[line] = lines[j + 1]

for name, bench_data in sorted(results.items()):
print(name)
print(bench_data)
print('\n')

# Summary
print('\n')
print('Testflo Summary')
print('\n')

for line in lines[-11:]:
print(line)
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
from aviary.utils.functions import set_aviary_initial_values, set_aviary_input_defaults
from aviary.utils.preprocessors import preprocess_options
from aviary.utils.test_utils.default_subsystems import get_default_mission_subsystems
from aviary.validation_cases.benchmark_utils import print_benchmark_results
from aviary.variable_info.functions import setup_model_options
from aviary.variable_info.variables import Aircraft, Dynamic

Expand All @@ -43,7 +44,8 @@ def bench_test_IPOPT(self):
driver.opt_settings['tol'] = 1e-3
driver.opt_settings['print_level'] = 4

self._do_run(driver, optimizer)
prob = self._do_run(driver, optimizer)
print_benchmark_results(prob)

@require_pyoptsparse(optimizer='SNOPT')
def bench_test_SNOPT(self):
Expand All @@ -57,7 +59,8 @@ def bench_test_SNOPT(self):
driver.opt_settings['Major feasibility tolerance'] = 1e-6
driver.opt_settings['iSumm'] = 6

self._do_run(driver, optimizer)
prob = self._do_run(driver, optimizer)
print_benchmark_results(prob)

def _do_run(self, driver: Driver, optimizer, *args):
aviary_options = _inputs.deepcopy()
Expand Down Expand Up @@ -154,6 +157,8 @@ def _do_run(self, driver: Driver, optimizer, *args):
actual = takeoff.model.get_val('traj.balanced_rotate.states:velocity', units='kn')[-1]
assert_near_equal(actual, desired, 2e-2)

return takeoff


if __name__ == '__main__':
use_SNOPT = False
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@
from aviary.core.aviary_problem import AviaryProblem
from aviary.models.aircraft.advanced_single_aisle.phase_info import phase_info
from aviary.utils.test_utils.assert_utils import warn_timeseries_near_equal
from aviary.validation_cases.benchmark_utils import compare_against_expected_values
from aviary.validation_cases.benchmark_utils import (
compare_against_expected_values,
print_benchmark_results,
)
from aviary.variable_info.variables import Aircraft, Mission


Expand Down Expand Up @@ -47,7 +50,7 @@ def run_trajectory(sim=True):
prob.check_and_preprocess_inputs()

prob.build_model()
prob.add_driver('SNOPT', max_iter=50, verbosity=1)
prob.add_driver('SNOPT', max_iter=50, verbosity=0)

##########################
# Design Variables #
Expand Down Expand Up @@ -79,6 +82,7 @@ class ProblemPhaseTestCase(unittest.TestCase):
def bench_test_sizing_N3CC(self):
prob = run_trajectory(sim=False)

print_benchmark_results(prob)
# self.assertTrue(prob.result.success)

times_climb = prob.get_val('traj.climb.timeseries.time', units='s')
Expand Down Expand Up @@ -515,7 +519,6 @@ def bench_test_sizing_N3CC(self):
)

compare_against_expected_values(prob, self.expected_dict)
# self.assertTrue(prob.result.success)


if __name__ == '__main__':
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from aviary.utils.functions import set_aviary_initial_values, set_aviary_input_defaults
from aviary.utils.preprocessors import preprocess_options
from aviary.utils.test_utils.default_subsystems import get_default_mission_subsystems
from aviary.validation_cases.benchmark_utils import print_benchmark_results
from aviary.variable_info.functions import setup_model_options
from aviary.variable_info.variables import Aircraft, Dynamic

Expand All @@ -42,7 +43,8 @@ def bench_test_IPOPT(self):
driver.opt_settings['print_level'] = 4
driver.opt_settings['mu_init'] = 1e-5

self._do_run(driver, optimizer)
prob = self._do_run(driver, optimizer)
print_benchmark_results(prob)

@require_pyoptsparse(optimizer='SNOPT')
def bench_test_SNOPT(self):
Expand All @@ -56,7 +58,8 @@ def bench_test_SNOPT(self):
driver.opt_settings['Major feasibility tolerance'] = 1e-6
driver.opt_settings['iSumm'] = 6

self._do_run(driver, optimizer)
prob = self._do_run(driver, optimizer)
print_benchmark_results(prob)

def _do_run(self, driver: Driver, optimizer, *args):
aviary_options = _inputs.deepcopy()
Expand Down Expand Up @@ -151,6 +154,7 @@ def _do_run(self, driver: Driver, optimizer, *args):
actual = landing.model.get_val('traj.landing_fullstop.t', units='s')[-1]

assert_near_equal(actual, desired, 0.05)
return landing


if __name__ == '__main__':
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from aviary.utils.functions import set_aviary_initial_values, set_aviary_input_defaults
from aviary.utils.preprocessors import preprocess_options
from aviary.utils.test_utils.default_subsystems import get_default_mission_subsystems
from aviary.validation_cases.benchmark_utils import print_benchmark_results
from aviary.variable_info.functions import setup_model_options
from aviary.variable_info.variables import Aircraft, Dynamic

Expand All @@ -46,7 +47,8 @@ def bench_test_IPOPT(self):
# driver.opt_settings['nlp_scaling_method'] = None
# driver.opt_settings['linear_solver'] = 'mumps'

self._do_run(driver, optimizer)
prob = self._do_run(driver, optimizer)
print_benchmark_results(prob)

@require_pyoptsparse(optimizer='SNOPT')
def bench_test_SNOPT(self):
Expand All @@ -60,7 +62,8 @@ def bench_test_SNOPT(self):
driver.opt_settings['Major feasibility tolerance'] = 1e-6
driver.opt_settings['iSumm'] = 6

self._do_run(driver, optimizer)
prob = self._do_run(driver, optimizer)
print_benchmark_results(prob)

def _do_run(self, driver: Driver, optimizer, *args):
aviary_options = _inputs.deepcopy()
Expand Down Expand Up @@ -158,6 +161,8 @@ def _do_run(self, driver: Driver, optimizer, *args):

assert_near_equal(actual, desired, 2e-2)

return takeoff


if __name__ == '__main__':
use_SNOPT = True
Expand Down
7 changes: 4 additions & 3 deletions aviary/validation_cases/benchmark_tests/test_bench_FwGm.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

from aviary.models.missions.two_dof_default import phase_info
from aviary.interface.run_aviary import run_aviary
from aviary.validation_cases.benchmark_utils import print_benchmark_results
from aviary.variable_info.variables import Aircraft, Mission


Expand All @@ -32,6 +33,7 @@ def bench_test_swap_3_FwGm_IPOPT(self):
optimizer='IPOPT',
)

print_benchmark_results(prob)
# TODO: This problem does not always converge.
# self.assertTrue(prob.result.success)

Expand Down Expand Up @@ -59,11 +61,12 @@ def bench_test_swap_3_FwGm_SNOPT(self):
prob = run_aviary(
'validation_cases/validation_data/test_models/aircraft_for_bench_FwGm.csv',
local_phase_info,
verbosity=1,
verbosity=0,
optimizer='SNOPT',
max_iter=60,
)

print_benchmark_results(prob)
self.assertTrue(prob.result.success)

rtol = 1e-2
Expand All @@ -84,8 +87,6 @@ def bench_test_swap_3_FwGm_SNOPT(self):
else:
assert_near_equal(prob.get_val(var_name), expected_val, tolerance=rtol)

self.assertTrue(prob.result.success)


if __name__ == '__main__':
test = ProblemPhaseTestCase()
Expand Down
9 changes: 7 additions & 2 deletions aviary/validation_cases/benchmark_tests/test_bench_GwFm.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@

from aviary.interface.run_aviary import run_aviary
from aviary.validation_cases.validation_data.test_models.GwFm_phase_info import phase_info
from aviary.validation_cases.benchmark_utils import compare_against_expected_values
from aviary.validation_cases.benchmark_utils import (
compare_against_expected_values,
print_benchmark_results,
)


@use_tempdirs
Expand Down Expand Up @@ -126,6 +129,7 @@ def bench_test_swap_1_GwFm_IPOPT(self):
optimizer='IPOPT',
verbosity=0,
)
print_benchmark_results(prob)
# self.assertTrue(prob.result.success)
compare_against_expected_values(prob, self.expected_dict)

Expand All @@ -136,8 +140,9 @@ def bench_test_swap_1_GwFm_SNOPT(self):
self.phase_info,
max_iter=50,
optimizer='SNOPT',
verbosity=1,
verbosity=0,
)
print_benchmark_results(prob)
# self.assertTrue(prob.result.success)
compare_against_expected_values(prob, self.expected_dict)
self.assertTrue(prob.result.success)
Expand Down
23 changes: 15 additions & 8 deletions aviary/validation_cases/benchmark_tests/test_bench_solved2dof.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@
from aviary.models.missions.solved2dof_landing_default import phase_info as phase_info_landing
from openmdao.utils.assert_utils import assert_near_equal
from openmdao.utils.testing_utils import require_pyoptsparse, use_tempdirs
from aviary.validation_cases.benchmark_utils import print_benchmark_results


@use_tempdirs
class TestBenchSolved2DOF(unittest.TestCase):
"""Run the model in serial that is setup in ProblemPhaseTestCase class."""

@require_pyoptsparse(optimizer='IPOPT')
def test_bench_Solved2DOF(self):
@require_pyoptsparse(optimizer='SNOPT')
def bench_test_Solved2DOF(self):
subsystem_options = {
'aerodynamics': {
'method': 'low_speed',
Expand Down Expand Up @@ -97,18 +98,20 @@ def test_bench_Solved2DOF(self):
prob = av.run_aviary(
aircraft_data='validation_cases/validation_data/test_models/aircraft_for_bench_solved2dof.csv',
phase_info=phase_info,
optimizer='IPOPT',
optimizer='SNOPT',
objective_type='time',
max_iter=100,
)

print_benchmark_results(prob)
self.assertTrue(prob.result.success)

tol = 1e-2
assert_near_equal(prob.get_val(av.Mission.FINAL_TIME, units='s'), 108.84030411, tol)
assert_near_equal(prob.get_val(av.Mission.FUEL_MASS, units='lbm'), 459.3830223, tol)

@require_pyoptsparse(optimizer='IPOPT')
def test_bench_Solved2DOF_landing(self):
@require_pyoptsparse(optimizer='SNOPT')
def bench_test_Solved2DOF_landing(self):
# This problem solves better with a reduced ref for objective time, therefore need to call add_objectve()
subsystem_options = {
'aerodynamics': {
Expand Down Expand Up @@ -204,17 +207,21 @@ def test_bench_Solved2DOF_landing(self):
)
prob.check_and_preprocess_inputs()
prob.build_model()
prob.add_driver('IPOPT', max_iter=100)
prob.add_driver('SNOPT', max_iter=100)
prob.add_design_variables()
prob.add_objective('time', ref=1e2)
prob.setup()
prob.run_aviary_problem()

self.assertTrue(prob.result.success)
print_benchmark_results(prob)
# self.assertTrue(prob.result.success)

tol = 1e-2
assert_near_equal(prob.get_val(av.Mission.FINAL_TIME, units='s'), 68.30353617, tol)
assert_near_equal(prob.get_val(av.Mission.FUEL_MASS, units='lbm'), 98.91566618, tol)


if __name__ == '__main__':
unittest.main()
# unittest.main()
z = TestBenchSolved2DOF()
z.bench_test_Solved2DOF_landing()
Loading
Loading