Skip to content

Update inconsistent naming for angle of attack #647

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 17 commits into from
Feb 7, 2025
Merged
Changes from 1 commit
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
Next Next commit
This commit modifies the angle of attack name through Aviary to use t…
…he variable now stored in the variable meta data.
nathanperreau committed Jan 17, 2025
commit 48c74536cd0e2f67bf69593ae40d9804fe3208d4
26 changes: 13 additions & 13 deletions aviary/mission/flops_based/ode/landing_eom.py
Original file line number Diff line number Diff line change
@@ -57,7 +57,7 @@ def setup(self):
Dynamic.Vehicle.LIFT,
Dynamic.Vehicle.Propulsion.THRUST_TOTAL,
Dynamic.Vehicle.DRAG,
'angle_of_attack',
Dynamic.Vehicle.ANGLE_OF_ATTACK,
Dynamic.Mission.FLIGHT_PATH_ANGLE,
]

@@ -113,7 +113,7 @@ def setup(self):
Dynamic.Vehicle.MASS,
Dynamic.Vehicle.LIFT,
Dynamic.Vehicle.DRAG,
'angle_of_attack',
Dynamic.Vehicle.ANGLE_OF_ATTACK,
Dynamic.Mission.FLIGHT_PATH_ANGLE,
]

@@ -165,7 +165,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('angle_of_attack', val=np.zeros(nn), units='rad')
self.add_input(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'
@@ -204,7 +204,7 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None):

weight = mass * grav_metric

alpha = inputs['angle_of_attack']
alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK]
gamma = inputs[Dynamic.Mission.FLIGHT_PATH_ANGLE]

# FLOPS measures glideslope below horizontal
@@ -242,7 +242,7 @@ def compute_partials(self, inputs, J, discrete_inputs=None):

weight = mass * grav_metric

alpha = inputs['angle_of_attack']
alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK]
gamma = inputs[Dynamic.Mission.FLIGHT_PATH_ANGLE]

# FLOPS measures glideslope below horizontal
@@ -284,8 +284,8 @@ def compute_partials(self, inputs, J, discrete_inputs=None):
f_h = t_angle * (drag - weight * s_gamma) / c_angle
f_v = -(weight * c_gamma - lift) / (s_angle * t_angle)

J[forces_key, 'angle_of_attack'] = f_h - f_v
J[thrust_key, 'angle_of_attack'] = (f_h + f_v) / (2.)
J[forces_key, Dynamic.Vehicle.ANGLE_OF_ATTACK] = f_h - f_v
J[thrust_key, Dynamic.Vehicle.ANGLE_OF_ATTACK] = (f_h + f_v) / (2.)

f_h = -weight * c_gamma / c_angle
f_v = -weight * s_gamma / s_angle
@@ -320,7 +320,7 @@ def setup(self):
val=np.ones(nn), units='N')
add_aviary_input(self, Dynamic.Vehicle.DRAG, val=np.ones(nn), units='N')

self.add_input('angle_of_attack', val=np.zeros(nn), units='rad')
self.add_input(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'
@@ -351,7 +351,7 @@ def setup_partials(self):
Dynamic.Vehicle.LIFT,
Dynamic.Vehicle.Propulsion.THRUST_TOTAL,
Dynamic.Vehicle.DRAG,
'angle_of_attack',
Dynamic.Vehicle.ANGLE_OF_ATTACK,
Dynamic.Mission.FLIGHT_PATH_ANGLE,
]

@@ -370,7 +370,7 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None):
thrust = inputs[Dynamic.Vehicle.Propulsion.THRUST_TOTAL]
drag = inputs[Dynamic.Vehicle.DRAG]

alpha = inputs['angle_of_attack']
alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK]
gamma = inputs[Dynamic.Mission.FLIGHT_PATH_ANGLE]

# FLOPS measures glideslope below horizontal
@@ -408,7 +408,7 @@ def compute_partials(self, inputs, J, discrete_inputs=None):
thrust = inputs[Dynamic.Vehicle.Propulsion.THRUST_TOTAL]
drag = inputs[Dynamic.Vehicle.DRAG]

alpha = inputs['angle_of_attack']
alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK]
gamma = inputs[Dynamic.Mission.FLIGHT_PATH_ANGLE]

