Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions aviary/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,9 @@
)
from aviary.subsystems.propulsion.utils import build_engine_deck

###################
# Level 3 Imports #
###################
####################
# Advanced Imports #
####################
# Model Setup
from aviary.variable_info.functions import (
override_aviary_vars,
Expand Down Expand Up @@ -185,6 +185,9 @@
# Mass
from aviary.subsystems.mass.mass_builder import MassBuilder, CoreMassBuilder

# Energy
from aviary.subsystems.energy.energy_builder import EnergyBuilder, CoreEnergyBuilder

# Performance
from aviary.subsystems.performance.performance_builder import (
PerformanceBuilder,
Expand All @@ -194,7 +197,6 @@
# Propulsion
from aviary.subsystems.propulsion.engine_deck import EngineDeck
from aviary.subsystems.propulsion.engine_model import EngineModel
from aviary.subsystems.propulsion.motor.motor_builder import MotorBuilder
from aviary.subsystems.propulsion.propulsion_builder import (
PropulsionBuilder,
CorePropulsionBuilder,
Expand Down
3 changes: 3 additions & 0 deletions aviary/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,6 @@

# sea level standard temperature in deg R
TSLS_DEGR = 518.67

# fuel properties
DENSITY_JET_A = (6.7, 'lbm/galUS')
11 changes: 10 additions & 1 deletion aviary/core/aviary_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
Verbosity,
)
from aviary.variable_info.functions import setup_trajectory_params
from aviary.variable_info.variables import Aircraft, Mission, Settings
from aviary.variable_info.variables import Aircraft, Dynamic, Mission, Settings

TWO_DEGREES_OF_FREEDOM = EquationsOfMotion.TWO_DEGREES_OF_FREEDOM
ENERGY_STATE = EquationsOfMotion.ENERGY_STATE
Expand Down Expand Up @@ -1026,6 +1026,15 @@ def link_phases(self, verbosity=None, comm=None):
upstream_analytic = [item for item in vars1 if item.startswith('initial_')]
downstream_analytic = [item for item in vars2 if item.startswith('initial_')]

# TODO 2DOF simple cruise breaks this, so it currently can't support discontinuous reserves
if self.mission_method is ENERGY_STATE:
# If the user specifies a specific initial mach/altitude for the first reserve phase,
# allow discontinuities for those variables between the main and reserve mission
if self.reserve_phases and phase2 == self.reserve_phases[0]:
for var in (Dynamic.Mission.ALTITUDE, Dynamic.Atmosphere.MACH):
if phase_info2.get(f'{var}_initial', (None, None))[0]:
common = common - {var}

# Sort because of MPI
for var in sorted(common):
# Controls: True or False, everything else: None
Expand Down
8 changes: 7 additions & 1 deletion aviary/docs/examples/reserve_mission.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -184,8 +184,14 @@
}
],
"metadata": {
"kernelspec": {
"display_name": "aviary",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python"
"name": "python",
"version": "3.13.13"
}
},
"nbformat": 4,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@
" takeoff_mic_p2_to_engine_cutback_builder,\n",
" takeoff_rotate_builder,\n",
")\n",
"from aviary.utils.test_utils.default_subsystems import get_default_premission_subsystems\n",
"from aviary.utils.test_utils.default_subsystems import get_default_subsystems\n",
"from aviary.variable_info.functions import setup_model_options\n",
"\n",
"takeoff_trajectory_builder = av.DetailedTakeoffTrajectoryBuilder('detailed_takeoff')\n",
Expand All @@ -379,7 +379,7 @@
"takeoff = om.Problem()\n",
"\n",
"# default subsystems\n",
"default_premission_subsystems = get_default_premission_subsystems('FLOPS', engines)\n",
"default_premission_subsystems = get_default_subsystems('FLOPS', engines).values()\n",
"\n",
"# Upstream pre-mission analysis for aero\n",
"takeoff.model.add_subsystem(\n",
Expand Down
2 changes: 1 addition & 1 deletion aviary/docs/user_guide_unreviewed/subsystems/fuel.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
"Caution should be taken when converting GASP aircraft and evaluating fuel mass.\n",
"FRESF, in GASP can be assigned to three differen values: an extra fuel weight in lbs, an extra fuel percentage, or an extra reserve flight time.\n",
"FRESF values between 0 and 10 will not evaluate to a extra reserve flight time. Instead this must be accomplished by setting up a reserve mission and a `target_time`. Doing this will help Aviary calculate {glue:md}`Mission.TOTAL_RESERVE_FUEL_MASS` which is the fuel burn for all of the reserve phases. [Read more about generating reserve missions.](../reserve_missions.ipynb)\n",
"FRESF values at or below 0 will convert to a percentage of mission fuel burn reserive and bookept under {glue:md}`Mission.RESERVE_FUEL_MARGIN`. (`FRESHF = -.1` -> `RESERVE_FUEL_MARGIN = 10`)\n",
"FRESF values at or below 0 will convert to a percentage of mission fuel burn reserive and bookept under {glue:md}`Mission.RESERVE_FUEL_MARGIN`. (`FRESHF = -.1` -> `RESERVE_FUEL_MARGIN = 0.1`)\n",
"FRESF values at or above 10 will convert directly to lbm fuel burn reserves and accounted for in {glue:md}`Mission.RESERVE_FUEL_MASS_ADDITIONAL`. \n",
"Further details on these conversiosn can be viewed in `fortran_to_aviary.py`."
]
Expand Down
8 changes: 5 additions & 3 deletions aviary/interface/test/test_reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ def test_timeseries_report(self):
'time (s)',
'altitude (ft)',
'altitude_rate (ft/s)',
'cumulative_fuel_burn (lbm)',
'distance (m)',
'drag (lbf)',
'drag_coefficient (unitless)',
Expand All @@ -58,6 +59,7 @@ def test_timeseries_report(self):
'0.0',
'8.333333333333337',
'1.0',
'1.0',
'21108.341035874902',
'0.260025166162475',
'0.0',
Expand Down Expand Up @@ -171,6 +173,6 @@ def test_multiple_off_design_report_directories(self):


