From 294cadd27a7b70eb2c5070e9d6af4c87548df221 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 5 Jun 2026 18:49:54 -0400 Subject: [PATCH 01/31] added verbosity to get_path() call --- aviary/core/aviary_group.py | 2 +- aviary/core/aviary_problem.py | 2 +- aviary/docs/user_guide_unreviewed/aviary_commands.ipynb | 4 +++- aviary/interface/run_aviary.py | 2 +- aviary/utils/csv_data_file.py | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/aviary/core/aviary_group.py b/aviary/core/aviary_group.py index 071fc9e505..f4e02801c3 100644 --- a/aviary/core/aviary_group.py +++ b/aviary/core/aviary_group.py @@ -295,7 +295,7 @@ def load_inputs( ## LOAD PHASE_INFO ### # if phase info is a file, load it if isinstance(phase_info, str) or isinstance(phase_info, Path): - phase_info_path = get_path(phase_info) + phase_info_path = get_path(phase_info, verbosity) spec = spec_from_file_location('phase_info_file', str(phase_info_path)) phase_info_file = module_from_spec(spec) sys.modules['phase_info_file'] = phase_info_file diff --git a/aviary/core/aviary_problem.py b/aviary/core/aviary_problem.py index 3fb1061aaa..a8e2f543fc 100644 --- a/aviary/core/aviary_problem.py +++ b/aviary/core/aviary_problem.py @@ -2156,7 +2156,7 @@ def reload_aviary_problem( # Initialize a new aviary problem and aviary_input data structure prob = AviaryProblem() - filename = get_path(filename) + filename = get_path(filename, verbosity) aviary_inputs = _read_sizing_json(filename, metadata, verbosity) diff --git a/aviary/docs/user_guide_unreviewed/aviary_commands.ipynb b/aviary/docs/user_guide_unreviewed/aviary_commands.ipynb index 77fec33d17..459b0f1778 100644 --- a/aviary/docs/user_guide_unreviewed/aviary_commands.ipynb +++ b/aviary/docs/user_guide_unreviewed/aviary_commands.ipynb @@ -140,7 +140,9 @@ "{glue:md}`aviary run_mission models/aircraft/small_single_aisle/small_single_aisle_GASP.csv` in\n", "{glue:md}`aviary/models/aircraft/small_single_aisle`\n", "\n", - "SNOPT is the default optimizer, but IPOPT is available as well." + "SNOPT is the default optimizer, but IPOPT is available as well.\n", + "\n", + "Note: Do not use the test models in `validation_cases/validation_data/test_models`. They are for testing purpose only." ] }, { diff --git a/aviary/interface/run_aviary.py b/aviary/interface/run_aviary.py index 9f09252895..9171cbb1fa 100644 --- a/aviary/interface/run_aviary.py +++ b/aviary/interface/run_aviary.py @@ -144,7 +144,7 @@ def run_aviary_cmd( } if isinstance(phase_info, str): - phase_info_path = get_path(phase_info) + phase_info_path = get_path(phase_info, verbosity) spec = spec_from_file_location('phase_info_file', str(phase_info_path)) phase_info_file = module_from_spec(spec) sys.modules['phase_info_file'] = phase_info_file diff --git a/aviary/utils/csv_data_file.py b/aviary/utils/csv_data_file.py index e7835d02bc..4498bbe26c 100644 --- a/aviary/utils/csv_data_file.py +++ b/aviary/utils/csv_data_file.py @@ -59,7 +59,7 @@ def read_data_file( """ verbosity = Verbosity(verbosity) - filepath = get_path(filename) + filepath = get_path(filename, verbosity) data = NamedValues() comments = [] From 0faf4e0eadc794e8fb31125ec98d7cf67982e5ec Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 5 Jun 2026 18:51:12 -0400 Subject: [PATCH 02/31] fixed a minor bug when calling get_path() --- aviary/utils/process_input_decks.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/aviary/utils/process_input_decks.py b/aviary/utils/process_input_decks.py index 54d42b0301..68e9bdf588 100644 --- a/aviary/utils/process_input_decks.py +++ b/aviary/utils/process_input_decks.py @@ -107,11 +107,7 @@ def create_vehicle(vehicle_deck='', meta_data=CoreMetaData, verbosity=Verbosity. initialization_guesses[key.removeprefix('initialization_guesses:')] = val aircraft_values.update(vehicle_deck) else: - if verbosity >= Verbosity.BRIEF: - verbose = True - else: - verbose = False - vehicle_deck = get_path(vehicle_deck, verbose) + vehicle_deck = get_path(vehicle_deck, verbosity) aircraft_values, initialization_guesses = parse_inputs( vehicle_deck=vehicle_deck, aircraft_values=aircraft_values, From 669e2f03ce5b77ec7e2800dd9a430477c0ca8d2c Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 23 Jun 2026 14:59:27 -0400 Subject: [PATCH 03/31] update landing EOM and ODE --- aviary/mission/energy_state/ode/landing_eom.py | 4 ++-- aviary/mission/energy_state/ode/test/test_landing_eom.py | 2 ++ aviary/mission/energy_state/ode/test/test_landing_ode.py | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/aviary/mission/energy_state/ode/landing_eom.py b/aviary/mission/energy_state/ode/landing_eom.py index 793eb9034f..c619a88e13 100644 --- a/aviary/mission/energy_state/ode/landing_eom.py +++ b/aviary/mission/energy_state/ode/landing_eom.py @@ -164,7 +164,7 @@ def setup(self): add_aviary_input(self, Dynamic.Vehicle.LIFT, val=np.ones(nn), units='N') add_aviary_input(self, Dynamic.Vehicle.DRAG, val=np.ones(nn), units='N') - self.add_input(Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(nn), units='rad') + add_aviary_input(self, Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(nn), units='rad') add_aviary_input(self, Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.zeros(nn), units='rad') @@ -322,7 +322,7 @@ def setup(self): add_aviary_input(self, Dynamic.Vehicle.Propulsion.THRUST_TOTAL, val=np.ones(nn), units='N') add_aviary_input(self, Dynamic.Vehicle.DRAG, val=np.ones(nn), units='N') - self.add_input(Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(nn), units='rad') + add_aviary_input(self, Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(nn), units='rad') add_aviary_input(self, Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.zeros(nn), units='rad') diff --git a/aviary/mission/energy_state/ode/test/test_landing_eom.py b/aviary/mission/energy_state/ode/test/test_landing_eom.py index 5cac19dc98..243e1196a1 100644 --- a/aviary/mission/energy_state/ode/test/test_landing_eom.py +++ b/aviary/mission/energy_state/ode/test/test_landing_eom.py @@ -3,6 +3,7 @@ import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.energy_state.ode.landing_eom import ( FlareEOM, @@ -21,6 +22,7 @@ from aviary.variable_info.variables import Dynamic +@use_tempdirs class FlareEOMTest(unittest.TestCase): """Test against data of detailed_landing_flare from models/aircraft/advanced_single_aisle/advanced_single_aisle_data.py.""" diff --git a/aviary/mission/energy_state/ode/test/test_landing_ode.py b/aviary/mission/energy_state/ode/test/test_landing_ode.py index 74274e222b..8c536db882 100644 --- a/aviary/mission/energy_state/ode/test/test_landing_ode.py +++ b/aviary/mission/energy_state/ode/test/test_landing_ode.py @@ -1,6 +1,7 @@ import unittest import openmdao.api as om +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.energy_state.ode.landing_ode import FlareODE from aviary.validation_cases.validation_data.test_data.advanced_single_aisle_data import ( @@ -18,6 +19,7 @@ from aviary.variable_info.variables import Aircraft, Dynamic +@use_tempdirs class FlareODETest(unittest.TestCase): """Test against data of detailed_landing_flare from models/aircraft/advanced_single_aisle/advanced_single_aisle_data.py.""" From b8c090e27642739e4a4d6724b8a06b8f076aadc4 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 23 Jun 2026 15:01:15 -0400 Subject: [PATCH 04/31] update test_landing_eom.py and test_mission_eom.py --- aviary/mission/energy_state/ode/test/test_landing_eom.py | 5 +---- aviary/mission/energy_state/ode/test/test_mission_eom.py | 3 +++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/aviary/mission/energy_state/ode/test/test_landing_eom.py b/aviary/mission/energy_state/ode/test/test_landing_eom.py index 243e1196a1..1ca233014f 100644 --- a/aviary/mission/energy_state/ode/test/test_landing_eom.py +++ b/aviary/mission/energy_state/ode/test/test_landing_eom.py @@ -203,7 +203,4 @@ def test_GroundSumForces(self): if __name__ == '__main__': - # unittest.main() - test = FlareEOMTest() - test.setUp() - test.test_case() + unittest.main() diff --git a/aviary/mission/energy_state/ode/test/test_mission_eom.py b/aviary/mission/energy_state/ode/test/test_mission_eom.py index e58169edbe..c2ba239c94 100644 --- a/aviary/mission/energy_state/ode/test/test_mission_eom.py +++ b/aviary/mission/energy_state/ode/test/test_mission_eom.py @@ -3,12 +3,15 @@ import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs + from aviary.mission.energy_state.ode.mission_EOM import MissionEOM from aviary.utils.test_utils.variable_test import assert_match_varnames from aviary.variable_info.variables import Dynamic +@use_tempdirs class MissionEOMTest(unittest.TestCase): """Test energy-method equations of motion.""" From 968140e64002137af8c5e028cb8501d039094e5f Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 23 Jun 2026 15:30:38 -0400 Subject: [PATCH 05/31] update range_rate.py and test_range_rate.py --- aviary/mission/energy_state/ode/range_rate.py | 10 +++++++--- .../mission/energy_state/ode/test/test_range_rate.py | 2 ++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/aviary/mission/energy_state/ode/range_rate.py b/aviary/mission/energy_state/ode/range_rate.py index c3e64ced30..dfee0e2037 100644 --- a/aviary/mission/energy_state/ode/range_rate.py +++ b/aviary/mission/energy_state/ode/range_rate.py @@ -1,5 +1,6 @@ import numpy as np import openmdao.api as om +from aviary.variable_info.functions import add_aviary_input, add_aviary_output from aviary.variable_info.variables import Dynamic @@ -16,19 +17,22 @@ def initialize(self): def setup(self): nn = self.options['num_nodes'] - self.add_input( + add_aviary_input( + self, Dynamic.Mission.ALTITUDE_RATE, val=np.ones(nn), desc='climb rate', units='m/s', ) - self.add_input( + add_aviary_input( + self, Dynamic.Mission.VELOCITY, val=np.ones(nn), desc='current velocity', units='m/s', ) - self.add_output( + add_aviary_output( + self, Dynamic.Mission.DISTANCE_RATE, val=np.ones(nn), desc='current horizontal velocity (assumed no wind)', diff --git a/aviary/mission/energy_state/ode/test/test_range_rate.py b/aviary/mission/energy_state/ode/test/test_range_rate.py index 82275e669a..4094e0c1f4 100644 --- a/aviary/mission/energy_state/ode/test/test_range_rate.py +++ b/aviary/mission/energy_state/ode/test/test_range_rate.py @@ -1,6 +1,7 @@ import unittest import openmdao.api as om +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.energy_state.ode.range_rate import RangeRate from aviary.utils.test_utils.variable_test import assert_match_varnames @@ -9,6 +10,7 @@ from aviary.variable_info.variables import Dynamic +@use_tempdirs class RangeRateTest(unittest.TestCase): def setUp(self): """Test using data from validation_cases/validation_data/flops_data/full_mission_test_data.py.""" From b604b2337b2a2e75b793d39b11c8fccc0665d1e1 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 23 Jun 2026 17:49:25 -0400 Subject: [PATCH 06/31] update test_required_thrust.py --- aviary/mission/energy_state/ode/test/test_required_thrust.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/aviary/mission/energy_state/ode/test/test_required_thrust.py b/aviary/mission/energy_state/ode/test/test_required_thrust.py index e0366a51d2..12d15dfb3a 100644 --- a/aviary/mission/energy_state/ode/test/test_required_thrust.py +++ b/aviary/mission/energy_state/ode/test/test_required_thrust.py @@ -3,12 +3,14 @@ import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.energy_state.ode.required_thrust import RequiredThrust from aviary.utils.test_utils.variable_test import assert_match_varnames from aviary.variable_info.variables import Dynamic +@use_tempdirs class RequiredThrustTest(unittest.TestCase): """Test required thrust.""" From ae3ff449c4f99f6a39ebcc58b66a918a7d068e0e Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 23 Jun 2026 18:20:05 -0400 Subject: [PATCH 07/31] update required_thrust.py --- aviary/mission/energy_state/ode/required_thrust.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/aviary/mission/energy_state/ode/required_thrust.py b/aviary/mission/energy_state/ode/required_thrust.py index 82b6b39a43..425860d3ed 100644 --- a/aviary/mission/energy_state/ode/required_thrust.py +++ b/aviary/mission/energy_state/ode/required_thrust.py @@ -1,5 +1,6 @@ import numpy as np import openmdao.api as om +from aviary.variable_info.functions import add_aviary_input from aviary.constants import GRAV_METRIC_FLOPS as gravity from aviary.variable_info.variables import Dynamic @@ -18,26 +19,29 @@ def setup(self): nn = self.options['num_nodes'] self.add_input(Dynamic.Vehicle.DRAG, val=np.zeros(nn), units='N', desc='drag force') - self.add_input( + add_aviary_input( + self, Dynamic.Mission.ALTITUDE_RATE, val=np.zeros(nn), units='m/s', desc='rate of change of altitude', ) - self.add_input( + add_aviary_input( + self, Dynamic.Mission.VELOCITY, val=np.zeros(nn), units='m/s', desc=Dynamic.Mission.VELOCITY, ) - self.add_input( + add_aviary_input( + self, Dynamic.Mission.VELOCITY_RATE, val=np.zeros(nn), units='m/s**2', desc='rate of change of velocity', ) - self.add_input( - Dynamic.Vehicle.MASS, val=np.zeros(nn), units='kg', desc='mass of the aircraft' + add_aviary_input( + self, Dynamic.Vehicle.MASS, val=np.zeros(nn), units='kg', desc='mass of the aircraft' ) self.add_output('thrust_required', val=np.zeros(nn), units='N', desc='required thrust') From 97fbd12967c3508cbd9ea1d319c38a67da1c21d0 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 23 Jun 2026 18:39:14 -0400 Subject: [PATCH 08/31] failed one test. Change one self.add_input to add_aviary_input --- .../mission/energy_state/ode/required_thrust.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/aviary/mission/energy_state/ode/required_thrust.py b/aviary/mission/energy_state/ode/required_thrust.py index 425860d3ed..d535709eeb 100644 --- a/aviary/mission/energy_state/ode/required_thrust.py +++ b/aviary/mission/energy_state/ode/required_thrust.py @@ -18,30 +18,27 @@ def initialize(self): def setup(self): nn = self.options['num_nodes'] - self.add_input(Dynamic.Vehicle.DRAG, val=np.zeros(nn), units='N', desc='drag force') - add_aviary_input( - self, + add_aviary_input(self, Dynamic.Vehicle.DRAG, val=np.zeros(nn), units='N', desc='drag force') + self.add_input( Dynamic.Mission.ALTITUDE_RATE, val=np.zeros(nn), units='m/s', desc='rate of change of altitude', ) - add_aviary_input( - self, + self.add_input( Dynamic.Mission.VELOCITY, val=np.zeros(nn), units='m/s', desc=Dynamic.Mission.VELOCITY, ) - add_aviary_input( - self, + self.add_input( Dynamic.Mission.VELOCITY_RATE, val=np.zeros(nn), units='m/s**2', desc='rate of change of velocity', ) - add_aviary_input( - self, Dynamic.Vehicle.MASS, val=np.zeros(nn), units='kg', desc='mass of the aircraft' + self.add_input( + Dynamic.Vehicle.MASS, val=np.zeros(nn), units='kg', desc='mass of the aircraft' ) self.add_output('thrust_required', val=np.zeros(nn), units='N', desc='required thrust') From 91559c8ddc94cce97a421d3bccc0ee36e55e8ddc Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 23 Jun 2026 19:07:10 -0400 Subject: [PATCH 09/31] changed the second one self.add_input to add_aviary_input --- aviary/mission/energy_state/ode/required_thrust.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aviary/mission/energy_state/ode/required_thrust.py b/aviary/mission/energy_state/ode/required_thrust.py index d535709eeb..655a98167b 100644 --- a/aviary/mission/energy_state/ode/required_thrust.py +++ b/aviary/mission/energy_state/ode/required_thrust.py @@ -19,7 +19,8 @@ def setup(self): nn = self.options['num_nodes'] add_aviary_input(self, Dynamic.Vehicle.DRAG, val=np.zeros(nn), units='N', desc='drag force') - self.add_input( + add_aviary_input( + self, Dynamic.Mission.ALTITUDE_RATE, val=np.zeros(nn), units='m/s', From 809e8f2325f69df94eb0f4006d605c411af46bda Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 23 Jun 2026 19:49:27 -0400 Subject: [PATCH 10/31] changed the third one self.add_input to add_aviary_input --- aviary/mission/energy_state/ode/required_thrust.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aviary/mission/energy_state/ode/required_thrust.py b/aviary/mission/energy_state/ode/required_thrust.py index 655a98167b..2cc4a81210 100644 --- a/aviary/mission/energy_state/ode/required_thrust.py +++ b/aviary/mission/energy_state/ode/required_thrust.py @@ -26,7 +26,8 @@ def setup(self): units='m/s', desc='rate of change of altitude', ) - self.add_input( + add_aviary_input( + self, Dynamic.Mission.VELOCITY, val=np.zeros(nn), units='m/s', From ded7fa424b46a9ff078b1627cf3a0e8a666a7334 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 23 Jun 2026 21:26:58 -0400 Subject: [PATCH 11/31] update takeoff_eom.py --- aviary/mission/energy_state/ode/takeoff_eom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aviary/mission/energy_state/ode/takeoff_eom.py b/aviary/mission/energy_state/ode/takeoff_eom.py index 6a466cc8b7..f67054c210 100644 --- a/aviary/mission/energy_state/ode/takeoff_eom.py +++ b/aviary/mission/energy_state/ode/takeoff_eom.py @@ -544,7 +544,7 @@ def setup(self): add_aviary_input(self, Dynamic.Vehicle.Propulsion.THRUST_TOTAL, val=np.ones(nn), units='N') add_aviary_input(self, Dynamic.Vehicle.DRAG, val=np.ones(nn), units='N') - self.add_input(Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(nn), units='rad') + add_aviary_input(self, Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(nn), units='rad') add_aviary_input(self, Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.zeros(nn), units='rad') @@ -770,7 +770,7 @@ def setup(self): add_aviary_input(self, Dynamic.Vehicle.Propulsion.THRUST_TOTAL, val=np.ones(nn), units='N') add_aviary_input(self, Dynamic.Vehicle.DRAG, val=np.ones(nn), units='N') - self.add_input(Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(nn), units='rad') + add_aviary_input(self, Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(nn), units='rad') add_aviary_input(self, Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.zeros(nn), units='rad') From 0911ed3969ca8d4921cea403a9e4d618e47f0668 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 23 Jun 2026 21:48:10 -0400 Subject: [PATCH 12/31] update test_takeoff_eom.py and test_takeoff_ode.py --- aviary/mission/energy_state/ode/test/test_takeoff_eom.py | 2 ++ aviary/mission/energy_state/ode/test/test_takeoff_ode.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/aviary/mission/energy_state/ode/test/test_takeoff_eom.py b/aviary/mission/energy_state/ode/test/test_takeoff_eom.py index 46f4ef73b1..aeaadea167 100644 --- a/aviary/mission/energy_state/ode/test/test_takeoff_eom.py +++ b/aviary/mission/energy_state/ode/test/test_takeoff_eom.py @@ -3,6 +3,7 @@ import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.energy_state.ode.takeoff_eom import ( Accelerations, @@ -27,6 +28,7 @@ inputs.set_val(Aircraft.Engine.NUM_ENGINES, np.array([2])) +@use_tempdirs class TakeoffEOMTest(unittest.TestCase): """Test detailed takeoff equation of motion.""" diff --git a/aviary/mission/energy_state/ode/test/test_takeoff_ode.py b/aviary/mission/energy_state/ode/test/test_takeoff_ode.py index c757c8a7fb..21fc745cf2 100644 --- a/aviary/mission/energy_state/ode/test/test_takeoff_ode.py +++ b/aviary/mission/energy_state/ode/test/test_takeoff_ode.py @@ -2,6 +2,7 @@ from copy import deepcopy import openmdao.api as om +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.energy_state.ode.takeoff_ode import TakeoffODE from aviary.validation_cases.validation_data.test_data.advanced_single_aisle_data import ( @@ -22,6 +23,7 @@ takeoff_subsystem_options = deepcopy(takeoff_subsystem_options) +@use_tempdirs class TakeoffODETest(unittest.TestCase): """Test detailed takeoff ODE.""" From 8beb634a95a505d2a2e27154ab82d70df5dab477 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 23 Jun 2026 22:41:27 -0400 Subject: [PATCH 13/31] update test_building_landing.py test_building_takeoff.py test_simplified_landing.py test_simplified_takeoff.py --- .../mission/energy_state/phases/test/test_building_landing.py | 2 ++ .../mission/energy_state/phases/test/test_building_takeoff.py | 2 ++ .../energy_state/phases/test/test_simplified_landing.py | 3 +++ .../energy_state/phases/test/test_simplified_takeoff.py | 4 ++++ 4 files changed, 11 insertions(+) diff --git a/aviary/mission/energy_state/phases/test/test_building_landing.py b/aviary/mission/energy_state/phases/test/test_building_landing.py index 0c55a5d979..015e7968db 100644 --- a/aviary/mission/energy_state/phases/test/test_building_landing.py +++ b/aviary/mission/energy_state/phases/test/test_building_landing.py @@ -2,11 +2,13 @@ import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.energy_state.phases.build_landing import Landing from aviary.variable_info.variables import Mission +@use_tempdirs class LandingPhaseTest(unittest.TestCase): """Test landing phase builder.""" diff --git a/aviary/mission/energy_state/phases/test/test_building_takeoff.py b/aviary/mission/energy_state/phases/test/test_building_takeoff.py index 864ed45f6d..78bd640938 100644 --- a/aviary/mission/energy_state/phases/test/test_building_takeoff.py +++ b/aviary/mission/energy_state/phases/test/test_building_takeoff.py @@ -2,11 +2,13 @@ import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.energy_state.phases.build_takeoff import Takeoff from aviary.variable_info.variables import Aircraft, Mission +@use_tempdirs class TakeoffPhaseTest(unittest.TestCase): """Test takeoff phase builder.""" diff --git a/aviary/mission/energy_state/phases/test/test_simplified_landing.py b/aviary/mission/energy_state/phases/test/test_simplified_landing.py index 811f2cd42c..2620c1578f 100644 --- a/aviary/mission/energy_state/phases/test/test_simplified_landing.py +++ b/aviary/mission/energy_state/phases/test/test_simplified_landing.py @@ -2,12 +2,14 @@ import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary import constants from aviary.mission.energy_state.phases.simplified_landing import LandingCalc, LandingGroup from aviary.variable_info.variables import Aircraft, Dynamic, Mission +@use_tempdirs class LandingCalcTest(unittest.TestCase): """Test computation in LandingCalc class (the simplified landing).""" @@ -77,6 +79,7 @@ def test_case1(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) +@use_tempdirs class LandingGroupTest(unittest.TestCase): """Test the computation of LandingGroup.""" diff --git a/aviary/mission/energy_state/phases/test/test_simplified_takeoff.py b/aviary/mission/energy_state/phases/test/test_simplified_takeoff.py index 487a8e4086..4f8a0dcbd0 100644 --- a/aviary/mission/energy_state/phases/test/test_simplified_takeoff.py +++ b/aviary/mission/energy_state/phases/test/test_simplified_takeoff.py @@ -8,6 +8,7 @@ import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary import constants from aviary.mission.energy_state.phases.simplified_takeoff import ( @@ -18,6 +19,7 @@ from aviary.variable_info.variables import Aircraft, Dynamic, Mission +@use_tempdirs class StallSpeedTest(unittest.TestCase): """Test computation in StallSpeed class.""" @@ -78,6 +80,7 @@ def test_case1(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) +@use_tempdirs class FinalConditionsTest(unittest.TestCase): """Test final conditions computation in FinalTakeoffConditions class.""" @@ -154,6 +157,7 @@ def test_case1(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) +@use_tempdirs class TakeoffGroupTest(unittest.TestCase): """Test computation in TakeoffGroup.""" From db276c6cf02afa1b31cc555d06f6115cfe26fc2c Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 23 Jun 2026 23:22:27 -0400 Subject: [PATCH 14/31] update simplified_takeoff.py --- aviary/mission/energy_state/phases/simplified_takeoff.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/aviary/mission/energy_state/phases/simplified_takeoff.py b/aviary/mission/energy_state/phases/simplified_takeoff.py index 4671f5a1d1..041bba461e 100644 --- a/aviary/mission/energy_state/phases/simplified_takeoff.py +++ b/aviary/mission/energy_state/phases/simplified_takeoff.py @@ -21,7 +21,8 @@ def setup(self): desc='mass of the aircraft', ) - self.add_input( + add_aviary_input( + self, Dynamic.Atmosphere.DENSITY, val=1.225, units='kg/m**3', @@ -105,7 +106,8 @@ def setup(self): add_aviary_input(self, Mission.Takeoff.FUEL_MASS, val=10.0e3) - self.add_input( + add_aviary_input( + self, Dynamic.Atmosphere.DENSITY, val=1.225, units='kg/m**3', From 3efaa0fcede587a79a1d23e83093ba50c3f184df Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 23 Jun 2026 23:44:23 -0400 Subject: [PATCH 15/31] update altitude_rate.py specific_energy_rate.py --- aviary/mission/ode/altitude_rate.py | 13 +++++++++---- aviary/mission/ode/specific_energy_rate.py | 18 +++++++++++++----- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/aviary/mission/ode/altitude_rate.py b/aviary/mission/ode/altitude_rate.py index f5aee021b7..3de5842bb5 100644 --- a/aviary/mission/ode/altitude_rate.py +++ b/aviary/mission/ode/altitude_rate.py @@ -1,5 +1,6 @@ import numpy as np import openmdao.api as om +from aviary.variable_info.functions import add_aviary_input, add_aviary_output import aviary.constants as constants from aviary.variable_info.variables import Dynamic @@ -16,25 +17,29 @@ def initialize(self): def setup(self): nn = self.options['num_nodes'] - self.add_input( + add_aviary_input( + self, Dynamic.Mission.SPECIFIC_ENERGY_RATE, val=np.ones(nn), desc='current specific power', units='m/s', ) - self.add_input( + add_aviary_input( + self, Dynamic.Mission.VELOCITY_RATE, val=np.ones(nn), desc='current acceleration', units='m/s**2', ) - self.add_input( + add_aviary_input( + self, Dynamic.Mission.VELOCITY, val=np.ones(nn), desc='current velocity', units='m/s', ) - self.add_output( + add_aviary_output( + self, Dynamic.Mission.ALTITUDE_RATE, val=np.ones(nn), desc='current climb rate', diff --git a/aviary/mission/ode/specific_energy_rate.py b/aviary/mission/ode/specific_energy_rate.py index 95d12ad54b..9eaff2412f 100644 --- a/aviary/mission/ode/specific_energy_rate.py +++ b/aviary/mission/ode/specific_energy_rate.py @@ -2,6 +2,7 @@ import openmdao.api as om from aviary.constants import GRAV_METRIC_FLOPS as gravity +from aviary.variable_info.functions import add_aviary_input, add_aviary_output from aviary.variable_info.variables import Dynamic @@ -17,21 +18,28 @@ def initialize(self): def setup(self): nn = self.options['num_nodes'] - self.add_input( + add_aviary_input( + self, Dynamic.Mission.VELOCITY, val=np.ones(nn), desc='current velocity', units='m/s', ) - self.add_input(Dynamic.Vehicle.MASS, val=np.ones(nn), desc='current mass', units='kg') - self.add_input( + add_aviary_input( + self, Dynamic.Vehicle.MASS, val=np.ones(nn), desc='current mass', units='kg' + ) + add_aviary_input( + self, Dynamic.Vehicle.Propulsion.THRUST_TOTAL, val=np.ones(nn), desc='current thrust', units='N', ) - self.add_input(Dynamic.Vehicle.DRAG, val=np.ones(nn), desc='current drag', units='N') - self.add_output( + add_aviary_input( + self, Dynamic.Vehicle.DRAG, val=np.ones(nn), desc='current drag', units='N' + ) + add_aviary_output( + self, Dynamic.Mission.SPECIFIC_ENERGY_RATE, val=np.ones(nn), desc='current specific power', From 9ac331d4820d83e3f64ec8bb5ffb2993890ca7b3 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 24 Jun 2026 00:14:49 -0400 Subject: [PATCH 16/31] update test_altitude_rate.py and test_specific_energy_rate.py --- aviary/mission/ode/test/test_altitude_rate.py | 2 ++ aviary/mission/ode/test/test_specific_energy_rate.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/aviary/mission/ode/test/test_altitude_rate.py b/aviary/mission/ode/test/test_altitude_rate.py index cd2218bdca..bcfd77455d 100644 --- a/aviary/mission/ode/test/test_altitude_rate.py +++ b/aviary/mission/ode/test/test_altitude_rate.py @@ -1,6 +1,7 @@ import unittest import openmdao.api as om +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.ode.altitude_rate import AltitudeRate from aviary.utils.test_utils.variable_test import assert_match_varnames @@ -9,6 +10,7 @@ from aviary.variable_info.variables import Dynamic +@use_tempdirs class AltitudeRateTest(unittest.TestCase): def setUp(self): prob = self.prob = om.Problem() diff --git a/aviary/mission/ode/test/test_specific_energy_rate.py b/aviary/mission/ode/test/test_specific_energy_rate.py index 4959aa9316..3a3e4895e9 100644 --- a/aviary/mission/ode/test/test_specific_energy_rate.py +++ b/aviary/mission/ode/test/test_specific_energy_rate.py @@ -1,6 +1,7 @@ import unittest import openmdao.api as om +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.ode.specific_energy_rate import SpecificEnergyRate from aviary.utils.test_utils.variable_test import assert_match_varnames @@ -9,6 +10,7 @@ from aviary.variable_info.variables import Dynamic +@use_tempdirs class SpecificEnergyRateTest(unittest.TestCase): def setUp(self): prob = self.prob = om.Problem() From 76897ad1b83ff4920504f7ffe2d60578e8b1bb54 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 24 Jun 2026 00:40:39 -0400 Subject: [PATCH 17/31] update gamma_comp.py --- aviary/mission/solved_two_dof/ode/gamma_comp.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/aviary/mission/solved_two_dof/ode/gamma_comp.py b/aviary/mission/solved_two_dof/ode/gamma_comp.py index 1d93ab8303..986bebe3ec 100644 --- a/aviary/mission/solved_two_dof/ode/gamma_comp.py +++ b/aviary/mission/solved_two_dof/ode/gamma_comp.py @@ -1,5 +1,6 @@ import numpy as np import openmdao.api as om +from aviary.variable_info.functions import add_aviary_output from aviary.variable_info.variables import Dynamic @@ -27,7 +28,8 @@ def setup(self): desc='second derivative of altitude wrt range', ) - self.add_output( + add_aviary_output( + self, Dynamic.Mission.FLIGHT_PATH_ANGLE, shape=nn, units='rad', From e6a4466145b40e7864c0576e1b8f69482659b4fc Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 24 Jun 2026 00:58:52 -0400 Subject: [PATCH 18/31] update unsteady_solved_eom.py and unsteady_solved_flight_conditions.py --- .../solved_two_dof/ode/unsteady_solved_eom.py | 4 +++- .../ode/unsteady_solved_flight_conditions.py | 19 +++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/aviary/mission/solved_two_dof/ode/unsteady_solved_eom.py b/aviary/mission/solved_two_dof/ode/unsteady_solved_eom.py index 997b9e4323..1c216e700e 100644 --- a/aviary/mission/solved_two_dof/ode/unsteady_solved_eom.py +++ b/aviary/mission/solved_two_dof/ode/unsteady_solved_eom.py @@ -36,7 +36,9 @@ def setup(self): # Inputs - self.add_input(Dynamic.Mission.VELOCITY, shape=nn, desc='true air speed', units='m/s') + add_aviary_input( + self, Dynamic.Mission.VELOCITY, shape=nn, desc='true air speed', units='m/s' + ) # TODO: This should probably be declared in Newtons, but the weight variable # is really a mass. This should be resolved with an adapter component that diff --git a/aviary/mission/solved_two_dof/ode/unsteady_solved_flight_conditions.py b/aviary/mission/solved_two_dof/ode/unsteady_solved_flight_conditions.py index 1536043ca9..ae5481f789 100644 --- a/aviary/mission/solved_two_dof/ode/unsteady_solved_flight_conditions.py +++ b/aviary/mission/solved_two_dof/ode/unsteady_solved_flight_conditions.py @@ -1,5 +1,6 @@ import numpy as np import openmdao.api as om +from aviary.variable_info.functions import add_aviary_input, add_aviary_output from aviary import constants from aviary.variable_info.enums import SpeedType @@ -65,20 +66,23 @@ def setup(self): ground_roll = self.options['ground_roll'] ar = np.arange(self.options['num_nodes']) - self.add_input( + add_aviary_input( + self, Dynamic.Atmosphere.DENSITY, val=np.zeros(nn), units='kg/m**3', desc='density of air', ) - self.add_input( + add_aviary_input( + self, Dynamic.Atmosphere.SPEED_OF_SOUND, val=np.zeros(nn), units='m/s', desc='speed of sound', ) - self.add_output( + add_aviary_output( + self, Dynamic.Atmosphere.DYNAMIC_PRESSURE, val=np.zeros(nn), units='N/m**2', @@ -93,7 +97,8 @@ def setup(self): ) if not ground_roll: - self.add_input( + add_aviary_input( + self, Dynamic.Mission.FLIGHT_PATH_ANGLE, shape=nn, units='rad', @@ -108,7 +113,8 @@ def setup(self): ) if in_type is SpeedType.TAS: - self.add_input( + add_aviary_input( + self, Dynamic.Mission.VELOCITY, val=np.zeros(nn), units='m/s', @@ -128,7 +134,8 @@ def setup(self): units='m/s', desc='equivalent air speed', ) - self.add_output( + add_aviary_output( + self, Dynamic.Atmosphere.MACH, val=np.zeros(nn), units='unitless', From 5507f29884f8c4c1216d37b3bf8a59cdfe79630d Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 24 Jun 2026 11:18:29 -0400 Subject: [PATCH 19/31] update unsteady_solved_flight_conditions.py --- .../ode/unsteady_solved_flight_conditions.py | 140 ++++++++++-------- 1 file changed, 77 insertions(+), 63 deletions(-) diff --git a/aviary/mission/solved_two_dof/ode/unsteady_solved_flight_conditions.py b/aviary/mission/solved_two_dof/ode/unsteady_solved_flight_conditions.py index ae5481f789..ed2eb3bde1 100644 --- a/aviary/mission/solved_two_dof/ode/unsteady_solved_flight_conditions.py +++ b/aviary/mission/solved_two_dof/ode/unsteady_solved_flight_conditions.py @@ -105,13 +105,6 @@ def setup(self): desc='flight path angle', ) - self.declare_partials( - of='dTAS_dt_approx', - wrt=[Dynamic.Mission.FLIGHT_PATH_ANGLE], - rows=ar, - cols=ar, - ) - if in_type is SpeedType.TAS: add_aviary_input( self, @@ -142,29 +135,6 @@ def setup(self): desc='Mach number', ) - self.declare_partials( - of=Dynamic.Atmosphere.DYNAMIC_PRESSURE, - wrt=[Dynamic.Atmosphere.DENSITY, Dynamic.Mission.VELOCITY], - rows=ar, - cols=ar, - ) - self.declare_partials( - of=Dynamic.Atmosphere.MACH, - wrt=[Dynamic.Atmosphere.SPEED_OF_SOUND, Dynamic.Mission.VELOCITY], - rows=ar, - cols=ar, - ) - self.declare_partials( - of='EAS', - wrt=[Dynamic.Mission.VELOCITY, Dynamic.Atmosphere.DENSITY], - rows=ar, - cols=ar, - ) - self.declare_partials(of='dTAS_dt_approx', wrt=['dTAS_dr'], rows=ar, cols=ar) - self.declare_partials( - of='dTAS_dt_approx', wrt=[Dynamic.Mission.VELOCITY], rows=ar, cols=ar - ) - elif in_type is SpeedType.EAS: self.add_input( 'EAS', @@ -185,50 +155,24 @@ def setup(self): desc='change in air density per unit altitude', ) - self.add_output( + add_aviary_output( + self, Dynamic.Mission.VELOCITY, val=np.zeros(nn), units='m/s', desc='true air speed', ) - self.add_output( + add_aviary_output( + self, Dynamic.Atmosphere.MACH, val=np.zeros(nn), units='unitless', desc='Mach number', ) - self.declare_partials( - of=Dynamic.Atmosphere.DYNAMIC_PRESSURE, - wrt=[Dynamic.Atmosphere.DENSITY, 'EAS'], - rows=ar, - cols=ar, - ) - self.declare_partials( - of=Dynamic.Atmosphere.MACH, - wrt=[ - Dynamic.Atmosphere.SPEED_OF_SOUND, - 'EAS', - Dynamic.Atmosphere.DENSITY, - ], - rows=ar, - cols=ar, - ) - self.declare_partials( - of=Dynamic.Mission.VELOCITY, - wrt=[Dynamic.Atmosphere.DENSITY, 'EAS'], - rows=ar, - cols=ar, - ) - self.declare_partials( - of='dTAS_dt_approx', - wrt=['drho_dh', Dynamic.Atmosphere.DENSITY, 'EAS', 'dEAS_dr'], - rows=ar, - cols=ar, - ) - else: - self.add_input( + add_aviary_input( + self, Dynamic.Atmosphere.MACH, val=np.zeros(nn), units='unitless', @@ -253,13 +197,83 @@ def setup(self): units='m/s', desc='equivalent air speed', ) - self.add_output( + add_aviary_output( + self, Dynamic.Mission.VELOCITY, val=np.zeros(nn), units='m/s', desc='true air speed', ) + def setup_partials(self): + nn = self.options['num_nodes'] + in_type = self.options['input_speed_type'] + ground_roll = self.options['ground_roll'] + ar = np.arange(self.options['num_nodes']) + + if not ground_roll: + self.declare_partials( + of='dTAS_dt_approx', + wrt=[Dynamic.Mission.FLIGHT_PATH_ANGLE], + rows=ar, + cols=ar, + ) + + if in_type is SpeedType.TAS: + self.declare_partials( + of=Dynamic.Atmosphere.DYNAMIC_PRESSURE, + wrt=[Dynamic.Atmosphere.DENSITY, Dynamic.Mission.VELOCITY], + rows=ar, + cols=ar, + ) + self.declare_partials( + of=Dynamic.Atmosphere.MACH, + wrt=[Dynamic.Atmosphere.SPEED_OF_SOUND, Dynamic.Mission.VELOCITY], + rows=ar, + cols=ar, + ) + self.declare_partials( + of='EAS', + wrt=[Dynamic.Mission.VELOCITY, Dynamic.Atmosphere.DENSITY], + rows=ar, + cols=ar, + ) + self.declare_partials(of='dTAS_dt_approx', wrt=['dTAS_dr'], rows=ar, cols=ar) + self.declare_partials( + of='dTAS_dt_approx', wrt=[Dynamic.Mission.VELOCITY], rows=ar, cols=ar + ) + + elif in_type is SpeedType.EAS: + self.declare_partials( + of=Dynamic.Atmosphere.DYNAMIC_PRESSURE, + wrt=[Dynamic.Atmosphere.DENSITY, 'EAS'], + rows=ar, + cols=ar, + ) + self.declare_partials( + of=Dynamic.Atmosphere.MACH, + wrt=[ + Dynamic.Atmosphere.SPEED_OF_SOUND, + 'EAS', + Dynamic.Atmosphere.DENSITY, + ], + rows=ar, + cols=ar, + ) + self.declare_partials( + of=Dynamic.Mission.VELOCITY, + wrt=[Dynamic.Atmosphere.DENSITY, 'EAS'], + rows=ar, + cols=ar, + ) + self.declare_partials( + of='dTAS_dt_approx', + wrt=['drho_dh', Dynamic.Atmosphere.DENSITY, 'EAS', 'dEAS_dr'], + rows=ar, + cols=ar, + ) + + else: self.declare_partials( of=Dynamic.Atmosphere.DYNAMIC_PRESSURE, wrt=[ From 090397c42bb7efdb9fff18b0fd93599fb6f7029e Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 24 Jun 2026 11:49:55 -0400 Subject: [PATCH 20/31] added use_tempdirs --- aviary/mission/solved_two_dof/ode/test/test_gamma_comp.py | 2 ++ aviary/mission/solved_two_dof/ode/test/test_groundroll_ode.py | 2 ++ .../ode/test/test_unsteady_alpha_thrust_iter_group.py | 2 ++ .../solved_two_dof/ode/test/test_unsteady_flight_conditions.py | 2 ++ .../mission/solved_two_dof/ode/test/test_unsteady_solved_ode.py | 2 ++ 5 files changed, 10 insertions(+) diff --git a/aviary/mission/solved_two_dof/ode/test/test_gamma_comp.py b/aviary/mission/solved_two_dof/ode/test/test_gamma_comp.py index 60fc35c960..cd90a9940d 100644 --- a/aviary/mission/solved_two_dof/ode/test/test_gamma_comp.py +++ b/aviary/mission/solved_two_dof/ode/test/test_gamma_comp.py @@ -3,12 +3,14 @@ import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.solved_two_dof.ode.gamma_comp import GammaComp from aviary.mission.solved_two_dof.ode.unsteady_solved_eom import UnsteadySolvedEOM from aviary.variable_info.variables import Aircraft, Dynamic +@use_tempdirs class TestUnsteadyFlightEOM(unittest.TestCase): """Test 2-degrees-of-freedom equations of motion for unsteady flight.""" diff --git a/aviary/mission/solved_two_dof/ode/test/test_groundroll_ode.py b/aviary/mission/solved_two_dof/ode/test/test_groundroll_ode.py index 9aeef57a52..7d24c1a84e 100644 --- a/aviary/mission/solved_two_dof/ode/test/test_groundroll_ode.py +++ b/aviary/mission/solved_two_dof/ode/test/test_groundroll_ode.py @@ -2,6 +2,7 @@ import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.solved_two_dof.ode.groundroll_ode import GroundrollODE from aviary.mission.two_dof.ode.test.params import set_params_for_unit_tests @@ -13,6 +14,7 @@ from aviary.variable_info.variables import Aircraft, Dynamic +@use_tempdirs class GroundrollODETestCase(unittest.TestCase): """Test groundroll ODE.""" diff --git a/aviary/mission/solved_two_dof/ode/test/test_unsteady_alpha_thrust_iter_group.py b/aviary/mission/solved_two_dof/ode/test/test_unsteady_alpha_thrust_iter_group.py index 468e20e189..43bde77a85 100644 --- a/aviary/mission/solved_two_dof/ode/test/test_unsteady_alpha_thrust_iter_group.py +++ b/aviary/mission/solved_two_dof/ode/test/test_unsteady_alpha_thrust_iter_group.py @@ -3,6 +3,7 @@ import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary.constants import GRAV_ENGLISH_LBM from aviary.mission.two_dof.ode.test.params import set_params_for_unit_tests @@ -19,6 +20,7 @@ from aviary.variable_info.variables import Aircraft, Dynamic +@use_tempdirs class TestUnsteadyAlphaThrustIterGroup(unittest.TestCase): """Test the UnsteadyControlIterGroup.""" diff --git a/aviary/mission/solved_two_dof/ode/test/test_unsteady_flight_conditions.py b/aviary/mission/solved_two_dof/ode/test/test_unsteady_flight_conditions.py index a725708b09..682a6a01cd 100644 --- a/aviary/mission/solved_two_dof/ode/test/test_unsteady_flight_conditions.py +++ b/aviary/mission/solved_two_dof/ode/test/test_unsteady_flight_conditions.py @@ -3,6 +3,7 @@ import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary.constants import RHO_SEA_LEVEL_METRIC from aviary.mission.solved_two_dof.ode.unsteady_solved_flight_conditions import ( @@ -13,6 +14,7 @@ from aviary.variable_info.variables import Dynamic +@use_tempdirs class TestUnsteadyFlightConditions(unittest.TestCase): """Unit test for UnsteadySolvedFlightConditions.""" diff --git a/aviary/mission/solved_two_dof/ode/test/test_unsteady_solved_ode.py b/aviary/mission/solved_two_dof/ode/test/test_unsteady_solved_ode.py index f2cb556ecf..c86b1a2ccb 100644 --- a/aviary/mission/solved_two_dof/ode/test/test_unsteady_solved_ode.py +++ b/aviary/mission/solved_two_dof/ode/test/test_unsteady_solved_ode.py @@ -3,6 +3,7 @@ import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary.constants import GRAV_ENGLISH_LBM from aviary.mission.two_dof.ode.test.params import set_params_for_unit_tests @@ -15,6 +16,7 @@ from aviary.variable_info.variables import Aircraft, Dynamic +@use_tempdirs class TestUnsteadySolvedODE(unittest.TestCase): """Test the unsteady solved ODE in steady level flight.""" From 8c625bef1f6871748b524bb67507e9cbceb3e391 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 24 Jun 2026 11:50:23 -0400 Subject: [PATCH 21/31] update groundroll_eom.py --- aviary/mission/solved_two_dof/ode/groundroll_eom.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/aviary/mission/solved_two_dof/ode/groundroll_eom.py b/aviary/mission/solved_two_dof/ode/groundroll_eom.py index c19d33e764..3de99af335 100644 --- a/aviary/mission/solved_two_dof/ode/groundroll_eom.py +++ b/aviary/mission/solved_two_dof/ode/groundroll_eom.py @@ -14,7 +14,6 @@ def initialize(self): def setup(self): nn = self.options['num_nodes'] - arange = np.arange(nn) add_aviary_input(self, Dynamic.Vehicle.MASS, val=np.ones(nn), units='lbm') add_aviary_input( @@ -68,6 +67,13 @@ def setup(self): add_aviary_output(self, Dynamic.Mission.DISTANCE_RATE, val=np.ones(nn), units='ft/s') self.add_output('normal_force', val=np.ones(nn), desc='normal forces', units='lbf') self.add_output('fuselage_pitch', val=np.ones(nn), desc='fuselage pitch angle', units='deg') + self.add_output( + 'angle_of_attack_rate', val=np.ones(nn), desc='angle of attack rate', units='deg/s' + ) + + def setup_partials(self): + nn = self.options['num_nodes'] + arange = np.arange(nn) self.declare_partials(Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE, '*') self.declare_partials( @@ -130,10 +136,6 @@ def setup(self): ) self.declare_partials('fuselage_pitch', Aircraft.Wing.INCIDENCE, val=-1) - self.add_output( - 'angle_of_attack_rate', val=np.ones(nn), desc='angle of attack rate', units='deg/s' - ) - self.declare_partials('angle_of_attack_rate', ['*']) def compute(self, inputs, outputs): From e5136a2e1342a7e9670004ccf3de55b8e46bc92c Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 24 Jun 2026 12:20:35 -0400 Subject: [PATCH 22/31] update flight_constraints.py and speed_constraints.py --- .../two_dof/ode/constraints/flight_constraints.py | 13 ++++++++----- .../two_dof/ode/constraints/speed_constraints.py | 4 +++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/aviary/mission/two_dof/ode/constraints/flight_constraints.py b/aviary/mission/two_dof/ode/constraints/flight_constraints.py index 076ebab6a8..06efcfd6aa 100644 --- a/aviary/mission/two_dof/ode/constraints/flight_constraints.py +++ b/aviary/mission/two_dof/ode/constraints/flight_constraints.py @@ -23,7 +23,8 @@ def setup(self): nn = self.options['num_nodes'] arange = np.arange(nn) - self.add_input( + add_aviary_input( + self, Dynamic.Vehicle.MASS, val=np.ones(nn), units='lbm', @@ -45,7 +46,8 @@ def setup(self): units='unitless', desc='maximum lift coefficient', ) - self.add_input( + add_aviary_input( + self, Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.ones(nn), units='rad', @@ -54,7 +56,8 @@ def setup(self): add_aviary_input(self, Aircraft.Wing.INCIDENCE, val=1.0, units='rad') - self.add_input( + add_aviary_input( + self, Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.ones(nn), units='rad', @@ -190,8 +193,8 @@ class ClimbAtTopOfClimb(om.ExplicitComponent): """This class is not used nor tested.""" def setup(self): - self.add_input(Dynamic.Mission.VELOCITY, units='ft/s', val=-200) - self.add_input(Dynamic.Mission.FLIGHT_PATH_ANGLE, units='rad', val=0.0) + add_aviary_input(self, Dynamic.Mission.VELOCITY, units='ft/s', val=-200) + add_aviary_input(self, Dynamic.Mission.FLIGHT_PATH_ANGLE, units='rad', val=0.0) self.add_output('ROC', units='ft/s') self.declare_partials('*', '*') diff --git a/aviary/mission/two_dof/ode/constraints/speed_constraints.py b/aviary/mission/two_dof/ode/constraints/speed_constraints.py index e70069a4ca..51f4a1bf1d 100644 --- a/aviary/mission/two_dof/ode/constraints/speed_constraints.py +++ b/aviary/mission/two_dof/ode/constraints/speed_constraints.py @@ -1,5 +1,6 @@ import numpy as np import openmdao.api as om +from aviary.variable_info.functions import add_aviary_input from aviary.variable_info.variables import Dynamic @@ -33,7 +34,8 @@ def setup(self): units='kn', desc='equivalent airspeed', ) - self.add_input( + add_aviary_input( + self, Dynamic.Atmosphere.MACH, val=np.ones(nn), units='unitless', From ad0302c2cd3d6459758bdeed3b78408e60995bd6 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 24 Jun 2026 12:39:58 -0400 Subject: [PATCH 23/31] added use_tempdirs to test_climb_constraints.py and test_flight_constraints.py --- .../two_dof/ode/constraints/test/test_climb_constraints.py | 2 ++ .../two_dof/ode/constraints/test/test_flight_constraints.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/aviary/mission/two_dof/ode/constraints/test/test_climb_constraints.py b/aviary/mission/two_dof/ode/constraints/test/test_climb_constraints.py index 2b4342d244..38f43e1e3b 100644 --- a/aviary/mission/two_dof/ode/constraints/test/test_climb_constraints.py +++ b/aviary/mission/two_dof/ode/constraints/test/test_climb_constraints.py @@ -3,11 +3,13 @@ import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.two_dof.ode.constraints.speed_constraints import SpeedConstraints from aviary.variable_info.variables import Dynamic +@use_tempdirs class SpeedConstraintTestCase1(unittest.TestCase): """Test speed constraint at MACH = 0.6 with targeted MACH at 0.8.""" diff --git a/aviary/mission/two_dof/ode/constraints/test/test_flight_constraints.py b/aviary/mission/two_dof/ode/constraints/test/test_flight_constraints.py index 8bc1e662ee..7e4e42cd66 100644 --- a/aviary/mission/two_dof/ode/constraints/test/test_flight_constraints.py +++ b/aviary/mission/two_dof/ode/constraints/test/test_flight_constraints.py @@ -3,11 +3,13 @@ import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.two_dof.ode.constraints.flight_constraints import FlightConstraints from aviary.variable_info.variables import Aircraft, Dynamic +@use_tempdirs class FlightConstraintTestCase(unittest.TestCase): """Test minimum TAS computation.""" From d305b158489845ab54c8463f1eb9d4b1d23e6441 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 24 Jun 2026 13:07:27 -0400 Subject: [PATCH 24/31] added use_tempdirs --- aviary/mission/two_dof/ode/test/test_accel_eom.py | 2 ++ aviary/mission/two_dof/ode/test/test_accel_ode.py | 2 ++ .../two_dof/ode/test/test_breguet_cruise_eom.py | 11 +++++++---- .../two_dof/ode/test/test_breguet_cruise_ode.py | 3 +++ aviary/mission/two_dof/ode/test/test_flight_ode.py | 3 +++ .../two_dof/ode/test/test_simple_cruise_eom.py | 8 ++++---- .../two_dof/ode/test/test_simple_cruise_ode.py | 7 +++---- aviary/mission/two_dof/ode/test/test_taxi_eom.py | 2 ++ aviary/mission/two_dof/ode/test/test_taxi_ode.py | 2 ++ 9 files changed, 28 insertions(+), 12 deletions(-) diff --git a/aviary/mission/two_dof/ode/test/test_accel_eom.py b/aviary/mission/two_dof/ode/test/test_accel_eom.py index 35ee80b9a3..77a665723b 100644 --- a/aviary/mission/two_dof/ode/test/test_accel_eom.py +++ b/aviary/mission/two_dof/ode/test/test_accel_eom.py @@ -3,11 +3,13 @@ import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.two_dof.ode.accel_eom import AccelerationRates from aviary.variable_info.variables import Dynamic +@use_tempdirs class AccelerationTestCase(unittest.TestCase): """ These tests compare the output of the accel EOM to the output from GASP. There are some discrepancies. diff --git a/aviary/mission/two_dof/ode/test/test_accel_ode.py b/aviary/mission/two_dof/ode/test/test_accel_ode.py index bef24e3b70..f29af30fe9 100644 --- a/aviary/mission/two_dof/ode/test/test_accel_ode.py +++ b/aviary/mission/two_dof/ode/test/test_accel_ode.py @@ -2,6 +2,7 @@ import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.two_dof.ode.accel_ode import AccelODE from aviary.mission.two_dof.ode.test.params import set_params_for_unit_tests @@ -14,6 +15,7 @@ from aviary.variable_info.variables import Aircraft, Dynamic +@use_tempdirs class AccelerationODETestCase(unittest.TestCase): """Test 2-degrees-of-freedom acceleration ODE.""" diff --git a/aviary/mission/two_dof/ode/test/test_breguet_cruise_eom.py b/aviary/mission/two_dof/ode/test/test_breguet_cruise_eom.py index 71da22e100..9da7f5da97 100644 --- a/aviary/mission/two_dof/ode/test/test_breguet_cruise_eom.py +++ b/aviary/mission/two_dof/ode/test/test_breguet_cruise_eom.py @@ -3,12 +3,14 @@ import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary.constants import GRAV_ENGLISH_LBM from aviary.mission.two_dof.ode.breguet_cruise_eom import ElectricRangeComp, RangeComp from aviary.variable_info.variables import Dynamic +@use_tempdirs class TestBreguetResults(unittest.TestCase): """Test cruise range and time in RangeComp component.""" @@ -50,6 +52,7 @@ def test_case1(self): assert_check_partials(partial_data, atol=tol, rtol=tol) +@use_tempdirs class TestBreguetPartials(unittest.TestCase): def setUp(self): nn = 10 @@ -99,6 +102,7 @@ def test_partials(self): assert_check_partials(partial_data, atol=tol, rtol=tol) +@use_tempdirs class TestBreguetPartials2(unittest.TestCase): """Test mass-weight conversion.""" @@ -140,6 +144,7 @@ def test_partials(self): assert_check_partials(partial_data, atol=2e-11, rtol=1e-11) +@use_tempdirs class TestBreguetResults2(unittest.TestCase): def setUp(self): self.nn = nn = 100 @@ -181,6 +186,7 @@ def test_results(self): assert_near_equal(np.diff(t), -np.diff(W) / fuel_flow_avg, tolerance=1.0e-6) +@use_tempdirs class TestElectricBreguetResults(unittest.TestCase): """Test cruise range and time in E_RangeComp component.""" @@ -231,7 +237,4 @@ def test_partials(self): if __name__ == '__main__': - # unittest.main() - test = TestBreguetPartials2() - test.setUp() - test.test_partials() + unittest.main() diff --git a/aviary/mission/two_dof/ode/test/test_breguet_cruise_ode.py b/aviary/mission/two_dof/ode/test/test_breguet_cruise_ode.py index f7ac783382..cc64f5a013 100644 --- a/aviary/mission/two_dof/ode/test/test_breguet_cruise_ode.py +++ b/aviary/mission/two_dof/ode/test/test_breguet_cruise_ode.py @@ -3,6 +3,7 @@ import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.two_dof.ode.breguet_cruise_ode import ( BreguetCruiseODE, @@ -16,6 +17,7 @@ from aviary.variable_info.variables import Aircraft, Dynamic +@use_tempdirs class CruiseODETestCase(unittest.TestCase): def setUp(self): self.prob = om.Problem() @@ -77,6 +79,7 @@ def test_cruise(self): assert_check_partials(partial_data, atol=1e-8, rtol=1e-8) +@use_tempdirs class ElectricCruiseODETestCase(unittest.TestCase): """This test uses a makeup electrical engine to test electrical Breguet cruise ODE.""" diff --git a/aviary/mission/two_dof/ode/test/test_flight_ode.py b/aviary/mission/two_dof/ode/test/test_flight_ode.py index 426bde6944..f748faeb25 100644 --- a/aviary/mission/two_dof/ode/test/test_flight_ode.py +++ b/aviary/mission/two_dof/ode/test/test_flight_ode.py @@ -4,6 +4,7 @@ import openmdao import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials +from openmdao.utils.testing_utils import use_tempdirs from packaging import version from aviary.mission.two_dof.ode.flight_ode import FlightODE @@ -17,6 +18,7 @@ from aviary.variable_info.variables import Aircraft, Dynamic +@use_tempdirs class FlightODEClimbTestCase(unittest.TestCase): """Test 2-degrees-of-freedom climb ODE.""" @@ -133,6 +135,7 @@ def test_end_of_climb(self): check_prob_outputs(self.prob, testvals, 1e-6) +@use_tempdirs class FlightODEDescenTestCase(unittest.TestCase): """Test 2-degrees-of-freedom descent ODE.""" diff --git a/aviary/mission/two_dof/ode/test/test_simple_cruise_eom.py b/aviary/mission/two_dof/ode/test/test_simple_cruise_eom.py index 60013d2b8b..5da94f7900 100644 --- a/aviary/mission/two_dof/ode/test/test_simple_cruise_eom.py +++ b/aviary/mission/two_dof/ode/test/test_simple_cruise_eom.py @@ -3,12 +3,14 @@ import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary.constants import GRAV_ENGLISH_LBM from aviary.mission.two_dof.ode.simple_cruise_eom import DistanceComp from aviary.variable_info.variables import Dynamic +@use_tempdirs class TestSimpleCruiseResults(unittest.TestCase): """Test cruise with DistanceComp component.""" @@ -35,6 +37,7 @@ def test_case1(self): assert_near_equal(distance[-1, ...], r_expected, tolerance=0.001) +@use_tempdirs class TestDistanceCompPartials(unittest.TestCase): def setUp(self): nn = 10 @@ -67,7 +70,4 @@ def test_partials(self): if __name__ == '__main__': - # unittest.main() - test = TestSimpleCruiseResults() - test.setUp() - test.test_case1() + unittest.main() diff --git a/aviary/mission/two_dof/ode/test/test_simple_cruise_ode.py b/aviary/mission/two_dof/ode/test/test_simple_cruise_ode.py index 75564c8bf7..4929e80f8d 100644 --- a/aviary/mission/two_dof/ode/test/test_simple_cruise_ode.py +++ b/aviary/mission/two_dof/ode/test/test_simple_cruise_ode.py @@ -3,6 +3,7 @@ import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.two_dof.ode.simple_cruise_ode import SimpleCruiseODE from aviary.mission.two_dof.ode.test.params import set_params_for_unit_tests @@ -13,6 +14,7 @@ from aviary.variable_info.variables import Aircraft, Dynamic +@use_tempdirs class CruiseODETestCase(unittest.TestCase): def setUp(self): self.prob = om.Problem() @@ -75,7 +77,4 @@ def test_cruise(self): if __name__ == '__main__': - # unittest.main() - z = CruiseODETestCase() - z.setUp() - z.test_cruise() + unittest.main() diff --git a/aviary/mission/two_dof/ode/test/test_taxi_eom.py b/aviary/mission/two_dof/ode/test/test_taxi_eom.py index 91ad71a8df..404161fd6c 100644 --- a/aviary/mission/two_dof/ode/test/test_taxi_eom.py +++ b/aviary/mission/two_dof/ode/test/test_taxi_eom.py @@ -2,6 +2,7 @@ import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary.mission.two_dof.ode.taxi_eom import TaxiFuelComponent from aviary.utils.aviary_values import AviaryValues @@ -9,6 +10,7 @@ from aviary.variable_info.variables import Dynamic, Mission +@use_tempdirs class TaxiFuelComponentTestCase(unittest.TestCase): """Test the computation of fuel consumed during taxi in TaxiFuelComponent component.""" diff --git a/aviary/mission/two_dof/ode/test/test_taxi_ode.py b/aviary/mission/two_dof/ode/test/test_taxi_ode.py index 80f3292f81..9efa79fe5e 100644 --- a/aviary/mission/two_dof/ode/test/test_taxi_ode.py +++ b/aviary/mission/two_dof/ode/test/test_taxi_ode.py @@ -3,6 +3,7 @@ import openmdao import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials +from openmdao.utils.testing_utils import use_tempdirs from packaging import version from aviary.mission.two_dof.ode.test.params import set_params_for_unit_tests @@ -15,6 +16,7 @@ from aviary.variable_info.variables import Dynamic, Mission +@use_tempdirs class TaxiTestCase(unittest.TestCase): """Test computation of taxi group.""" From 3dedefd9cf85876606c2ccbb6520f64503b28cd1 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 24 Jun 2026 13:36:44 -0400 Subject: [PATCH 25/31] update accel_eom.py breguet_cruise_eom.py landing_eom.py simple_cruise_eom.py taxi_eom.py --- aviary/mission/two_dof/ode/accel_eom.py | 21 +++++++++++++------ .../mission/two_dof/ode/breguet_cruise_eom.py | 10 ++++++--- aviary/mission/two_dof/ode/landing_eom.py | 3 ++- .../mission/two_dof/ode/simple_cruise_eom.py | 4 +++- aviary/mission/two_dof/ode/taxi_eom.py | 8 ++++--- 5 files changed, 32 insertions(+), 14 deletions(-) diff --git a/aviary/mission/two_dof/ode/accel_eom.py b/aviary/mission/two_dof/ode/accel_eom.py index 5a42fe31d1..5d1a1ff096 100644 --- a/aviary/mission/two_dof/ode/accel_eom.py +++ b/aviary/mission/two_dof/ode/accel_eom.py @@ -2,6 +2,7 @@ import openmdao.api as om from aviary.constants import GRAV_ENGLISH_GASP, GRAV_ENGLISH_LBM +from aviary.variable_info.functions import add_aviary_input, add_aviary_output from aviary.variable_info.variables import Dynamic @@ -17,27 +18,30 @@ def initialize(self): def setup(self): nn = self.options['num_nodes'] - arange = np.arange(nn) - self.add_input( + add_aviary_input( + self, Dynamic.Vehicle.MASS, val=np.ones(nn) * 1e6, units='lbm', desc='total mass of the aircraft', ) - self.add_input( + add_aviary_input( + self, Dynamic.Vehicle.DRAG, val=np.zeros(nn), units='lbf', desc='drag on aircraft', ) - self.add_input( + add_aviary_input( + self, Dynamic.Vehicle.Propulsion.THRUST_TOTAL, val=np.zeros(nn), units='lbf', desc='total thrust', ) - self.add_input( + add_aviary_input( + self, Dynamic.Mission.VELOCITY, val=np.zeros(nn), units='ft/s', @@ -50,13 +54,18 @@ def setup(self): units='ft/s**2', desc='rate of change of true air speed', ) - self.add_output( + add_aviary_output( + self, Dynamic.Mission.DISTANCE_RATE, val=np.zeros(nn), units='ft/s', desc='rate of change of horizontal distance covered', ) + def setup_partials(self): + nn = self.options['num_nodes'] + arange = np.arange(nn) + self.declare_partials( Dynamic.Mission.VELOCITY_RATE, [ diff --git a/aviary/mission/two_dof/ode/breguet_cruise_eom.py b/aviary/mission/two_dof/ode/breguet_cruise_eom.py index 07d7aa8105..9a4b466f2f 100644 --- a/aviary/mission/two_dof/ode/breguet_cruise_eom.py +++ b/aviary/mission/two_dof/ode/breguet_cruise_eom.py @@ -2,6 +2,7 @@ import openmdao.api as om from aviary.constants import GRAV_ENGLISH_LBM +from aviary.variable_info.functions import add_aviary_input from aviary.variable_info.variables import Dynamic @@ -32,7 +33,8 @@ def setup(self): desc='mass at each node, monotonically nonincreasing', ) - self.add_input( + add_aviary_input( + self, Dynamic.Vehicle.Propulsion.FUEL_MASS_FLOW_RATE_NEGATIVE_TOTAL, 0.74 * np.ones(nn), units='lbm/h', @@ -267,13 +269,15 @@ def setup(self): desc='range reference at which cruise begins', ) self.add_input('TAS_cruise', val=0.0001 * np.ones(nn), units='NM/s', desc='true airspeed') - self.add_input( + add_aviary_input( + self, Dynamic.Vehicle.CUMULATIVE_ELECTRIC_ENERGY_USED, 10.0 * np.ones(nn), units='kW*h', desc='total energy consumption, comes from propulsion', ) - self.add_input( + add_aviary_input( + self, Dynamic.Vehicle.Propulsion.ELECTRIC_POWER_IN_TOTAL, 0.74 * np.ones(nn), units='kW', diff --git a/aviary/mission/two_dof/ode/landing_eom.py b/aviary/mission/two_dof/ode/landing_eom.py index 0b00e0d29a..85026e7cfe 100644 --- a/aviary/mission/two_dof/ode/landing_eom.py +++ b/aviary/mission/two_dof/ode/landing_eom.py @@ -567,7 +567,8 @@ def setup(self): self.add_input( 'CL_max', val=0.0, units='unitless', desc='CLMX: max CL at approach altitude' ) - self.add_input( + add_aviary_input( + self, Dynamic.Vehicle.MASS, val=0.0, units='lbm', diff --git a/aviary/mission/two_dof/ode/simple_cruise_eom.py b/aviary/mission/two_dof/ode/simple_cruise_eom.py index c15039dca3..792f81fed7 100644 --- a/aviary/mission/two_dof/ode/simple_cruise_eom.py +++ b/aviary/mission/two_dof/ode/simple_cruise_eom.py @@ -1,6 +1,7 @@ import numpy as np import openmdao.api as om +from aviary.variable_info.functions import add_aviary_output from aviary.variable_info.variables import Dynamic @@ -33,7 +34,8 @@ def setup(self): desc='Constant true airspeed at each point in cruise.', ) - self.add_output( + add_aviary_output( + self, Dynamic.Mission.DISTANCE, shape=(nn,), units='NM', diff --git a/aviary/mission/two_dof/ode/taxi_eom.py b/aviary/mission/two_dof/ode/taxi_eom.py index ae36ca7426..791fe7f705 100644 --- a/aviary/mission/two_dof/ode/taxi_eom.py +++ b/aviary/mission/two_dof/ode/taxi_eom.py @@ -1,6 +1,6 @@ import openmdao.api as om -from aviary.variable_info.functions import add_aviary_input, add_aviary_option +from aviary.variable_info.functions import add_aviary_input, add_aviary_option, add_aviary_output from aviary.variable_info.variables import Dynamic, Mission @@ -11,7 +11,8 @@ def initialize(self): add_aviary_option(self, Mission.Taxi.DURATION, units='s') def setup(self): - self.add_input( + add_aviary_input( + self, Dynamic.Vehicle.Propulsion.FUEL_MASS_FLOW_RATE_NEGATIVE_TOTAL, val=1.0, units='lbm/s', @@ -25,7 +26,8 @@ def setup(self): units='lbm', desc='taxi_fuel_consumed', ) - self.add_output( + add_aviary_output( + self, Dynamic.Vehicle.MASS, val=175000.0, units='lbm', From 55927f5ecb8918192ec354ba4298a5d929875f4b Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 24 Jun 2026 14:18:29 -0400 Subject: [PATCH 26/31] added 'tags' to function add_aviary_output() --- aviary/mission/two_dof/ode/flight_path_eom.py | 12 ++++++++---- aviary/variable_info/functions.py | 5 +++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/aviary/mission/two_dof/ode/flight_path_eom.py b/aviary/mission/two_dof/ode/flight_path_eom.py index 7967dde39a..c93822bab0 100644 --- a/aviary/mission/two_dof/ode/flight_path_eom.py +++ b/aviary/mission/two_dof/ode/flight_path_eom.py @@ -39,7 +39,8 @@ def setup(self): add_aviary_input(self, Aircraft.Wing.INCIDENCE, val=0) add_aviary_input(self, Mission.Takeoff.ROLLING_FRICTION_COEFFICIENT, units='unitless') - self.add_output( + add_aviary_output( + self, Dynamic.Mission.VELOCITY_RATE, val=np.ones(nn), desc='TAS rate', @@ -48,14 +49,16 @@ def setup(self): ) if not ground_roll: - self.add_output( + add_aviary_output( + self, Dynamic.Mission.ALTITUDE_RATE, val=np.ones(nn), desc='altitude rate', units='ft/s', tags=['dymos.state_rate_source:altitude', 'dymos.state_units:ft'], ) - self.add_output( + add_aviary_output( + self, Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE, val=np.ones(nn), desc='flight path angle rate', @@ -67,7 +70,8 @@ def setup(self): ) add_aviary_input(self, Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.ones(nn), units='deg') - self.add_output( + add_aviary_output( + self, Dynamic.Mission.DISTANCE_RATE, val=np.ones(nn), desc='distance rate', diff --git a/aviary/variable_info/functions.py b/aviary/variable_info/functions.py index 7793847aac..5f4272c341 100644 --- a/aviary/variable_info/functions.py +++ b/aviary/variable_info/functions.py @@ -120,6 +120,7 @@ def add_aviary_output( meta_data=CoreMetaData, shape=None, primal_name=None, + tags=None, ): """ This function provides a clean way to add variables from the @@ -151,6 +152,9 @@ def add_aviary_output( primal_name : str or None Valid python name to represent the variable in compute_primal if 'name' is not a valid python name. + tags: str or list of strs or set of strs + User defined tags that can be used to filter what gets listed when calling list_inputs + and list_outputs. """ meta = meta_data[varname] # units of None are overwritten with defaults. Overwriting units with None is @@ -198,6 +202,7 @@ def add_aviary_output( desc=desc, shape_by_conn=shape_by_conn, primal_name=primal_name, + tags=tags, ) From dbfa50548c7692d73759c1444b52f49dd46b2f5c Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 24 Jun 2026 14:59:10 -0400 Subject: [PATCH 27/31] update test_interface_bugs.py, test_shape_by_conn.py, and engine_deck_conversion.py --- aviary/interface/test/test_interface_bugs.py | 5 +++-- aviary/interface/test/test_shape_by_conn.py | 4 +++- aviary/utils/engine_deck_conversion.py | 12 ++++++++---- aviary/utils/test/test_engine_deck_conversion.py | 6 +++--- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/aviary/interface/test/test_interface_bugs.py b/aviary/interface/test/test_interface_bugs.py index 91753da0bc..925c9fe0f1 100644 --- a/aviary/interface/test/test_interface_bugs.py +++ b/aviary/interface/test/test_interface_bugs.py @@ -10,13 +10,14 @@ ) from aviary.subsystems.subsystem_builder import SubsystemBuilder from aviary.utils.functions import get_aviary_resource_path +from aviary.variable_info.functions import add_aviary_input, add_aviary_output from aviary.variable_info.variables import Aircraft class WingWeightSubsys(om.ExplicitComponent): def setup(self): - self.add_input(Aircraft.Engine.MASS, 1.0, units='lbm') - self.add_output(Aircraft.Canard.ASPECT_RATIO, 1.0, units='unitless') + add_aviary_input(self, Aircraft.Engine.MASS, 1.0, units='lbm') + add_aviary_output(self, Aircraft.Canard.ASPECT_RATIO, 1.0, units='unitless') self.add_output('Tail', 1.0, units='unitless') self.declare_partials(Aircraft.Canard.ASPECT_RATIO, Aircraft.Engine.MASS, val=2.0) diff --git a/aviary/interface/test/test_shape_by_conn.py b/aviary/interface/test/test_shape_by_conn.py index dbed568a14..c90df0fd42 100644 --- a/aviary/interface/test/test_shape_by_conn.py +++ b/aviary/interface/test/test_shape_by_conn.py @@ -108,7 +108,9 @@ def test_shape_bug_two(self): class PostComponent(om.ExplicitComponent): def setup(self): - self.add_input(Aircraft.Design.DRAG_POLAR, shape_by_conn=True, units='unitless') + add_aviary_input( + self, Aircraft.Design.DRAG_POLAR, shape_by_conn=True, units='unitless' + ) add_aviary_input( self, Aircraft.Design.LIFT_POLAR, shape_by_conn=True, units='unitless' ) diff --git a/aviary/utils/engine_deck_conversion.py b/aviary/utils/engine_deck_conversion.py index 4dae6758f6..c65d5fac69 100644 --- a/aviary/utils/engine_deck_conversion.py +++ b/aviary/utils/engine_deck_conversion.py @@ -12,10 +12,11 @@ from aviary.subsystems.propulsion.utils import EngineModelVariables, default_units from aviary.utils.conversion_utils import _parse, _read_map, _rep from aviary.utils.csv_data_file import write_data_file -from aviary.utils.functions import get_aviary_resource_path, get_path +from aviary.utils.functions import get_aviary_resource_path from aviary.utils.named_values import NamedValues from aviary.utils.utils import round_it from aviary.variable_info.enums import EngineDeckType +from aviary.variable_info.functions import add_aviary_input from aviary.variable_info.variables import Dynamic @@ -712,19 +713,22 @@ def initialize(self): def setup(self): nn = self.options['num_nodes'] - self.add_input( + add_aviary_input( + self, Dynamic.Atmosphere.MACH, val=np.zeros(nn), desc='current Mach number', units='unitless', ) - self.add_input( + add_aviary_input( + self, Dynamic.Atmosphere.TEMPERATURE, val=np.zeros(nn), desc='current atmospheric temperature', units='degR', ) - self.add_input( + add_aviary_input( + self, Dynamic.Atmosphere.STATIC_PRESSURE, _PSLS_PSF, units='psf', diff --git a/aviary/utils/test/test_engine_deck_conversion.py b/aviary/utils/test/test_engine_deck_conversion.py index 05dc0ed408..da3ff5f5a2 100644 --- a/aviary/utils/test/test_engine_deck_conversion.py +++ b/aviary/utils/test/test_engine_deck_conversion.py @@ -108,6 +108,6 @@ def test_bad_filenames(self): if __name__ == '__main__': - # unittest.main() - test = TestEngineDeckConversion() - test.test_TF_conversion_GASP() + unittest.main() + # test = TestEngineDeckConversion() + # test.test_TF_conversion_GASP() From b288cb1e4a4df9ddecb5127b6ac4e5f860653f42 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 24 Jun 2026 15:35:52 -0400 Subject: [PATCH 28/31] try update required_thrust.py again --- aviary/mission/energy_state/ode/required_thrust.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/mission/energy_state/ode/required_thrust.py b/aviary/mission/energy_state/ode/required_thrust.py index 2cc4a81210..2f80f2fcc2 100644 --- a/aviary/mission/energy_state/ode/required_thrust.py +++ b/aviary/mission/energy_state/ode/required_thrust.py @@ -33,7 +33,7 @@ def setup(self): units='m/s', desc=Dynamic.Mission.VELOCITY, ) - self.add_input( + add_aviary_input( Dynamic.Mission.VELOCITY_RATE, val=np.zeros(nn), units='m/s**2', From c54fe86b82186f65ce0c7e1e3452467bdba8ea33 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 24 Jun 2026 15:39:34 -0400 Subject: [PATCH 29/31] try update required_thrust.py again --- aviary/mission/energy_state/ode/required_thrust.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aviary/mission/energy_state/ode/required_thrust.py b/aviary/mission/energy_state/ode/required_thrust.py index 2f80f2fcc2..31eaec2e5e 100644 --- a/aviary/mission/energy_state/ode/required_thrust.py +++ b/aviary/mission/energy_state/ode/required_thrust.py @@ -34,6 +34,7 @@ def setup(self): desc=Dynamic.Mission.VELOCITY, ) add_aviary_input( + self, Dynamic.Mission.VELOCITY_RATE, val=np.zeros(nn), units='m/s**2', From 3db3887dfdcbb1f4653cdf6dd0670a1374998d85 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 24 Jun 2026 16:09:04 -0400 Subject: [PATCH 30/31] it worked this time. Updating the last one --- aviary/mission/energy_state/ode/required_thrust.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aviary/mission/energy_state/ode/required_thrust.py b/aviary/mission/energy_state/ode/required_thrust.py index 31eaec2e5e..9ebf904782 100644 --- a/aviary/mission/energy_state/ode/required_thrust.py +++ b/aviary/mission/energy_state/ode/required_thrust.py @@ -40,8 +40,8 @@ def setup(self): units='m/s**2', desc='rate of change of velocity', ) - self.add_input( - Dynamic.Vehicle.MASS, val=np.zeros(nn), units='kg', desc='mass of the aircraft' + add_aviary_input( + self, Dynamic.Vehicle.MASS, val=np.zeros(nn), units='kg', desc='mass of the aircraft' ) self.add_output('thrust_required', val=np.zeros(nn), units='N', desc='required thrust') From d1efa88523373c0757f1aa8117af7b2c81236443 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 26 Jun 2026 19:57:36 -0400 Subject: [PATCH 31/31] removed my mod on add_aviary_output --- aviary/mission/two_dof/ode/flight_path_eom.py | 12 ++++-------- aviary/variable_info/functions.py | 5 ----- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/aviary/mission/two_dof/ode/flight_path_eom.py b/aviary/mission/two_dof/ode/flight_path_eom.py index c93822bab0..7967dde39a 100644 --- a/aviary/mission/two_dof/ode/flight_path_eom.py +++ b/aviary/mission/two_dof/ode/flight_path_eom.py @@ -39,8 +39,7 @@ def setup(self): add_aviary_input(self, Aircraft.Wing.INCIDENCE, val=0) add_aviary_input(self, Mission.Takeoff.ROLLING_FRICTION_COEFFICIENT, units='unitless') - add_aviary_output( - self, + self.add_output( Dynamic.Mission.VELOCITY_RATE, val=np.ones(nn), desc='TAS rate', @@ -49,16 +48,14 @@ def setup(self): ) if not ground_roll: - add_aviary_output( - self, + self.add_output( Dynamic.Mission.ALTITUDE_RATE, val=np.ones(nn), desc='altitude rate', units='ft/s', tags=['dymos.state_rate_source:altitude', 'dymos.state_units:ft'], ) - add_aviary_output( - self, + self.add_output( Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE, val=np.ones(nn), desc='flight path angle rate', @@ -70,8 +67,7 @@ def setup(self): ) add_aviary_input(self, Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.ones(nn), units='deg') - add_aviary_output( - self, + self.add_output( Dynamic.Mission.DISTANCE_RATE, val=np.ones(nn), desc='distance rate', diff --git a/aviary/variable_info/functions.py b/aviary/variable_info/functions.py index 5f4272c341..7793847aac 100644 --- a/aviary/variable_info/functions.py +++ b/aviary/variable_info/functions.py @@ -120,7 +120,6 @@ def add_aviary_output( meta_data=CoreMetaData, shape=None, primal_name=None, - tags=None, ): """ This function provides a clean way to add variables from the @@ -152,9 +151,6 @@ def add_aviary_output( primal_name : str or None Valid python name to represent the variable in compute_primal if 'name' is not a valid python name. - tags: str or list of strs or set of strs - User defined tags that can be used to filter what gets listed when calling list_inputs - and list_outputs. """ meta = meta_data[varname] # units of None are overwritten with defaults. Overwriting units with None is @@ -202,7 +198,6 @@ def add_aviary_output( desc=desc, shape_by_conn=shape_by_conn, primal_name=primal_name, - tags=tags, )