# FLOPS measures glideslope below horizontal
@@ -434,8 +434,8 @@ def compute_partials(self, inputs, J, discrete_inputs=None):
J[f_h_key, Dynamic.Vehicle.DRAG] = c_gamma
J[f_v_key, Dynamic.Vehicle.DRAG] = s_gamma

J[f_h_key, 'angle_of_attack'] = thrust * s_angle
J[f_v_key, 'angle_of_attack'] = thrust * c_angle
J[f_h_key, Dynamic.Vehicle.ANGLE_OF_ATTACK] = thrust * s_angle
J[f_v_key, Dynamic.Vehicle.ANGLE_OF_ATTACK] = thrust * c_angle

f_h = -drag * s_gamma - lift * c_gamma - thrust * s_angle
J[f_h_key, Dynamic.Mission.FLIGHT_PATH_ANGLE] = -f_h
2 changes: 1 addition & 1 deletion aviary/mission/flops_based/ode/landing_ode.py
Original file line number Diff line number Diff line change
@@ -174,7 +174,7 @@ def setup(self):
Dynamic.Vehicle.LIFT,
Dynamic.Vehicle.Propulsion.THRUST_TOTAL,
Dynamic.Vehicle.DRAG,
'angle_of_attack',
Dynamic.Vehicle.ANGLE_OF_ATTACK,
'angle_of_attack_rate',
Mission.Landing.FLARE_RATE,
],
26 changes: 13 additions & 13 deletions aviary/mission/flops_based/ode/takeoff_eom.py
Original file line number Diff line number Diff line change
@@ -547,7 +547,7 @@ def setup(self):
val=np.ones(nn), units='N')
add_aviary_input(self, Dynamic.Vehicle.DRAG, val=np.ones(nn), units='N')

self.add_input('angle_of_attack', val=np.zeros(nn), units='rad')
self.add_input(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'
@@ -586,7 +586,7 @@ def setup_partials(self):
Dynamic.Vehicle.Propulsion.THRUST_TOTAL,
Dynamic.Vehicle.LIFT,
Dynamic.Vehicle.DRAG,
'angle_of_attack',
Dynamic.Vehicle.ANGLE_OF_ATTACK,
Dynamic.Mission.FLIGHT_PATH_ANGLE,
]

@@ -635,7 +635,7 @@ def setup_partials(self):

self.declare_partials(
'forces_horizontal',
['angle_of_attack', Dynamic.Mission.FLIGHT_PATH_ANGLE],
[Dynamic.Vehicle.ANGLE_OF_ATTACK, Dynamic.Mission.FLIGHT_PATH_ANGLE],
dependent=False,
)

@@ -664,7 +664,7 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None):
alpha0 = \
aviary_options.get_val(Mission.Takeoff.ANGLE_OF_ATTACK_RUNWAY, 'rad')

alpha = inputs['angle_of_attack']
alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK]
gamma = inputs[Dynamic.Mission.FLIGHT_PATH_ANGLE]

angle = alpha - alpha0 + t_inc + gamma
@@ -713,7 +713,7 @@ def compute_partials(self, inputs, J, discrete_inputs=None):
thrust = inputs[Dynamic.Vehicle.Propulsion.THRUST_TOTAL]
drag = inputs[Dynamic.Vehicle.DRAG]

alpha = inputs['angle_of_attack']
alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK]
gamma = inputs[Dynamic.Mission.FLIGHT_PATH_ANGLE]

angle = alpha - alpha0 + t_inc + gamma
@@ -733,8 +733,8 @@ def compute_partials(self, inputs, J, discrete_inputs=None):
J['forces_horizontal', Dynamic.Vehicle.DRAG] = -c_gamma
J['forces_vertical', Dynamic.Vehicle.DRAG] = -s_gamma

J['forces_horizontal', 'angle_of_attack'] = -thrust * s_angle
J['forces_vertical', 'angle_of_attack'] = thrust * c_angle
J['forces_horizontal', Dynamic.Vehicle.ANGLE_OF_ATTACK] = -thrust * s_angle
J['forces_vertical', Dynamic.Vehicle.ANGLE_OF_ATTACK] = thrust * c_angle

