Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
3b51db7
Combined 2dof take-off EOMs
Kenneth-T-Moore Feb 13, 2026
4465edf
Merge branch '2dof_3' of github.com:Kenneth-T-Moore/aviary into 2dof_4
Kenneth-T-Moore Feb 13, 2026
ead63ff
Merge branch 'det' of github.com:Kenneth-T-Moore/aviary into 2dof_4
Kenneth-T-Moore Feb 13, 2026
0bc6ef0
2dof ascent/rotation/groundroll all combined into takeoff. Still 5 fa…
Kenneth-T-Moore Feb 13, 2026
dd85843
Latest
Kenneth-T-Moore Feb 17, 2026
3e67794
udpated test
Kenneth-T-Moore Feb 17, 2026
0356108
Fix for solved 2dof ground roll
Kenneth-T-Moore Feb 17, 2026
6f40f92
update docs
Kenneth-T-Moore Feb 17, 2026
d08571e
Moved solved 2dof groundroll to where it belongs
Kenneth-T-Moore Feb 17, 2026
e2dc1ea
Restore some peices that sovled 2dof needs, but keep them in the solv…
Kenneth-T-Moore Feb 17, 2026
9528a86
Tests are passing
Kenneth-T-Moore Feb 17, 2026
007e31d
RUFF
Kenneth-T-Moore Feb 18, 2026
00bfde0
Merge branch 'main' of github.com:OpenMDAO/Aviary into 2dof_4
Kenneth-T-Moore Feb 18, 2026
9a03d59
Docs
Kenneth-T-Moore Feb 18, 2026
fdb3ccd
Merge branch '2dof_3' of github.com:Kenneth-T-Moore/aviary into 2dof_4
Kenneth-T-Moore Feb 20, 2026
48b7571
Merge branch '2dof_3' of github.com:Kenneth-T-Moore/aviary into 2dof_4
Kenneth-T-Moore Feb 20, 2026
84cd6d3
Merge branch '2dof_3' of github.com:Kenneth-T-Moore/aviary into 2dof_4
Kenneth-T-Moore Feb 20, 2026
7d9f91c
From jason's review on part 3
Kenneth-T-Moore Feb 20, 2026
8a734e1
Merge branch '2dof_3' of github.com:Kenneth-T-Moore/aviary into 2dof_4
Kenneth-T-Moore Feb 20, 2026
d9220fa
Merge branch 'main' into 2dof_4
Kenneth-T-Moore Feb 25, 2026
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
11 changes: 2 additions & 9 deletions aviary/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,12 +112,9 @@
)
from aviary.mission.two_dof.ode.two_dof_ode import TwoDOFODE
from aviary.mission.two_dof.ode.accel_ode import AccelODE as TwoDOFAccelerationODE
from aviary.mission.two_dof.ode.ascent_ode import AscentODE as TwoDOFAscentODE
from aviary.mission.two_dof.ode.breguet_cruise_ode import BreguetCruiseODE
from aviary.mission.two_dof.ode.flight_ode import FlightODE as TwoDOFFlightODE
from aviary.mission.two_dof.ode.flight_path_ode import FlightPathODE as TwoDOFFlightPathODE
from aviary.mission.two_dof.ode.groundroll_ode import GroundrollODE as TwoDOFGroundrollODE
from aviary.mission.two_dof.ode.rotation_ode import RotationODE as TwoDOFRotationODE
from aviary.mission.two_dof.ode.takeoff_ode import TakeOffODE as TwoDOFTakeOffODE
from aviary.mission.two_dof.ode.landing_ode import LandingSegment as TwoDOFSimplifiedLanding
from aviary.mission.two_dof.ode.taxi_ode import TaxiSegment as AnalyticTaxi

Expand Down Expand Up @@ -161,12 +158,8 @@

# Phase builders
from aviary.mission.two_dof.phases.accel_phase import AccelPhase as TwoDOFAccelerationPhase
from aviary.mission.two_dof.phases.ascent_phase import AscentPhase as TwoDOFAscentPhase
from aviary.mission.two_dof.phases.flight_phase import FlightPhase as TwoDOFFlightPhase
from aviary.mission.two_dof.phases.groundroll_phase import (
GroundrollPhase as TwoDOFGroundrollPhase,
)
from aviary.mission.two_dof.phases.rotation_phase import RotationPhase as TwoDOFRotationPhase
from aviary.mission.two_dof.phases.takeoff_phase import TakeoffPhase as TwoDOFTakeoffPhase

