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
6 changes: 3 additions & 3 deletions aviary/core/aviary_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -916,12 +916,12 @@ def add_post_mission_systems(self, verbosity=None):
),
)
self.connect(
f'traj.{phase_name}.timeseries.distance',
f'traj.{phase_name}.timeseries.ground_distance',
f'{phase_name}_distance_constraint.final_distance',
src_indices=[-1],
)
self.connect(
f'traj.{phase_name}.timeseries.distance',
f'traj.{phase_name}.timeseries.ground_distance',
f'{phase_name}_distance_constraint.initial_distance',
src_indices=[0],
)
Expand Down Expand Up @@ -1062,7 +1062,7 @@ def link_phases(self, verbosity=None, comm=None):
src_indices=[-1],
)
self.connect(
f'traj.{final_phase}.timeseries.distance',
f'traj.{final_phase}.timeseries.ground_distance',
'state_output.range_in',
src_indices=[-1],
)
Expand Down
12 changes: 7 additions & 5 deletions aviary/docs/getting_started/onboarding_level3.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,9 @@
"###############\n",
"phases = ['climb', 'cruise', 'descent']\n",
"traj.link_phases(\n",
" phases, ['time', av.Dynamic.Vehicle.MASS, av.Dynamic.Mission.DISTANCE], connected=strong_couple\n",
" phases,\n",
" ['time', av.Dynamic.Vehicle.MASS, av.Dynamic.Mission.GROUND_DISTANCE],\n",
" connected=strong_couple,\n",
")\n",
"\n",
"# loop through phases and get all subsystem parameters\n",
Expand Down Expand Up @@ -559,7 +561,7 @@
")\n",
"prob.set_val(\n",
" 'traj.climb.states:distance',\n",
" climb.interp(av.Dynamic.Mission.DISTANCE, ys=[range_i_climb, range_f_climb]),\n",
" climb.interp(av.Dynamic.Mission.GROUND_DISTANCE, ys=[range_i_climb, range_f_climb]),\n",
" units='m',\n",
")\n",
"\n",
Expand All @@ -583,7 +585,7 @@
")\n",
"prob.set_val(\n",
" 'traj.cruise.states:distance',\n",
" cruise.interp(av.Dynamic.Mission.DISTANCE, ys=[range_i_cruise, range_f_cruise]),\n",
" cruise.interp(av.Dynamic.Mission.GROUND_DISTANCE, ys=[range_i_cruise, range_f_cruise]),\n",
" units='m',\n",
")\n",
"\n",
Expand All @@ -607,7 +609,7 @@
")\n",
"prob.set_val(\n",
" 'traj.descent.states:distance',\n",
" descent.interp(av.Dynamic.Mission.DISTANCE, ys=[distance_i_descent, distance_f_descent]),\n",
" descent.interp(av.Dynamic.Mission.GROUND_DISTANCE, ys=[distance_i_descent, distance_f_descent]),\n",
" units='m',\n",
")\n",
"\n",
Expand All @@ -626,7 +628,7 @@
"times_climb = prob.get_val('traj.climb.timeseries.time', units='s')\n",
"altitudes_climb = prob.get_val('traj.climb.timeseries.altitude', units='m')\n",
"masses_climb = prob.get_val('traj.climb.timeseries.mass', units='kg')\n",
"ranges_climb = prob.get_val('traj.climb.timeseries.distance', units='m')\n",
"ranges_climb = prob.get_val('traj.climb.timeseries.ground_distance', units='m')\n",
"velocities_climb = prob.get_val('traj.climb.timeseries.velocity', units='m/s')\n",
"thrusts_climb = prob.get_val('traj.climb.timeseries.thrust_net_total', units='N')\n",
"times_cruise = prob.get_val('traj.cruise.timeseries.time', units='s')\n",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,7 @@
"distance_max, units = takeoff_liftoff_user_options.get_item('distance_max')\n",
"liftoff = takeoff_trajectory_builder.get_phase('takeoff_liftoff')\n",
"\n",
"liftoff.add_objective(Dynamic.Mission.DISTANCE, loc='final', ref=distance_max, units=units)\n",
"liftoff.add_objective(Dynamic.Mission.GROUND_DISTANCE, loc='final', ref=distance_max, units=units)\n",
"\n",
"# Insert a constraint for a fake decision speed, until abort is added.\n",
"takeoff.model.add_constraint(\n",
Expand Down Expand Up @@ -756,7 +756,7 @@
"distance_max, units = landing_fullstop_user_options.get_item('distance_max')\n",
"fullstop = landing_trajectory_builder.get_phase('landing_fullstop')\n",
"\n",
"fullstop.add_objective(Dynamic.Mission.DISTANCE, loc='final', ref=distance_max, units=units)\n",
"fullstop.add_objective(Dynamic.Mission.GROUND_DISTANCE, loc='final', ref=distance_max, units=units)\n",
"\n",
"varnames = [\n",
" av.Aircraft.Wing.AREA,\n",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -483,7 +483,7 @@
")\n",
"prob.set_val(\n",
" 'traj.climb.states:distance',\n",
" climb.interp(av.Dynamic.Mission.DISTANCE, ys=[distance_i_climb, distance_f_climb]),\n",
" climb.interp(av.Dynamic.Mission.GROUND_DISTANCE, ys=[distance_i_climb, distance_f_climb]),\n",
" units='m',\n",
")\n",
"\n",
Expand All @@ -507,7 +507,7 @@
")\n",
"prob.set_val(\n",
" 'traj.cruise.states:distance',\n",
" cruise.interp(av.Dynamic.Mission.DISTANCE, ys=[distance_i_cruise, distance_f_cruise]),\n",
" cruise.interp(av.Dynamic.Mission.GROUND_DISTANCE, ys=[distance_i_cruise, distance_f_cruise]),\n",
" units='m',\n",
")\n",
"\n",
Expand All @@ -531,7 +531,7 @@
")\n",
"prob.set_val(\n",
" 'traj.descent.states:distance',\n",
" descent.interp(av.Dynamic.Mission.DISTANCE, ys=[distance_i_descent, distance_f_descent]),\n",
" descent.interp(av.Dynamic.Mission.GROUND_DISTANCE, ys=[distance_i_descent, distance_f_descent]),\n",
" units='m',\n",
")\n",
"\n",
Expand Down
2 changes: 1 addition & 1 deletion aviary/examples/run_level2_with_detailed_landing.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@
f'traj.{phase_name}.timeseries.altitude', units='ft'
)[-1][0]
output_data[point_name]['distance'] = case.get_val(
f'traj.{phase_name}.timeseries.distance', units='ft'
f'traj.{phase_name}.timeseries.ground_distance', units='ft'
)[-1][0]