J['forces_horizontal', Dynamic.Mission.FLIGHT_PATH_ANGLE] = (
-thrust * s_angle + drag * s_gamma - lift * c_gamma
@@ -772,7 +772,7 @@ def setup(self):
)
add_aviary_input(self, Dynamic.Vehicle.DRAG, val=np.ones(nn), units='N')

self.add_input('angle_of_attack', val=np.zeros(nn), units='rad')
self.add_input(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'
@@ -800,7 +800,7 @@ def setup_partials(self):
[
Dynamic.Vehicle.MASS,
Dynamic.Vehicle.Propulsion.THRUST_TOTAL,
'angle_of_attack',
Dynamic.Vehicle.ANGLE_OF_ATTACK,
Dynamic.Mission.FLIGHT_PATH_ANGLE,
],
rows=rows_cols,
@@ -846,7 +846,7 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None):

weight = mass * grav_metric

alpha = inputs['angle_of_attack']
alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK]
gamma = inputs[Dynamic.Mission.FLIGHT_PATH_ANGLE]

angle = alpha - alpha0 + t_inc
@@ -880,7 +880,7 @@ def compute_partials(self, inputs, J, discrete_inputs=None):

weight = mass * grav_metric

alpha = inputs['angle_of_attack']
alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK]
gamma = inputs[Dynamic.Mission.FLIGHT_PATH_ANGLE]

angle = alpha - alpha0 + t_inc
@@ -900,8 +900,8 @@ def compute_partials(self, inputs, J, discrete_inputs=None):
J[f_h_key, Dynamic.Vehicle.Propulsion.THRUST_TOTAL] = c_angle
J[f_v_key, Dynamic.Vehicle.Propulsion.THRUST_TOTAL] = s_angle

J[f_h_key, 'angle_of_attack'] = -thrust * s_angle
J[f_v_key, 'angle_of_attack'] = thrust * c_angle
J[f_h_key, Dynamic.Vehicle.ANGLE_OF_ATTACK] = -thrust * s_angle
J[f_v_key, Dynamic.Vehicle.ANGLE_OF_ATTACK] = thrust * c_angle