if __name__ == '__main__':
# unittest.main()
test = TestReports()
test.test_multiple_off_design_report_directories()
unittest.main()
# test = TestReports()
# test.test_multiple_off_design_report_directories()
54 changes: 0 additions & 54 deletions aviary/interface/test/test_reserve_support.py

This file was deleted.

6 changes: 4 additions & 2 deletions aviary/mission/energy_state/ode/test/test_landing_ode.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from aviary.utils.aviary_values import AviaryValues
from aviary.utils.functions import set_aviary_initial_values
from aviary.utils.preprocessors import preprocess_options
from aviary.utils.test_utils.default_subsystems import get_default_mission_subsystems
from aviary.utils.test_utils.default_subsystems import get_default_subsystems
from aviary.validation_cases.validation_data.test_data.advanced_single_aisle_data import (
detailed_landing_flare,
inputs,
Expand All @@ -35,7 +35,9 @@ def test_case(self):

preprocess_options(aviary_options, engine_models=engines)

default_mission_subsystems = get_default_mission_subsystems('FLOPS', engines)
default_mission_subsystems = [
get_default_subsystems('FLOPS', engines)[k] for k in ['propulsion', 'aerodynamics']
]

prob.model.add_subsystem(
'landing_flare_ode',
Expand Down
14 changes: 8 additions & 6 deletions aviary/mission/energy_state/ode/test/test_takeoff_ode.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@
from openmdao.utils.testing_utils import use_tempdirs

from aviary.mission.energy_state.ode.takeoff_ode import TakeoffODE
from aviary.subsystems.propulsion.utils import build_engine_deck
from aviary.utils.aviary_values import AviaryValues
from aviary.utils.functions import set_aviary_initial_values
from aviary.utils.preprocessors import preprocess_options
from aviary.utils.test_utils.default_subsystems import get_default_subsystems
from aviary.validation_cases.validation_data.test_data.advanced_single_aisle_data import (
detailed_takeoff_climbing,
detailed_takeoff_ground,
inputs,
takeoff_subsystem_options,
)
from aviary.subsystems.propulsion.utils import build_engine_deck
from aviary.utils.aviary_values import AviaryValues
from aviary.utils.functions import set_aviary_initial_values
from aviary.utils.preprocessors import preprocess_options
from aviary.utils.test_utils.default_subsystems import get_default_mission_subsystems
from aviary.validation_cases.validation_tests import do_validation_test
from aviary.variable_info.functions import setup_model_options
from aviary.variable_info.variables import Aircraft, Dynamic, Mission
Expand Down Expand Up @@ -99,7 +99,9 @@ def _make_prob(climbing):

preprocess_options(aviary_options, engine_models=engines)

default_mission_subsystems = get_default_mission_subsystems('FLOPS', engines)
default_mission_subsystems = [
get_default_subsystems('FLOPS', engines)[k] for k in ['propulsion', 'aerodynamics']
]

prob.model.add_subsystem(
'takeoff_ode',
Expand Down
4 changes: 4 additions & 0 deletions aviary/mission/energy_state_problem_configurator.py
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,10 @@ def check_trajectory(self, aviary_group):
continue

if initial != final:
# the first reserve mission phase is allowed to have discontinuous mach and alt
if aviary_group.reserve_phases and right_name == aviary_group.reserve_phases[0]:
if stem in (Dynamic.Atmosphere.MACH, Dynamic.Mission.ALTITUDE):
continue
msg += ' Constraint mismatch across phase boundary:\n'
msg += f' {left_name} {stem}_final: {final}\n'
msg += f' {right_name} {stem}_initial: {initial}\n'
Expand Down
9 changes: 5 additions & 4 deletions aviary/mission/solved_two_dof/ode/test/test_groundroll_ode.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
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
from aviary.subsystems.propulsion.utils import build_engine_deck
from aviary.utils.test_utils.default_subsystems import get_default_mission_subsystems
from aviary.utils.test_utils.default_subsystems import get_default_subsystems
from aviary.utils.test_utils.IO_test_util import check_prob_outputs
from aviary.variable_info.functions import setup_model_options
from aviary.variable_info.options import get_option_defaults
Expand All @@ -24,9 +24,10 @@ def setUp(self):
aviary_options = get_option_defaults()
aviary_options.set_val(Aircraft.Engine.GLOBAL_THROTTLE, True)
aviary_options.set_val(Mission.GRAVITY, val=32.2, units='ft/s**2')
default_mission_subsystems = get_default_mission_subsystems(
'GASP', [build_engine_deck(aviary_options)]
)
default_mission_subsystems = [
get_default_subsystems('GASP', [build_engine_deck(aviary_options)])[k]
for k in ['propulsion', 'aerodynamics']
]

self.prob.model = GroundrollODE(
num_nodes=2,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from aviary.mission.solved_two_dof.ode.unsteady_solved_ode import UnsteadySolvedODE
from aviary.mission.two_dof.ode.test.params import set_params_for_unit_tests
from aviary.subsystems.propulsion.utils import build_engine_deck
from aviary.utils.test_utils.default_subsystems import get_default_mission_subsystems
from aviary.utils.test_utils.default_subsystems import get_default_subsystems
from aviary.variable_info.enums import SpeedType
from aviary.variable_info.functions import setup_model_options
from aviary.variable_info.options import get_option_defaults
Expand All @@ -28,9 +28,10 @@ def _test_unsteady_solved_ode(
p = om.Problem()

aviary_options = get_option_defaults()
default_mission_subsystems = get_default_mission_subsystems(
'GASP', [build_engine_deck(aviary_options)]
)
default_mission_subsystems = [
get_default_subsystems('GASP', [build_engine_deck(aviary_options)])[k]
for k in ['propulsion', 'aerodynamics']
]

ode = UnsteadySolvedODE(
num_nodes=nn,
Expand Down
9 changes: 5 additions & 4 deletions aviary/mission/two_dof/ode/test/test_accel_ode.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from aviary.mission.two_dof.ode.test.params import set_params_for_unit_tests
from aviary.subsystems.propulsion.utils import build_engine_deck
from aviary.utils.aviary_values import AviaryValues
from aviary.utils.test_utils.default_subsystems import get_default_mission_subsystems
from aviary.utils.test_utils.default_subsystems import get_default_subsystems
from aviary.utils.test_utils.IO_test_util import check_prob_outputs
from aviary.variable_info.functions import setup_model_options
from aviary.variable_info.options import get_option_defaults
Expand All @@ -24,9 +24,10 @@ def setUp(self):

aviary_options = get_option_defaults()
aviary_options.set_val(Aircraft.Engine.GLOBAL_THROTTLE, True)
default_mission_subsystems = get_default_mission_subsystems(
'GASP', [build_engine_deck(aviary_options)]
)
default_mission_subsystems = [
get_default_subsystems('GASP', [build_engine_deck(aviary_options)])[k]
for k in ['propulsion', 'aerodynamics']
]

self.sys = self.prob.model = AccelODE(
num_nodes=2, aviary_options=aviary_options, subsystems=default_mission_subsystems
Expand Down
17 changes: 9 additions & 8 deletions aviary/mission/two_dof/ode/test/test_breguet_cruise_ode.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from aviary.mission.two_dof.ode.breguet_cruise_ode import BreguetCruiseODE, ElectricBreguetCruiseODE
from aviary.mission.two_dof.ode.test.params import set_params_for_unit_tests
from aviary.subsystems.propulsion.utils import build_engine_deck
from aviary.utils.test_utils.default_subsystems import get_default_mission_subsystems
from aviary.utils.test_utils.default_subsystems import get_default_subsystems
from aviary.variable_info.functions import setup_model_options
from aviary.variable_info.options import get_option_defaults
from aviary.variable_info.variables import Aircraft, Dynamic
Expand All @@ -21,9 +21,10 @@ def setUp(self):

aviary_options = get_option_defaults()
aviary_options.set_val(Aircraft.Engine.GLOBAL_THROTTLE, True)
default_mission_subsystems = get_default_mission_subsystems(
'GASP', [build_engine_deck(aviary_options)]
)
default_mission_subsystems = [
get_default_subsystems('GASP', [build_engine_deck(aviary_options)])[k]
for k in ['propulsion', 'aerodynamics']
]

self.prob.model = BreguetCruiseODE(
num_nodes=2,
Expand Down Expand Up @@ -89,10 +90,10 @@ def setUp(self):
Aircraft.Engine.DATA_FILE,
'mission/two_dof/ode/test/test_data/turbofan_23k_electrified.csv',
)
default_mission_subsystems = get_default_mission_subsystems(
'GASP', build_engine_deck(aviary_options)
)

default_mission_subsystems = [
get_default_subsystems('GASP', [build_engine_deck(aviary_options)])[k]
for k in ['propulsion', 'aerodynamics']
]
self.prob.model = ElectricBreguetCruiseODE(
num_nodes=2,
aviary_options=aviary_options,
Expand Down
16 changes: 9 additions & 7 deletions aviary/mission/two_dof/ode/test/test_flight_ode.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from aviary.mission.two_dof.ode.flight_ode import FlightODE
from aviary.mission.two_dof.ode.test.params import set_params_for_unit_tests
from aviary.subsystems.propulsion.utils import build_engine_deck
from aviary.utils.test_utils.default_subsystems import get_default_mission_subsystems
from aviary.utils.test_utils.default_subsystems import get_default_subsystems
from aviary.utils.test_utils.IO_test_util import check_prob_outputs
from aviary.variable_info.enums import SpeedType, Verbosity
from aviary.variable_info.functions import setup_model_options
Expand All @@ -29,9 +29,10 @@ def setUp(self):
aviary_options.set_val('verbosity', Verbosity.QUIET)
aviary_options.set_val(Aircraft.Engine.GLOBAL_THROTTLE, True)

default_mission_subsystems = get_default_mission_subsystems(
'GASP', [build_engine_deck(aviary_options)]
)
default_mission_subsystems = [
get_default_subsystems('GASP', [build_engine_deck(aviary_options)])[k]
for k in ['propulsion', 'aerodynamics']
]

self.sys = self.prob.model = FlightODE(
num_nodes=1,
Expand Down Expand Up @@ -143,9 +144,10 @@ def setUp(self):
self.prob = om.Problem()

aviary_options = get_option_defaults()
default_mission_subsystems = get_default_mission_subsystems(
'GASP', [build_engine_deck(aviary_options)]
)
default_mission_subsystems = [
get_default_subsystems('GASP', [build_engine_deck(aviary_options)])[k]
for k in ['propulsion', 'aerodynamics']
]

self.sys = self.prob.model = FlightODE(
num_nodes=1,
Expand Down
Loading