print(output_data)
2 changes: 1 addition & 1 deletion aviary/examples/run_level2_with_detailed_takeoff.py
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,7 @@
f'traj.{phase_name}.timeseries.altitude', units='ft'
)[-1][0]
output_data[point_name]['distance'] = case.get_val(
f'traj.{phase_name}.timeseries.distance', units='ft'
f'traj.{phase_name}.timeseries.ground_distance', units='ft'
)[-1][0]

print(output_data)
8 changes: 4 additions & 4 deletions aviary/examples/run_level3_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ def initialize(self):
)

prob.traj._phases['climb'].set_state_options(
Dynamic.Mission.DISTANCE, fix_initial=True, input_initial=False
Dynamic.Mission.GROUND_DISTANCE, fix_initial=True, input_initial=False
)

prob.traj._phases['climb'].set_time_options(
Expand Down Expand Up @@ -335,10 +335,10 @@ def initialize(self):
phases = list(prob.model.phase_info.keys())
prob.traj.link_phases(phases, ['time'], ref=None, connected=True)
prob.traj.link_phases(phases, [Dynamic.Vehicle.MASS], ref=None, connected=True)
prob.traj.link_phases(phases, [Dynamic.Mission.DISTANCE], ref=None, connected=True)
prob.traj.link_phases(phases, [Dynamic.Mission.GROUND_DISTANCE], ref=None, connected=True)

prob.model.connect(
f'traj.descent.timeseries.distance',
f'traj.descent.timeseries.ground_distance',
Mission.Summary.RANGE,
src_indices=[-1],
flat_src_indices=True,
Expand Down Expand Up @@ -457,7 +457,7 @@ def initialize(self):

# set initial guesses manually
control_keys = ['mach', 'altitude']
state_keys = ['mass', Dynamic.Mission.DISTANCE]
state_keys = ['mass', Dynamic.Mission.GROUND_DISTANCE]
guesses = {}
guesses['mach_climb'] = ([0.2, 0.72], 'unitless')
guesses['altitude_climb'] = ([0, 32000.0], 'ft')
Expand Down
4 changes: 3 additions & 1 deletion aviary/mission/flight_phase_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,9 @@ def build_phase(
self.add_state('mass', Dynamic.Vehicle.MASS, rate_source)

if phase_type is EquationsOfMotion.HEIGHT_ENERGY:
self.add_state('distance', Dynamic.Mission.DISTANCE, Dynamic.Mission.DISTANCE_RATE)
self.add_state(
'distance', Dynamic.Mission.GROUND_DISTANCE, Dynamic.Mission.GROUND_DISTANCE_RATE
)

phase = add_subsystem_variables_to_phase(phase, self.name, self.external_subsystems)

Expand Down
2 changes: 1 addition & 1 deletion aviary/mission/flops_based/ode/energy_ODE.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ def setup(self):
promotes_outputs=[
Dynamic.Mission.SPECIFIC_ENERGY_RATE_EXCESS,
Dynamic.Mission.ALTITUDE_RATE_MAX,
Dynamic.Mission.DISTANCE_RATE,
Dynamic.Mission.GROUND_DISTANCE_RATE,
'thrust_required',
],
)
Expand Down
6 changes: 3 additions & 3 deletions aviary/mission/flops_based/ode/landing_eom.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ def setup(self):
kwargs = {'num_nodes': nn, 'climbing': True}

inputs = [Dynamic.Mission.FLIGHT_PATH_ANGLE, Dynamic.Mission.VELOCITY]
outputs = [Dynamic.Mission.DISTANCE_RATE, Dynamic.Mission.ALTITUDE_RATE]
outputs = [Dynamic.Mission.GROUND_DISTANCE_RATE, Dynamic.Mission.ALTITUDE_RATE]

self.add_subsystem(
'distance_rates',
Expand Down Expand Up @@ -77,7 +77,7 @@ def setup(self):
inputs = [
'acceleration_horizontal',
'acceleration_vertical',
Dynamic.Mission.DISTANCE_RATE,
Dynamic.Mission.GROUND_DISTANCE_RATE,
Dynamic.Mission.ALTITUDE_RATE,
]

Expand All @@ -93,7 +93,7 @@ def setup(self):
)

inputs = [
Dynamic.Mission.DISTANCE_RATE,
Dynamic.Mission.GROUND_DISTANCE_RATE,
Dynamic.Mission.ALTITUDE_RATE,
'acceleration_horizontal',
'acceleration_vertical',
Expand Down
2 changes: 1 addition & 1 deletion aviary/mission/flops_based/ode/landing_ode.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ def setup(self):
Mission.Landing.FLARE_RATE,
],
promotes_outputs=[
Dynamic.Mission.DISTANCE_RATE,
Dynamic.Mission.GROUND_DISTANCE_RATE,
Dynamic.Mission.ALTITUDE_RATE,
Dynamic.Mission.VELOCITY_RATE,
Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE,
Expand Down
2 changes: 1 addition & 1 deletion aviary/mission/flops_based/ode/mission_EOM.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ def setup(self):
Dynamic.Mission.ALTITUDE_RATE,
Dynamic.Mission.VELOCITY,
],
promotes_outputs=[Dynamic.Mission.DISTANCE_RATE],
promotes_outputs=[Dynamic.Mission.GROUND_DISTANCE_RATE],
)

self.add_subsystem(
Expand Down
10 changes: 5 additions & 5 deletions aviary/mission/flops_based/ode/range_rate.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ def setup(self):
units='m/s',
)
self.add_output(
Dynamic.Mission.DISTANCE_RATE,
Dynamic.Mission.GROUND_DISTANCE_RATE,
val=np.ones(nn),
desc='current horizontal velocity (assumed no wind)',
units='m/s',
Expand All @@ -42,12 +42,12 @@ def compute(self, inputs, outputs):
velocity_2 = velocity**2
if (climb_rate_2 >= velocity_2).any():
raise om.AnalysisError('WARNING: climb rate exceeds velocity (range_rate.py)')
outputs[Dynamic.Mission.DISTANCE_RATE] = (velocity_2 - climb_rate_2) ** 0.5
outputs[Dynamic.Mission.GROUND_DISTANCE_RATE] = (velocity_2 - climb_rate_2) ** 0.5

def setup_partials(self):
arange = np.arange(self.options['num_nodes'])
self.declare_partials(
Dynamic.Mission.DISTANCE_RATE,
Dynamic.Mission.GROUND_DISTANCE_RATE,
[Dynamic.Mission.ALTITUDE_RATE, Dynamic.Mission.VELOCITY],
rows=arange,
cols=arange,
Expand All @@ -57,9 +57,9 @@ def compute_partials(self, inputs, J):
climb_rate = inputs[Dynamic.Mission.ALTITUDE_RATE]
velocity = inputs[Dynamic.Mission.VELOCITY]

J[Dynamic.Mission.DISTANCE_RATE, Dynamic.Mission.ALTITUDE_RATE] = (
J[Dynamic.Mission.GROUND_DISTANCE_RATE, Dynamic.Mission.ALTITUDE_RATE] = (
-climb_rate / (velocity**2 - climb_rate**2) ** 0.5
)
J[Dynamic.Mission.DISTANCE_RATE, Dynamic.Mission.VELOCITY] = (
J[Dynamic.Mission.GROUND_DISTANCE_RATE, Dynamic.Mission.VELOCITY] = (
velocity / (velocity**2 - climb_rate**2) ** 0.5
)
32 changes: 17 additions & 15 deletions aviary/mission/flops_based/ode/takeoff_eom.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ def setup(self):
kwargs = {'num_nodes': nn, 'climbing': climbing}

inputs = [Dynamic.Mission.FLIGHT_PATH_ANGLE, Dynamic.Mission.VELOCITY]
outputs = [Dynamic.Mission.DISTANCE_RATE, Dynamic.Mission.ALTITUDE_RATE]
outputs = [Dynamic.Mission.GROUND_DISTANCE_RATE, Dynamic.Mission.ALTITUDE_RATE]

self.add_subsystem(
'distance_rates',
Expand Down Expand Up @@ -210,7 +210,7 @@ def setup(self):
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_output(self, Dynamic.Mission.DISTANCE_RATE, val=np.zeros(nn), units='m/s')
add_aviary_output(self, Dynamic.Mission.GROUND_DISTANCE_RATE, val=np.zeros(nn), units='m/s')
add_aviary_output(self, Dynamic.Mission.ALTITUDE_RATE, val=np.zeros(nn), units='m/s')

def setup_partials(self):
Expand All @@ -225,13 +225,13 @@ def setup_partials(self):

else:
self.declare_partials(
Dynamic.Mission.DISTANCE_RATE,
Dynamic.Mission.GROUND_DISTANCE_RATE,
Dynamic.Mission.FLIGHT_PATH_ANGLE,
dependent=False,
)

self.declare_partials(
Dynamic.Mission.DISTANCE_RATE,
Dynamic.Mission.GROUND_DISTANCE_RATE,
Dynamic.Mission.VELOCITY,
val=np.identity(nn),
)
Expand All @@ -255,7 +255,7 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None):
else:
range_rate = velocity

outputs[Dynamic.Mission.DISTANCE_RATE] = range_rate
outputs[Dynamic.Mission.GROUND_DISTANCE_RATE] = range_rate

def compute_partials(self, inputs, J, discrete_inputs=None):
if self.options['climbing']:
Expand All @@ -265,8 +265,10 @@ def compute_partials(self, inputs, J, discrete_inputs=None):
cgam = np.cos(flight_path_angle)
sgam = np.sin(flight_path_angle)

J[Dynamic.Mission.DISTANCE_RATE, Dynamic.Mission.FLIGHT_PATH_ANGLE] = -sgam * velocity
J[Dynamic.Mission.DISTANCE_RATE, Dynamic.Mission.VELOCITY] = cgam
J[Dynamic.Mission.GROUND_DISTANCE_RATE, Dynamic.Mission.FLIGHT_PATH_ANGLE] = (
-sgam * velocity
)
J[Dynamic.Mission.GROUND_DISTANCE_RATE, Dynamic.Mission.VELOCITY] = cgam

J[Dynamic.Mission.ALTITUDE_RATE, Dynamic.Mission.FLIGHT_PATH_ANGLE] = cgam * velocity
J[Dynamic.Mission.ALTITUDE_RATE, Dynamic.Mission.VELOCITY] = sgam
Expand Down Expand Up @@ -395,7 +397,7 @@ 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.GROUND_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_output(self, Dynamic.Mission.VELOCITY_RATE, val=np.ones(nn), units='m/s**2')
Expand All @@ -407,7 +409,7 @@ def setup(self):
def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None):
a_h = inputs['acceleration_horizontal']
a_v = inputs['acceleration_vertical']
v_h = inputs[Dynamic.Mission.DISTANCE_RATE]
v_h = inputs[Dynamic.Mission.GROUND_DISTANCE_RATE]
v_v = inputs[Dynamic.Mission.ALTITUDE_RATE]

v_mag = np.sqrt(v_h**2 + v_v**2)
Expand All @@ -416,7 +418,7 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None):
def compute_partials(self, inputs, J, discrete_inputs=None):
a_h = inputs['acceleration_horizontal']
a_v = inputs['acceleration_vertical']
v_h = inputs[Dynamic.Mission.DISTANCE_RATE]
v_h = inputs[Dynamic.Mission.GROUND_DISTANCE_RATE]
v_v = inputs[Dynamic.Mission.ALTITUDE_RATE]

num = a_h * v_h + a_v * v_v
Expand All @@ -426,7 +428,7 @@ def compute_partials(self, inputs, J, discrete_inputs=None):
J[Dynamic.Mission.VELOCITY_RATE, 'acceleration_horizontal'] = v_h / den
J[Dynamic.Mission.VELOCITY_RATE, 'acceleration_vertical'] = v_v / den

J[Dynamic.Mission.VELOCITY_RATE, Dynamic.Mission.DISTANCE_RATE] = (
J[Dynamic.Mission.VELOCITY_RATE, Dynamic.Mission.GROUND_DISTANCE_RATE] = (
a_h / den - 0.5 * num / fact ** (3 / 2) * 2.0 * v_h
)

Expand All @@ -446,7 +448,7 @@ 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.GROUND_DISTANCE_RATE, val=np.zeros(nn), units='m/s')
add_aviary_input(self, Dynamic.Mission.ALTITUDE_RATE, val=np.zeros(nn), units='m/s')

self.add_input(
Expand Down Expand Up @@ -475,7 +477,7 @@ def setup(self):
self.declare_partials('*', '*', rows=rows_cols, cols=rows_cols)

def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None):
v_h = inputs[Dynamic.Mission.DISTANCE_RATE]
v_h = inputs[Dynamic.Mission.GROUND_DISTANCE_RATE]
v_v = inputs[Dynamic.Mission.ALTITUDE_RATE]
a_h = inputs['acceleration_horizontal']
a_v = inputs['acceleration_vertical']
Expand All @@ -485,7 +487,7 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None):
outputs[Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE] = x

def compute_partials(self, inputs, J, discrete_inputs=None):
v_h = inputs[Dynamic.Mission.DISTANCE_RATE]
v_h = inputs[Dynamic.Mission.GROUND_DISTANCE_RATE]
v_v = inputs[Dynamic.Mission.ALTITUDE_RATE]
a_h = inputs['acceleration_horizontal']
a_v = inputs['acceleration_vertical']
Expand All @@ -501,7 +503,7 @@ def compute_partials(self, inputs, J, discrete_inputs=None):

df_dav = v_h / den

J[Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE, Dynamic.Mission.DISTANCE_RATE] = df_dvh
J[Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE, Dynamic.Mission.GROUND_DISTANCE_RATE] = df_dvh
J[Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE, Dynamic.Mission.ALTITUDE_RATE] = df_dvv
J[Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE, 'acceleration_horizontal'] = df_dah
J[Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE, 'acceleration_vertical'] = df_dav
Expand Down
Loading
Loading