J[f_h_key, Dynamic.Mission.FLIGHT_PATH_ANGLE] = -weight * c_gamma
J[f_v_key, Dynamic.Mission.FLIGHT_PATH_ANGLE] = weight * s_gamma
2 changes: 1 addition & 1 deletion aviary/mission/flops_based/ode/takeoff_ode.py
Original file line number Diff line number Diff line change
@@ -180,7 +180,7 @@ def setup(self):
Dynamic.Vehicle.LIFT,
Dynamic.Vehicle.Propulsion.THRUST_TOTAL,
Dynamic.Vehicle.DRAG,
'angle_of_attack',
Dynamic.Vehicle.ANGLE_OF_ATTACK,
],
promotes_outputs=[
Dynamic.Mission.DISTANCE_RATE,
6 changes: 3 additions & 3 deletions aviary/mission/flops_based/ode/test/test_landing_eom.py
Original file line number Diff line number Diff line change
@@ -46,7 +46,7 @@ def test_case(self):
input_validation_data=detailed_landing_flare,
output_validation_data=detailed_landing_flare,
input_keys=[
'angle_of_attack',
Dynamic.Vehicle.ANGLE_OF_ATTACK,
Dynamic.Mission.FLIGHT_PATH_ANGLE,
Dynamic.Mission.VELOCITY,
Dynamic.Vehicle.MASS,
@@ -107,7 +107,7 @@ def test_GlideSlopeForces(self):
units="N",
)
prob.model.set_input_defaults(
"angle_of_attack", np.array([5.086, 6.834]), units="deg"
Dynamic.Vehicle.ANGLE_OF_ATTACK, np.array([5.086, 6.834]), units="deg"
)
prob.model.set_input_defaults(
Dynamic.Mission.FLIGHT_PATH_ANGLE, np.array([-3.0, -2.47]), units="deg"
@@ -153,7 +153,7 @@ def test_FlareSumForces(self):
Dynamic.Vehicle.Propulsion.THRUST_TOTAL, np.array([4980.3, 4102]), units="N"
)
prob.model.set_input_defaults(
"angle_of_attack", np.array([5.086, 6.834]), units="deg"
Dynamic.Vehicle.ANGLE_OF_ATTACK, np.array([5.086, 6.834]), units="deg"
)
prob.model.set_input_defaults(
Dynamic.Mission.FLIGHT_PATH_ANGLE, np.array([-3.0, -2.47]), units="deg"
2 changes: 1 addition & 1 deletion aviary/mission/flops_based/ode/test/test_landing_ode.py
Original file line number Diff line number Diff line change
@@ -54,7 +54,7 @@ def test_case(self):
input_validation_data=detailed_landing_flare,
output_validation_data=detailed_landing_flare,
input_keys=[
'angle_of_attack',
Dynamic.Vehicle.ANGLE_OF_ATTACK,
Dynamic.Mission.FLIGHT_PATH_ANGLE,
Dynamic.Mission.VELOCITY,
Dynamic.Vehicle.MASS,
6 changes: 3 additions & 3 deletions aviary/mission/flops_based/ode/test/test_takeoff_eom.py
Original file line number Diff line number Diff line change
@@ -29,7 +29,7 @@ def test_case_ground(self):
input_validation_data=detailed_takeoff_ground,
output_validation_data=detailed_takeoff_ground,
input_keys=[
'angle_of_attack',
Dynamic.Vehicle.ANGLE_OF_ATTACK,
Dynamic.Mission.FLIGHT_PATH_ANGLE,
Dynamic.Mission.VELOCITY,
Dynamic.Vehicle.MASS,
@@ -54,7 +54,7 @@ def test_case_climbing(self):
input_validation_data=detailed_takeoff_climbing,
output_validation_data=detailed_takeoff_climbing,
input_keys=[
'angle_of_attack',
Dynamic.Vehicle.ANGLE_OF_ATTACK,
Dynamic.Mission.FLIGHT_PATH_ANGLE,
Dynamic.Mission.VELOCITY,
Dynamic.Vehicle.MASS,
@@ -395,7 +395,7 @@ def test_ClimbGradientForces(self):
Dynamic.Mission.FLIGHT_PATH_ANGLE, np.array([0.612, 4.096]), units="rad"
)
prob.model.set_input_defaults(
"angle_of_attack", np.array([5.086, 6.834]), units="rad"
Dynamic.Vehicle.ANGLE_OF_ATTACK, np.array([5.086, 6.834]), units="rad"
)

prob.setup(check=False, force_alloc_complex=True)
4 changes: 2 additions & 2 deletions aviary/mission/flops_based/ode/test/test_takeoff_ode.py
Original file line number Diff line number Diff line change
@@ -30,7 +30,7 @@ def test_case_ground(self):
input_validation_data=detailed_takeoff_ground,
output_validation_data=detailed_takeoff_ground,
input_keys=[
'angle_of_attack',
Dynamic.Vehicle.ANGLE_OF_ATTACK,
Dynamic.Mission.FLIGHT_PATH_ANGLE,
Dynamic.Mission.ALTITUDE,
Dynamic.Mission.VELOCITY,
@@ -60,7 +60,7 @@ def test_case_climbing(self):
input_validation_data=detailed_takeoff_climbing,
output_validation_data=detailed_takeoff_climbing,
input_keys=[
'angle_of_attack',
Dynamic.Vehicle.ANGLE_OF_ATTACK,
Dynamic.Mission.FLIGHT_PATH_ANGLE,
Dynamic.Mission.ALTITUDE,
Dynamic.Mission.VELOCITY,
20 changes: 10 additions & 10 deletions aviary/mission/flops_based/phases/detailed_landing_phases.py
Original file line number Diff line number Diff line change
@@ -205,7 +205,7 @@ def build_phase(self, aviary_options: AviaryValues = None):
angle_of_attack_ref = user_options.get_val('angle_of_attack_ref', units)

phase.add_control(
'angle_of_attack', opt=True, units=units,
Dynamic.Vehicle.ANGLE_OF_ATTACK, opt=True, units=units,
upper=upper_angle_of_attack, lower=lower_angle_of_attack,
ref=angle_of_attack_ref
)
@@ -275,7 +275,7 @@ def _extra_ode_init_kwargs(self):
LandingApproachToMicP3._add_meta_data('initial_height', val=1., units='ft')

LandingApproachToMicP3._add_initial_guess_meta_data(
InitialGuessControl('angle_of_attack'))
InitialGuessControl(Dynamic.Vehicle.ANGLE_OF_ATTACK))

LandingApproachToMicP3._add_initial_guess_meta_data(InitialGuessState('altitude'))

@@ -530,7 +530,7 @@ def build_phase(self, aviary_options: AviaryValues = None):
opt=False
)

phase.add_control('angle_of_attack', opt=False, units='deg')
phase.add_control(Dynamic.Vehicle.ANGLE_OF_ATTACK, opt=False, units='deg')

phase.add_timeseries_output(
Dynamic.Vehicle.DRAG, output_name=Dynamic.Vehicle.DRAG, units='lbf'
@@ -590,7 +590,7 @@ def _extra_ode_init_kwargs(self):
LandingObstacleToFlare._add_meta_data('altitude_ref', val=1., units='ft')

LandingObstacleToFlare._add_initial_guess_meta_data(
InitialGuessControl('angle_of_attack'))
InitialGuessControl(Dynamic.Vehicle.ANGLE_OF_ATTACK))

LandingObstacleToFlare._add_initial_guess_meta_data(InitialGuessState('altitude'))

@@ -763,7 +763,7 @@ def build_phase(self, aviary_options: AviaryValues = None):
angle_of_attack_ref = user_options.get_val('angle_of_attack_ref', units)

phase.add_polynomial_control(
'angle_of_attack', opt=True, units=units, order=1,
Dynamic.Vehicle.ANGLE_OF_ATTACK, opt=True, units=units, order=1,
lower=lower_angle_of_attack, upper=upper_angle_of_attack,
ref=angle_of_attack_ref,
rate_targets="angle_of_attack_rate"
@@ -829,7 +829,7 @@ def _extra_ode_init_kwargs(self):
LandingFlareToTouchdown._add_meta_data('angle_of_attack_ref', val=10., units='deg')

LandingFlareToTouchdown._add_initial_guess_meta_data(
InitialGuessPolynomialControl('angle_of_attack'))
InitialGuessPolynomialControl(Dynamic.Vehicle.ANGLE_OF_ATTACK))

LandingFlareToTouchdown._add_initial_guess_meta_data(InitialGuessState('altitude'))

@@ -974,7 +974,7 @@ def build_phase(self, aviary_options=None):
max_angle_of_attack = user_options.get_val('max_angle_of_attack', units)

phase.add_polynomial_control(
'angle_of_attack', opt=True, units=units, order=1,
Dynamic.Vehicle.ANGLE_OF_ATTACK, opt=True, units=units, order=1,
lower=0, upper=max_angle_of_attack, fix_final=True,
fix_initial=False, ref=max_angle_of_attack)

@@ -1019,7 +1019,7 @@ def _extra_ode_init_kwargs(self):
LandingTouchdownToNoseDown._add_meta_data('max_angle_of_attack', val=10.0, units='deg')

LandingTouchdownToNoseDown._add_initial_guess_meta_data(
InitialGuessPolynomialControl('angle_of_attack'))
InitialGuessPolynomialControl(Dynamic.Vehicle.ANGLE_OF_ATTACK))


@_init_initial_guess_meta_data
@@ -1155,7 +1155,7 @@ def build_phase(self, aviary_options=None):
opt=False
)

phase.add_parameter('angle_of_attack', val=0.0, opt=False, units='deg')
phase.add_parameter(Dynamic.Vehicle.ANGLE_OF_ATTACK, val=0.0, opt=False, units='deg')

phase.add_timeseries_output(
Dynamic.Vehicle.Propulsion.THRUST_TOTAL,
@@ -1196,7 +1196,7 @@ def _extra_ode_init_kwargs(self):
LandingNoseDownToStop._add_meta_data('max_velocity', val=100.0, units='ft/s')

LandingNoseDownToStop._add_initial_guess_meta_data(
InitialGuessParameter('angle_of_attack'))
InitialGuessParameter(Dynamic.Vehicle.ANGLE_OF_ATTACK))


class LandingTrajectory:
Loading