Skip to content
Merged
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
30 changes: 15 additions & 15 deletions aviary/mission/energy_state/ode/landing_eom.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,13 +160,13 @@ def setup(self):

nn = options['num_nodes']

add_aviary_input(self, Dynamic.Vehicle.MASS, val=np.ones(nn), units='kg')
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')
add_aviary_input(self, Dynamic.Vehicle.MASS, shape=nn, units='kg')
add_aviary_input(self, Dynamic.Vehicle.LIFT, shape=nn, units='N')
add_aviary_input(self, Dynamic.Vehicle.DRAG, shape=nn, units='N')

add_aviary_input(self, Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(nn), units='rad')
add_aviary_input(self, Dynamic.Vehicle.ANGLE_OF_ATTACK, shape=nn, units='rad')

add_aviary_input(self, Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.zeros(nn), units='rad')
add_aviary_input(self, Dynamic.Mission.FLIGHT_PATH_ANGLE, shape=nn, units='rad')

self.add_output(
'forces_perpendicular',
Expand Down Expand Up @@ -317,14 +317,14 @@ def setup(self):

nn = options['num_nodes']

add_aviary_input(self, Dynamic.Vehicle.MASS, val=np.ones(nn), units='kg')
add_aviary_input(self, Dynamic.Vehicle.LIFT, val=np.ones(nn), units='N')
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')
add_aviary_input(self, Dynamic.Vehicle.MASS, shape=nn, units='kg')
add_aviary_input(self, Dynamic.Vehicle.LIFT, shape=nn, units='N')
add_aviary_input(self, Dynamic.Vehicle.Propulsion.THRUST_TOTAL, shape=nn, units='N')
add_aviary_input(self, Dynamic.Vehicle.DRAG, shape=nn, units='N')

add_aviary_input(self, Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(nn), units='rad')
add_aviary_input(self, Dynamic.Vehicle.ANGLE_OF_ATTACK, shape=nn, units='rad')

add_aviary_input(self, Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.zeros(nn), units='rad')
add_aviary_input(self, Dynamic.Mission.FLIGHT_PATH_ANGLE, shape=nn, units='rad')

self.add_output(
'forces_horizontal',
Expand Down Expand Up @@ -475,10 +475,10 @@ def setup(self):

nn = options['num_nodes']

add_aviary_input(self, Dynamic.Vehicle.MASS, val=np.ones(nn), units='kg')
add_aviary_input(self, Dynamic.Vehicle.LIFT, val=np.ones(nn), units='N')
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')
add_aviary_input(self, Dynamic.Vehicle.MASS, shape=nn, units='kg')
add_aviary_input(self, Dynamic.Vehicle.LIFT, shape=nn, units='N')
add_aviary_input(self, Dynamic.Vehicle.Propulsion.THRUST_TOTAL, shape=nn, units='N')
add_aviary_input(self, Dynamic.Vehicle.DRAG, shape=nn, units='N')

self.add_output(
'forces_horizontal',
Expand Down
6 changes: 3 additions & 3 deletions aviary/mission/energy_state/ode/range_rate.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,21 @@ def setup(self):
add_aviary_input(
self,
Dynamic.Mission.ALTITUDE_RATE,
val=np.ones(nn),
shape=nn,
desc='climb rate',
units='m/s',
)
add_aviary_input(
self,
Dynamic.Mission.VELOCITY,
val=np.ones(nn),
shape=nn,
desc='current velocity',
units='m/s',
)
add_aviary_output(
self,
Dynamic.Mission.DISTANCE_RATE,
val=np.ones(nn),
shape=nn,
desc='current horizontal velocity (assumed no wind)',
units='m/s',
)
Expand Down
16 changes: 6 additions & 10 deletions aviary/mission/energy_state/ode/required_thrust.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,32 +18,28 @@ def initialize(self):
def setup(self):
nn = self.options['num_nodes']

add_aviary_input(self, Dynamic.Vehicle.DRAG, val=np.zeros(nn), units='N', desc='drag force')
add_aviary_input(self, Dynamic.Vehicle.DRAG, shape=nn, units='N', desc='drag force')
add_aviary_input(
self,
Dynamic.Mission.ALTITUDE_RATE,
val=np.zeros(nn),
shape=nn,
units='m/s',
desc='rate of change of altitude',
)
add_aviary_input(
self,
Dynamic.Mission.VELOCITY,
val=np.zeros(nn),
shape=nn,
units='m/s',
desc=Dynamic.Mission.VELOCITY,
)
add_aviary_input(
self,
Dynamic.Mission.VELOCITY_RATE,
val=np.zeros(nn),
shape=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_output('thrust_required', val=np.zeros(nn), units='N', desc='required thrust')
add_aviary_input(self, Dynamic.Vehicle.MASS, shape=nn, units='kg')
self.add_output('thrust_required', shape=nn, units='N')

ar = np.arange(nn)
self.declare_partials('thrust_required', Dynamic.Vehicle.DRAG, rows=ar, cols=ar)
Expand Down
51 changes: 25 additions & 26 deletions aviary/mission/energy_state/ode/takeoff_eom.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,13 @@ def setup(self):

nn = options['num_nodes']

self.add_input('mass', val=np.ones(nn), units='kg', desc='current mass of the aircraft')
add_aviary_input(self, Dynamic.Vehicle.MASS, shape=nn, units='kg')

add_aviary_input(
self,
Dynamic.Atmosphere.DENSITY,
val=np.ones(nn),
shape=nn,
units='kg/m**3',
desc='current atmospheric density',
)

self.add_input('area', val=1.0, units='m**2', desc='surface area contributing to lift')
Expand Down Expand Up @@ -207,11 +206,11 @@ def setup(self):

nn = options['num_nodes']

add_aviary_input(self, Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.zeros(nn), units='rad')
add_aviary_input(self, Dynamic.Mission.VELOCITY, val=np.zeros(nn), units='m/s')
add_aviary_input(self, Dynamic.Mission.FLIGHT_PATH_ANGLE, shape=nn, units='rad')
add_aviary_input(self, Dynamic.Mission.VELOCITY, shape=nn, units='m/s')

add_aviary_output(self, Dynamic.Mission.DISTANCE_RATE, val=np.zeros(nn), units='m/s')
add_aviary_output(self, Dynamic.Mission.ALTITUDE_RATE, val=np.zeros(nn), units='m/s')
add_aviary_output(self, Dynamic.Mission.DISTANCE_RATE, shape=nn, units='m/s')
add_aviary_output(self, Dynamic.Mission.ALTITUDE_RATE, shape=nn, units='m/s')

def setup_partials(self):
options = self.options
Expand Down Expand Up @@ -283,7 +282,7 @@ def initialize(self):
def setup(self):
nn = self.options['num_nodes']

add_aviary_input(self, Dynamic.Vehicle.MASS, val=np.ones(nn), units='kg')
add_aviary_input(self, Dynamic.Vehicle.MASS, shape=nn, units='kg')

self.add_input(
'forces_horizontal',
Expand Down Expand Up @@ -395,10 +394,10 @@ def setup(self):
units='m/s**2',
)

add_aviary_input(self, Dynamic.Mission.DISTANCE_RATE, val=np.zeros(nn), units='m/s')
add_aviary_input(self, Dynamic.Mission.ALTITUDE_RATE, val=np.zeros(nn), units='m/s')
add_aviary_input(self, Dynamic.Mission.DISTANCE_RATE, shape=nn, units='m/s')
add_aviary_input(self, Dynamic.Mission.ALTITUDE_RATE, shape=nn, units='m/s')

add_aviary_output(self, Dynamic.Mission.VELOCITY_RATE, val=np.ones(nn), units='m/s**2')
add_aviary_output(self, Dynamic.Mission.VELOCITY_RATE, shape=nn, units='m/s**2')

rows_cols = np.arange(nn)

Expand Down Expand Up @@ -446,8 +445,8 @@ def initialize(self):
def setup(self):
nn = self.options['num_nodes']

add_aviary_input(self, Dynamic.Mission.DISTANCE_RATE, val=np.zeros(nn), units='m/s')
add_aviary_input(self, Dynamic.Mission.ALTITUDE_RATE, val=np.zeros(nn), units='m/s')
add_aviary_input(self, Dynamic.Mission.DISTANCE_RATE, shape=nn, units='m/s')
add_aviary_input(self, Dynamic.Mission.ALTITUDE_RATE, shape=nn, units='m/s')

self.add_input(
'acceleration_horizontal',
Expand All @@ -466,7 +465,7 @@ def setup(self):
add_aviary_output(
self,
Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE,
val=np.zeros(nn),
shape=nn,
units='rad/s',
)

Expand Down Expand Up @@ -539,14 +538,14 @@ def setup(self):

nn = options['num_nodes']

add_aviary_input(self, Dynamic.Vehicle.MASS, val=np.ones(nn), units='kg')
add_aviary_input(self, Dynamic.Vehicle.LIFT, val=np.ones(nn), units='N')
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')
add_aviary_input(self, Dynamic.Vehicle.MASS, shape=nn, units='kg')
add_aviary_input(self, Dynamic.Vehicle.LIFT, shape=nn, units='N')
add_aviary_input(self, Dynamic.Vehicle.Propulsion.THRUST_TOTAL, shape=nn, units='N')
add_aviary_input(self, Dynamic.Vehicle.DRAG, shape=nn, units='N')

add_aviary_input(self, Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(nn), units='rad')
add_aviary_input(self, Dynamic.Vehicle.ANGLE_OF_ATTACK, shape=nn, units='rad')

add_aviary_input(self, Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.zeros(nn), units='rad')
add_aviary_input(self, Dynamic.Mission.FLIGHT_PATH_ANGLE, shape=nn, units='rad')

self.add_output(
'forces_horizontal',
Expand Down Expand Up @@ -765,14 +764,14 @@ def setup(self):

nn = options['num_nodes']

add_aviary_input(self, Dynamic.Vehicle.MASS, val=np.ones(nn), units='kg')
add_aviary_input(self, Dynamic.Vehicle.LIFT, val=np.ones(nn), units='N')
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')
add_aviary_input(self, Dynamic.Vehicle.MASS, shape=nn, units='kg')
add_aviary_input(self, Dynamic.Vehicle.LIFT, shape=nn, units='N')
add_aviary_input(self, Dynamic.Vehicle.Propulsion.THRUST_TOTAL, shape=nn, units='N')
add_aviary_input(self, Dynamic.Vehicle.DRAG, shape=nn, units='N')

add_aviary_input(self, Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(nn), units='rad')
add_aviary_input(self, Dynamic.Vehicle.ANGLE_OF_ATTACK, shape=nn, units='rad')

add_aviary_input(self, Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.zeros(nn), units='rad')
add_aviary_input(self, Dynamic.Mission.FLIGHT_PATH_ANGLE, shape=nn, units='rad')

self.add_output(
'climb_gradient_forces_horizontal',
Expand Down
11 changes: 6 additions & 5 deletions aviary/mission/energy_state/ode/test/test_landing_ode.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
import unittest

import numpy as np
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 (
detailed_landing_flare,
inputs,
landing_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_data.test_data.advanced_single_aisle_data import (
detailed_landing_flare,
inputs,
landing_subsystem_options,
)
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
Expand Down
4 changes: 3 additions & 1 deletion aviary/mission/energy_state/ode/test/test_takeoff_eom.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@
TakeoffEOM,
VelocityRate,
)
from aviary.utils.test_utils.variable_test import assert_match_varnames
from aviary.validation_cases.validation_data.test_data.advanced_single_aisle_data import (
detailed_takeoff_climbing,
detailed_takeoff_ground,
inputs,
)
from aviary.utils.test_utils.variable_test import assert_match_varnames
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 @@ -134,6 +134,7 @@ def test_StallSpeed(self):
tol = 1e-6
prob = om.Problem()
prob.model.add_subsystem('stall_speed', StallSpeed(num_nodes=2), promotes=['*'])
prob.model.set_input_defaults(Dynamic.Vehicle.MASS, np.ones(2), units='kg')
prob.model.set_input_defaults(Dynamic.Atmosphere.DENSITY, np.array([1, 2]), units='kg/m**3')
prob.model.set_input_defaults('area', 10, units='m**2')
prob.model.set_input_defaults('lift_coefficient_max', 5000, units='unitless')
Expand Down Expand Up @@ -200,6 +201,7 @@ def test_Accelerations(self):
prob.model.set_input_defaults('forces_vertical', [50.0, 100.0], units='N')

prob.setup(check=False, force_alloc_complex=True)
prob.set_val(Dynamic.Vehicle.MASS, np.ones(2))
prob.run_model()

assert_near_equal(prob['acceleration_horizontal'], np.array([100.0, 200.0]), tol)
Expand Down
11 changes: 5 additions & 6 deletions aviary/mission/energy_state/phases/simplified_landing.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,22 @@ class LandingCalc(om.ExplicitComponent):
"""Calculate the distance covered over the ground and approach velocity during landing."""

def setup(self):
add_aviary_input(self, Mission.FINAL_MASS, val=150_000)
add_aviary_input(self, Mission.FINAL_MASS)

add_aviary_input(
self,
Dynamic.Atmosphere.DENSITY,
val=1.225,
units='kg/m**3',
desc='atmospheric density',
)

add_aviary_input(self, Aircraft.Wing.AREA, val=700)
add_aviary_input(self, Aircraft.Wing.AREA)

add_aviary_input(self, Mission.Landing.LIFT_COEFFICIENT_MAX, val=3)
add_aviary_input(self, Mission.Landing.LIFT_COEFFICIENT_MAX)

add_aviary_output(self, Mission.Landing.GROUND_DISTANCE, val=0)
add_aviary_output(self, Mission.Landing.GROUND_DISTANCE)

add_aviary_output(self, Mission.Landing.INITIAL_VELOCITY, val=0)
add_aviary_output(self, Mission.Landing.INITIAL_VELOCITY)

self.declare_partials(
Mission.Landing.INITIAL_VELOCITY,
Expand Down
27 changes: 10 additions & 17 deletions aviary/mission/energy_state/phases/simplified_takeoff.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,7 @@ def setup(self):
add_aviary_input(
self,
Dynamic.Atmosphere.DENSITY,
val=1.225,
units='kg/m**3',
desc='atmospheric density',
)

self.add_input('planform_area', val=7, units='m**2', desc='area of the wings')
Expand Down Expand Up @@ -104,26 +102,24 @@ def setup(self):
desc='mass of the aircraft',
)

add_aviary_input(self, Mission.Takeoff.FUEL_MASS, val=10.0e3)
add_aviary_input(self, Mission.Takeoff.FUEL_MASS)

add_aviary_input(
self,
Dynamic.Atmosphere.DENSITY,
val=1.225,
units='kg/m**3',
desc='atmospheric density',
)

add_aviary_input(self, Aircraft.Wing.AREA, val=7)
add_aviary_input(self, Mission.Takeoff.LIFT_COEFFICIENT_MAX, val=2)
add_aviary_input(self, Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, val=100_000)
add_aviary_input(self, Mission.Takeoff.LIFT_OVER_DRAG, val=2)
add_aviary_input(self, Mission.Takeoff.CLIMBOUT_THRUST_FRACTION, val=1)
add_aviary_input(self, Aircraft.Wing.AREA)
add_aviary_input(self, Mission.Takeoff.LIFT_COEFFICIENT_MAX)
add_aviary_input(self, Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST)
add_aviary_input(self, Mission.Takeoff.LIFT_OVER_DRAG)
add_aviary_input(self, Mission.Takeoff.CLIMBOUT_THRUST_FRACTION)

add_aviary_output(self, Mission.Takeoff.GROUND_DISTANCE, val=0)
add_aviary_output(self, Mission.Takeoff.FINAL_VELOCITY, val=0, units='m/s')
add_aviary_output(self, Mission.Takeoff.FINAL_MASS, val=0)
add_aviary_output(self, Mission.Takeoff.FINAL_ALTITUDE, val=0)
add_aviary_output(self, Mission.Takeoff.GROUND_DISTANCE)
add_aviary_output(self, Mission.Takeoff.FINAL_VELOCITY, units='m/s')
add_aviary_output(self, Mission.Takeoff.FINAL_MASS)
add_aviary_output(self, Mission.Takeoff.FINAL_ALTITUDE)

def setup_partials(self):
self.declare_partials(
Expand Down Expand Up @@ -215,9 +211,6 @@ def compute_partials(self, inputs, J):
rad_Rot = ramp_weight / (S * Cl_max * rho_ratio)
den_Cout = 1.0 + climbout_thrust / ramp_weight - 0.90 / L_over_D

S * Cl_max * (thrust / ramp_weight - (0.20 + 0.00550 * ramp_weight / S) / L_over_D)
S * Cl_max * (-thrust / ramp_weight**2 - (0.00550 / S) / L_over_D)

dRD_dM = (
17 / den_RD
- 17
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
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
from aviary.variable_info.variables import Aircraft, Dynamic, Mission


@use_tempdirs
Expand All @@ -24,6 +24,10 @@ def test_case1(self):
prob = om.Problem()
prob.model = landing
prob.setup(force_alloc_complex=True)
prob.set_val(
Mission.FINAL_MASS,
val=150_000,
)
prob.run_model()
partial_data = prob.check_partials(
out_stream=None, method='cs', compact_print=False, excludes=['*atmosphere*']
Expand Down
Loading
Loading