# Trajectory builders
from aviary.mission.height_energy.phases.detailed_landing_phases import (
Expand Down
10 changes: 3 additions & 7 deletions aviary/docs/getting_started/input_csv_phase_info.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -137,13 +137,11 @@
"from aviary.models.missions.height_energy_default import phase_info as HE_phase_info\n",
"from aviary.models.missions.two_dof_default import phase_info as TwoDOF_phase_info\n",
"from aviary.mission.flight_phase_builder import FlightPhaseOptions\n",
"from aviary.mission.height_energy.phases.groundroll_phase import GroundrollPhaseOptions as FGopt\n",
"from aviary.mission.solved_two_dof.phases.groundroll_phase import GroundrollPhaseOptions as FGopt\n",
"from aviary.mission.two_dof.phases.accel_phase import AccelPhaseOptions\n",
"from aviary.mission.two_dof.phases.ascent_phase import AscentPhaseOptions\n",
"from aviary.mission.two_dof.phases.flight_phase import FlightPhaseOptions\n",
"from aviary.mission.two_dof.phases.groundroll_phase import GroundrollPhaseOptions as GGopt\n",
"from aviary.mission.two_dof.phases.rotation_phase import RotationPhaseOptions\n",
"from aviary.mission.two_dof.phases.simple_cruise_phase import SimpleCruisePhaseOptions\n",
"from aviary.mission.two_dof.phases.takeoff_phase import TakeoffPhaseOptions\n",
"from aviary.mission.solved_two_dof.phases.solved_twodof_phase import SolvedTwoDOFPhaseOptions\n",
"from aviary.utils.doctape import glue_keys\n",
"\n",
Expand All @@ -166,14 +164,12 @@
"dummy_phase_info.update(TwoDOF_phase_info)\n",
"\n",
"dummy_phase_info.update(AccelPhaseOptions().items())\n",
"dummy_phase_info.update(AscentPhaseOptions().items())\n",
"dummy_phase_info.update(FlightPhaseOptions().items())\n",
"dummy_phase_info.update(FGopt().items())\n",
"dummy_phase_info.update(FlightPhaseOptions().items())\n",
"dummy_phase_info.update(GGopt().items())\n",
"dummy_phase_info.update(RotationPhaseOptions().items())\n",
"dummy_phase_info.update(SimpleCruisePhaseOptions().items())\n",
"dummy_phase_info.update(SolvedTwoDOFPhaseOptions().items())\n",
"dummy_phase_info.update(TakeoffPhaseOptions().items())\n",
"glue_keys(dummy_phase_info)"
]
},
Expand Down
19 changes: 8 additions & 11 deletions aviary/docs/user_guide/phase_info.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,22 @@
"source": [
"# Testing Cell\n",
"from aviary.mission.flight_phase_builder import FlightPhaseOptions\n",
"from aviary.mission.height_energy.phases.groundroll_phase import GroundrollPhaseOptions as FGopt\n",
"from aviary.mission.solved_two_dof.phases.groundroll_phase import GroundrollPhaseOptions as FGopt\n",
"from aviary.mission.two_dof.phases.accel_phase import AccelPhaseOptions\n",
"from aviary.mission.two_dof.phases.ascent_phase import AscentPhaseOptions\n",
"from aviary.mission.two_dof.phases.flight_phase import FlightPhaseOptions\n",
"from aviary.mission.two_dof.phases.groundroll_phase import GroundrollPhaseOptions as GGopt\n",
"from aviary.mission.two_dof.phases.rotation_phase import RotationPhaseOptions\n",
"from aviary.mission.two_dof.phases.flight_phase import FlightPhaseOptions as GFlightPhaseOptions\n",
"from aviary.mission.two_dof.phases.simple_cruise_phase import SimpleCruisePhaseOptions\n",
"from aviary.mission.two_dof.phases.takeoff_phase import TakeoffPhaseOptions\n",
"from aviary.mission.solved_two_dof.phases.solved_twodof_phase import SolvedTwoDOFPhaseOptions\n",
"from aviary.utils.doctape import glue_keys\n",
"\n",
"dummy_phase_info = {}\n",
"dummy_phase_info.update(AccelPhaseOptions().items())\n",
"dummy_phase_info.update(AscentPhaseOptions().items())\n",
"dummy_phase_info.update(FlightPhaseOptions().items())\n",
"dummy_phase_info.update(FGopt().items())\n",
"dummy_phase_info.update(FlightPhaseOptions().items())\n",
"dummy_phase_info.update(GGopt().items())\n",
"dummy_phase_info.update(RotationPhaseOptions().items())\n",
"dummy_phase_info.update(GFlightPhaseOptions().items())\n",
"dummy_phase_info.update(SimpleCruisePhaseOptions().items())\n",
"dummy_phase_info.update(TakeoffPhaseOptions().items())\n",
"dummy_phase_info.update(SolvedTwoDOFPhaseOptions().items())\n",
"glue_keys(dummy_phase_info)"
]
Expand Down Expand Up @@ -122,7 +119,7 @@
"\n",
"- **{glue:md}`no_descent`**: Set to True to prevent the aircraft from descending during the phase. This can be used to prevent unexpected descent during a climb phase. This is only available when using the height_energy equations of motion.\n",
"\n",
"- **{glue:md}'transcription'**: Set the Dymos transcription to use for the phase. Aviary supports 'Collocation' or 'PicardShooting'. [See Dymos documentation for more details](https://openmdao.github.io/dymos/getting_started/transcriptions.html)\n",
"- **{glue:md}`transcription`**: Set the Dymos transcription to use for the phase. Aviary supports 'Collocation' or 'PicardShooting'. [See Dymos documentation for more details](https://openmdao.github.io/dymos/getting_started/transcriptions.html)\n",
"\n",
"### Specialized phase settings\n",
"\n",
Expand Down Expand Up @@ -201,9 +198,9 @@
"\n",
"- **{glue:md}`normal_ref0`**: Additive scale factor \"ref0\" for the normal force constraint. Only available in rotation phases (i.e, phases with \"rotation\" in their name).\n",
"\n",
"- **{glue:md}`pitch_constraint_bounds`**: Lower and upper bounds of the pitch constraint. Only available in ascent phases (i.e, phases with \"ascent\" in their name).\n",
"- **{glue:md}`pitch_constraint_bounds`**: Lower and upper bounds of the pitch constraint. Only available in takeoff phases.\n",
"\n",
"- **{glue:md}`pitch_constraint_ref`**: Multiplicative scale factor \"ref\" for the pitch constraint. Only available in ascent phases (i.e, phases with \"ascent\" in their name).\n",
"- **{glue:md}`pitch_constraint_ref`**: Multiplicative scale factor \"ref\" for the pitch constraint. Only available in takeoff phases.\n",
"\n",
"### Complete List of All Phase Info Options\n",
"\n",
Expand Down
21 changes: 12 additions & 9 deletions aviary/docs/user_guide/phase_info_conversion.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,22 @@
"source": [
"# Testing Cell\n",
"from aviary.mission.flight_phase_builder import FlightPhaseOptions\n",
"from aviary.mission.height_energy.phases.groundroll_phase import GroundrollPhaseOptions as FGopt\n",
"from aviary.mission.solved_two_dof.phases.groundroll_phase import GroundrollPhaseOptions as FGopt\n",
"from aviary.mission.two_dof.phases.accel_phase import AccelPhaseOptions\n",
"from aviary.mission.two_dof.phases.ascent_phase import AscentPhaseOptions\n",
"from aviary.mission.two_dof.phases.flight_phase import FlightPhaseOptions\n",
"from aviary.mission.two_dof.phases.groundroll_phase import GroundrollPhaseOptions as GGopt\n",
"from aviary.mission.two_dof.phases.rotation_phase import RotationPhaseOptions\n",
"from aviary.mission.two_dof.phases.flight_phase import FlightPhaseOptions as GFlightPhaseOptions\n",
"from aviary.mission.two_dof.phases.simple_cruise_phase import SimpleCruisePhaseOptions\n",
"from aviary.mission.two_dof.phases.takeoff_phase import TakeoffPhaseOptions\n",
"from aviary.mission.solved_two_dof.phases.solved_twodof_phase import SolvedTwoDOFPhaseOptions\n",
"from aviary.utils.doctape import glue_keys\n",
"\n",
"dummy_phase_info = {}\n",
"dummy_phase_info.update(AccelPhaseOptions().items())\n",
"dummy_phase_info.update(AscentPhaseOptions().items())\n",
"dummy_phase_info.update(FlightPhaseOptions().items())\n",
"dummy_phase_info.update(FGopt().items())\n",
"dummy_phase_info.update(FlightPhaseOptions().items())\n",
"dummy_phase_info.update(GGopt().items())\n",
"dummy_phase_info.update(RotationPhaseOptions().items())\n",
"dummy_phase_info.update(GFlightPhaseOptions().items())\n",
"dummy_phase_info.update(SimpleCruisePhaseOptions().items())\n",
"dummy_phase_info.update(TakeoffPhaseOptions().items())\n",
"dummy_phase_info.update(SolvedTwoDOFPhaseOptions().items())\n",
"glue_keys(dummy_phase_info)"
]
Expand Down Expand Up @@ -604,7 +601,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"This phase_info has been updated to the new format below:"
"This phase_info has been updated to the new format below. Note that the new \"phase_builder\" option allows different specific equations of motion to be selected. Formerly, these were selected based on the name that the user gave to each phase."
]
},
{
Expand All @@ -619,6 +616,8 @@
" 'groundroll': {\n",
" 'subsystem_options': {'core_aerodynamics': {'method': 'low_speed'}},\n",
" 'user_options': {\n",
" 'phase_builder': PhaseType.TWO_DOF_TAKEOFF,\n",
" 'ground_roll': True,\n",
" 'num_segments': 1,\n",
" 'order': 3,\n",
" 'time_initial': (0.0, 's'),\n",
Expand All @@ -645,6 +644,8 @@
" 'rotation': {\n",
" 'subsystem_options': {'core_aerodynamics': {'method': 'low_speed'}},\n",
" 'user_options': {\n",
" 'phase_builder': PhaseType.TWO_DOF_TAKEOFF,\n",
" 'rotation': True,\n",
" 'num_segments': 1,\n",
" 'order': 3,\n",
" 'time_duration_bounds': ((1, 100), 's'),\n",
Expand Down Expand Up @@ -674,6 +675,7 @@
" 'ascent': {\n",
" 'subsystem_options': {'core_aerodynamics': {'method': 'low_speed'}},\n",
" 'user_options': {\n",
" 'phase_builder': PhaseType.TWO_DOF_TAKEOFF,\n",
" 'num_segments': 4,\n",
" 'order': 3,\n",
" 'velocity_bounds': ((0, 700), 'kn'),\n",
Expand Down Expand Up @@ -712,6 +714,7 @@
" 'accel': {\n",
" 'subsystem_options': {'core_aerodynamics': {'method': 'cruise'}},\n",
" 'user_options': {\n",
" 'phase_builder': PhaseType.ACCEL,\n",
" 'num_segments': 1,\n",
" 'order': 3,\n",
" 'alt': (500, 'ft'),\n",
Expand Down
59 changes: 19 additions & 40 deletions aviary/docs/user_guide/phase_info_detailed.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,9 @@
"\n",
"The TWO_DEGREES_OF_FREEDOM phases contain some options that are unique to each phase.\n",
"\n",
"### AccelPhase\n"
"### AccelPhase\n",
"\n",
"This phase is only used for level accelerating flight."
]
},
{
Expand All @@ -85,41 +87,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"### AscentPhase\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"om.show_options_table('aviary.mission.two_dof.phases.ascent_phase.AscentPhaseOptions')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### SimpleCruisePhase\n",
"\n",
"This is the best choice for a level cruise when using the two DOF equations. SimpleCruisePhase integrates mass using the specified transcription, but the distance is computed from the fixed velocity. This can be selected by setting the \"phase_type\" option to `PhaseType.SIMPLE_CRUISE`.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"om.show_options_table('aviary.mission.two_dof.phases.simple_cruise_phase.SimpleCruisePhaseOptions')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### BreguetCruisePhase (Optional)\n",
"### BreguetCruisePhase\n",
"\n",
"The `BreguetCruisePhase` computes distance analytically using a form of the Breguet Range equation. This will generally be a little faster than `SimpleCruisePhase`, but it comes with a limitation that no external subsystems can contain a state that requires integration. This can be selected by setting the \"phase_type\" option to `PhaseType.BREGUET_RANGE`.\n"
]
Expand Down Expand Up @@ -157,7 +125,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"### GroundrollPhase\n"
"### SimpleCruisePhase\n",
"\n",
"This is the best choice for a level cruise when using the two DOF equations. SimpleCruisePhase integrates mass using the specified transcription, but the distance is computed from the fixed velocity. This can be selected by setting the \"phase_type\" option to `PhaseType.SIMPLE_CRUISE`.\n"
]
},
{
Expand All @@ -166,14 +136,16 @@
"metadata": {},
"outputs": [],
"source": [
"om.show_options_table('aviary.mission.two_dof.phases.groundroll_phase.GroundrollPhaseOptions')"
"om.show_options_table('aviary.mission.two_dof.phases.simple_cruise_phase.SimpleCruisePhaseOptions')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### RotationPhase\n"
"### TakeoffPhase\n",
"\n",
"This phase can be used for all takeoff phases and includes dynamics for ground roll, rotation, and ascent."
]
},
{
Expand All @@ -182,8 +154,15 @@
"metadata": {},
"outputs": [],
"source": [
"om.show_options_table('aviary.mission.two_dof.phases.rotation_phase.RotationPhaseOptions')"
"om.show_options_table('aviary.mission.two_dof.phases.takeoff_phase.TakeoffPhaseOptions')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import numpy as np
import openmdao.api as om

from aviary.mission.two_dof.ode.groundroll_eom import GroundrollEOM
from aviary.mission.solved_two_dof.ode.groundroll_eom import GroundrollEOM
from aviary.mission.two_dof.ode.params import ParamPort
from aviary.mission.two_dof.ode.two_dof_ode import TwoDOFODE
from aviary.subsystems.aerodynamics.aerodynamics_builder import AerodynamicsBuilder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import openmdao.api as om
from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal

from aviary.mission.two_dof.ode.groundroll_eom import GroundrollEOM
from aviary.mission.solved_two_dof.ode.groundroll_eom import GroundrollEOM
from aviary.variable_info.variables import Aircraft, Dynamic


Expand Down Expand Up @@ -59,12 +59,12 @@ class GroundrollEOMTestCase2(unittest.TestCase):
"""Test mass-weight conversion."""

def setUp(self):
import aviary.mission.two_dof.ode.groundroll_eom as gr
import aviary.mission.solved_two_dof.ode.groundroll_eom as gr

gr.GRAV_ENGLISH_LBM = 1.1

def tearDown(self):
import aviary.mission.two_dof.ode.groundroll_eom as gr
import aviary.mission.solved_two_dof.ode.groundroll_eom as gr

gr.GRAV_ENGLISH_LBM = 1.0

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import openmdao.api as om
from openmdao.utils.assert_utils import assert_check_partials

from aviary.mission.two_dof.ode.groundroll_ode import GroundrollODE
from aviary.mission.solved_two_dof.ode.groundroll_ode import GroundrollODE
from aviary.mission.two_dof.ode.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
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import dymos as dm

from aviary.mission.two_dof.ode.groundroll_ode import GroundrollODE
from aviary.mission.initial_guess_builders import (
InitialGuessIntegrationVariable,
InitialGuessPolynomialControl,
InitialGuessState,
)
from aviary.mission.phase_builder import PhaseBuilder, register
from aviary.mission.phase_utils import add_subsystem_variables_to_phase
from aviary.mission.solved_two_dof.ode.groundroll_ode import GroundrollODE
from aviary.utils.aviary_options_dict import AviaryOptionsDictionary
from aviary.utils.aviary_values import AviaryValues
from aviary.variable_info.variable_meta_data import _MetaData
from aviary.variable_info.variables import Dynamic
from aviary.mission.phase_utils import add_subsystem_variables_to_phase

# Solved 2DOF uses this builder.
#
Expand Down Expand Up @@ -69,7 +69,11 @@ def declare_options(self):

@register
class GroundrollPhase(PhaseBuilder):
"""A phase builder for a two degree of freedom (2DOF) phase."""
"""
A phase builder for a two degree of freedom (2DOF) ground roll phase.

This is used exclusively by the Solved 2DOF Phase Builder.
"""

__slots__ = ('subsystems', 'meta_data')

Expand Down
2 changes: 1 addition & 1 deletion aviary/mission/solved_two_dof_problem_configurator.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from aviary.mission.height_energy.phases.groundroll_phase import (
from aviary.mission.solved_two_dof.phases.groundroll_phase import (
GroundrollPhase as GroundrollPhaseVelocityIntegrated,
)
from aviary.mission.solved_two_dof.phases.solved_twodof_phase import SolvedTwoDOFPhase
Expand Down
Loading
Loading