From 48c74536cd0e2f67bf69593ae40d9804fe3208d4 Mon Sep 17 00:00:00 2001 From: Nathan Perreau Date: Fri, 17 Jan 2025 16:07:47 -0500 Subject: [PATCH 1/6] This commit modifies the angle of attack name through Aviary to use the variable now stored in the variable meta data. --- aviary/mission/flops_based/ode/landing_eom.py | 26 +++++------ aviary/mission/flops_based/ode/landing_ode.py | 2 +- aviary/mission/flops_based/ode/takeoff_eom.py | 26 +++++------ aviary/mission/flops_based/ode/takeoff_ode.py | 2 +- .../flops_based/ode/test/test_landing_eom.py | 6 +-- .../flops_based/ode/test/test_landing_ode.py | 2 +- .../flops_based/ode/test/test_takeoff_eom.py | 6 +-- .../flops_based/ode/test/test_takeoff_ode.py | 4 +- .../phases/detailed_landing_phases.py | 20 ++++---- .../phases/detailed_takeoff_phases.py | 42 ++++++++--------- aviary/models/N3CC/N3CC_data.py | 46 +++++++++---------- .../aerodynamics/aerodynamics_builder.py | 2 +- .../aerodynamics/flops_based/ground_effect.py | 14 +++--- .../flops_based/solved_alpha_group.py | 6 +-- .../flops_based/takeoff_aero_group.py | 8 ++-- .../flops_based/test/test_ground_effect.py | 2 +- .../test/test_takeoff_aero_group.py | 2 +- .../aerodynamics/gasp_based/table_based.py | 24 +++++----- .../gasp_based/test/test_table_based.py | 9 ++-- aviary/variable_info/variable_meta_data.py | 8 ++++ aviary/variable_info/variables.py | 1 + 21 files changed, 134 insertions(+), 124 deletions(-) diff --git a/aviary/mission/flops_based/ode/landing_eom.py b/aviary/mission/flops_based/ode/landing_eom.py index 1ebf06ec4..be19ce6ba 100644 --- a/aviary/mission/flops_based/ode/landing_eom.py +++ b/aviary/mission/flops_based/ode/landing_eom.py @@ -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 diff --git a/aviary/mission/flops_based/ode/landing_ode.py b/aviary/mission/flops_based/ode/landing_ode.py index 4945a0455..1bcdff1ea 100644 --- a/aviary/mission/flops_based/ode/landing_ode.py +++ b/aviary/mission/flops_based/ode/landing_ode.py @@ -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, ], diff --git a/aviary/mission/flops_based/ode/takeoff_eom.py b/aviary/mission/flops_based/ode/takeoff_eom.py index 3ab97bd1d..773e25a16 100644 --- a/aviary/mission/flops_based/ode/takeoff_eom.py +++ b/aviary/mission/flops_based/ode/takeoff_eom.py @@ -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 diff --git a/aviary/mission/flops_based/ode/takeoff_ode.py b/aviary/mission/flops_based/ode/takeoff_ode.py index 1cb0354e0..412937ec9 100644 --- a/aviary/mission/flops_based/ode/takeoff_ode.py +++ b/aviary/mission/flops_based/ode/takeoff_ode.py @@ -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, diff --git a/aviary/mission/flops_based/ode/test/test_landing_eom.py b/aviary/mission/flops_based/ode/test/test_landing_eom.py index ca92b53bf..20d12cbc6 100644 --- a/aviary/mission/flops_based/ode/test/test_landing_eom.py +++ b/aviary/mission/flops_based/ode/test/test_landing_eom.py @@ -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" diff --git a/aviary/mission/flops_based/ode/test/test_landing_ode.py b/aviary/mission/flops_based/ode/test/test_landing_ode.py index 454bf0e32..b75699755 100644 --- a/aviary/mission/flops_based/ode/test/test_landing_ode.py +++ b/aviary/mission/flops_based/ode/test/test_landing_ode.py @@ -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, diff --git a/aviary/mission/flops_based/ode/test/test_takeoff_eom.py b/aviary/mission/flops_based/ode/test/test_takeoff_eom.py index 3718ebd5b..7f49ed647 100644 --- a/aviary/mission/flops_based/ode/test/test_takeoff_eom.py +++ b/aviary/mission/flops_based/ode/test/test_takeoff_eom.py @@ -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) diff --git a/aviary/mission/flops_based/ode/test/test_takeoff_ode.py b/aviary/mission/flops_based/ode/test/test_takeoff_ode.py index 453422c7b..b4df9415d 100644 --- a/aviary/mission/flops_based/ode/test/test_takeoff_ode.py +++ b/aviary/mission/flops_based/ode/test/test_takeoff_ode.py @@ -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, diff --git a/aviary/mission/flops_based/phases/detailed_landing_phases.py b/aviary/mission/flops_based/phases/detailed_landing_phases.py index adccdb346..6846c0d1a 100644 --- a/aviary/mission/flops_based/phases/detailed_landing_phases.py +++ b/aviary/mission/flops_based/phases/detailed_landing_phases.py @@ -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: diff --git a/aviary/mission/flops_based/phases/detailed_takeoff_phases.py b/aviary/mission/flops_based/phases/detailed_takeoff_phases.py index 38e6f2ac9..4ead8b28c 100644 --- a/aviary/mission/flops_based/phases/detailed_takeoff_phases.py +++ b/aviary/mission/flops_based/phases/detailed_takeoff_phases.py @@ -212,7 +212,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, @@ -252,7 +252,7 @@ def _extra_ode_init_kwargs(self): 'max_velocity', val=100.0, units='ft/s') TakeoffBrakeReleaseToDecisionSpeed._add_initial_guess_meta_data( - InitialGuessParameter('angle_of_attack')) + InitialGuessParameter(Dynamic.Vehicle.ANGLE_OF_ATTACK)) @_init_initial_guess_meta_data @@ -393,7 +393,7 @@ def build_phase(self, aviary_options=None): phase.add_boundary_constraint('v_over_v_stall', loc='final', lower=1.2, ref=1.2) - 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, @@ -438,7 +438,7 @@ def _extra_ode_init_kwargs(self): TakeoffDecisionSpeedToRotate._add_meta_data('max_velocity', val=100.0, units='ft/s') TakeoffDecisionSpeedToRotate._add_initial_guess_meta_data( - InitialGuessParameter('angle_of_attack')) + InitialGuessParameter(Dynamic.Vehicle.ANGLE_OF_ATTACK)) @_init_initial_guess_meta_data @@ -539,7 +539,7 @@ def build_phase(self, aviary_options=None): TakeoffDecisionSpeedBrakeDelay._add_meta_data('max_velocity', val=100.0, units='ft/s') TakeoffDecisionSpeedBrakeDelay._add_initial_guess_meta_data( - InitialGuessParameter('angle_of_attack')) + InitialGuessParameter(Dynamic.Vehicle.ANGLE_OF_ATTACK)) @_init_initial_guess_meta_data @@ -680,7 +680,7 @@ def build_phase(self, aviary_options=None): ) 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, ref=max_angle_of_attack) @@ -729,7 +729,7 @@ def _extra_ode_init_kwargs(self): TakeoffRotateToLiftoff._add_meta_data('max_angle_of_attack', val=10.0, units='deg') TakeoffRotateToLiftoff._add_initial_guess_meta_data( - InitialGuessPolynomialControl('angle_of_attack')) + InitialGuessPolynomialControl(Dynamic.Vehicle.ANGLE_OF_ATTACK)) @_init_initial_guess_meta_data @@ -905,7 +905,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, lower=lower_angle_of_attack, upper=upper_angle_of_attack, ref=angle_of_attack_ref) @@ -985,7 +985,7 @@ def _extra_ode_init_kwargs(self): TakeoffLiftoffToObstacle._add_meta_data('angle_of_attack_ref', val=10., units='deg') TakeoffLiftoffToObstacle._add_initial_guess_meta_data( - InitialGuessControl('angle_of_attack')) + InitialGuessControl(Dynamic.Vehicle.ANGLE_OF_ATTACK)) TakeoffLiftoffToObstacle._add_initial_guess_meta_data(InitialGuessState('altitude')) @@ -1166,7 +1166,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, lower=lower_angle_of_attack, upper=upper_angle_of_attack, ref=angle_of_attack_ref) @@ -1242,7 +1242,7 @@ def _extra_ode_init_kwargs(self): TakeoffObstacleToMicP2._add_meta_data('mic_altitude', val=1.0, units='ft') TakeoffObstacleToMicP2._add_initial_guess_meta_data( - InitialGuessControl('angle_of_attack')) + InitialGuessControl(Dynamic.Vehicle.ANGLE_OF_ATTACK)) TakeoffObstacleToMicP2._add_initial_guess_meta_data(InitialGuessState('altitude')) @@ -1423,7 +1423,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, lower=lower_angle_of_attack, upper=upper_angle_of_attack, ref=angle_of_attack_ref) @@ -1494,7 +1494,7 @@ def _extra_ode_init_kwargs(self): TakeoffMicP2ToEngineCutback._add_meta_data('final_range', val=1000., units='ft') TakeoffMicP2ToEngineCutback._add_initial_guess_meta_data( - InitialGuessControl('angle_of_attack')) + InitialGuessControl(Dynamic.Vehicle.ANGLE_OF_ATTACK)) TakeoffMicP2ToEngineCutback._add_initial_guess_meta_data(InitialGuessState('altitude')) @@ -1670,7 +1670,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, lower=lower_angle_of_attack, upper=upper_angle_of_attack, ref=angle_of_attack_ref) @@ -1724,7 +1724,7 @@ def _extra_ode_init_kwargs(self): TakeoffEngineCutback._add_meta_data('angle_of_attack_ref', val=10., units='deg') TakeoffEngineCutback._add_initial_guess_meta_data( - InitialGuessControl('angle_of_attack')) + InitialGuessControl(Dynamic.Vehicle.ANGLE_OF_ATTACK)) TakeoffEngineCutback._add_initial_guess_meta_data(InitialGuessState('altitude')) @@ -1905,7 +1905,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, lower=lower_angle_of_attack, upper=upper_angle_of_attack, ref=angle_of_attack_ref) @@ -1972,7 +1972,7 @@ def _extra_ode_init_kwargs(self): TakeoffEngineCutbackToMicP1._add_meta_data('mic_range', val=1000.0, units='ft') TakeoffEngineCutbackToMicP1._add_initial_guess_meta_data( - InitialGuessControl('angle_of_attack')) + InitialGuessControl(Dynamic.Vehicle.ANGLE_OF_ATTACK)) TakeoffEngineCutbackToMicP1._add_initial_guess_meta_data(InitialGuessState('altitude')) @@ -2153,7 +2153,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, lower=lower_angle_of_attack, upper=upper_angle_of_attack, ref=angle_of_attack_ref) @@ -2219,7 +2219,7 @@ def _extra_ode_init_kwargs(self): TakeoffMicP1ToClimb._add_meta_data('mic_range', val=1000., units='ft') TakeoffMicP1ToClimb._add_initial_guess_meta_data( - InitialGuessControl('angle_of_attack')) + InitialGuessControl(Dynamic.Vehicle.ANGLE_OF_ATTACK)) TakeoffMicP1ToClimb._add_initial_guess_meta_data(InitialGuessState('altitude')) @@ -2364,7 +2364,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') return phase @@ -2396,7 +2396,7 @@ def _extra_ode_init_kwargs(self): TakeoffBrakeToAbort._add_meta_data('max_velocity', val=100.0, units='ft/s') TakeoffBrakeToAbort._add_initial_guess_meta_data( - InitialGuessParameter('angle_of_attack')) + InitialGuessParameter(Dynamic.Vehicle.ANGLE_OF_ATTACK)) class TakeoffTrajectory: diff --git a/aviary/models/N3CC/N3CC_data.py b/aviary/models/N3CC/N3CC_data.py index 9e1841553..0b6b312ed 100644 --- a/aviary/models/N3CC/N3CC_data.py +++ b/aviary/models/N3CC/N3CC_data.py @@ -519,7 +519,7 @@ takeoff_brake_release_initial_guesses.set_val('mass', gross_mass, gross_mass_units) takeoff_brake_release_initial_guesses.set_val('throttle', 1.) -takeoff_brake_release_initial_guesses.set_val('angle_of_attack', 0., 'deg') +takeoff_brake_release_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') takeoff_brake_release_builder = TakeoffBrakeReleaseToDecisionSpeed( 'takeoff_brake_release', @@ -548,7 +548,7 @@ takeoff_decision_speed_initial_guesses.set_val('velocity', [150., 160.], 'kn') takeoff_decision_speed_initial_guesses.set_val('mass', gross_mass, gross_mass_units) takeoff_decision_speed_initial_guesses.set_val('throttle', 1.) -takeoff_decision_speed_initial_guesses.set_val('angle_of_attack', 0., 'deg') +takeoff_decision_speed_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') takeoff_decision_speed_builder = TakeoffDecisionSpeedToRotate( 'takeoff_decision_speed', @@ -576,7 +576,7 @@ takeoff_rotate_initial_guesses.set_val('distance', [4500, 4800.0], 'ft') takeoff_rotate_initial_guesses.set_val('velocity', [160., 160.0], 'kn') takeoff_rotate_initial_guesses.set_val('throttle', 1.) -takeoff_rotate_initial_guesses.set_val('angle_of_attack', [0., 8.], 'deg') +takeoff_rotate_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, [0., 8.], 'deg') takeoff_rotate_initial_guesses.set_val('mass', gross_mass, gross_mass_units) takeoff_rotate_builder = TakeoffRotateToLiftoff( @@ -613,7 +613,7 @@ takeoff_liftoff_initial_guesses.set_val( Dynamic.Mission.FLIGHT_PATH_ANGLE, [0, 6.0], 'deg' ) -takeoff_liftoff_initial_guesses.set_val('angle_of_attack', 8.117, 'deg') +takeoff_liftoff_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 8.117, 'deg') takeoff_liftoff_initial_guesses.set_val('mass', gross_mass, gross_mass_units) takeoff_liftoff_builder = TakeoffLiftoffToObstacle( @@ -657,7 +657,7 @@ takeoff_mic_p2_initial_guesses.set_val( Dynamic.Mission.FLIGHT_PATH_ANGLE, [7.0, 10.0], 'deg' ) -takeoff_mic_p2_initial_guesses.set_val('angle_of_attack', 8.117, 'deg') +takeoff_mic_p2_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 8.117, 'deg') takeoff_mic_p2_initial_guesses.set_val('mass', gross_mass, gross_mass_units) takeoff_mic_p2_builder = TakeoffObstacleToMicP2( @@ -714,7 +714,7 @@ Dynamic.Mission.FLIGHT_PATH_ANGLE, [11.0, 10.0], 'deg' ) -takeoff_mic_p2_to_engine_cutback_initial_guesses.set_val('angle_of_attack', 5.0, 'deg') +takeoff_mic_p2_to_engine_cutback_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.0, 'deg') takeoff_mic_p2_to_engine_cutback_initial_guesses.set_val( 'mass', gross_mass, gross_mass_units) @@ -770,7 +770,7 @@ Dynamic.Mission.FLIGHT_PATH_ANGLE, [10.0, 10.0], 'deg' ) -takeoff_engine_cutback_initial_guesses.set_val('angle_of_attack', 5.0, 'deg') +takeoff_engine_cutback_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.0, 'deg') takeoff_engine_cutback_initial_guesses.set_val('mass', gross_mass, gross_mass_units) takeoff_engine_cutback_builder = TakeoffEngineCutback( @@ -831,7 +831,7 @@ takeoff_engine_cutback_to_mic_p1_initial_guesses.set_val( Dynamic.Mission.FLIGHT_PATH_ANGLE, 2.29, 'deg' ) -takeoff_engine_cutback_to_mic_p1_initial_guesses.set_val('angle_of_attack', 5.0, 'deg') +takeoff_engine_cutback_to_mic_p1_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.0, 'deg') takeoff_engine_cutback_to_mic_p1_initial_guesses.set_val( 'mass', gross_mass, gross_mass_units) @@ -879,7 +879,7 @@ takeoff_mic_p1_to_climb_initial_guesses.set_val( Dynamic.Mission.FLIGHT_PATH_ANGLE, 2.29, 'deg' ) -takeoff_mic_p1_to_climb_initial_guesses.set_val('angle_of_attack', 5.0, 'deg') +takeoff_mic_p1_to_climb_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.0, 'deg') takeoff_mic_p1_to_climb_initial_guesses.set_val('mass', gross_mass, gross_mass_units) takeoff_mic_p1_to_climb_builder = TakeoffMicP1ToClimb( @@ -909,7 +909,7 @@ detailed_takeoff.set_val( Dynamic.Vehicle.Propulsion.THRUST_TOTAL, [44038.8, 34103.4, 33929.0, 33638.2], 'lbf') -detailed_takeoff.set_val('angle_of_attack', [0.000, 3.600, 8.117, 8.117], 'deg') +detailed_takeoff.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, [0.000, 3.600, 8.117, 8.117], 'deg') detailed_takeoff.set_val( Dynamic.Mission.FLIGHT_PATH_ANGLE, [0.000, 0.000, 0.612, 4.096], 'deg' ) @@ -981,7 +981,7 @@ def _split_aviary_values(aviary_values, slicing): balanced_brake_release_initial_guesses.set_val('velocity', [0.01, 150.], 'kn') balanced_brake_release_initial_guesses.set_val('mass', gross_mass, gross_mass_units) balanced_brake_release_initial_guesses.set_val('throttle', 1.) -balanced_brake_release_initial_guesses.set_val('angle_of_attack', 0., 'deg') +balanced_brake_release_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') balanced_brake_release_builder = TakeoffBrakeReleaseToDecisionSpeed( 'balanced_brake_release', @@ -1011,7 +1011,7 @@ def _split_aviary_values(aviary_values, slicing): balanced_decision_speed_initial_guesses.set_val('velocity', [150., 160.], 'kn') balanced_decision_speed_initial_guesses.set_val('mass', gross_mass, gross_mass_units) balanced_decision_speed_initial_guesses.set_val('throttle', engine_out_throttle) -balanced_decision_speed_initial_guesses.set_val('angle_of_attack', 0., 'deg') +balanced_decision_speed_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') balanced_decision_speed_builder = TakeoffDecisionSpeedToRotate( 'balanced_decision_speed', @@ -1038,7 +1038,7 @@ def _split_aviary_values(aviary_values, slicing): balanced_rotate_initial_guesses.set_val('distance', [4500., 4800.], 'ft') balanced_rotate_initial_guesses.set_val('velocity', [160., 160.], 'kn') balanced_rotate_initial_guesses.set_val('throttle', engine_out_throttle) -balanced_rotate_initial_guesses.set_val('angle_of_attack', [0., 8.], 'deg') +balanced_rotate_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, [0., 8.], 'deg') balanced_rotate_initial_guesses.set_val('mass', gross_mass, gross_mass_units) balanced_rotate_builder = TakeoffRotateToLiftoff( @@ -1074,7 +1074,7 @@ def _split_aviary_values(aviary_values, slicing): balanced_liftoff_initial_guesses.set_val( Dynamic.Mission.FLIGHT_PATH_ANGLE, [0.0, 5.0], 'deg' ) -balanced_liftoff_initial_guesses.set_val('angle_of_attack', 8.117, 'deg') +balanced_liftoff_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 8.117, 'deg') balanced_liftoff_initial_guesses.set_val('mass', gross_mass, gross_mass_units) balanced_liftoff_builder = TakeoffLiftoffToObstacle( @@ -1101,7 +1101,7 @@ def _split_aviary_values(aviary_values, slicing): balanced_delayed_brake_initial_guesses.set_val('velocity', [150., 150.], 'kn') balanced_delayed_brake_initial_guesses.set_val('mass', gross_mass, gross_mass_units) balanced_delayed_brake_initial_guesses.set_val('throttle', engine_out_throttle) -balanced_delayed_brake_initial_guesses.set_val('angle_of_attack', 0., 'deg') +balanced_delayed_brake_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') # NOTE: no special handling required; re-use existing phase builder type balanced_delayed_brake_builder = TakeoffDecisionSpeedBrakeDelay( @@ -1128,7 +1128,7 @@ def _split_aviary_values(aviary_values, slicing): balanced_abort_initial_guesses.set_val('velocity', [150., 0.01], 'kn') balanced_abort_initial_guesses.set_val('mass', gross_mass, gross_mass_units) balanced_abort_initial_guesses.set_val('throttle', 0.) -balanced_abort_initial_guesses.set_val('angle_of_attack', 0., 'deg') +balanced_abort_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') balanced_abort_builder = TakeoffBrakeToAbort( 'balanced_abort', @@ -1276,7 +1276,7 @@ def _split_aviary_values(aviary_values, slicing): ) detailed_landing.set_val( - 'angle_of_attack', + Dynamic.Vehicle.ANGLE_OF_ATTACK, [ 5.231, 5.231, 5.231, 5.23, 5.23, 5.23, 5.23, 5.23, 5.229, 5.229, 5.229, 5.229, 5.228, 5.228, 5.227, 5.227, 5.227, 5.226, 5.226, 5.225, 5.224, 5.224, 5.223, @@ -1409,7 +1409,7 @@ def _split_aviary_values(aviary_values, slicing): Dynamic.Mission.FLIGHT_PATH_ANGLE, [apr_angle, apr_angle], 'deg' ) -landing_approach_to_mic_p3_initial_guesses.set_val('angle_of_attack', 5.25, 'deg') +landing_approach_to_mic_p3_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.25, 'deg') landing_approach_to_mic_p3_builder = LandingApproachToMicP3( 'landing_approach_to_mic_p3', @@ -1461,7 +1461,7 @@ def _split_aviary_values(aviary_values, slicing): Dynamic.Mission.FLIGHT_PATH_ANGLE, [apr_angle, apr_angle], 'deg' ) -landing_mic_p3_to_obstacle_initial_guesses.set_val('angle_of_attack', 5.25, 'deg') +landing_mic_p3_to_obstacle_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.25, 'deg') landing_mic_p3_to_obstacle_builder = LandingMicP3ToObstacle( 'landing_mic_p3_to_obstacle', @@ -1500,7 +1500,7 @@ def _split_aviary_values(aviary_values, slicing): Dynamic.Mission.FLIGHT_PATH_ANGLE, [apr_angle, apr_angle], 'deg' ) -landing_obstacle_initial_guesses.set_val('angle_of_attack', 5.2, 'deg') +landing_obstacle_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.2, 'deg') landing_obstacle_builder = LandingObstacleToFlare( 'landing_obstacle', @@ -1541,7 +1541,7 @@ def _split_aviary_values(aviary_values, slicing): landing_flare_initial_guesses.set_val( Dynamic.Mission.FLIGHT_PATH_ANGLE, [apr_angle, 0.0], 'deg' ) -landing_flare_initial_guesses.set_val('angle_of_attack', [5.2, 7.5], 'deg') +landing_flare_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, [5.2, 7.5], 'deg') landing_flare_builder = LandingFlareToTouchdown( 'landing_flare', @@ -1574,7 +1574,7 @@ def _split_aviary_values(aviary_values, slicing): landing_touchdown_initial_guesses.set_val('velocity', [140., 135.], 'kn') landing_touchdown_initial_guesses.set_val('mass', detailed_landing_mass, 'lbm') landing_touchdown_initial_guesses.set_val('throttle', 0.) -landing_touchdown_initial_guesses.set_val('angle_of_attack', [7.5, 0.0], 'deg') +landing_touchdown_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, [7.5, 0.0], 'deg') landing_touchdown_builder = LandingTouchdownToNoseDown( 'landing_touchdown', @@ -1606,7 +1606,7 @@ def _split_aviary_values(aviary_values, slicing): landing_fullstop_initial_guesses.set_val('velocity', [135., 0.01], 'kn') landing_fullstop_initial_guesses.set_val('mass', detailed_landing_mass, 'lbm') landing_fullstop_initial_guesses.set_val('throttle', 0.) -landing_fullstop_initial_guesses.set_val('angle_of_attack', 0., 'deg') +landing_fullstop_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') landing_fullstop_builder = LandingNoseDownToStop( 'landing_fullstop', diff --git a/aviary/subsystems/aerodynamics/aerodynamics_builder.py b/aviary/subsystems/aerodynamics/aerodynamics_builder.py index 679e91c29..28966dc71 100644 --- a/aviary/subsystems/aerodynamics/aerodynamics_builder.py +++ b/aviary/subsystems/aerodynamics/aerodynamics_builder.py @@ -221,7 +221,7 @@ def mission_inputs(self, **kwargs): elif method == 'low_speed': promotes = [ - 'angle_of_attack', + Dynamic.Vehicle.ANGLE_OF_ATTACK, Dynamic.Mission.ALTITUDE, Dynamic.Mission.FLIGHT_PATH_ANGLE, Mission.Takeoff.DRAG_COEFFICIENT_MIN, diff --git a/aviary/subsystems/aerodynamics/flops_based/ground_effect.py b/aviary/subsystems/aerodynamics/flops_based/ground_effect.py index 3130ed5da..f4c95f7e4 100644 --- a/aviary/subsystems/aerodynamics/flops_based/ground_effect.py +++ b/aviary/subsystems/aerodynamics/flops_based/ground_effect.py @@ -38,7 +38,7 @@ def initialize(self): def setup(self): nn = self.options['num_nodes'] - 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.ALTITUDE, np.zeros(nn), units='m') @@ -93,7 +93,7 @@ def setup_partials(self): self.declare_partials( 'lift_coefficient', [ - 'angle_of_attack', + Dynamic.Vehicle.ANGLE_OF_ATTACK, Dynamic.Mission.FLIGHT_PATH_ANGLE, 'minimum_drag_coefficient', 'base_drag_coefficient', @@ -109,7 +109,7 @@ def setup_partials(self): self.declare_partials( 'drag_coefficient', [ - 'angle_of_attack', + Dynamic.Vehicle.ANGLE_OF_ATTACK, Dynamic.Mission.ALTITUDE, Dynamic.Mission.FLIGHT_PATH_ANGLE, 'base_drag_coefficient', @@ -129,7 +129,7 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): ground_altitude = options['ground_altitude'] - angle_of_attack = inputs['angle_of_attack'] + angle_of_attack = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK] altitude = inputs[Dynamic.Mission.ALTITUDE] flight_path_angle = inputs[Dynamic.Mission.FLIGHT_PATH_ANGLE] minimum_drag_coefficient = inputs['minimum_drag_coefficient'] @@ -185,7 +185,7 @@ def compute_partials(self, inputs, J, discrete_inputs=None): ground_altitude = options['ground_altitude'] - angle_of_attack = inputs['angle_of_attack'] + angle_of_attack = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK] altitude = inputs[Dynamic.Mission.ALTITUDE] flight_path_angle = inputs[Dynamic.Mission.FLIGHT_PATH_ANGLE] minimum_drag_coefficient = inputs['minimum_drag_coefficient'] @@ -309,7 +309,7 @@ def compute_partials(self, inputs, J, discrete_inputs=None): d_dc_aoa = base_lift_coefficient * (lift_coeff_factor - 1.) * d_ca_aoa - J['drag_coefficient', 'angle_of_attack'] = d_dc_aoa + J['drag_coefficient', Dynamic.Vehicle.ANGLE_OF_ATTACK] = d_dc_aoa # endregion drag_coefficient wrt angle_of_attack # region drag_coefficient wrt flight_path_angle @@ -419,7 +419,7 @@ def compute_partials(self, inputs, J, discrete_inputs=None): J['drag_coefficient', Aircraft.Wing.ASPECT_RATIO][idx] = 0.0 J['drag_coefficient', Aircraft.Wing.HEIGHT][idx] = 0.0 J['drag_coefficient', Aircraft.Wing.SPAN][idx] = 0.0 - J['drag_coefficient', 'angle_of_attack'][idx] = 0.0 + J['drag_coefficient', Dynamic.Vehicle.ANGLE_OF_ATTACK][idx] = 0.0 J['drag_coefficient', Dynamic.Mission.FLIGHT_PATH_ANGLE][idx] = 0.0 J['lift_coefficient', Dynamic.Mission.ALTITUDE][idx] = 0.0 diff --git a/aviary/subsystems/aerodynamics/flops_based/solved_alpha_group.py b/aviary/subsystems/aerodynamics/flops_based/solved_alpha_group.py index 2e3e058d0..b0a8c386f 100644 --- a/aviary/subsystems/aerodynamics/flops_based/solved_alpha_group.py +++ b/aviary/subsystems/aerodynamics/flops_based/solved_alpha_group.py @@ -90,10 +90,10 @@ def setup(self): ) balance = self.add_subsystem('balance', om.BalanceComp()) - balance.add_balance('alpha', val=np.ones(nn), units='deg', res_ref=1.0e6) + balance.add_balance('angle_of_attack', val=np.ones(nn), units='deg', res_ref=1.0e6) - self.connect('balance.alpha', 'tabular_aero.alpha') - self.connect('needed_lift.lift_resid', 'balance.lhs:alpha') + self.connect('balance.angle_of_attack', 'tabular_aero.angle_of_attack') + self.connect('needed_lift.lift_resid', 'balance.lhs:angle_of_attack') self.add_subsystem( 'needed_lift', diff --git a/aviary/subsystems/aerodynamics/flops_based/takeoff_aero_group.py b/aviary/subsystems/aerodynamics/flops_based/takeoff_aero_group.py index 9d1cde015..c1d5213de 100644 --- a/aviary/subsystems/aerodynamics/flops_based/takeoff_aero_group.py +++ b/aviary/subsystems/aerodynamics/flops_based/takeoff_aero_group.py @@ -98,7 +98,7 @@ def setup(self): drag_coefficients = \ np.array(options['drag_coefficients']) * drag_coefficient_factor - inputs = ['angle_of_attack'] + inputs = [Dynamic.Vehicle.ANGLE_OF_ATTACK] takeoff_polar: om.MetaModelSemiStructuredComp = self.add_subsystem( 'takeoff_polar', @@ -108,7 +108,7 @@ def setup(self): promotes_inputs=inputs, ) - takeoff_polar.add_input('angle_of_attack', angles_of_attack, units='rad') + takeoff_polar.add_input(Dynamic.Vehicle.ANGLE_OF_ATTACK, angles_of_attack, units='rad') takeoff_polar.add_output('lift_coefficient', lift_coefficients, units='unitless') takeoff_polar.add_output('drag_coefficient', drag_coefficients, units='unitless') @@ -121,7 +121,7 @@ def setup(self): } inputs = [ - 'angle_of_attack', + Dynamic.Vehicle.ANGLE_OF_ATTACK, Dynamic.Mission.ALTITUDE, Dynamic.Mission.FLIGHT_PATH_ANGLE, ('minimum_drag_coefficient', Mission.Takeoff.DRAG_COEFFICIENT_MIN), @@ -190,4 +190,4 @@ def setup(self): promotes_inputs=inputs, promotes_outputs=outputs ) - self.set_input_defaults('angle_of_attack', np.zeros(nn), 'rad') + self.set_input_defaults(Dynamic.Vehicle.ANGLE_OF_ATTACK, np.zeros(nn), 'rad') diff --git a/aviary/subsystems/aerodynamics/flops_based/test/test_ground_effect.py b/aviary/subsystems/aerodynamics/flops_based/test/test_ground_effect.py index d94fa8139..b0e8b1bb0 100644 --- a/aviary/subsystems/aerodynamics/flops_based/test/test_ground_effect.py +++ b/aviary/subsystems/aerodynamics/flops_based/test/test_ground_effect.py @@ -63,7 +63,7 @@ def make_problem(): inputs = AviaryValues( { - 'angle_of_attack': (np.array([0.0, 2.0, 6]), 'deg'), + Dynamic.Vehicle.ANGLE_OF_ATTACK: (np.array([0.0, 2.0, 6]), 'deg'), Dynamic.Mission.ALTITUDE: (np.array([100.0, 132, 155]), 'm'), Dynamic.Mission.FLIGHT_PATH_ANGLE: (np.array([0.0, 0.5, 1.0]), 'deg'), 'minimum_drag_coefficient': minimum_drag_coefficient, diff --git a/aviary/subsystems/aerodynamics/flops_based/test/test_takeoff_aero_group.py b/aviary/subsystems/aerodynamics/flops_based/test/test_takeoff_aero_group.py index b57bd73e9..d4874adf2 100644 --- a/aviary/subsystems/aerodynamics/flops_based/test/test_takeoff_aero_group.py +++ b/aviary/subsystems/aerodynamics/flops_based/test/test_takeoff_aero_group.py @@ -76,7 +76,7 @@ def make_problem(subsystem_options={}): dynamic_inputs = AviaryValues( { - 'angle_of_attack': (np.array([0.0, 2.0, 6.0]), 'deg'), + Dynamic.Vehicle.ANGLE_OF_ATTACK: (np.array([0.0, 2.0, 6.0]), 'deg'), Dynamic.Mission.ALTITUDE: (np.array([0.0, 32.0, 55.0]), 'm'), Dynamic.Mission.FLIGHT_PATH_ANGLE: (np.array([0.0, 0.5, 1.0]), 'deg'), } diff --git a/aviary/subsystems/aerodynamics/gasp_based/table_based.py b/aviary/subsystems/aerodynamics/gasp_based/table_based.py index 5c0d33a5c..3ef7fa7fc 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/table_based.py +++ b/aviary/subsystems/aerodynamics/gasp_based/table_based.py @@ -22,7 +22,7 @@ aliases = { Dynamic.Mission.ALTITUDE: ['h', 'alt', 'altitude'], Dynamic.Atmosphere.MACH: ['m', 'mach'], - 'angle_of_attack': ['alpha', 'angle_of_attack', 'AoA'], + Dynamic.Vehicle.ANGLE_OF_ATTACK: ['alpha', 'angle_of_attack', 'AoA'], 'flap_deflection': ['flap_deflection'], 'hob': ['hob'], 'lift_coefficient': ['cl', 'lift_coefficient'], @@ -78,7 +78,7 @@ def setup(self): promotes_inputs=[ Dynamic.Mission.ALTITUDE, Dynamic.Atmosphere.MACH, - ('angle_of_attack', 'alpha'), + Dynamic.Vehicle.ANGLE_OF_ATTACK, ] + extra_promotes, promotes_outputs=[('lift_coefficient', 'CL'), ('drag_coefficient', 'CD')], @@ -176,7 +176,7 @@ def setup(self): promotes_inputs=[ Dynamic.Mission.ALTITUDE, Dynamic.Atmosphere.MACH, - ('angle_of_attack', 'alpha'), + Dynamic.Vehicle.ANGLE_OF_ATTACK, ], promotes_outputs=[ ("lift_coefficient", "CL_free"), @@ -197,7 +197,7 @@ def setup(self): promotes_inputs=[ ('flap_deflection', 'flap_defl'), Dynamic.Atmosphere.MACH, - ('angle_of_attack', 'alpha'), + Dynamic.Vehicle.ANGLE_OF_ATTACK, ], promotes_outputs=[ ("delta_lift_coefficient", "dCL_flaps_full"), @@ -217,7 +217,7 @@ def setup(self): ground_aero_interp, promotes_inputs=[ Dynamic.Atmosphere.MACH, - ('angle_of_attack', 'alpha'), + Dynamic.Vehicle.ANGLE_OF_ATTACK, 'hob', ], promotes_outputs=[ @@ -414,7 +414,7 @@ def _build_free_aero_interp(num_nodes=0, aero_data=None, connect_training_data=F required_inputs = { Dynamic.Mission.ALTITUDE, Dynamic.Atmosphere.MACH, - 'angle_of_attack', + Dynamic.Vehicle.ANGLE_OF_ATTACK, } required_outputs = {'lift_coefficient', 'drag_coefficient'} @@ -489,7 +489,7 @@ def _build_flaps_aero_interp(num_nodes=0, aero_data=None, connect_training_data= interp_data = _structure_special_grid(interp_data) - required_inputs = {'flap_deflection', Dynamic.Atmosphere.MACH, 'angle_of_attack'} + required_inputs = {'flap_deflection', Dynamic.Atmosphere.MACH, Dynamic.Vehicle.ANGLE_OF_ATTACK} required_outputs = {'delta_lift_coefficient', 'delta_drag_coefficient'} missing_variables = [] @@ -506,7 +506,7 @@ def _build_flaps_aero_interp(num_nodes=0, aero_data=None, connect_training_data= dcl = interp_data.get_val('delta_lift_coefficient', 'unitless') defl = np.unique(interp_data.get_val('flap_deflection', 'deg') ) # units don't matter, not using values - alpha = np.unique(interp_data.get_val('angle_of_attack', 'deg') + alpha = np.unique(interp_data.get_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 'deg') ) # units don't matter, not using values mach = np.unique(interp_data.get_val(Dynamic.Atmosphere.MACH, 'unitless')) @@ -543,7 +543,7 @@ def _build_ground_aero_interp(num_nodes=0, aero_data=None, connect_training_data # aero_data is modified in-place, deepcopy required interp_data = aero_data.deepcopy() - required_inputs = {'hob', Dynamic.Atmosphere.MACH, 'angle_of_attack'} + required_inputs = {'hob', Dynamic.Atmosphere.MACH, Dynamic.Vehicle.ANGLE_OF_ATTACK} required_outputs = {'delta_lift_coefficient', 'delta_drag_coefficient'} missing_variables = [] @@ -558,7 +558,7 @@ def _build_ground_aero_interp(num_nodes=0, aero_data=None, connect_training_data f'variables: {missing_variables}') dcl = interp_data.get_val('delta_lift_coefficient', 'unitless') - alpha = np.unique(interp_data.get_val('angle_of_attack', 'deg') + alpha = np.unique(interp_data.get_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 'deg') ) # units don't matter, not using values mach = np.unique(interp_data.get_val(Dynamic.Atmosphere.MACH, 'unitless')) hob = np.unique(interp_data.get_val('hob', 'unitless')) @@ -608,7 +608,7 @@ def _structure_special_grid(aero_data): x0 = np.unique(data[0]) x1 = np.unique(data[1]) # units don't matter, not using values - aoa = aero_data.get_val('angle_of_attack', 'deg') + aoa = aero_data.get_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 'deg') if data[0].shape[0] > x0.shape[0]: # special case alpha - this format saturates alpha at its max @@ -619,6 +619,6 @@ def _structure_special_grid(aero_data): _, _, aoa = np.meshgrid(x0, x1, aoa) # put the aoa data back in the NamedValues object - aero_data.set_val('angle_of_attack', aoa.flatten(), 'deg') + aero_data.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, aoa.flatten(), 'deg') return aero_data diff --git a/aviary/subsystems/aerodynamics/gasp_based/test/test_table_based.py b/aviary/subsystems/aerodynamics/gasp_based/test/test_table_based.py index 3d9ad91cb..616a8d984 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/test/test_table_based.py +++ b/aviary/subsystems/aerodynamics/gasp_based/test/test_table_based.py @@ -27,7 +27,8 @@ def test_climb(self): prob.set_val( Dynamic.Atmosphere.MACH, [0.381, 0.384, 0.391, 0.399, 0.8, 0.8, 0.8, 0.8] ) - prob.set_val("alpha", [5.19, 5.19, 5.19, 5.18, 3.58, 3.81, 4.05, 4.18]) + prob.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, [5.19, 5.19, 5.19, 5.18, 3.58, 3.81, 4.05, 4.18]) prob.set_val( Dynamic.Mission.ALTITUDE, [500, 1000, 2000, 3000, 35000, 36000, 37000, 37500], @@ -57,7 +58,7 @@ def test_cruise(self): prob.setup(force_alloc_complex=True) prob.set_val(Dynamic.Atmosphere.MACH, [0.8, 0.8]) - prob.set_val("alpha", [4.216, 3.146]) + prob.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, [4.216, 3.146]) prob.set_val(Dynamic.Mission.ALTITUDE, [37500, 37500]) prob.run_model() @@ -103,7 +104,7 @@ def test_groundroll(self): prob.set_val("t_curr", [0.0, 1.0, 2.0, 3.0]) prob.set_val(Dynamic.Mission.ALTITUDE, 0) prob.set_val(Dynamic.Atmosphere.MACH, [0.0, 0.009, 0.018, 0.026]) - prob.set_val("alpha", 0) + prob.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 0) # TODO set q if we want to test lift/drag forces prob.set_val("flap_defl", self.flap_defl_to) @@ -147,7 +148,7 @@ def test_takeoff(self): Dynamic.Atmosphere.MACH, [0.257, 0.260, 0.263, 0.265, 0.276, 0.277, 0.279, 0.280], ) - prob.set_val("alpha", [8.94, 8.74, 8.44, 8.24, 6.45, 6.34, 6.76, 7.59]) + prob.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, [8.94, 8.74, 8.44, 8.24, 6.45, 6.34, 6.76, 7.59]) # TODO set q if we want to test lift/drag forces prob.set_val(Aircraft.Wing.AREA, 1370) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 6ef0e83de..dca9eb8b9 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -6328,6 +6328,14 @@ # \/ \___| |_| |_| |_| \___| |_| \___| # ================================================ +add_meta_data( + Dynamic.Vehicle.ANGLE_OF_ATTACK, + meta_data=_MetaData, + historical_name={"GASP": None, "FLOPS": None, "LEAPS1": None}, + units='deg', + desc="Angle between aircraft wing cord and relative wind", +) + add_meta_data( Dynamic.Vehicle.BATTERY_STATE_OF_CHARGE, meta_data=_MetaData, diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index f9ad1c69e..ec7f6404e 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -649,6 +649,7 @@ class Mission: class Vehicle: """Vehicle properties and states in a vehicle-fixed reference frame.""" + ANGLE_OF_ATTACK = 'angle_of_attack' BATTERY_STATE_OF_CHARGE = 'battery_state_of_charge' CUMULATIVE_ELECTRIC_ENERGY_USED = 'cumulative_electric_energy_used' DRAG = 'drag' From 6431f698957d24f69ca7722213e7d9f83dcac034 Mon Sep 17 00:00:00 2001 From: Nathan Perreau Date: Mon, 27 Jan 2025 13:13:07 -0500 Subject: [PATCH 2/6] Changes being made to follow proper syntax. Needed to pass pre-commit checks --- .../phases/detailed_takeoff_phases.py | 9 ++- aviary/models/N3CC/N3CC_data.py | 66 ++++++++++++------- .../flops_based/solved_alpha_group.py | 3 +- .../flops_based/takeoff_aero_group.py | 3 +- .../aerodynamics/gasp_based/table_based.py | 3 +- .../gasp_based/test/test_table_based.py | 3 +- 6 files changed, 58 insertions(+), 29 deletions(-) diff --git a/aviary/mission/flops_based/phases/detailed_takeoff_phases.py b/aviary/mission/flops_based/phases/detailed_takeoff_phases.py index 4ead8b28c..0f69c4b56 100644 --- a/aviary/mission/flops_based/phases/detailed_takeoff_phases.py +++ b/aviary/mission/flops_based/phases/detailed_takeoff_phases.py @@ -212,7 +212,8 @@ def build_phase(self, aviary_options=None): opt=False ) - phase.add_parameter(Dynamic.Vehicle.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, @@ -393,7 +394,8 @@ def build_phase(self, aviary_options=None): phase.add_boundary_constraint('v_over_v_stall', loc='final', lower=1.2, ref=1.2) - phase.add_parameter(Dynamic.Vehicle.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, @@ -2364,7 +2366,8 @@ def build_phase(self, aviary_options=None): opt=False ) - phase.add_parameter(Dynamic.Vehicle.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') return phase diff --git a/aviary/models/N3CC/N3CC_data.py b/aviary/models/N3CC/N3CC_data.py index 93564faa5..37dfdcadc 100644 --- a/aviary/models/N3CC/N3CC_data.py +++ b/aviary/models/N3CC/N3CC_data.py @@ -519,7 +519,8 @@ takeoff_brake_release_initial_guesses.set_val('mass', gross_mass, gross_mass_units) takeoff_brake_release_initial_guesses.set_val('throttle', 1.) -takeoff_brake_release_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') +takeoff_brake_release_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') takeoff_brake_release_builder = TakeoffBrakeReleaseToDecisionSpeed( 'takeoff_brake_release', @@ -548,7 +549,8 @@ takeoff_decision_speed_initial_guesses.set_val('velocity', [150., 160.], 'kn') takeoff_decision_speed_initial_guesses.set_val('mass', gross_mass, gross_mass_units) takeoff_decision_speed_initial_guesses.set_val('throttle', 1.) -takeoff_decision_speed_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') +takeoff_decision_speed_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') takeoff_decision_speed_builder = TakeoffDecisionSpeedToRotate( 'takeoff_decision_speed', @@ -576,7 +578,8 @@ takeoff_rotate_initial_guesses.set_val('distance', [4500, 4800.0], 'ft') takeoff_rotate_initial_guesses.set_val('velocity', [160., 160.0], 'kn') takeoff_rotate_initial_guesses.set_val('throttle', 1.) -takeoff_rotate_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, [0., 8.], 'deg') +takeoff_rotate_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, [0., 8.], 'deg') takeoff_rotate_initial_guesses.set_val('mass', gross_mass, gross_mass_units) takeoff_rotate_builder = TakeoffRotateToLiftoff( @@ -613,7 +616,8 @@ takeoff_liftoff_initial_guesses.set_val( Dynamic.Mission.FLIGHT_PATH_ANGLE, [0, 6.0], 'deg' ) -takeoff_liftoff_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 8.117, 'deg') +takeoff_liftoff_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 8.117, 'deg') takeoff_liftoff_initial_guesses.set_val('mass', gross_mass, gross_mass_units) takeoff_liftoff_builder = TakeoffLiftoffToObstacle( @@ -657,7 +661,8 @@ takeoff_mic_p2_initial_guesses.set_val( Dynamic.Mission.FLIGHT_PATH_ANGLE, [7.0, 10.0], 'deg' ) -takeoff_mic_p2_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 8.117, 'deg') +takeoff_mic_p2_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 8.117, 'deg') takeoff_mic_p2_initial_guesses.set_val('mass', gross_mass, gross_mass_units) takeoff_mic_p2_builder = TakeoffObstacleToMicP2( @@ -714,7 +719,8 @@ Dynamic.Mission.FLIGHT_PATH_ANGLE, [11.0, 10.0], 'deg' ) -takeoff_mic_p2_to_engine_cutback_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.0, 'deg') +takeoff_mic_p2_to_engine_cutback_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.0, 'deg') takeoff_mic_p2_to_engine_cutback_initial_guesses.set_val( 'mass', gross_mass, gross_mass_units) @@ -770,7 +776,8 @@ Dynamic.Mission.FLIGHT_PATH_ANGLE, [10.0, 10.0], 'deg' ) -takeoff_engine_cutback_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.0, 'deg') +takeoff_engine_cutback_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.0, 'deg') takeoff_engine_cutback_initial_guesses.set_val('mass', gross_mass, gross_mass_units) takeoff_engine_cutback_builder = TakeoffEngineCutback( @@ -831,7 +838,8 @@ takeoff_engine_cutback_to_mic_p1_initial_guesses.set_val( Dynamic.Mission.FLIGHT_PATH_ANGLE, 2.29, 'deg' ) -takeoff_engine_cutback_to_mic_p1_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.0, 'deg') +takeoff_engine_cutback_to_mic_p1_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.0, 'deg') takeoff_engine_cutback_to_mic_p1_initial_guesses.set_val( 'mass', gross_mass, gross_mass_units) @@ -879,7 +887,8 @@ takeoff_mic_p1_to_climb_initial_guesses.set_val( Dynamic.Mission.FLIGHT_PATH_ANGLE, 2.29, 'deg' ) -takeoff_mic_p1_to_climb_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.0, 'deg') +takeoff_mic_p1_to_climb_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.0, 'deg') takeoff_mic_p1_to_climb_initial_guesses.set_val('mass', gross_mass, gross_mass_units) takeoff_mic_p1_to_climb_builder = TakeoffMicP1ToClimb( @@ -909,7 +918,8 @@ detailed_takeoff.set_val( Dynamic.Vehicle.Propulsion.THRUST_TOTAL, [44038.8, 34103.4, 33929.0, 33638.2], 'lbf') -detailed_takeoff.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, [0.000, 3.600, 8.117, 8.117], 'deg') +detailed_takeoff.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, + [0.000, 3.600, 8.117, 8.117], 'deg') detailed_takeoff.set_val( Dynamic.Mission.FLIGHT_PATH_ANGLE, [0.000, 0.000, 0.612, 4.096], 'deg' ) @@ -981,7 +991,8 @@ def _split_aviary_values(aviary_values, slicing): balanced_brake_release_initial_guesses.set_val('velocity', [0.01, 150.], 'kn') balanced_brake_release_initial_guesses.set_val('mass', gross_mass, gross_mass_units) balanced_brake_release_initial_guesses.set_val('throttle', 1.) -balanced_brake_release_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') +balanced_brake_release_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') balanced_brake_release_builder = TakeoffBrakeReleaseToDecisionSpeed( 'balanced_brake_release', @@ -1011,7 +1022,8 @@ def _split_aviary_values(aviary_values, slicing): balanced_decision_speed_initial_guesses.set_val('velocity', [150., 160.], 'kn') balanced_decision_speed_initial_guesses.set_val('mass', gross_mass, gross_mass_units) balanced_decision_speed_initial_guesses.set_val('throttle', engine_out_throttle) -balanced_decision_speed_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') +balanced_decision_speed_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') balanced_decision_speed_builder = TakeoffDecisionSpeedToRotate( 'balanced_decision_speed', @@ -1038,7 +1050,8 @@ def _split_aviary_values(aviary_values, slicing): balanced_rotate_initial_guesses.set_val('distance', [4500., 4800.], 'ft') balanced_rotate_initial_guesses.set_val('velocity', [160., 160.], 'kn') balanced_rotate_initial_guesses.set_val('throttle', engine_out_throttle) -balanced_rotate_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, [0., 8.], 'deg') +balanced_rotate_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, + [0., 8.], 'deg') balanced_rotate_initial_guesses.set_val('mass', gross_mass, gross_mass_units) balanced_rotate_builder = TakeoffRotateToLiftoff( @@ -1074,7 +1087,8 @@ def _split_aviary_values(aviary_values, slicing): balanced_liftoff_initial_guesses.set_val( Dynamic.Mission.FLIGHT_PATH_ANGLE, [0.0, 5.0], 'deg' ) -balanced_liftoff_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 8.117, 'deg') +balanced_liftoff_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 8.117, 'deg') balanced_liftoff_initial_guesses.set_val('mass', gross_mass, gross_mass_units) balanced_liftoff_builder = TakeoffLiftoffToObstacle( @@ -1101,7 +1115,8 @@ def _split_aviary_values(aviary_values, slicing): balanced_delayed_brake_initial_guesses.set_val('velocity', [150., 150.], 'kn') balanced_delayed_brake_initial_guesses.set_val('mass', gross_mass, gross_mass_units) balanced_delayed_brake_initial_guesses.set_val('throttle', engine_out_throttle) -balanced_delayed_brake_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') +balanced_delayed_brake_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') # NOTE: no special handling required; re-use existing phase builder type balanced_delayed_brake_builder = TakeoffDecisionSpeedBrakeDelay( @@ -1128,7 +1143,8 @@ def _split_aviary_values(aviary_values, slicing): balanced_abort_initial_guesses.set_val('velocity', [150., 0.01], 'kn') balanced_abort_initial_guesses.set_val('mass', gross_mass, gross_mass_units) balanced_abort_initial_guesses.set_val('throttle', 0.) -balanced_abort_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') +balanced_abort_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') balanced_abort_builder = TakeoffBrakeToAbort( 'balanced_abort', @@ -1409,7 +1425,8 @@ def _split_aviary_values(aviary_values, slicing): Dynamic.Mission.FLIGHT_PATH_ANGLE, [apr_angle, apr_angle], 'deg' ) -landing_approach_to_mic_p3_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.25, 'deg') +landing_approach_to_mic_p3_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.25, 'deg') landing_approach_to_mic_p3_builder = LandingApproachToMicP3( 'landing_approach_to_mic_p3', @@ -1461,7 +1478,8 @@ def _split_aviary_values(aviary_values, slicing): Dynamic.Mission.FLIGHT_PATH_ANGLE, [apr_angle, apr_angle], 'deg' ) -landing_mic_p3_to_obstacle_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.25, 'deg') +landing_mic_p3_to_obstacle_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.25, 'deg') landing_mic_p3_to_obstacle_builder = LandingMicP3ToObstacle( 'landing_mic_p3_to_obstacle', @@ -1500,7 +1518,8 @@ def _split_aviary_values(aviary_values, slicing): Dynamic.Mission.FLIGHT_PATH_ANGLE, [apr_angle, apr_angle], 'deg' ) -landing_obstacle_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.2, 'deg') +landing_obstacle_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.2, 'deg') landing_obstacle_builder = LandingObstacleToFlare( 'landing_obstacle', @@ -1541,7 +1560,8 @@ def _split_aviary_values(aviary_values, slicing): landing_flare_initial_guesses.set_val( Dynamic.Mission.FLIGHT_PATH_ANGLE, [apr_angle, 0.0], 'deg' ) -landing_flare_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, [5.2, 7.5], 'deg') +landing_flare_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, [5.2, 7.5], 'deg') landing_flare_builder = LandingFlareToTouchdown( 'landing_flare', @@ -1574,7 +1594,8 @@ def _split_aviary_values(aviary_values, slicing): landing_touchdown_initial_guesses.set_val('velocity', [140., 135.], 'kn') landing_touchdown_initial_guesses.set_val('mass', detailed_landing_mass, 'lbm') landing_touchdown_initial_guesses.set_val('throttle', 0.) -landing_touchdown_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, [7.5, 0.0], 'deg') +landing_touchdown_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, [7.5, 0.0], 'deg') landing_touchdown_builder = LandingTouchdownToNoseDown( 'landing_touchdown', @@ -1606,7 +1627,8 @@ def _split_aviary_values(aviary_values, slicing): landing_fullstop_initial_guesses.set_val('velocity', [135., 0.01], 'kn') landing_fullstop_initial_guesses.set_val('mass', detailed_landing_mass, 'lbm') landing_fullstop_initial_guesses.set_val('throttle', 0.) -landing_fullstop_initial_guesses.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') +landing_fullstop_initial_guesses.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 0., 'deg') landing_fullstop_builder = LandingNoseDownToStop( 'landing_fullstop', diff --git a/aviary/subsystems/aerodynamics/flops_based/solved_alpha_group.py b/aviary/subsystems/aerodynamics/flops_based/solved_alpha_group.py index b0a8c386f..c350e0ba3 100644 --- a/aviary/subsystems/aerodynamics/flops_based/solved_alpha_group.py +++ b/aviary/subsystems/aerodynamics/flops_based/solved_alpha_group.py @@ -90,7 +90,8 @@ def setup(self): ) balance = self.add_subsystem('balance', om.BalanceComp()) - balance.add_balance('angle_of_attack', val=np.ones(nn), units='deg', res_ref=1.0e6) + balance.add_balance('angle_of_attack', val=np.ones(nn), + units='deg', res_ref=1.0e6) self.connect('balance.angle_of_attack', 'tabular_aero.angle_of_attack') self.connect('needed_lift.lift_resid', 'balance.lhs:angle_of_attack') diff --git a/aviary/subsystems/aerodynamics/flops_based/takeoff_aero_group.py b/aviary/subsystems/aerodynamics/flops_based/takeoff_aero_group.py index c1d5213de..d3d908272 100644 --- a/aviary/subsystems/aerodynamics/flops_based/takeoff_aero_group.py +++ b/aviary/subsystems/aerodynamics/flops_based/takeoff_aero_group.py @@ -108,7 +108,8 @@ def setup(self): promotes_inputs=inputs, ) - takeoff_polar.add_input(Dynamic.Vehicle.ANGLE_OF_ATTACK, angles_of_attack, units='rad') + takeoff_polar.add_input(Dynamic.Vehicle.ANGLE_OF_ATTACK, + angles_of_attack, units='rad') takeoff_polar.add_output('lift_coefficient', lift_coefficients, units='unitless') takeoff_polar.add_output('drag_coefficient', drag_coefficients, units='unitless') diff --git a/aviary/subsystems/aerodynamics/gasp_based/table_based.py b/aviary/subsystems/aerodynamics/gasp_based/table_based.py index 3ef7fa7fc..c5d40e5f5 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/table_based.py +++ b/aviary/subsystems/aerodynamics/gasp_based/table_based.py @@ -489,7 +489,8 @@ def _build_flaps_aero_interp(num_nodes=0, aero_data=None, connect_training_data= interp_data = _structure_special_grid(interp_data) - required_inputs = {'flap_deflection', Dynamic.Atmosphere.MACH, Dynamic.Vehicle.ANGLE_OF_ATTACK} + required_inputs = {'flap_deflection', + Dynamic.Atmosphere.MACH, Dynamic.Vehicle.ANGLE_OF_ATTACK} required_outputs = {'delta_lift_coefficient', 'delta_drag_coefficient'} missing_variables = [] diff --git a/aviary/subsystems/aerodynamics/gasp_based/test/test_table_based.py b/aviary/subsystems/aerodynamics/gasp_based/test/test_table_based.py index 616a8d984..f6531c666 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/test/test_table_based.py +++ b/aviary/subsystems/aerodynamics/gasp_based/test/test_table_based.py @@ -148,7 +148,8 @@ def test_takeoff(self): Dynamic.Atmosphere.MACH, [0.257, 0.260, 0.263, 0.265, 0.276, 0.277, 0.279, 0.280], ) - prob.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, [8.94, 8.74, 8.44, 8.24, 6.45, 6.34, 6.76, 7.59]) + prob.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, + [8.94, 8.74, 8.44, 8.24, 6.45, 6.34, 6.76, 7.59]) # TODO set q if we want to test lift/drag forces prob.set_val(Aircraft.Wing.AREA, 1370) From 1a0738373e7531e1835dfd9991a0bcec9fe06408 Mon Sep 17 00:00:00 2001 From: Nathan Perreau Date: Mon, 27 Jan 2025 16:15:14 -0500 Subject: [PATCH 3/6] Small commit to fix an autopep8 error --- aviary/mission/flops_based/phases/detailed_landing_phases.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aviary/mission/flops_based/phases/detailed_landing_phases.py b/aviary/mission/flops_based/phases/detailed_landing_phases.py index 6846c0d1a..bee57217f 100644 --- a/aviary/mission/flops_based/phases/detailed_landing_phases.py +++ b/aviary/mission/flops_based/phases/detailed_landing_phases.py @@ -1155,7 +1155,8 @@ def build_phase(self, aviary_options=None): opt=False ) - phase.add_parameter(Dynamic.Vehicle.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, From 3e68388c5292ff08295ecd56f0d783a167b81d4c Mon Sep 17 00:00:00 2001 From: jkirk5 Date: Fri, 31 Jan 2025 13:24:22 -0500 Subject: [PATCH 4/6] update "alpha" to Dynamic.Vehicle.ANGLE_OF_ATTACK --- .../run_detailed_takeoff_in_level2.py | 160 +++++++++--------- .../interface/default_phase_info/two_dof.py | 114 ++++++------- aviary/interface/methods_for_level2.py | 12 +- aviary/mission/flight_phase_builder.py | 2 +- .../flops_based/phases/groundroll_phase.py | 2 +- aviary/mission/gasp_based/ode/accel_ode.py | 8 +- aviary/mission/gasp_based/ode/ascent_eom.py | 37 ++-- aviary/mission/gasp_based/ode/ascent_ode.py | 6 +- aviary/mission/gasp_based/ode/base_ode.py | 27 +-- aviary/mission/gasp_based/ode/climb_ode.py | 2 +- .../ode/constraints/flight_constraints.py | 10 +- .../test/test_flight_constraints.py | 4 +- aviary/mission/gasp_based/ode/descent_eom.py | 10 +- aviary/mission/gasp_based/ode/descent_ode.py | 4 +- .../mission/gasp_based/ode/flight_path_eom.py | 40 +++-- .../mission/gasp_based/ode/flight_path_ode.py | 10 +- .../mission/gasp_based/ode/groundroll_eom.py | 27 ++- .../mission/gasp_based/ode/groundroll_ode.py | 7 +- aviary/mission/gasp_based/ode/landing_ode.py | 2 +- aviary/mission/gasp_based/ode/rotation_eom.py | 27 ++- aviary/mission/gasp_based/ode/rotation_ode.py | 15 +- .../gasp_based/ode/test/test_ascent_eom.py | 8 +- .../gasp_based/ode/test/test_climb_ode.py | 4 +- .../gasp_based/ode/test/test_descent_eom.py | 8 +- .../gasp_based/ode/test/test_descent_ode.py | 4 +- .../ode/test/test_groundroll_eom.py | 8 +- .../gasp_based/ode/test/test_landing_ode.py | 4 +- .../gasp_based/ode/test/test_rotation_eom.py | 8 +- .../gasp_based/ode/test/test_rotation_ode.py | 2 +- .../unsteady_solved/test/test_gamma_comp.py | 6 +- .../test_unsteady_alpha_thrust_iter_group.py | 12 +- .../test/test_unsteady_solved_eom.py | 10 +- .../test/test_unsteady_solved_ode.py | 8 +- .../unsteady_control_iter_group.py | 16 +- .../unsteady_solved/unsteady_solved_eom.py | 52 ++++-- .../unsteady_solved/unsteady_solved_ode.py | 23 +-- .../mission/gasp_based/phases/accel_phase.py | 6 +- .../mission/gasp_based/phases/ascent_phase.py | 7 +- .../mission/gasp_based/phases/climb_phase.py | 6 +- .../gasp_based/phases/descent_phase.py | 6 +- .../gasp_based/phases/rotation_phase.py | 6 +- .../phases/time_integration_phases.py | 24 +-- aviary/mission/twodof_phase.py | 23 ++- .../aerodynamics/aerodynamics_builder.py | 6 +- .../test/test_solved_aero_group.py | 12 +- .../aerodynamics/gasp_based/gaspaero.py | 52 ++++-- .../gasp_based/test/test_gaspaero.py | 18 +- 47 files changed, 516 insertions(+), 349 deletions(-) diff --git a/aviary/examples/run_detailed_takeoff_in_level2.py b/aviary/examples/run_detailed_takeoff_in_level2.py index 4a79899c2..d5fee84b8 100644 --- a/aviary/examples/run_detailed_takeoff_in_level2.py +++ b/aviary/examples/run_detailed_takeoff_in_level2.py @@ -35,15 +35,15 @@ 'order': 3, 'fix_initial': True, 'ground_roll': True, - 'duration_ref': (100., 'kn'), - 'duration_bounds': ((100., 500.), 'kn'), + 'duration_ref': (100.0, 'kn'), + 'duration_bounds': ((100.0, 500.0), 'kn'), }, 'subsystem_options': subsystem_options, 'initial_guesses': { - 'distance': [(0., 2.e3), 'ft'], - 'time': [(0., 20.), 's'], - 'velocity': [(1., 120.), 'kn'], - 'mass': [(175.e3, 174.85e3), 'lbm'], + 'distance': [(0.0, 2.0e3), 'ft'], + 'time': [(0.0, 20.0), 's'], + 'velocity': [(1.0, 120.0), 'kn'], + 'mass': [(175.0e3, 174.85e3), 'lbm'], }, }, 'rotate': { @@ -53,10 +53,10 @@ 'fix_initial': False, 'ground_roll': True, 'clean': False, - 'initial_ref': (1.e3, 'ft'), - 'initial_bounds': ((1.e3, 3.e3), 'ft'), - 'duration_ref': (1.e3, 'ft'), - 'duration_bounds': ((200., 2.e3), 'ft'), + 'initial_ref': (1.0e3, 'ft'), + 'initial_bounds': ((1.0e3, 3.0e3), 'ft'), + 'duration_ref': (1.0e3, 'ft'), + 'duration_bounds': ((200.0, 2.0e3), 'ft'), 'mach_bounds': ((0.18, 0.2), 'unitless'), 'polynomial_control_order': 1, 'throttle_enforcement': 'boundary_constraint', @@ -65,24 +65,24 @@ 'rotation': True, 'initial_mach': (0.18, 'unitless'), 'final_mach': (0.2, 'unitless'), - 'initial_altitude': (0., 'ft'), - 'final_altitude': (0., 'ft'), + 'initial_altitude': (0.0, 'ft'), + 'final_altitude': (0.0, 'ft'), 'constraints': { 'normal_force': { - 'equals': 0., + 'equals': 0.0, 'loc': 'final', 'units': 'lbf', 'type': 'boundary', - 'ref': 10.e5, + 'ref': 10.0e5, }, }, }, 'subsystem_options': subsystem_options, 'initial_guesses': { - 'distance': [(2.e3, 1.e3), 'ft'], - 'time': [(20., 25.), 's'], + 'distance': [(2.0e3, 1.0e3), 'ft'], + 'time': [(20.0, 25.0), 's'], 'mass': [(174.85e3, 174.84e3), 'lbm'], - 'alpha': [(0., 12.), 'deg'], + Dynamic.Vehicle.ANGLE_OF_ATTACK: [(0.0, 12.0), 'deg'], }, }, 'BC': { @@ -92,16 +92,16 @@ 'fix_initial': False, 'ground_roll': False, 'clean': False, - 'initial_ref': (1.e3, 'ft'), - 'initial_bounds': ((1., 16.e3), 'ft'), - 'duration_ref': (1.e3, 'ft'), - 'duration_bounds': ((500., 1500.), 'ft'), + 'initial_ref': (1.0e3, 'ft'), + 'initial_bounds': ((1.0, 16.0e3), 'ft'), + 'duration_ref': (1.0e3, 'ft'), + 'duration_bounds': ((500.0, 1500.0), 'ft'), 'mach_bounds': ((0.2, 0.22), 'unitless'), - 'altitude_bounds': ((0., 250.), 'ft'), + 'altitude_bounds': ((0.0, 250.0), 'ft'), 'initial_mach': (0.2, 'unitless'), 'final_mach': (0.22, 'unitless'), - 'initial_altitude': (0., 'ft'), - 'final_altitude': (50., 'ft'), + 'initial_altitude': (0.0, 'ft'), + 'final_altitude': (50.0, 'ft'), 'polynomial_control_order': 1, 'throttle_enforcement': 'boundary_constraint', 'optimize_mach': optimize_mach, @@ -110,8 +110,8 @@ }, 'subsystem_options': subsystem_options, 'initial_guesses': { - 'distance': [(3.e3, 1.e3), 'ft'], - 'time': [(25., 35.), 's'], + 'distance': [(3.0e3, 1.0e3), 'ft'], + 'time': [(25.0, 35.0), 's'], 'mass': [(174.84e3, 174.82e3), 'lbm'], }, }, @@ -122,23 +122,23 @@ 'fix_initial': False, 'ground_roll': False, 'clean': False, - 'initial_ref': (1.e3, 'ft'), - 'initial_bounds': ((1.e3, 20.e3), 'ft'), - 'duration_ref': (1.e3, 'ft'), - 'duration_bounds': ((3.e3, 20.e3), 'ft'), + 'initial_ref': (1.0e3, 'ft'), + 'initial_bounds': ((1.0e3, 20.0e3), 'ft'), + 'duration_ref': (1.0e3, 'ft'), + 'duration_bounds': ((3.0e3, 20.0e3), 'ft'), 'mach_bounds': ((0.22, 0.3), 'unitless'), - 'altitude_bounds': ((0., 985.), 'ft'), + 'altitude_bounds': ((0.0, 985.0), 'ft'), 'initial_mach': (0.22, 'unitless'), 'final_mach': (0.3, 'unitless'), - 'initial_altitude': (50., 'ft'), - 'final_altitude': (985., 'ft'), + 'initial_altitude': (50.0, 'ft'), + 'final_altitude': (985.0, 'ft'), 'polynomial_control_order': 1, 'throttle_enforcement': 'boundary_constraint', 'optimize_mach': optimize_mach, 'optimize_altitude': optimize_altitude, 'constraints': { 'altitude': { - 'equals': 985., + 'equals': 985.0, 'loc': 'final', 'units': 'ft', 'type': 'boundary', @@ -147,8 +147,8 @@ }, 'subsystem_options': subsystem_options, 'initial_guesses': { - 'distance': [(4.e3, 10.e3), 'ft'], - 'time': [(35., 60.), 's'], + 'distance': [(4.0e3, 10.0e3), 'ft'], + 'time': [(35.0, 60.0), 's'], 'mass': [(174.82e3, 174.8e3), 'lbm'], }, }, @@ -159,24 +159,24 @@ 'fix_initial': False, 'ground_roll': False, 'clean': False, - 'initial_ref': (1.e3, 'ft'), - 'initial_bounds': ((1.e3, 20.e3), 'ft'), - 'duration_ref': (1.e3, 'ft'), - 'duration_bounds': ((3.e3, 20.e3), 'ft'), + 'initial_ref': (1.0e3, 'ft'), + 'initial_bounds': ((1.0e3, 20.0e3), 'ft'), + 'duration_ref': (1.0e3, 'ft'), + 'duration_bounds': ((3.0e3, 20.0e3), 'ft'), 'mach_bounds': ((0.22, 0.3), 'unitless'), - 'altitude_bounds': ((985., 1100.), 'ft'), + 'altitude_bounds': ((985.0, 1100.0), 'ft'), 'initial_mach': (0.22, 'unitless'), 'final_mach': (0.3, 'unitless'), - 'initial_altitude': (985., 'ft'), - 'final_altitude': (1100., 'ft'), + 'initial_altitude': (985.0, 'ft'), + 'final_altitude': (1100.0, 'ft'), 'polynomial_control_order': 1, 'throttle_enforcement': 'path_constraint', 'optimize_mach': optimize_mach, 'optimize_altitude': optimize_altitude, 'constraints': { 'distance': { - 'upper': 19.e3, - 'ref': 20.e3, + 'upper': 19.0e3, + 'ref': 20.0e3, 'loc': 'final', 'units': 'ft', 'type': 'boundary', @@ -185,8 +185,8 @@ }, 'subsystem_options': subsystem_options, 'initial_guesses': { - 'distance': [(10.e3, 14.e3), 'ft'], - 'time': [(60., 80.), 's'], + 'distance': [(10.0e3, 14.0e3), 'ft'], + 'time': [(60.0, 80.0), 's'], 'mass': [(174.8e3, 174.5e3), 'lbm'], }, }, @@ -197,23 +197,23 @@ 'fix_initial': False, 'ground_roll': False, 'clean': False, - 'initial_ref': (1.e3, 'ft'), - 'initial_bounds': ((500., 30.e3), 'ft'), - 'duration_ref': (1.e3, 'ft'), - 'duration_bounds': ((50., 5000.), 'ft'), + 'initial_ref': (1.0e3, 'ft'), + 'initial_bounds': ((500.0, 30.0e3), 'ft'), + 'duration_ref': (1.0e3, 'ft'), + 'duration_bounds': ((50.0, 5000.0), 'ft'), 'mach_bounds': ((0.24, 0.32), 'unitless'), - 'altitude_bounds': ((985., 1.5e3), 'ft'), + 'altitude_bounds': ((985.0, 1.5e3), 'ft'), 'initial_mach': (0.3, 'unitless'), 'final_mach': (0.3, 'unitless'), - 'initial_altitude': (1100., 'ft'), - 'final_altitude': (1200., 'ft'), + 'initial_altitude': (1100.0, 'ft'), + 'final_altitude': (1200.0, 'ft'), 'polynomial_control_order': 2, 'optimize_mach': optimize_mach, 'optimize_altitude': optimize_altitude, 'throttle_enforcement': 'path_constraint', 'constraints': { 'flight_path_angle': { - 'equals': 4., + 'equals': 4.0, 'loc': 'final', 'units': 'deg', 'type': 'boundary', @@ -222,9 +222,9 @@ }, 'subsystem_options': subsystem_options, 'initial_guesses': { - 'distance': [(18.e3, 2.e3), 'ft'], + 'distance': [(18.0e3, 2.0e3), 'ft'], 'mass': [(174.5e3, 174.4e3), 'lbm'], - 'time': [(80., 85.), 's'], + 'time': [(80.0, 85.0), 's'], }, }, 'EF_to_P1': { @@ -234,30 +234,30 @@ 'fix_initial': False, 'ground_roll': False, 'clean': False, - 'initial_ref': (1.e3, 'ft'), - 'initial_bounds': ((500., 50.e3), 'ft'), - 'duration_ref': (1.e3, 'ft'), - 'duration_bounds': ((1.e3, 20.e3), 'ft'), + 'initial_ref': (1.0e3, 'ft'), + 'initial_bounds': ((500.0, 50.0e3), 'ft'), + 'duration_ref': (1.0e3, 'ft'), + 'duration_bounds': ((1.0e3, 20.0e3), 'ft'), 'mach_bounds': ((0.24, 0.32), 'unitless'), 'altitude_bounds': ((1.1e3, 1.2e3), 'ft'), 'initial_mach': (0.3, 'unitless'), 'final_mach': (0.3, 'unitless'), - 'initial_altitude': (1100., 'ft'), - 'final_altitude': (1200., 'ft'), + 'initial_altitude': (1100.0, 'ft'), + 'final_altitude': (1200.0, 'ft'), 'polynomial_control_order': 1, 'optimize_mach': optimize_mach, 'optimize_altitude': optimize_altitude, 'throttle_enforcement': 'bounded', 'constraints': { 'distance': { - 'equals': 21325., + 'equals': 21325.0, 'units': 'ft', 'type': 'boundary', 'loc': 'final', - 'ref': 30.e3, + 'ref': 30.0e3, }, 'flight_path_angle': { - 'equals': 4., + 'equals': 4.0, 'loc': 'final', 'units': 'deg', 'type': 'boundary', @@ -266,9 +266,9 @@ }, 'subsystem_options': subsystem_options, 'initial_guesses': { - 'distance': [(20.e3, 1325.), 'ft'], + 'distance': [(20.0e3, 1325.0), 'ft'], 'mass': [(174.4e3, 174.3e3), 'lbm'], - 'time': [(85., 90.), 's'], + 'time': [(85.0, 90.0), 's'], }, }, 'EF_past_P1': { @@ -278,41 +278,41 @@ 'fix_initial': False, 'ground_roll': False, 'clean': False, - 'initial_ref': (1.e3, 'ft'), - 'initial_bounds': ((20.e3, 50.e3), 'ft'), - 'duration_ref': (1.e3, 'ft'), - 'duration_bounds': ((100., 50.e3), 'ft'), + 'initial_ref': (1.0e3, 'ft'), + 'initial_bounds': ((20.0e3, 50.0e3), 'ft'), + 'duration_ref': (1.0e3, 'ft'), + 'duration_bounds': ((100.0, 50.0e3), 'ft'), 'mach_bounds': ((0.24, 0.32), 'unitless'), - 'altitude_bounds': ((1.e3, 3.e3), 'ft'), + 'altitude_bounds': ((1.0e3, 3.0e3), 'ft'), 'initial_mach': (0.3, 'unitless'), 'final_mach': (0.3, 'unitless'), - 'initial_altitude': (1200., 'ft'), - 'final_altitude': (2000., 'ft'), + 'initial_altitude': (1200.0, 'ft'), + 'final_altitude': (2000.0, 'ft'), 'polynomial_control_order': 1, 'optimize_mach': optimize_mach, 'optimize_altitude': optimize_altitude, 'throttle_enforcement': 'boundary_constraint', 'constraints': { 'flight_path_angle': { - 'equals': 4., + 'equals': 4.0, 'loc': 'final', 'units': 'deg', 'type': 'boundary', }, 'distance': { - 'equals': 30.e3, + 'equals': 30.0e3, 'units': 'ft', 'type': 'boundary', 'loc': 'final', - 'ref': 30.e3, + 'ref': 30.0e3, }, }, }, 'subsystem_options': subsystem_options, 'initial_guesses': { - 'distance': [(21325., 50.e3), 'ft'], + 'distance': [(21325.0, 50.0e3), 'ft'], 'mass': [(174.3e3, 174.2e3), 'lbm'], - 'time': [(90., 180.), 's'], + 'time': [(90.0, 180.0), 's'], }, }, "post_mission": { diff --git a/aviary/interface/default_phase_info/two_dof.py b/aviary/interface/default_phase_info/two_dof.py index e5dd9e40c..b86cfe67e 100644 --- a/aviary/interface/default_phase_info/two_dof.py +++ b/aviary/interface/default_phase_info/two_dof.py @@ -12,8 +12,8 @@ 'connect_initial_mass': False, 'fix_initial': True, 'fix_initial_mass': False, - 'duration_ref': (50., 's'), - 'duration_bounds': ((1., 100.), 's'), + 'duration_ref': (50.0, 's'), + 'duration_bounds': ((1.0, 100.0), 's'), 'velocity_lower': (0, 'kn'), 'velocity_upper': (1000, 'kn'), 'velocity_ref': (150, 'kn'), @@ -22,16 +22,16 @@ 'mass_ref': (150_000, 'lbm'), 'mass_defect_ref': (150_000, 'lbm'), 'distance_lower': (0, 'ft'), - 'distance_upper': (10.e3, 'ft'), + 'distance_upper': (10.0e3, 'ft'), 'distance_ref': (3000, 'ft'), 'distance_defect_ref': (3000, 'ft'), }, 'initial_guesses': { 'time': ([0.0, 40.0], 's'), 'velocity': ([0.066, 143.1], 'kn'), - 'distance': ([0.0, 1000.], 'ft'), + 'distance': ([0.0, 1000.0], 'ft'), 'throttle': ([0.956, 0.956], 'unitless'), - } + }, }, 'rotation': { 'user_options': { @@ -52,19 +52,19 @@ 'distance_upper': (10_000, 'ft'), 'distance_ref': (5000, 'ft'), 'distance_defect_ref': (5000, 'ft'), - 'angle_lower': (0., 'rad'), - 'angle_upper': (5., 'rad'), - 'angle_ref': (5., 'rad'), - 'angle_defect_ref': (5., 'rad'), + 'angle_lower': (0.0, 'rad'), + 'angle_upper': (5.0, 'rad'), + 'angle_ref': (5.0, 'rad'), + 'angle_defect_ref': (5.0, 'rad'), 'normal_ref': (10000, 'lbf'), }, 'initial_guesses': { 'time': ([40.0, 5.0], 's'), - 'alpha': ([0.0, 2.5], 'deg'), - 'velocity': ([143, 150.], 'kn'), + 'angle_of_attack': ([0.0, 2.5], 'deg'), + 'velocity': ([143, 150.0], 'kn'), 'distance': ([3680.37217765, 4000], 'ft'), 'throttle': ([0.956, 0.956], 'unitless'), - } + }, }, 'ascent': { 'user_options': { @@ -93,21 +93,21 @@ 'angle_upper': (20, 'rad'), 'angle_ref': (57.2958, 'deg'), 'angle_defect_ref': (57.2958, 'deg'), - 'pitch_constraint_lower': (0., 'deg'), - 'pitch_constraint_upper': (15., 'deg'), - 'pitch_constraint_ref': (1., 'deg'), + 'pitch_constraint_lower': (0.0, 'deg'), + 'pitch_constraint_upper': (15.0, 'deg'), + 'pitch_constraint_ref': (1.0, 'deg'), }, 'initial_guesses': { - 'time': ([45., 25.], 's'), - 'flight_path_angle': ([0.0, 8.], 'deg'), - 'alpha': ([2.5, 1.5], 'deg'), - 'velocity': ([150., 185.], 'kn'), - 'distance': ([4.e3, 10.e3], 'ft'), - 'altitude': ([0.0, 500.], 'ft'), + 'time': ([45.0, 25.0], 's'), + 'flight_path_angle': ([0.0, 8.0], 'deg'), + 'angle_of_attack': ([2.5, 1.5], 'deg'), + 'velocity': ([150.0, 185.0], 'kn'), + 'distance': ([4.0e3, 10.0e3], 'ft'), + 'altitude': ([0.0, 500.0], 'ft'), 'tau_gear': (0.2, 'unitless'), 'tau_flaps': (0.9, 'unitless'), 'throttle': ([0.956, 0.956], 'unitless'), - } + }, }, 'accel': { 'user_options': { @@ -132,11 +132,11 @@ 'distance_defect_ref': (5, 'NM'), }, 'initial_guesses': { - 'time': ([70., 13.], 's'), - 'velocity': ([185., 250.], 'kn'), - 'distance': ([10.e3, 20.e3], 'ft'), + 'time': ([70.0, 13.0], 's'), + 'velocity': ([185.0, 250.0], 'kn'), + 'distance': ([10.0e3, 20.0e3], 'ft'), 'throttle': ([0.956, 0.956], 'unitless'), - } + }, }, 'climb1': { 'user_options': { @@ -146,12 +146,12 @@ 'EAS_target': (250, 'kn'), 'mach_cruise': 0.8, 'target_mach': False, - 'final_altitude': (10.e3, 'ft'), + 'final_altitude': (10.0e3, 'ft'), 'duration_bounds': ((30, 300), 's'), 'duration_ref': (1000, 's'), 'alt_lower': (400, 'ft'), 'alt_upper': (11_000, 'ft'), - 'alt_ref': (10.e3, 'ft'), + 'alt_ref': (10.0e3, 'ft'), 'mass_lower': (0, 'lbm'), 'mass_upper': (None, 'lbm'), 'mass_ref': (150_000, 'lbm'), @@ -162,11 +162,11 @@ 'distance_ref0': (0, 'NM'), }, 'initial_guesses': { - 'time': ([1., 2.], 'min'), - 'distance': ([20.e3, 100.e3], 'ft'), - 'altitude': ([500., 10.e3], 'ft'), + 'time': ([1.0, 2.0], 'min'), + 'distance': ([20.0e3, 100.0e3], 'ft'), + 'altitude': ([500.0, 10.0e3], 'ft'), 'throttle': ([0.956, 0.956], 'unitless'), - } + }, }, 'climb2': { 'user_options': { @@ -195,11 +195,11 @@ 'distance_defect_ref': (500, 'NM'), }, 'initial_guesses': { - 'time': ([216., 1300.], 's'), - 'distance': ([100.e3, 200.e3], 'ft'), - 'altitude': ([10.e3, 37.5e3], 'ft'), + 'time': ([216.0, 1300.0], 's'), + 'distance': ([100.0e3, 200.0e3], 'ft'), + 'altitude': ([10.0e3, 37.5e3], 'ft'), 'throttle': ([0.956, 0.956], 'unitless'), - } + }, }, 'cruise': { 'user_options': { @@ -208,12 +208,12 @@ }, 'initial_guesses': { # [Initial mass, delta mass] for special cruise phase. - 'mass': ([171481., -35000], 'lbm'), - 'initial_distance': (200.e3, 'ft'), - 'initial_time': (1516., 's'), + 'mass': ([171481.0, -35000], 'lbm'), + 'initial_distance': (200.0e3, 'ft'), + 'initial_time': (1516.0, 's'), 'altitude': (37.5e3, 'ft'), 'mach': (0.8, 'unitless'), - } + }, }, 'desc1': { 'user_options': { @@ -224,8 +224,8 @@ 'EAS_limit': (350, 'kn'), 'mach_cruise': 0.8, 'input_speed_type': SpeedType.MACH, - 'final_altitude': (10.e3, 'ft'), - 'duration_bounds': ((300., 900.), 's'), + 'final_altitude': (10.0e3, 'ft'), + 'duration_bounds': ((300.0, 900.0), 's'), 'duration_ref': (1000, 's'), 'alt_lower': (1000, 'ft'), 'alt_upper': (40_000, 'ft'), @@ -237,19 +237,19 @@ 'mass_ref': (140_000, 'lbm'), 'mass_ref0': (0, 'lbm'), 'mass_defect_ref': (140_000, 'lbm'), - 'distance_lower': (3000., 'NM'), - 'distance_upper': (5000., 'NM'), + 'distance_lower': (3000.0, 'NM'), + 'distance_upper': (5000.0, 'NM'), 'distance_ref': (mission_distance, 'NM'), 'distance_ref0': (0, 'NM'), 'distance_defect_ref': (100, 'NM'), }, 'initial_guesses': { - 'mass': (136000., 'lbm'), - 'altitude': ([37.5e3, 10.e3], 'ft'), + 'mass': (136000.0, 'lbm'), + 'altitude': ([37.5e3, 10.0e3], 'ft'), 'throttle': ([0.0, 0.0], 'unitless'), - 'distance': ([.92*mission_distance, .96*mission_distance], 'NM'), - 'time': ([28000., 500.], 's'), - } + 'distance': ([0.92 * mission_distance, 0.96 * mission_distance], 'NM'), + 'time': ([28000.0, 500.0], 's'), + }, }, 'desc2': { 'user_options': { @@ -261,11 +261,11 @@ 'mach_cruise': 0.80, 'input_speed_type': SpeedType.EAS, 'final_altitude': (1000, 'ft'), - 'duration_bounds': ((100., 5000), 's'), + 'duration_bounds': ((100.0, 5000), 's'), 'duration_ref': (500, 's'), 'alt_lower': (500, 'ft'), 'alt_upper': (11_000, 'ft'), - 'alt_ref': (10.e3, 'ft'), + 'alt_ref': (10.0e3, 'ft'), 'alt_ref0': (1000, 'ft'), 'alt_constraint_ref': (1000, 'ft'), 'mass_lower': (0, 'lbm'), @@ -278,12 +278,12 @@ 'distance_defect_ref': (100, 'NM'), }, 'initial_guesses': { - 'mass': (136000., 'lbm'), - 'altitude': ([10.e3, 1.e3], 'ft'), - 'throttle': ([0., 0.], 'unitless'), - 'distance': ([.96*mission_distance, mission_distance], 'NM'), - 'time': ([28500., 500.], 's'), - } + 'mass': (136000.0, 'lbm'), + 'altitude': ([10.0e3, 1.0e3], 'ft'), + 'throttle': ([0.0, 0.0], 'unitless'), + 'distance': ([0.96 * mission_distance, mission_distance], 'NM'), + 'time': ([28500.0, 500.0], 's'), + }, }, } diff --git a/aviary/interface/methods_for_level2.py b/aviary/interface/methods_for_level2.py index 4e576bda9..22ba123fa 100644 --- a/aviary/interface/methods_for_level2.py +++ b/aviary/interface/methods_for_level2.py @@ -1558,7 +1558,11 @@ def link_phases(self): if len(phases) > 2: self.traj.link_phases( - phases[1:], ["alpha"], units='rad', connected=False) + phases[1:], + [Dynamic.Vehicle.ANGLE_OF_ATTACK], + units='rad', + connected=False, + ) elif self.mission_method is TWO_DEGREES_OF_FREEDOM: if self.analysis_scheme is AnalysisScheme.COLLOCATION: @@ -1593,7 +1597,7 @@ def link_phases(self): states_to_link[Dynamic.Mission.VELOCITY] = true_unless_mpi # if the first phase is rotation, we also need alpha if phase1 == 'rotation': - states_to_link['alpha'] = False + states_to_link[Dynamic.Vehicle.ANGLE_OF_ATTACK] = False for state, connected in states_to_link.items(): # in initial guesses, all of the states, other than time use @@ -2326,11 +2330,11 @@ def _add_guesses(self, phase_name, phase, guesses, setvalprob, parent_prefix): Dynamic.Mission.DISTANCE, Dynamic.Mission.VELOCITY, "flight_path_angle", - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, ] if self.mission_method is TWO_DEGREES_OF_FREEDOM and phase_name == 'ascent': # Alpha is a control for ascent. - control_keys.append('alpha') + control_keys.append(Dynamic.Vehicle.ANGLE_OF_ATTACK) prob_keys = ["tau_gear", "tau_flaps"] diff --git a/aviary/mission/flight_phase_builder.py b/aviary/mission/flight_phase_builder.py index d744efc20..3746d17f7 100644 --- a/aviary/mission/flight_phase_builder.py +++ b/aviary/mission/flight_phase_builder.py @@ -311,7 +311,7 @@ def build_phase(self, aviary_options: AviaryValues = None, phase_type=EquationsO if phase_type is EquationsOfMotion.SOLVED_2DOF: phase.add_timeseries_output(Dynamic.Mission.FLIGHT_PATH_ANGLE) - phase.add_timeseries_output("alpha") + phase.add_timeseries_output(Dynamic.Vehicle.ANGLE_OF_ATTACK) phase.add_timeseries_output( "fuselage_pitch", output_name="theta", units="deg") phase.add_timeseries_output("thrust_req", units="lbf") diff --git a/aviary/mission/flops_based/phases/groundroll_phase.py b/aviary/mission/flops_based/phases/groundroll_phase.py index 99ddfdf8a..1f2309653 100644 --- a/aviary/mission/flops_based/phases/groundroll_phase.py +++ b/aviary/mission/flops_based/phases/groundroll_phase.py @@ -116,7 +116,7 @@ def build_phase(self, aviary_options: AviaryValues = None): phase.add_timeseries_output("time") phase.add_timeseries_output("mass") phase.add_timeseries_output(Dynamic.Mission.ALTITUDE) - phase.add_timeseries_output("alpha") + phase.add_timeseries_output(Dynamic.Vehicle.ANGLE_OF_ATTACK) phase.add_timeseries_output(Dynamic.Mission.FLIGHT_PATH_ANGLE) phase.add_timeseries_output(Dynamic.Vehicle.Propulsion.THROTTLE) diff --git a/aviary/mission/gasp_based/ode/accel_ode.py b/aviary/mission/gasp_based/ode/accel_ode.py index 91781f45c..04ed7e4c9 100644 --- a/aviary/mission/gasp_based/ode/accel_ode.py +++ b/aviary/mission/gasp_based/ode/accel_ode.py @@ -47,8 +47,12 @@ def setup(self): promotes_outputs=["weight"], ) - kwargs = {'num_nodes': nn, 'aviary_inputs': aviary_options, - 'method': 'cruise', 'output_alpha': True} + kwargs = { + 'num_nodes': nn, + 'aviary_inputs': aviary_options, + 'method': 'cruise', + 'output_alpha': True, + } for subsystem in core_subsystems: system = subsystem.build_mission(**kwargs) if system is not None: diff --git a/aviary/mission/gasp_based/ode/ascent_eom.py b/aviary/mission/gasp_based/ode/ascent_eom.py index 761ed6d9f..df6d587e7 100644 --- a/aviary/mission/gasp_based/ode/ascent_eom.py +++ b/aviary/mission/gasp_based/ode/ascent_eom.py @@ -51,7 +51,12 @@ def setup(self): ) add_aviary_input(self, Aircraft.Wing.INCIDENCE, val=0, units="deg") - self.add_input("alpha", val=np.ones(nn), desc="angle of attack", units="deg") + self.add_input( + Dynamic.Vehicle.ANGLE_OF_ATTACK, + val=np.ones(nn), + desc="angle of attack", + units="deg", + ) self.add_output( Dynamic.Mission.VELOCITY_RATE, @@ -93,7 +98,7 @@ def setup_partials(self): Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE, [ Dynamic.Vehicle.Propulsion.THRUST_TOTAL, - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, Dynamic.Vehicle.LIFT, Dynamic.Vehicle.MASS, Dynamic.Mission.FLIGHT_PATH_ANGLE, @@ -112,7 +117,7 @@ def setup_partials(self): Dynamic.Vehicle.MASS, Dynamic.Mission.FLIGHT_PATH_ANGLE, Dynamic.Vehicle.Propulsion.THRUST_TOTAL, - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, ], rows=arange, cols=arange, @@ -123,7 +128,7 @@ def setup_partials(self): Dynamic.Mission.VELOCITY_RATE, [ Dynamic.Vehicle.Propulsion.THRUST_TOTAL, - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, Dynamic.Vehicle.DRAG, Dynamic.Vehicle.MASS, Dynamic.Mission.FLIGHT_PATH_ANGLE, @@ -151,7 +156,7 @@ def setup_partials(self): Dynamic.Vehicle.MASS, Dynamic.Vehicle.LIFT, Dynamic.Vehicle.Propulsion.THRUST_TOTAL, - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, ], rows=arange, cols=arange, @@ -164,7 +169,13 @@ def setup_partials(self): cols=arange, val=180 / np.pi, ) - self.declare_partials("fuselage_pitch", "alpha", rows=arange, cols=arange, val=1) + self.declare_partials( + "fuselage_pitch", + Dynamic.Vehicle.ANGLE_OF_ATTACK, + rows=arange, + cols=arange, + val=1, + ) self.declare_partials("fuselage_pitch", Aircraft.Wing.INCIDENCE, val=-1) def compute(self, inputs, outputs): @@ -175,7 +186,7 @@ def compute(self, inputs, outputs): TAS = inputs[Dynamic.Mission.VELOCITY] gamma = inputs[Dynamic.Mission.FLIGHT_PATH_ANGLE] i_wing = inputs[Aircraft.Wing.INCIDENCE] - alpha = inputs["alpha"] + alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK] mu = 0.0 @@ -226,7 +237,7 @@ def compute_partials(self, inputs, J): TAS = inputs[Dynamic.Mission.VELOCITY] gamma = inputs[Dynamic.Mission.FLIGHT_PATH_ANGLE] i_wing = inputs[Aircraft.Wing.INCIDENCE] - alpha = inputs["alpha"] + alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK] mu = MU_TAKEOFF mu = 0.0 @@ -248,7 +259,7 @@ def compute_partials(self, inputs, J): ] = ( dTAcF_dThrust * GRAV_ENGLISH_GASP / (TAS * weight) ) - J[Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE, "alpha"] = ( + J[Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE, Dynamic.Vehicle.ANGLE_OF_ATTACK] = ( dTAcF_dAlpha * GRAV_ENGLISH_GASP / (TAS * weight) ) J[Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE, Aircraft.Wing.INCIDENCE] = ( @@ -285,7 +296,9 @@ def compute_partials(self, inputs, J): J["load_factor", Dynamic.Vehicle.Propulsion.THRUST_TOTAL] = dTAcF_dThrust / ( weight * np.cos(gamma) ) - J["load_factor", "alpha"] = dTAcF_dAlpha / (weight * np.cos(gamma)) + J["load_factor", Dynamic.Vehicle.ANGLE_OF_ATTACK] = dTAcF_dAlpha / ( + weight * np.cos(gamma) + ) J["load_factor", Aircraft.Wing.INCIDENCE] = dTAcF_dIwing / ( weight * np.cos(gamma) ) @@ -311,7 +324,7 @@ def compute_partials(self, inputs, J): J[Dynamic.Mission.VELOCITY_RATE, Dynamic.Vehicle.Propulsion.THRUST_TOTAL] = ( (dTAlF_dThrust - mu * dNF_dThrust) * GRAV_ENGLISH_GASP / weight ) - J[Dynamic.Mission.VELOCITY_RATE, "alpha"] = ( + J[Dynamic.Mission.VELOCITY_RATE, Dynamic.Vehicle.ANGLE_OF_ATTACK] = ( (dTAlF_dAlpha - mu * dNF_dAlpha) * GRAV_ENGLISH_GASP / weight ) J[Dynamic.Mission.VELOCITY_RATE, Aircraft.Wing.INCIDENCE] = ( @@ -354,5 +367,5 @@ def compute_partials(self, inputs, J): J["normal_force", Dynamic.Vehicle.MASS] = dNF_dWeight * GRAV_ENGLISH_LBM J["normal_force", Dynamic.Vehicle.LIFT] = dNF_dLift J["normal_force", Dynamic.Vehicle.Propulsion.THRUST_TOTAL] = dNF_dThrust - J["normal_force", "alpha"] = dNF_dAlpha + J["normal_force", Dynamic.Vehicle.ANGLE_OF_ATTACK] = dNF_dAlpha J["normal_force", Aircraft.Wing.INCIDENCE] = dNF_dIwing diff --git a/aviary/mission/gasp_based/ode/ascent_ode.py b/aviary/mission/gasp_based/ode/ascent_ode.py index 9e1fe8d31..062a594da 100644 --- a/aviary/mission/gasp_based/ode/ascent_ode.py +++ b/aviary/mission/gasp_based/ode/ascent_ode.py @@ -71,7 +71,7 @@ def setup(self): Dynamic.Vehicle.DRAG, Dynamic.Mission.VELOCITY, Dynamic.Mission.FLIGHT_PATH_ANGLE, - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, ] + ["aircraft:*"], promotes_outputs=[ @@ -91,7 +91,9 @@ def setup(self): ParamPort.set_default_vals(self) self.set_input_defaults("t_init_flaps", val=47.5) self.set_input_defaults("t_init_gear", val=37.3) - self.set_input_defaults("alpha", val=np.zeros(nn), units="deg") + self.set_input_defaults( + Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(nn), units="deg" + ) self.set_input_defaults( Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.zeros(nn), units="deg" ) diff --git a/aviary/mission/gasp_based/ode/base_ode.py b/aviary/mission/gasp_based/ode/base_ode.py index c5321484e..ff4f5b332 100644 --- a/aviary/mission/gasp_based/ode/base_ode.py +++ b/aviary/mission/gasp_based/ode/base_ode.py @@ -75,14 +75,14 @@ def AddAlphaControl( elif alpha_mode is AlphaModes.LOAD_FACTOR: alpha_comp = om.BalanceComp( - name="alpha", + name=Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.full(nn, 10), # initial guess units="deg", eq_units="unitless", lhs_name="load_factor", rhs_val=target_load_factor, - upper=25., - lower=-2., + upper=25.0, + lower=-2.0, ) alpha_comp_inputs = ["load_factor"] @@ -102,7 +102,7 @@ def AddAlphaControl( elif alpha_mode is AlphaModes.DECELERATION: alpha_comp = om.BalanceComp( - name="alpha", + name=Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.full(nn, 10), # initial guess units="deg", lhs_name=Dynamic.Mission.VELOCITY_RATE, @@ -116,7 +116,7 @@ def AddAlphaControl( elif alpha_mode is AlphaModes.REQUIRED_LIFT: alpha_comp = om.BalanceComp( - name="alpha", + name=Dynamic.Vehicle.ANGLE_OF_ATTACK, val=8.0 * np.ones(nn), units="deg", rhs_name="required_lift", @@ -130,7 +130,7 @@ def AddAlphaControl( # Future controller modes # elif alpha_mode is AlphaModes.FLIGHT_PATH_ANGLE: # alpha_comp = om.BalanceComp( - # name="alpha", + # name=Dynamic.Vehicle.ANGLE_OF_ATTACK, # val=np.full(nn, 1), # units="deg", # lhs_name=Dynamic.Mission.FLIGHT_PATH_ANGLE, @@ -144,7 +144,7 @@ def AddAlphaControl( # elif alpha_mode is AlphaModes.ALTITUDE_RATE: # alpha_comp = om.BalanceComp( - # name="alpha", + # name=Dynamic.Vehicle.ANGLE_OF_ATTACK, # val=np.full(nn, 1), # units="deg", # lhs_name=Dynamic.Mission.ALTITUDE_RATE, @@ -157,7 +157,7 @@ def AddAlphaControl( # elif alpha_mode is AlphaModes.CONSTANT_ALTITUDE: # alpha_comp = om.BalanceComp( - # name="alpha", + # name=Dynamic.Vehicle.ANGLE_OF_ATTACK, # val=np.full(nn, 1), # units="deg", # lhs_name=Dynamic.Mission.ALTITUDE, @@ -169,11 +169,12 @@ def AddAlphaControl( # alpha_comp_inputs = [Dynamic.Mission.ALTITUDE] if alpha_mode is not AlphaModes.DEFAULT: - alpha_group.add_subsystem("alpha_comp", - alpha_comp, - promotes_inputs=alpha_comp_inputs, - promotes_outputs=["alpha"], - ) + alpha_group.add_subsystem( + "alpha_comp", + alpha_comp, + promotes_inputs=alpha_comp_inputs, + promotes_outputs=[Dynamic.Vehicle.ANGLE_OF_ATTACK], + ) if add_default_solver and alpha_mode not in (AlphaModes.ROTATION,): alpha_group.nonlinear_solver = om.NewtonSolver() diff --git a/aviary/mission/gasp_based/ode/climb_ode.py b/aviary/mission/gasp_based/ode/climb_ode.py index 19f17677e..f844eb3a0 100644 --- a/aviary/mission/gasp_based/ode/climb_ode.py +++ b/aviary/mission/gasp_based/ode/climb_ode.py @@ -225,7 +225,7 @@ def setup(self): "constraints", FlightConstraints(num_nodes=nn), promotes_inputs=[ - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, Dynamic.Atmosphere.DENSITY, "CL_max", Dynamic.Mission.FLIGHT_PATH_ANGLE, diff --git a/aviary/mission/gasp_based/ode/constraints/flight_constraints.py b/aviary/mission/gasp_based/ode/constraints/flight_constraints.py index 2c3e6f2d0..38e9b21d0 100644 --- a/aviary/mission/gasp_based/ode/constraints/flight_constraints.py +++ b/aviary/mission/gasp_based/ode/constraints/flight_constraints.py @@ -56,7 +56,7 @@ def setup(self): add_aviary_input(self, Aircraft.Wing.INCIDENCE, val=1.0, units="rad") self.add_input( - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.ones(nn), units="rad", desc="angle of attack", @@ -86,7 +86,7 @@ def setup(self): self.declare_partials( "theta", - [Dynamic.Mission.FLIGHT_PATH_ANGLE, "alpha"], + [Dynamic.Mission.FLIGHT_PATH_ANGLE, Dynamic.Vehicle.ANGLE_OF_ATTACK], rows=arange, cols=arange, ) @@ -134,7 +134,7 @@ def compute(self, inputs, outputs): CL_max = inputs["CL_max"] gamma = inputs[Dynamic.Mission.FLIGHT_PATH_ANGLE] i_wing = inputs[Aircraft.Wing.INCIDENCE] - alpha = inputs["alpha"] + alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK] TAS = inputs[Dynamic.Mission.VELOCITY] V_stall = (2 * weight / (wing_area * rho * CL_max)) ** 0.5 # stall speed @@ -154,11 +154,11 @@ def compute_partials(self, inputs, J): CL_max = inputs["CL_max"] gamma = inputs[Dynamic.Mission.FLIGHT_PATH_ANGLE] i_wing = inputs[Aircraft.Wing.INCIDENCE] - alpha = inputs["alpha"] + alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK] TAS = inputs[Dynamic.Mission.VELOCITY] J["theta", Dynamic.Mission.FLIGHT_PATH_ANGLE] = 1 - J["theta", "alpha"] = 1 + J["theta", Dynamic.Vehicle.ANGLE_OF_ATTACK] = 1 J["theta", Aircraft.Wing.INCIDENCE] = -1 J["TAS_violation", Dynamic.Vehicle.MASS] = ( diff --git a/aviary/mission/gasp_based/ode/constraints/test/test_flight_constraints.py b/aviary/mission/gasp_based/ode/constraints/test/test_flight_constraints.py index 69f85811b..af7be6a10 100644 --- a/aviary/mission/gasp_based/ode/constraints/test/test_flight_constraints.py +++ b/aviary/mission/gasp_based/ode/constraints/test/test_flight_constraints.py @@ -34,7 +34,9 @@ def setUp(self): Dynamic.Mission.FLIGHT_PATH_ANGLE, 7.76 * np.ones(2), units="deg" ) self.prob.model.set_input_defaults(Aircraft.Wing.INCIDENCE, 0.0, units="deg") - self.prob.model.set_input_defaults("alpha", 5.19 * np.ones(2), units="deg") + self.prob.model.set_input_defaults( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 5.19 * np.ones(2), units="deg" + ) self.prob.model.set_input_defaults( Dynamic.Mission.VELOCITY, 252 * np.ones(2), units="kn" ) diff --git a/aviary/mission/gasp_based/ode/descent_eom.py b/aviary/mission/gasp_based/ode/descent_eom.py index 57e843e53..fa81e95b3 100644 --- a/aviary/mission/gasp_based/ode/descent_eom.py +++ b/aviary/mission/gasp_based/ode/descent_eom.py @@ -36,7 +36,7 @@ def setup(self): desc="mass of aircraft", ) self.add_input( - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.ones(nn), units="rad", desc="angle of attack of aircraft", @@ -95,7 +95,7 @@ def setup(self): Dynamic.Vehicle.MASS, Dynamic.Vehicle.Propulsion.THRUST_TOTAL, Dynamic.Vehicle.DRAG, - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, ], rows=arange, cols=arange, @@ -117,7 +117,7 @@ def compute(self, inputs, outputs): thrust = inputs[Dynamic.Vehicle.Propulsion.THRUST_TOTAL] drag = inputs[Dynamic.Vehicle.DRAG] weight = inputs[Dynamic.Vehicle.MASS] * GRAV_ENGLISH_LBM - alpha = inputs["alpha"] + alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK] gamma = (thrust - drag) / weight @@ -132,7 +132,7 @@ def compute_partials(self, inputs, J): thrust = inputs[Dynamic.Vehicle.Propulsion.THRUST_TOTAL] drag = inputs[Dynamic.Vehicle.DRAG] weight = inputs[Dynamic.Vehicle.MASS] * GRAV_ENGLISH_LBM - alpha = inputs["alpha"] + alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK] gamma = (thrust - drag) / weight @@ -167,7 +167,7 @@ def compute_partials(self, inputs, J): ) / weight - np.sin(alpha) J["required_lift", Dynamic.Vehicle.DRAG] = - \ weight * np.sin(gamma) * (-1 / weight) - J["required_lift", "alpha"] = -thrust * np.cos(alpha) + J["required_lift", Dynamic.Vehicle.ANGLE_OF_ATTACK] = -thrust * np.cos(alpha) J[ Dynamic.Mission.FLIGHT_PATH_ANGLE, Dynamic.Vehicle.Propulsion.THRUST_TOTAL diff --git a/aviary/mission/gasp_based/ode/descent_ode.py b/aviary/mission/gasp_based/ode/descent_ode.py index 9cc39fed7..fa25a95ee 100644 --- a/aviary/mission/gasp_based/ode/descent_ode.py +++ b/aviary/mission/gasp_based/ode/descent_ode.py @@ -170,7 +170,7 @@ def setup(self): Dynamic.Mission.VELOCITY, Dynamic.Vehicle.DRAG, Dynamic.Vehicle.Propulsion.THRUST_TOTAL, - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, ], promotes_outputs=[ Dynamic.Mission.ALTITUDE_RATE, @@ -185,7 +185,7 @@ def setup(self): FlightConstraints(num_nodes=nn), promotes_inputs=[ Dynamic.Vehicle.MASS, - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, Dynamic.Atmosphere.DENSITY, "CL_max", Dynamic.Mission.FLIGHT_PATH_ANGLE, diff --git a/aviary/mission/gasp_based/ode/flight_path_eom.py b/aviary/mission/gasp_based/ode/flight_path_eom.py index 31dff7641..bb20ad400 100644 --- a/aviary/mission/gasp_based/ode/flight_path_eom.py +++ b/aviary/mission/gasp_based/ode/flight_path_eom.py @@ -87,7 +87,12 @@ def setup(self): 'dymos.state_units:rad', ], ) - self.add_input("alpha", val=np.ones(nn), desc="angle of attack", units="deg") + self.add_input( + Dynamic.Vehicle.ANGLE_OF_ATTACK, + val=np.ones(nn), + desc="angle of attack", + units="deg", + ) self.add_output( Dynamic.Mission.DISTANCE_RATE, @@ -148,7 +153,7 @@ def setup_partials(self): Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE, [ Dynamic.Vehicle.Propulsion.THRUST_TOTAL, - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, Dynamic.Vehicle.LIFT, Dynamic.Vehicle.MASS, Dynamic.Mission.FLIGHT_PATH_ANGLE, @@ -162,17 +167,20 @@ def setup_partials(self): ) self.declare_partials( "normal_force", - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, rows=arange, cols=arange, ) self.declare_partials( - "fuselage_pitch", "alpha", rows=arange, cols=arange + "fuselage_pitch", + Dynamic.Vehicle.ANGLE_OF_ATTACK, + rows=arange, + cols=arange, ) self.declare_partials( "load_factor", - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, rows=arange, cols=arange, ) @@ -180,7 +188,7 @@ def setup_partials(self): self.declare_partials( Dynamic.Mission.VELOCITY_RATE, - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, rows=arange, cols=arange, ) @@ -226,7 +234,7 @@ def compute(self, inputs, outputs): if self.options["ground_roll"]: alpha = inputs[Aircraft.Wing.INCIDENCE] else: - alpha = inputs["alpha"] + alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK] thrust_along_flightpath = thrust * np.cos((alpha - i_wing) * np.pi / 180) thrust_across_flightpath = thrust * np.sin((alpha - i_wing) * np.pi / 180) @@ -276,7 +284,7 @@ def compute_partials(self, inputs, J): if self.options["ground_roll"]: alpha = i_wing else: - alpha = inputs["alpha"] + alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK] nn = self.options["num_nodes"] @@ -362,9 +370,9 @@ def compute_partials(self, inputs, J): ] = ( dTAcF_dThrust * GRAV_ENGLISH_GASP / (TAS * weight) ) - J[Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE, "alpha"] = ( - dTAcF_dAlpha * GRAV_ENGLISH_GASP / (TAS * weight) - ) + J[ + Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE, Dynamic.Vehicle.ANGLE_OF_ATTACK + ] = (dTAcF_dAlpha * GRAV_ENGLISH_GASP / (TAS * weight)) J[Dynamic.Mission.FLIGHT_PATH_ANGLE_RATE, Aircraft.Wing.INCIDENCE] = ( dTAcF_dIwing * GRAV_ENGLISH_GASP / (TAS * weight) ) @@ -390,12 +398,14 @@ def compute_partials(self, inputs, J): dNF_dAlpha = -np.ones(nn) * dTAcF_dAlpha # dNF_dAlpha[normal_force1 < 0] = 0 - J[Dynamic.Mission.VELOCITY_RATE, "alpha"] = ( + J[Dynamic.Mission.VELOCITY_RATE, Dynamic.Vehicle.ANGLE_OF_ATTACK] = ( (dTAlF_dAlpha - mu * dNF_dAlpha) * GRAV_ENGLISH_GASP / weight ) - J["normal_force", "alpha"] = dNF_dAlpha - J["fuselage_pitch", "alpha"] = 1 - J["load_factor", "alpha"] = dTAcF_dAlpha / (weight * np.cos(gamma)) + J["normal_force", Dynamic.Vehicle.ANGLE_OF_ATTACK] = dNF_dAlpha + J["fuselage_pitch", Dynamic.Vehicle.ANGLE_OF_ATTACK] = 1 + J["load_factor", Dynamic.Vehicle.ANGLE_OF_ATTACK] = dTAcF_dAlpha / ( + weight * np.cos(gamma) + ) J[Dynamic.Mission.VELOCITY_RATE, Aircraft.Wing.INCIDENCE] = ( (dTAlF_dIwing - mu * dNF_dIwing) * GRAV_ENGLISH_GASP / weight ) diff --git a/aviary/mission/gasp_based/ode/flight_path_ode.py b/aviary/mission/gasp_based/ode/flight_path_ode.py index dc87ee833..c08a0358b 100644 --- a/aviary/mission/gasp_based/ode/flight_path_ode.py +++ b/aviary/mission/gasp_based/ode/flight_path_ode.py @@ -60,7 +60,7 @@ def setup(self): Dynamic.Mission.FLIGHT_PATH_ANGLE, ] + ['aircraft:*'] if not self.options['ground_roll']: - EOM_inputs.append('alpha') + EOM_inputs.append(Dynamic.Vehicle.ANGLE_OF_ATTACK) if analysis_scheme is AnalysisScheme.SHOOTING: SGM_required_inputs = { @@ -121,7 +121,7 @@ def setup(self): promotes_inputs=[ 'weight', ('thrust', Dynamic.Vehicle.Propulsion.THRUST_TOTAL), - 'alpha', + Dynamic.Vehicle.ANGLE_OF_ATTACK, ('gamma', Dynamic.Mission.FLIGHT_PATH_ANGLE), ('i_wing', Aircraft.Wing.INCIDENCE), ], @@ -165,7 +165,7 @@ def setup(self): promotes_inputs=[ ('drag', Dynamic.Vehicle.DRAG), # 'weight', - # 'alpha', + # Dynamic.Vehicle.ANGLE_OF_ATTACK, # ('gamma', Dynamic.Mission.FLIGHT_PATH_ANGLE), ('i_wing', Aircraft.Wing.INCIDENCE), ], @@ -207,7 +207,9 @@ def setup(self): self.set_input_defaults("t_init_flaps", val=47.5) self.set_input_defaults("t_init_gear", val=37.3) self.set_input_defaults("t_curr", val=np.zeros(nn), units="s") - self.set_input_defaults("alpha", val=np.zeros(nn), units="rad") + self.set_input_defaults( + Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(nn), units="rad" + ) self.set_input_defaults( Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.zeros(nn), units="deg" ) diff --git a/aviary/mission/gasp_based/ode/groundroll_eom.py b/aviary/mission/gasp_based/ode/groundroll_eom.py index 17aeb0160..d65b0bd8f 100644 --- a/aviary/mission/gasp_based/ode/groundroll_eom.py +++ b/aviary/mission/gasp_based/ode/groundroll_eom.py @@ -54,7 +54,12 @@ def setup(self): units="rad", ) add_aviary_input(self, Aircraft.Wing.INCIDENCE, val=0) - self.add_input("alpha", val=np.zeros(nn), desc="angle of attack", units="deg") + self.add_input( + Dynamic.Vehicle.ANGLE_OF_ATTACK, + val=np.zeros(nn), + desc="angle of attack", + units="deg", + ) self.add_output( Dynamic.Mission.VELOCITY_RATE, @@ -89,7 +94,7 @@ def setup(self): Dynamic.Mission.VELOCITY_RATE, [ Dynamic.Vehicle.Propulsion.THRUST_TOTAL, - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, Dynamic.Vehicle.DRAG, Dynamic.Vehicle.MASS, Dynamic.Mission.FLIGHT_PATH_ANGLE, @@ -117,7 +122,7 @@ def setup(self): Dynamic.Vehicle.MASS, Dynamic.Vehicle.LIFT, Dynamic.Vehicle.Propulsion.THRUST_TOTAL, - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, ], rows=arange, cols=arange, @@ -130,7 +135,13 @@ def setup(self): cols=arange, val=180 / np.pi, ) - self.declare_partials("fuselage_pitch", "alpha", rows=arange, cols=arange, val=1) + self.declare_partials( + "fuselage_pitch", + Dynamic.Vehicle.ANGLE_OF_ATTACK, + rows=arange, + cols=arange, + val=1, + ) self.declare_partials("fuselage_pitch", Aircraft.Wing.INCIDENCE, val=-1) if analysis_scheme is AnalysisScheme.COLLOCATION: @@ -152,7 +163,7 @@ def compute(self, inputs, outputs): TAS = inputs[Dynamic.Mission.VELOCITY] gamma = inputs[Dynamic.Mission.FLIGHT_PATH_ANGLE] i_wing = inputs[Aircraft.Wing.INCIDENCE] - alpha = inputs["alpha"] + alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK] nn = self.options["num_nodes"] @@ -192,7 +203,7 @@ def compute_partials(self, inputs, J): TAS = inputs[Dynamic.Mission.VELOCITY] gamma = inputs[Dynamic.Mission.FLIGHT_PATH_ANGLE] i_wing = inputs[Aircraft.Wing.INCIDENCE] - alpha = inputs["alpha"] + alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK] nn = self.options["num_nodes"] @@ -228,7 +239,7 @@ def compute_partials(self, inputs, J): J[Dynamic.Mission.VELOCITY_RATE, Dynamic.Vehicle.Propulsion.THRUST_TOTAL] = ( (dTAlF_dThrust - mu * dNF_dThrust) * GRAV_ENGLISH_GASP / weight ) - J[Dynamic.Mission.VELOCITY_RATE, "alpha"] = ( + J[Dynamic.Mission.VELOCITY_RATE, Dynamic.Vehicle.ANGLE_OF_ATTACK] = ( (dTAlF_dAlpha - mu * dNF_dAlpha) * GRAV_ENGLISH_GASP / weight ) J[Dynamic.Mission.VELOCITY_RATE, Aircraft.Wing.INCIDENCE] = ( @@ -271,5 +282,5 @@ def compute_partials(self, inputs, J): J["normal_force", Dynamic.Vehicle.MASS] = dNF_dWeight * GRAV_ENGLISH_LBM J["normal_force", Dynamic.Vehicle.LIFT] = dNF_dLift J["normal_force", Dynamic.Vehicle.Propulsion.THRUST_TOTAL] = dNF_dThrust - J["normal_force", "alpha"] = dNF_dAlpha + J["normal_force", Dynamic.Vehicle.ANGLE_OF_ATTACK] = dNF_dAlpha J["normal_force", Aircraft.Wing.INCIDENCE] = dNF_dIwing diff --git a/aviary/mission/gasp_based/ode/groundroll_ode.py b/aviary/mission/gasp_based/ode/groundroll_ode.py index 85df33617..6f18c4335 100644 --- a/aviary/mission/gasp_based/ode/groundroll_ode.py +++ b/aviary/mission/gasp_based/ode/groundroll_ode.py @@ -65,7 +65,10 @@ def setup(self): i_wing={"units": "deg", "val": 1.1}, alpha={"units": "deg", "val": 1.1 * np.ones(nn)}, ), - promotes=[("i_wing", Aircraft.Wing.INCIDENCE), "alpha"], + promotes=[ + ("i_wing", Aircraft.Wing.INCIDENCE), + ("alpha", Dynamic.Vehicle.ANGLE_OF_ATTACK), + ], ) kwargs = { @@ -88,7 +91,7 @@ def setup(self): if type(subsystem) is AerodynamicsBuilderBase: self.promotes( subsystem.name, - inputs=["alpha"], + inputs=[Dynamic.Vehicle.ANGLE_OF_ATTACK], src_indices=np.zeros(nn, dtype=int), ) diff --git a/aviary/mission/gasp_based/ode/landing_ode.py b/aviary/mission/gasp_based/ode/landing_ode.py index 6c984f03e..57a1b83bf 100644 --- a/aviary/mission/gasp_based/ode/landing_ode.py +++ b/aviary/mission/gasp_based/ode/landing_ode.py @@ -171,7 +171,7 @@ def setup(self): ("airport_alt", Mission.Landing.AIRPORT_ALTITUDE), (Dynamic.Atmosphere.MACH, "mach_td"), (Dynamic.Atmosphere.DYNAMIC_PRESSURE, "q_td"), - ("alpha", Aircraft.Wing.INCIDENCE), + (Dynamic.Vehicle.ANGLE_OF_ATTACK, Aircraft.Wing.INCIDENCE), ("flap_defl", Aircraft.Wing.FLAP_DEFLECTION_LANDING), ("CL_max_flaps", Mission.Landing.LIFT_COEFFICIENT_MAX), ( diff --git a/aviary/mission/gasp_based/ode/rotation_eom.py b/aviary/mission/gasp_based/ode/rotation_eom.py index 4c0014546..cffcbc432 100644 --- a/aviary/mission/gasp_based/ode/rotation_eom.py +++ b/aviary/mission/gasp_based/ode/rotation_eom.py @@ -54,7 +54,12 @@ def setup(self): ) add_aviary_input(self, Aircraft.Wing.INCIDENCE, val=0.0, units="deg") - self.add_input("alpha", val=np.ones(nn), desc="angle of attack", units="deg") + self.add_input( + Dynamic.Vehicle.ANGLE_OF_ATTACK, + val=np.ones(nn), + desc="angle of attack", + units="deg", + ) self.add_output( Dynamic.Mission.VELOCITY_RATE, @@ -99,7 +104,7 @@ def setup_partials(self): Dynamic.Mission.VELOCITY_RATE, [ Dynamic.Vehicle.Propulsion.THRUST_TOTAL, - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, Dynamic.Vehicle.DRAG, Dynamic.Vehicle.MASS, Dynamic.Mission.FLIGHT_PATH_ANGLE, @@ -128,7 +133,7 @@ def setup_partials(self): Dynamic.Vehicle.MASS, Dynamic.Vehicle.LIFT, Dynamic.Vehicle.Propulsion.THRUST_TOTAL, - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, ], rows=arange, cols=arange, @@ -141,7 +146,13 @@ def setup_partials(self): cols=arange, val=180 / np.pi, ) - self.declare_partials("fuselage_pitch", "alpha", rows=arange, cols=arange, val=1) + self.declare_partials( + "fuselage_pitch", + Dynamic.Vehicle.ANGLE_OF_ATTACK, + rows=arange, + cols=arange, + val=1, + ) self.declare_partials("fuselage_pitch", Aircraft.Wing.INCIDENCE, val=-1) def compute(self, inputs, outputs): @@ -154,7 +165,7 @@ def compute(self, inputs, outputs): TAS = inputs[Dynamic.Mission.VELOCITY] gamma = inputs[Dynamic.Mission.FLIGHT_PATH_ANGLE] i_wing = inputs[Aircraft.Wing.INCIDENCE] - alpha = inputs["alpha"] + alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK] mu = MU_TAKEOFF @@ -197,7 +208,7 @@ def compute_partials(self, inputs, J): TAS = inputs[Dynamic.Mission.VELOCITY] gamma = inputs[Dynamic.Mission.FLIGHT_PATH_ANGLE] i_wing = inputs[Aircraft.Wing.INCIDENCE] - alpha = inputs["alpha"] + alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK] nn = self.options["num_nodes"] @@ -233,7 +244,7 @@ def compute_partials(self, inputs, J): J[Dynamic.Mission.VELOCITY_RATE, Dynamic.Vehicle.Propulsion.THRUST_TOTAL] = ( (dTAlF_dThrust - mu * dNF_dThrust) * GRAV_ENGLISH_GASP / weight ) - J[Dynamic.Mission.VELOCITY_RATE, "alpha"] = ( + J[Dynamic.Mission.VELOCITY_RATE, Dynamic.Vehicle.ANGLE_OF_ATTACK] = ( (dTAlF_dAlpha - mu * dNF_dAlpha) * GRAV_ENGLISH_GASP / weight ) J[Dynamic.Mission.VELOCITY_RATE, Aircraft.Wing.INCIDENCE] = ( @@ -276,5 +287,5 @@ def compute_partials(self, inputs, J): J["normal_force", Dynamic.Vehicle.MASS] = dNF_dWeight * GRAV_ENGLISH_LBM J["normal_force", Dynamic.Vehicle.LIFT] = dNF_dLift J["normal_force", Dynamic.Vehicle.Propulsion.THRUST_TOTAL] = dNF_dThrust - J["normal_force", "alpha"] = dNF_dAlpha + J["normal_force", Dynamic.Vehicle.ANGLE_OF_ATTACK] = dNF_dAlpha J["normal_force", Aircraft.Wing.INCIDENCE] = dNF_dIwing diff --git a/aviary/mission/gasp_based/ode/rotation_ode.py b/aviary/mission/gasp_based/ode/rotation_ode.py index c4158b6b7..4536abcf1 100644 --- a/aviary/mission/gasp_based/ode/rotation_ode.py +++ b/aviary/mission/gasp_based/ode/rotation_ode.py @@ -53,18 +53,21 @@ def setup(self): ) alpha_comp_inputs = ["rotation_rate", "t_curr", "start_rotation", ("alpha_init", Aircraft.Wing.INCIDENCE)] - self.add_subsystem("alpha_comp", - alpha_comp, - promotes_inputs=alpha_comp_inputs, - promotes_outputs=["alpha"], - ) + self.add_subsystem( + "alpha_comp", + alpha_comp, + promotes_inputs=alpha_comp_inputs, + promotes_outputs=[Dynamic.Vehicle.ANGLE_OF_ATTACK], + ) self.add_subsystem("rotation_eom", RotationEOM(num_nodes=nn), promotes=["*"]) ParamPort.set_default_vals(self) self.set_input_defaults("t_init_flaps", val=47.5, units='s') self.set_input_defaults("t_init_gear", val=37.3, units='s') - self.set_input_defaults("alpha", val=np.ones(nn), units="deg") + self.set_input_defaults( + Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.ones(nn), units="deg" + ) self.set_input_defaults( Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.zeros(nn), units="deg" ) diff --git a/aviary/mission/gasp_based/ode/test/test_ascent_eom.py b/aviary/mission/gasp_based/ode/test/test_ascent_eom.py index 340240369..38a0e52ba 100644 --- a/aviary/mission/gasp_based/ode/test/test_ascent_eom.py +++ b/aviary/mission/gasp_based/ode/test/test_ascent_eom.py @@ -32,7 +32,9 @@ def setUp(self): Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.zeros(2), units="rad" ) self.prob.model.set_input_defaults(Aircraft.Wing.INCIDENCE, val=0, units="deg") - self.prob.model.set_input_defaults("alpha", val=np.zeros(2), units="deg") + self.prob.model.set_input_defaults( + Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(2), units="deg" + ) self.prob.setup(check=False, force_alloc_complex=True) @@ -88,7 +90,9 @@ def test_case1(self): Dynamic.Mission.VELOCITY, val=10 * np.ones(2), units="ft/s") prob.model.set_input_defaults( Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.zeros(2), units="rad") - prob.model.set_input_defaults("alpha", val=np.zeros(2), units="deg") + prob.model.set_input_defaults( + Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(2), units="deg" + ) prob.setup(check=False, force_alloc_complex=True) partial_data = prob.check_partials(out_stream=None, method="cs") diff --git a/aviary/mission/gasp_based/ode/test/test_climb_ode.py b/aviary/mission/gasp_based/ode/test/test_climb_ode.py index 2df625238..52a984ed6 100644 --- a/aviary/mission/gasp_based/ode/test/test_climb_ode.py +++ b/aviary/mission/gasp_based/ode/test/test_climb_ode.py @@ -61,7 +61,7 @@ def test_start_of_climb(self): self.prob.run_model() testvals = { - "alpha": 5.16398, + Dynamic.Vehicle.ANGLE_OF_ATTACK: 5.16398, "CL": 0.59766664, "CD": 0.03070836, Dynamic.Mission.ALTITUDE_RATE: 3414.624 / 60, # ft/s @@ -106,7 +106,7 @@ def test_end_of_climb(self): self.prob.run_model() testvals = { - "alpha": [4.0557, 4.06615], + Dynamic.Vehicle.ANGLE_OF_ATTACK: [4.0557, 4.06615], "CL": [0.512628, 0.615819], "CD": [0.02692759, 0.03299578], Dynamic.Mission.ALTITUDE_RATE: [3053.64 / 60, 430.746 / 60], # ft/s diff --git a/aviary/mission/gasp_based/ode/test/test_descent_eom.py b/aviary/mission/gasp_based/ode/test/test_descent_eom.py index baef579ee..f534d6061 100644 --- a/aviary/mission/gasp_based/ode/test/test_descent_eom.py +++ b/aviary/mission/gasp_based/ode/test/test_descent_eom.py @@ -34,7 +34,9 @@ def setUp(self): self.prob.model.set_input_defaults( Dynamic.Vehicle.MASS, np.array([147661, 147661]), units="lbm" ) - self.prob.model.set_input_defaults("alpha", np.array([3.2, 3.2]), units="deg") + self.prob.model.set_input_defaults( + Dynamic.Vehicle.ANGLE_OF_ATTACK, np.array([3.2, 3.2]), units="deg" + ) self.prob.setup(check=False, force_alloc_complex=True) @@ -98,7 +100,9 @@ def test_case1(self): prob.model.set_input_defaults( Dynamic.Vehicle.MASS, np.array([147661, 147661]), units="lbm" ) - prob.model.set_input_defaults("alpha", np.array([3.2, 3.2]), units="deg") + prob.model.set_input_defaults( + Dynamic.Vehicle.ANGLE_OF_ATTACK, np.array([3.2, 3.2]), units="deg" + ) prob.setup(check=False, force_alloc_complex=True) partial_data = prob.check_partials(out_stream=None, method="cs") diff --git a/aviary/mission/gasp_based/ode/test/test_descent_ode.py b/aviary/mission/gasp_based/ode/test/test_descent_ode.py index 2b823203a..a49804d4e 100644 --- a/aviary/mission/gasp_based/ode/test/test_descent_ode.py +++ b/aviary/mission/gasp_based/ode/test/test_descent_ode.py @@ -63,7 +63,7 @@ def test_high_alt(self): self.prob.run_model() testvals = { - "alpha": np.array([3.22047, 1.20346]), + Dynamic.Vehicle.ANGLE_OF_ATTACK: np.array([3.22047, 1.20346]), "CL": np.array([0.5169255, 0.25908651]), "CD": np.array([0.02786507, 0.01862951]), # ft/s @@ -105,7 +105,7 @@ def test_low_alt(self): self.prob.run_model() testvals = { - "alpha": 4.19956, + Dynamic.Vehicle.ANGLE_OF_ATTACK: 4.19956, "CL": 0.507578, "CD": 0.0268404, Dynamic.Mission.ALTITUDE_RATE: -18.97635475, diff --git a/aviary/mission/gasp_based/ode/test/test_groundroll_eom.py b/aviary/mission/gasp_based/ode/test/test_groundroll_eom.py index 30ec303ef..2359e6c54 100644 --- a/aviary/mission/gasp_based/ode/test/test_groundroll_eom.py +++ b/aviary/mission/gasp_based/ode/test/test_groundroll_eom.py @@ -34,7 +34,9 @@ def setUp(self): Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.zeros(2), units="rad" ) self.prob.model.set_input_defaults(Aircraft.Wing.INCIDENCE, val=0, units="deg") - self.prob.model.set_input_defaults("alpha", val=np.zeros(2), units="deg") + self.prob.model.set_input_defaults( + Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(2), units="deg" + ) self.prob.setup(check=False, force_alloc_complex=True) @@ -102,7 +104,9 @@ def test_case1(self): prob.model.set_input_defaults( Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.zeros(2), units="rad") prob.model.set_input_defaults(Aircraft.Wing.INCIDENCE, val=0, units="deg") - prob.model.set_input_defaults("alpha", val=np.zeros(2), units="deg") + prob.model.set_input_defaults( + Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(2), units="deg" + ) prob.setup(check=False, force_alloc_complex=True) partial_data = prob.check_partials(out_stream=None, method="cs") diff --git a/aviary/mission/gasp_based/ode/test/test_landing_ode.py b/aviary/mission/gasp_based/ode/test/test_landing_ode.py index 74498ded9..8fb663e10 100644 --- a/aviary/mission/gasp_based/ode/test/test_landing_ode.py +++ b/aviary/mission/gasp_based/ode/test/test_landing_ode.py @@ -43,7 +43,9 @@ def test_dland(self): self.prob.set_val(Mission.Landing.AIRPORT_ALTITUDE, 0, units="ft") self.prob.set_val(Mission.Landing.INITIAL_MACH, 0.1, units="unitless") - self.prob.set_val("alpha", 0, units="deg") # doesn't matter + self.prob.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 0, units="deg" + ) # doesn't matter self.prob.set_val(Mission.Landing.MAXIMUM_SINK_RATE, 900, units="ft/min") self.prob.set_val(Mission.Landing.GLIDE_TO_STALL_RATIO, 1.3, units="unitless") self.prob.set_val(Mission.Landing.MAXIMUM_FLARE_LOAD_FACTOR, diff --git a/aviary/mission/gasp_based/ode/test/test_rotation_eom.py b/aviary/mission/gasp_based/ode/test/test_rotation_eom.py index ddf48c369..afa555d9d 100644 --- a/aviary/mission/gasp_based/ode/test/test_rotation_eom.py +++ b/aviary/mission/gasp_based/ode/test/test_rotation_eom.py @@ -32,7 +32,9 @@ def setUp(self): Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.zeros(2), units="rad" ) self.prob.model.set_input_defaults(Aircraft.Wing.INCIDENCE, val=0, units="deg") - self.prob.model.set_input_defaults("alpha", val=np.zeros(2), units="deg") + self.prob.model.set_input_defaults( + Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(2), units="deg" + ) self.prob.setup(check=False, force_alloc_complex=True) @@ -99,7 +101,9 @@ def test_case1(self): prob.model.set_input_defaults( Dynamic.Mission.FLIGHT_PATH_ANGLE, val=np.zeros(2), units="rad") prob.model.set_input_defaults(Aircraft.Wing.INCIDENCE, val=0, units="deg") - prob.model.set_input_defaults("alpha", val=np.zeros(2), units="deg") + prob.model.set_input_defaults( + Dynamic.Vehicle.ANGLE_OF_ATTACK, val=np.zeros(2), units="deg" + ) prob.setup(check=False, force_alloc_complex=True) partial_data = prob.check_partials(out_stream=None, method="cs") diff --git a/aviary/mission/gasp_based/ode/test/test_rotation_ode.py b/aviary/mission/gasp_based/ode/test/test_rotation_ode.py index 5fdec7b11..25f3d5e4d 100644 --- a/aviary/mission/gasp_based/ode/test/test_rotation_ode.py +++ b/aviary/mission/gasp_based/ode/test/test_rotation_ode.py @@ -35,7 +35,7 @@ def test_rotation_partials(self): self.prob.set_val(Aircraft.Wing.INCIDENCE, 1.5, units="deg") self.prob.set_val(Dynamic.Vehicle.MASS, [100000, 100000], units="lbm") - self.prob.set_val("alpha", [1.5, 1.5], units="deg") + self.prob.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, [1.5, 1.5], units="deg") self.prob.set_val(Dynamic.Mission.VELOCITY, [100, 100], units="kn") self.prob.set_val("t_curr", [1, 2], units="s") self.prob.set_val("interference_independent_of_shielded_area", 1.89927266) diff --git a/aviary/mission/gasp_based/ode/unsteady_solved/test/test_gamma_comp.py b/aviary/mission/gasp_based/ode/unsteady_solved/test/test_gamma_comp.py index 5de32444d..f98554bdb 100644 --- a/aviary/mission/gasp_based/ode/unsteady_solved/test/test_gamma_comp.py +++ b/aviary/mission/gasp_based/ode/unsteady_solved/test/test_gamma_comp.py @@ -35,7 +35,7 @@ def _test_unsteady_flight_eom(self, ground_roll=False): p.set_val(Aircraft.Wing.INCIDENCE, 0.0, units="deg") if not ground_roll: - p.set_val("alpha", 0.0, units="deg") + p.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 0.0, units="deg") p.set_val(Dynamic.Mission.FLIGHT_PATH_ANGLE, 0, units="deg") p.set_val("dh_dr", 0, units=None) p.set_val("d2h_dr2", 0, units="1/m") @@ -86,7 +86,9 @@ def _test_unsteady_flight_eom(self, ground_roll=False): p.set_val(Aircraft.Wing.INCIDENCE, np.random.rand(1), units="deg") if not ground_roll: - p.set_val("alpha", 5 * np.random.rand(nn), units="deg") + p.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 5 * np.random.rand(nn), units="deg" + ) p.set_val( Dynamic.Mission.FLIGHT_PATH_ANGLE, 5 * np.random.rand(nn), units="deg" ) diff --git a/aviary/mission/gasp_based/ode/unsteady_solved/test/test_unsteady_alpha_thrust_iter_group.py b/aviary/mission/gasp_based/ode/unsteady_solved/test/test_unsteady_alpha_thrust_iter_group.py index 1486d307e..0014dc9b5 100644 --- a/aviary/mission/gasp_based/ode/unsteady_solved/test/test_unsteady_alpha_thrust_iter_group.py +++ b/aviary/mission/gasp_based/ode/unsteady_solved/test/test_unsteady_alpha_thrust_iter_group.py @@ -49,7 +49,9 @@ def _test_unsteady_alpha_thrust_iter_group(self, ground_roll=False): promotes_outputs=["*"]) if ground_roll: - ig.set_input_defaults("alpha", np.zeros(nn), units="deg") + ig.set_input_defaults( + Dynamic.Vehicle.ANGLE_OF_ATTACK, np.zeros(nn), units="deg" + ) p.setup(force_alloc_complex=True) @@ -69,7 +71,7 @@ def _test_unsteady_alpha_thrust_iter_group(self, ground_roll=False): if not ground_roll: p.set_val(Dynamic.Mission.FLIGHT_PATH_ANGLE, 0.0 * np.ones(nn), units="rad") - p.set_val("alpha", 4 * np.ones(nn), units="deg") + p.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 4 * np.ones(nn), units="deg") p.set_val("dh_dr", 0.0 * np.ones(nn), units=None) p.set_val("d2h_dr2", 0.0 * np.ones(nn), units="1/NM") @@ -87,7 +89,11 @@ def _test_unsteady_alpha_thrust_iter_group(self, ground_roll=False): ) weight = p.model.get_val("mass", units="lbm") * GRAV_ENGLISH_LBM iwing = p.model.get_val(Aircraft.Wing.INCIDENCE, units="deg") - alpha = iwing if ground_roll else p.model.get_val("alpha", units="deg") + alpha = ( + iwing + if ground_roll + else p.model.get_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, units="deg") + ) c_alphai = np.cos(np.radians(alpha - iwing)) s_alphai = np.sin(np.radians(alpha - iwing)) diff --git a/aviary/mission/gasp_based/ode/unsteady_solved/test/test_unsteady_solved_eom.py b/aviary/mission/gasp_based/ode/unsteady_solved/test/test_unsteady_solved_eom.py index fd08c80be..365fd125c 100644 --- a/aviary/mission/gasp_based/ode/unsteady_solved/test/test_unsteady_solved_eom.py +++ b/aviary/mission/gasp_based/ode/unsteady_solved/test/test_unsteady_solved_eom.py @@ -34,7 +34,7 @@ def _test_unsteady_solved_eom(self, ground_roll=False): p.set_val(Aircraft.Wing.INCIDENCE, 0.0, units="deg") if not ground_roll: - p.set_val("alpha", 0.0, units="deg") + p.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 0.0, units="deg") p.set_val(Dynamic.Mission.FLIGHT_PATH_ANGLE, 0, units="deg") p.set_val("dh_dr", 0, units=None) p.set_val("d2h_dr2", 0, units="1/m") @@ -81,7 +81,9 @@ def _test_unsteady_solved_eom(self, ground_roll=False): p.set_val(Aircraft.Wing.INCIDENCE, np.random.rand(1), units="deg") if not ground_roll: - p.set_val("alpha", 5 * np.random.rand(nn), units="deg") + p.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, 5 * np.random.rand(nn), units="deg" + ) p.set_val( Dynamic.Mission.FLIGHT_PATH_ANGLE, 5 * np.random.rand(nn), units="deg" ) @@ -137,7 +139,9 @@ def _test_unsteady_solved_eom(self, ground_roll=False): p.set_val(Aircraft.Wing.INCIDENCE, np.random.rand(1), units="deg") if not ground_roll: - p.set_val("alpha", nn * np.random.rand(nn), units="deg") + p.set_val( + Dynamic.Vehicle.ANGLE_OF_ATTACK, nn * np.random.rand(nn), units="deg" + ) p.set_val(Dynamic.Mission.FLIGHT_PATH_ANGLE, nn * np.random.rand(nn), units="deg") p.set_val("dh_dr", 0.1 * np.random.rand(nn), units=None) diff --git a/aviary/mission/gasp_based/ode/unsteady_solved/test/test_unsteady_solved_ode.py b/aviary/mission/gasp_based/ode/unsteady_solved/test/test_unsteady_solved_ode.py index 194e2f40c..b597bdebe 100644 --- a/aviary/mission/gasp_based/ode/unsteady_solved/test/test_unsteady_solved_ode.py +++ b/aviary/mission/gasp_based/ode/unsteady_solved/test/test_unsteady_solved_ode.py @@ -49,7 +49,9 @@ def _test_unsteady_solved_ode( p.model.set_input_defaults(Dynamic.Atmosphere.MACH, 0.8 * np.ones(nn)) if ground_roll: p.model.set_input_defaults(Dynamic.Atmosphere.MACH, 0.1 * np.ones(nn)) - ode.set_input_defaults("alpha", np.zeros(nn), units="deg") + ode.set_input_defaults( + Dynamic.Vehicle.ANGLE_OF_ATTACK, np.zeros(nn), units="deg" + ) p.setup(force_alloc_complex=True) @@ -68,7 +70,7 @@ def _test_unsteady_solved_ode( if not ground_roll: p.set_val(Dynamic.Mission.FLIGHT_PATH_ANGLE, 0.0 * np.ones(nn), units="rad") - p.set_val("alpha", 4 * np.ones(nn), units="deg") + p.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, 4 * np.ones(nn), units="deg") p.set_val("dh_dr", 0.0 * np.ones(nn), units="ft/NM") p.set_val("d2h_dr2", 0.0 * np.ones(nn), units="1/NM") @@ -92,7 +94,7 @@ def _test_unsteady_solved_ode( dt_dr = p.model.get_val("dt_dr", units="s/ft") tas = p.model.get_val(Dynamic.Mission.VELOCITY, units="ft/s") iwing = p.model.get_val(Aircraft.Wing.INCIDENCE, units="deg") - alpha = p.model.get_val("alpha", units="deg") + alpha = p.model.get_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, units="deg") c_alphai = np.cos(np.radians(alpha - iwing)) s_alphai = np.sin(np.radians(alpha - iwing)) diff --git a/aviary/mission/gasp_based/ode/unsteady_solved/unsteady_control_iter_group.py b/aviary/mission/gasp_based/ode/unsteady_solved/unsteady_control_iter_group.py index 37a2fcb65..1e0bab0de 100644 --- a/aviary/mission/gasp_based/ode/unsteady_solved/unsteady_control_iter_group.py +++ b/aviary/mission/gasp_based/ode/unsteady_solved/unsteady_control_iter_group.py @@ -74,13 +74,15 @@ def setup(self): thrust_alpha_bal = om.BalanceComp() if not self.options['ground_roll']: - thrust_alpha_bal.add_balance("alpha", - units="rad", - val=np.zeros(nn), - lhs_name="dgam_dt_approx", - rhs_name="dgam_dt", - eq_units="rad/s", - normalize=False) + thrust_alpha_bal.add_balance( + Dynamic.Vehicle.ANGLE_OF_ATTACK, + units="rad", + val=np.zeros(nn), + lhs_name="dgam_dt_approx", + rhs_name="dgam_dt", + eq_units="rad/s", + normalize=False, + ) thrust_alpha_bal.add_balance("thrust_req", units="N", diff --git a/aviary/mission/gasp_based/ode/unsteady_solved/unsteady_solved_eom.py b/aviary/mission/gasp_based/ode/unsteady_solved/unsteady_solved_eom.py index 24a86ce07..4e22158af 100644 --- a/aviary/mission/gasp_based/ode/unsteady_solved/unsteady_solved_eom.py +++ b/aviary/mission/gasp_based/ode/unsteady_solved/unsteady_solved_eom.py @@ -51,8 +51,12 @@ def setup(self): self.add_input(Dynamic.Vehicle.DRAG, shape=nn, desc=Dynamic.Vehicle.DRAG, units="N") add_aviary_input(self, Aircraft.Wing.INCIDENCE, val=0, units="rad") - self.add_input("alpha", val=np.zeros( - nn), desc="angle of attack", units="rad") + self.add_input( + Dynamic.Vehicle.ANGLE_OF_ATTACK, + val=np.zeros(nn), + desc="angle of attack", + units="rad", + ) if not self.options["ground_roll"]: self.add_input( @@ -123,20 +127,28 @@ def setup_partials(self): self.declare_partials(of=["dTAS_dt", "normal_force", "load_factor"], wrt=[Aircraft.Wing.INCIDENCE]) - self.declare_partials(of=["normal_force", "dTAS_dt"], - wrt=["alpha"], - rows=ar, cols=ar) + self.declare_partials( + of=["normal_force", "dTAS_dt"], + wrt=[Dynamic.Vehicle.ANGLE_OF_ATTACK], + rows=ar, + cols=ar, + ) - self.declare_partials(of="fuselage_pitch", - wrt=["alpha"], - rows=ar, cols=ar, val=1.0) + self.declare_partials( + of="fuselage_pitch", + wrt=[Dynamic.Vehicle.ANGLE_OF_ATTACK], + rows=ar, + cols=ar, + val=1.0, + ) self.declare_partials(of="fuselage_pitch", wrt=Aircraft.Wing.INCIDENCE, val=-1.0) - self.declare_partials(of="load_factor", wrt=["alpha"], - rows=ar, cols=ar) + self.declare_partials( + of="load_factor", wrt=[Dynamic.Vehicle.ANGLE_OF_ATTACK], rows=ar, cols=ar + ) if not ground_roll: self.declare_partials( @@ -150,7 +162,7 @@ def setup_partials(self): "mass", Dynamic.Vehicle.Propulsion.THRUST_TOTAL, Dynamic.Vehicle.DRAG, - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, Dynamic.Mission.FLIGHT_PATH_ANGLE, ], rows=ar, @@ -181,7 +193,7 @@ def setup_partials(self): Dynamic.Vehicle.LIFT, "mass", Dynamic.Vehicle.Propulsion.THRUST_TOTAL, - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, Dynamic.Mission.FLIGHT_PATH_ANGLE, ], rows=ar, @@ -213,7 +225,7 @@ def compute(self, inputs, outputs): weight = inputs["mass"] * GRAV_ENGLISH_LBM * LBF_TO_N drag = inputs[Dynamic.Vehicle.DRAG] lift = inputs[Dynamic.Vehicle.LIFT] - alpha = inputs["alpha"] + alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK] i_wing = inputs[Aircraft.Wing.INCIDENCE] @@ -272,7 +284,7 @@ def compute_partials(self, inputs, partials): lift = inputs[Dynamic.Vehicle.LIFT] tas = inputs[Dynamic.Mission.VELOCITY] i_wing = inputs[Aircraft.Wing.INCIDENCE] - alpha = inputs["alpha"] + alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK] if self.options["ground_roll"]: mu = MU_TAKEOFF @@ -318,7 +330,7 @@ def compute_partials(self, inputs, partials): GRAV_ENGLISH_LBM * (LBF_TO_N * (-sgam - mu) / m - _f / (weight/LBF_TO_N * m)) partials["dTAS_dt", Dynamic.Vehicle.LIFT] = mu / m - partials["dTAS_dt", "alpha"] = -tsai / m + mu * tcai / m + partials["dTAS_dt", Dynamic.Vehicle.ANGLE_OF_ATTACK] = -tsai / m + mu * tcai / m partials["dTAS_dt", Aircraft.Wing.INCIDENCE] = tsai / m - mu * tcai / m partials["normal_force", Dynamic.Vehicle.Propulsion.THRUST_TOTAL] = -salpha_i @@ -330,11 +342,13 @@ def compute_partials(self, inputs, partials): partials["load_factor", "mass"] = \ - (lift + tsai) / (weight**2/LBF_TO_N * cgam) * GRAV_ENGLISH_LBM - partials["normal_force", "alpha"] = -tcai + partials["normal_force", Dynamic.Vehicle.ANGLE_OF_ATTACK] = -tcai partials["normal_force", Aircraft.Wing.INCIDENCE] = tcai partials["load_factor", Aircraft.Wing.INCIDENCE] = -tcai / (weight * cgam) - partials["load_factor", "alpha"] = tcai / (weight * cgam) + partials["load_factor", Dynamic.Vehicle.ANGLE_OF_ATTACK] = tcai / ( + weight * cgam + ) if not ground_roll: partials["dt_dr", Dynamic.Mission.FLIGHT_PATH_ANGLE] = ( @@ -353,7 +367,9 @@ def compute_partials(self, inputs, partials): partials["dgam_dt", Dynamic.Mission.FLIGHT_PATH_ANGLE] = ( m * tas * weight * sgam / mtas2 ) - partials["dgam_dt", "alpha"] = m * tas * tcai / mtas2 + partials["dgam_dt", Dynamic.Vehicle.ANGLE_OF_ATTACK] = ( + m * tas * tcai / mtas2 + ) partials["dgam_dt", Dynamic.Mission.VELOCITY] = ( -m * (tsai + lift - weight * cgam) / mtas2 ) diff --git a/aviary/mission/gasp_based/ode/unsteady_solved/unsteady_solved_ode.py b/aviary/mission/gasp_based/ode/unsteady_solved/unsteady_solved_ode.py index cffa4259b..ed333e7ea 100644 --- a/aviary/mission/gasp_based/ode/unsteady_solved/unsteady_solved_ode.py +++ b/aviary/mission/gasp_based/ode/unsteady_solved/unsteady_solved_ode.py @@ -173,7 +173,8 @@ def setup(self): mission_inputs = subsystem.mission_inputs(**kwargs) if subsystem.code_origin is LegacyCode.FLOPS and 'angle_of_attack' in mission_inputs: mission_inputs.remove('angle_of_attack') - mission_inputs.append(('angle_of_attack', 'alpha')) + mission_inputs.append( + ('angle_of_attack', Dynamic.Vehicle.ANGLE_OF_ATTACK)) control_iter_group.add_subsystem(subsystem.name, system, promotes_inputs=mission_inputs, @@ -204,15 +205,17 @@ def setup(self): thrust_alpha_bal = om.BalanceComp() if not self.options['ground_roll']: - thrust_alpha_bal.add_balance("alpha", - units="rad", - val=np.zeros(nn), - lhs_name="dgam_dt_approx", - rhs_name="dgam_dt", - eq_units="rad/s", - lower=-np.pi/12, - upper=np.pi/12, - normalize=False) + thrust_alpha_bal.add_balance( + Dynamic.Vehicle.ANGLE_OF_ATTACK, + units="rad", + val=np.zeros(nn), + lhs_name="dgam_dt_approx", + rhs_name="dgam_dt", + eq_units="rad/s", + lower=-np.pi / 12, + upper=np.pi / 12, + normalize=False, + ) thrust_alpha_bal.add_balance("thrust_req", units="N", diff --git a/aviary/mission/gasp_based/phases/accel_phase.py b/aviary/mission/gasp_based/phases/accel_phase.py index 0bfdbe487..8a7628f46 100644 --- a/aviary/mission/gasp_based/phases/accel_phase.py +++ b/aviary/mission/gasp_based/phases/accel_phase.py @@ -68,7 +68,11 @@ def build_phase(self, aviary_options: AviaryValues = None): output_name=Dynamic.Atmosphere.MACH, units="unitless", ) - phase.add_timeseries_output("alpha", output_name="alpha", units="deg") + phase.add_timeseries_output( + Dynamic.Vehicle.ANGLE_OF_ATTACK, + output_name=Dynamic.Vehicle.ANGLE_OF_ATTACK, + units="deg", + ) phase.add_timeseries_output("aero.CL", output_name="CL", units="unitless") phase.add_timeseries_output( Dynamic.Vehicle.Propulsion.THRUST_TOTAL, diff --git a/aviary/mission/gasp_based/phases/ascent_phase.py b/aviary/mission/gasp_based/phases/ascent_phase.py index 6352dfccf..97df853f8 100644 --- a/aviary/mission/gasp_based/phases/ascent_phase.py +++ b/aviary/mission/gasp_based/phases/ascent_phase.py @@ -71,7 +71,7 @@ def build_phase(self, aviary_options: AviaryValues = None): ) phase.add_control( - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, val=0, lower=alpha_constraint_lower, upper=alpha_constraint_upper, @@ -172,8 +172,9 @@ def build_phase(self, aviary_options: AviaryValues = None): desc='initial guess for distance state') AscentPhase._add_initial_guess_meta_data( - InitialGuessControl('alpha'), - desc='initial guess for angle of attack control') + InitialGuessControl('angle_of_attack'), + desc='initial guess for angle of attack control', +) AscentPhase._add_initial_guess_meta_data( InitialGuessControl('tau_gear'), diff --git a/aviary/mission/gasp_based/phases/climb_phase.py b/aviary/mission/gasp_based/phases/climb_phase.py index 279c644a7..4c037f734 100644 --- a/aviary/mission/gasp_based/phases/climb_phase.py +++ b/aviary/mission/gasp_based/phases/climb_phase.py @@ -97,7 +97,11 @@ def build_phase(self, aviary_options: AviaryValues = None): Dynamic.Vehicle.Propulsion.FUEL_FLOW_RATE_NEGATIVE_TOTAL, units="lbm/s" ) phase.add_timeseries_output("theta", output_name="theta", units="deg") - phase.add_timeseries_output("alpha", output_name="alpha", units="deg") + phase.add_timeseries_output( + Dynamic.Vehicle.ANGLE_OF_ATTACK, + output_name=Dynamic.Vehicle.ANGLE_OF_ATTACK, + units="deg", + ) phase.add_timeseries_output( Dynamic.Mission.FLIGHT_PATH_ANGLE, output_name=Dynamic.Mission.FLIGHT_PATH_ANGLE, diff --git a/aviary/mission/gasp_based/phases/descent_phase.py b/aviary/mission/gasp_based/phases/descent_phase.py index 409187456..08390e83f 100644 --- a/aviary/mission/gasp_based/phases/descent_phase.py +++ b/aviary/mission/gasp_based/phases/descent_phase.py @@ -68,7 +68,11 @@ def build_phase(self, aviary_options: AviaryValues = None): output_name=Dynamic.Mission.FLIGHT_PATH_ANGLE, units="deg", ) - phase.add_timeseries_output("alpha", output_name="alpha", units="deg") + phase.add_timeseries_output( + Dynamic.Vehicle.ANGLE_OF_ATTACK, + output_name=Dynamic.Vehicle.ANGLE_OF_ATTACK, + units="deg", + ) phase.add_timeseries_output("theta", output_name="theta", units="deg") phase.add_timeseries_output("aero.CL", output_name="CL", units="unitless") phase.add_timeseries_output( diff --git a/aviary/mission/gasp_based/phases/rotation_phase.py b/aviary/mission/gasp_based/phases/rotation_phase.py index 8643ea5ec..8b961edb6 100644 --- a/aviary/mission/gasp_based/phases/rotation_phase.py +++ b/aviary/mission/gasp_based/phases/rotation_phase.py @@ -51,7 +51,7 @@ def build_phase(self, aviary_options: AviaryValues = None): # Add states phase.add_state( - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, fix_initial=True, fix_final=False, lower=angle_lower, @@ -155,8 +155,8 @@ def build_phase(self, aviary_options: AviaryValues = None): InitialGuessIntegrationVariable(), desc='initial guess for time options') RotationPhase._add_initial_guess_meta_data( - InitialGuessState('alpha'), - desc='initial guess for angle of attack state') + InitialGuessState('angle_of_attack'), desc='initial guess for angle of attack state' +) RotationPhase._add_initial_guess_meta_data( InitialGuessState('velocity'), desc='initial guess for true airspeed state') diff --git a/aviary/mission/gasp_based/phases/time_integration_phases.py b/aviary/mission/gasp_based/phases/time_integration_phases.py index 7b5e5d0b8..84da8711b 100644 --- a/aviary/mission/gasp_based/phases/time_integration_phases.py +++ b/aviary/mission/gasp_based/phases/time_integration_phases.py @@ -65,7 +65,7 @@ def __init__( super().__init__( RotationODE(analysis_scheme=AnalysisScheme.SHOOTING, **ode_args), problem_name=phase_name, - outputs=["normal_force", "alpha"], + outputs=["normal_force", Dynamic.Vehicle.ANGLE_OF_ATTACK], states=[ Dynamic.Vehicle.MASS, Dynamic.Mission.DISTANCE, @@ -120,7 +120,7 @@ def __init__( "load_factor", "fuselage_pitch", "normal_force", - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, ], states=[ Dynamic.Vehicle.MASS, @@ -128,7 +128,7 @@ def __init__( Dynamic.Mission.ALTITUDE, Dynamic.Mission.VELOCITY, Dynamic.Mission.FLIGHT_PATH_ANGLE, - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, ], # state_units=['lbm','nmi','ft'], alternate_state_rate_names={ @@ -154,7 +154,7 @@ def __init__( def event_equation_function(self, t, x): alpha = self.get_alpha(t, x) - self.ode0.set_val("alpha", alpha) + self.ode0.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, alpha) self.ode0.output_equation_function(t, x) alt = self.ode0.get_val(Dynamic.Mission.ALTITUDE).squeeze() return np.array( @@ -250,7 +250,9 @@ def set_val(self, *args, **kwargs): ode.set_val(*args, **kwargs) def compute_alpha(self, ode, t, x): - return ode.output_equation_function(t, x)[list(ode.outputs.keys()).index("alpha")] + return ode.output_equation_function(t, x)[ + list(ode.outputs.keys()).index(Dynamic.Vehicle.ANGLE_OF_ATTACK) + ] def get_alpha(self, t, x): a_key = (t,) + tuple(x) @@ -327,7 +329,7 @@ def state_equation_function(self, t, x, u=None): return np.ones(self.dim_output) * np.nan alpha = self.get_alpha(t, x) prob = self.get_prob(t, x) - prob.set_val("alpha", alpha) + prob.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, alpha) return prob.state_equation_function(t, x) @property @@ -345,7 +347,7 @@ def output_equation_function(self, t, x): # using solver may introduce slight variations depending on how it's walking or # not? and need to have a real compute before compute totals - or does that mean # use problem? - prob.set_val("alpha", alpha) + prob.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, alpha) self.time = t self.state = x return prob.output_equation_function(t, x) @@ -369,7 +371,7 @@ def __init__( super().__init__( ode, problem_name=phase_name, - outputs=["EAS", "mach", "alpha"], + outputs=["EAS", "mach", Dynamic.Vehicle.ANGLE_OF_ATTACK], states=[ Dynamic.Vehicle.MASS, Dynamic.Mission.DISTANCE, @@ -424,7 +426,7 @@ def __init__( ode, problem_name=phase_name, outputs=[ - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, Dynamic.Mission.FLIGHT_PATH_ANGLE, "required_lift", "lift", @@ -486,7 +488,7 @@ def __init__( ode, problem_name=phase_name, outputs=[ - "alpha", # ? + Dynamic.Vehicle.ANGLE_OF_ATTACK, # ? "lift", "EAS", Dynamic.Mission.VELOCITY, @@ -549,7 +551,7 @@ def __init__( ode, problem_name=phase_name, outputs=[ - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, "required_lift", "lift", "EAS", diff --git a/aviary/mission/twodof_phase.py b/aviary/mission/twodof_phase.py index 15f2068f1..85b425dc8 100644 --- a/aviary/mission/twodof_phase.py +++ b/aviary/mission/twodof_phase.py @@ -69,13 +69,17 @@ def build_phase(self, aviary_options: AviaryValues = None): fix_initial=fix_initial, fix_final=False, ref=100., defect_ref=100.) if rotation: - phase.add_polynomial_control("alpha", - order=control_order, - fix_initial=True, - lower=0, upper=15, - units='deg', ref=10., - val=0., - opt=True) + phase.add_polynomial_control( + Dynamic.Vehicle.ANGLE_OF_ATTACK, + order=control_order, + fix_initial=True, + lower=0, + upper=15, + units='deg', + ref=10.0, + val=0.0, + opt=True, + ) phase.add_timeseries_output("EAS", units="kn") phase.add_timeseries_output(Dynamic.Mission.VELOCITY, units="kn") @@ -128,8 +132,9 @@ def _extra_ode_init_kwargs(self): desc='initial guess for initial distance and duration specified as a tuple') TwoDOFPhase._add_initial_guess_meta_data( - InitialGuessPolynomialControl('alpha'), - desc='initial guess for alpha') + InitialGuessPolynomialControl('angle_of_attack'), + desc='initial guess for angle of attack', +) TwoDOFPhase._add_initial_guess_meta_data( InitialGuessState('time'), diff --git a/aviary/subsystems/aerodynamics/aerodynamics_builder.py b/aviary/subsystems/aerodynamics/aerodynamics_builder.py index 1f2c8ffc5..140fa6566 100644 --- a/aviary/subsystems/aerodynamics/aerodynamics_builder.py +++ b/aviary/subsystems/aerodynamics/aerodynamics_builder.py @@ -287,7 +287,11 @@ def mission_outputs(self, **kwargs): elif method == 'cruise': if 'output_alpha' in kwargs: if kwargs['output_alpha']: - promotes = [Dynamic.Vehicle.DRAG, Dynamic.Vehicle.LIFT, 'alpha'] + promotes = [ + Dynamic.Vehicle.DRAG, + Dynamic.Vehicle.LIFT, + Dynamic.Vehicle.ANGLE_OF_ATTACK, + ] else: promotes = [Dynamic.Vehicle.DRAG, Dynamic.Vehicle.LIFT, 'CL_max'] diff --git a/aviary/subsystems/aerodynamics/flops_based/test/test_solved_aero_group.py b/aviary/subsystems/aerodynamics/flops_based/test/test_solved_aero_group.py index 5e752099b..cb3aba991 100644 --- a/aviary/subsystems/aerodynamics/flops_based/test/test_solved_aero_group.py +++ b/aviary/subsystems/aerodynamics/flops_based/test/test_solved_aero_group.py @@ -16,7 +16,7 @@ from aviary.utils.csv_data_file import read_data_file from aviary.utils.named_values import NamedValues from aviary.interface.default_phase_info.height_energy import phase_info -from aviary.variable_info.variables import Aircraft +from aviary.variable_info.variables import Aircraft, Dynamic # The drag-polar-generating component reads this in, instead of computing the polars. @@ -216,13 +216,17 @@ def initialize(self): desc="List of altitudes in ascending order.") self.options.declare("mach", default=None, allow_none=True, desc="List of mach numbers in ascending order.") - self.options.declare("alpha", default=None, allow_none=True, - desc="List of angles of attack in ascending order.") + self.options.declare( + "alpha", + default=None, + allow_none=True, + desc="List of angles of attack in ascending order.", + ) def setup(self): altitude = self.options['altitude'] mach = self.options['mach'] - alpha = self.options['alpha'] + alpha = self.options["alpha"] self.add_input(Aircraft.Wing.AREA, 1.0, units='ft**2') self.add_input(Aircraft.Wing.SPAN, 1.0, units='ft') diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index cd45e5a5c..014b36a2c 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py @@ -1129,7 +1129,13 @@ def setup(self): nn = self.options["num_nodes"] # mission inputs - self.add_input("alpha", val=0.0, units="deg", shape=nn, desc="Angle of attack") + self.add_input( + Dynamic.Vehicle.ANGLE_OF_ATTACK, + val=0.0, + units="deg", + shape=nn, + desc="Angle of attack", + ) self.add_input( Dynamic.Mission.ALTITUDE, val=0.0, @@ -1203,7 +1209,7 @@ def setup_partials(self): ar = np.arange(self.options["num_nodes"]) dynvars = [ - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, Dynamic.Mission.ALTITUDE, "lift_curve_slope", "lift_ratio", @@ -1291,14 +1297,22 @@ def setup(self): if self.options["output_alpha"]: self.add_output( - "alpha", val=0.0, units="deg", shape=nn, desc="Angle of attack" + Dynamic.Vehicle.ANGLE_OF_ATTACK, + val=0.0, + units="deg", + shape=nn, + desc="Angle of attack", ) self.add_input( "CL", val=1.0, units="unitless", shape=nn, desc="Lift coefficient" ) else: self.add_input( - "alpha", val=0.0, units="deg", shape=nn, desc="Angle of attack" + Dynamic.Vehicle.ANGLE_OF_ATTACK, + val=0.0, + units="deg", + shape=nn, + desc="Angle of attack", ) self.add_output( "CL", val=1.0, units="unitless", shape=nn, desc="Lift coefficient" @@ -1325,17 +1339,21 @@ def setup_partials(self): if self.options["output_alpha"]: self.declare_partials( - "alpha", + Dynamic.Vehicle.ANGLE_OF_ATTACK, ["CL", "lift_ratio", "lift_curve_slope"], rows=ar, cols=ar, method="cs", ) - self.declare_partials("alpha", [Aircraft.Wing.ZERO_LIFT_ANGLE], method="cs") + self.declare_partials( + Dynamic.Vehicle.ANGLE_OF_ATTACK, + [Aircraft.Wing.ZERO_LIFT_ANGLE], + method="cs", + ) else: self.declare_partials( "CL", - ["lift_curve_slope", "alpha", "lift_ratio"], + ["lift_curve_slope", Dynamic.Vehicle.ANGLE_OF_ATTACK, "lift_ratio"], rows=ar, cols=ar, method="cs", @@ -1364,9 +1382,11 @@ def compute(self, inputs, outputs): if self.options["output_alpha"]: CL = inputs["CL"] clw = CL / (1 + lift_ratio) - outputs["alpha"] = rad2deg(clw / lift_curve_slope) + alpha0 + outputs[Dynamic.Vehicle.ANGLE_OF_ATTACK] = ( + rad2deg(clw / lift_curve_slope) + alpha0 + ) else: - alpha = inputs["alpha"] + alpha = inputs[Dynamic.Vehicle.ANGLE_OF_ATTACK] outputs["CL"] = ( lift_curve_slope * deg2rad(alpha - alpha0) * (1 + lift_ratio) ) @@ -1434,14 +1454,12 @@ def initialize(self): types=bool, desc="True to start with flaps applied, False for reverse", ) - # TODO this option does not really exist for LowSpeed and should be renamed - # (the value of having identical option set to cruise aero not worth the added - # confusion of having a mislabeled option here) self.options.declare( - "output_alpha", + "lift_required", default=False, types=bool, - desc="If True, output alpha for a given input CL", + desc="If True, compute CL from lift required (mass). If False, compute lift " + "from current flight conditions including angle of attack.", ) self.options.declare( "input_atmos", @@ -1453,7 +1471,7 @@ def initialize(self): def setup(self): nn = self.options["num_nodes"] - output_alpha = self.options["output_alpha"] + lift_required = self.options["lift_required"] self.add_subsystem( "aero_setup", AeroSetup( @@ -1490,7 +1508,7 @@ def setup(self): promotes_outputs=['flap_factor', 'gear_factor'], ) - if output_alpha: + if lift_required: # lift_req -> CL self.add_subsystem( "lift2cl", @@ -1500,7 +1518,7 @@ def setup(self): # so ensure this is what's passed to DragCoef promotes_outputs=[("CL", "CL_full_flaps")], ) - warnings.warn("Alpha is NOT an output from LowSpeedAero.") + # NOTE Alpha is NOT an output from LowSpeedAero. else: self.add_subsystem( "lift_coef", diff --git a/aviary/subsystems/aerodynamics/gasp_based/test/test_gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/test/test_gaspaero.py index ed962e8ed..aa2101f79 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/test/test_gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/test/test_gaspaero.py @@ -51,7 +51,7 @@ def test_cruise(self): with self.subTest(alt=alt, mach=mach, alpha=alpha): # prob.set_val(Dynamic.Mission.ALTITUDE, alt) prob.set_val(Dynamic.Atmosphere.MACH, mach) - prob.set_val("alpha", alpha) + prob.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, alpha) prob.set_val(Dynamic.Atmosphere.SPEED_OF_SOUND, row["sos"]) prob.set_val(Dynamic.Atmosphere.KINEMATIC_VISCOSITY, row["nu"]) @@ -94,7 +94,7 @@ def test_ground(self): with self.subTest(ilift=ilift, alt=alt, mach=mach, alpha=alpha): prob.set_val(Dynamic.Atmosphere.MACH, mach) prob.set_val(Dynamic.Mission.ALTITUDE, alt) - prob.set_val("alpha", alpha) + prob.set_val(Dynamic.Vehicle.ANGLE_OF_ATTACK, alpha) prob.set_val(Dynamic.Atmosphere.SPEED_OF_SOUND, row["sos"]) prob.set_val(Dynamic.Atmosphere.KINEMATIC_VISCOSITY, row["nu"]) @@ -125,18 +125,18 @@ def test_ground(self): assert_check_partials(partial_data, atol=4.5, rtol=5e-3) def test_ground_alpha_out(self): - # Test that drag output matches between alpha in/out cases + # Test that drag output matches between both CL computation methods prob = om.Problem() prob.model.add_subsystem( - "alpha_in", + "lift_from_aoa", LowSpeedAero(), - promotes_inputs=["*", ("alpha", "alpha_in")], + promotes_inputs=["*", (Dynamic.Vehicle.ANGLE_OF_ATTACK, "alpha_in")], promotes_outputs=[(Dynamic.Vehicle.LIFT, "lift_req")], ) prob.model.add_subsystem( - "alpha_out", - LowSpeedAero(output_alpha=True), + "lift_required", + LowSpeedAero(lift_required=True), promotes_inputs=["*", "lift_req"], ) @@ -156,7 +156,9 @@ def test_ground_alpha_out(self): prob.set_val("alpha_in", 5) prob.run_model() - assert_near_equal(prob["alpha_in.drag"], prob["alpha_out.drag"], tolerance=1e-6) + assert_near_equal( + prob["lift_from_aoa.drag"], prob["lift_required.drag"], tolerance=1e-6 + ) partial_data = prob.check_partials(method="fd", out_stream=None) assert_check_partials(partial_data, atol=0.02, rtol=1e-4) From 8ec9d88658566efebb8ec084fc41f2585271e941 Mon Sep 17 00:00:00 2001 From: jkirk5 Date: Fri, 31 Jan 2025 16:15:37 -0500 Subject: [PATCH 5/6] fix from variable name update --- aviary/examples/run_detailed_takeoff_in_level2.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/aviary/examples/run_detailed_takeoff_in_level2.py b/aviary/examples/run_detailed_takeoff_in_level2.py index d5fee84b8..ed00b93ff 100644 --- a/aviary/examples/run_detailed_takeoff_in_level2.py +++ b/aviary/examples/run_detailed_takeoff_in_level2.py @@ -82,7 +82,7 @@ 'distance': [(2.0e3, 1.0e3), 'ft'], 'time': [(20.0, 25.0), 's'], 'mass': [(174.85e3, 174.84e3), 'lbm'], - Dynamic.Vehicle.ANGLE_OF_ATTACK: [(0.0, 12.0), 'deg'], + 'angle_of_attack': [(0.0, 12.0), 'deg'], }, }, 'BC': { @@ -373,7 +373,8 @@ output_data[point_name]['true_airspeed'] = case.get_val( f'traj.{phase_name}.timeseries.velocity', units='kn')[-1][0] output_data[point_name]['angle_of_attack'] = case.get_val( - f'traj.{phase_name}.timeseries.alpha', units='deg')[-1][0] + f'traj.{phase_name}.timeseries.angle_of_attack', units='deg' + )[-1][0] output_data[point_name]['flight_path_angle'] = case.get_val( f'traj.{phase_name}.timeseries.flight_path_angle', units='deg')[-1][0] output_data[point_name]['altitude'] = case.get_val( From 2978547c7f2537ba64025406a1e659cddf0dfaba Mon Sep 17 00:00:00 2001 From: jkirk5 Date: Fri, 31 Jan 2025 16:35:32 -0500 Subject: [PATCH 6/6] another variable name fix --- aviary/examples/run_detailed_landing_in_level2.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/aviary/examples/run_detailed_landing_in_level2.py b/aviary/examples/run_detailed_landing_in_level2.py index fb611ce78..239c95ae5 100644 --- a/aviary/examples/run_detailed_landing_in_level2.py +++ b/aviary/examples/run_detailed_landing_in_level2.py @@ -1,5 +1,3 @@ - - import openmdao.api as om import aviary.api as av @@ -200,9 +198,11 @@ output_data[point_name]['true_airspeed'] = case.get_val( f'traj.{phase_name}.timeseries.velocity', units='kn')[-1][0] output_data[point_name]['angle_of_attack'] = case.get_val( - f'traj.{phase_name}.timeseries.alpha', units='deg')[-1][0] + f'traj.{phase_name}.timeseries.angle_of_attack', units='deg' + )[-1][0] output_data[point_name]['flight_path_angle'] = case.get_val( - f'traj.{phase_name}.timeseries.flight_path_angle', units='deg')[-1][0] + f'traj.{phase_name}.timeseries.flight_path_angle', units='deg' + )[-1][0] output_data[point_name]['altitude'] = case.get_val( f'traj.{phase_name}.timeseries.altitude', units='ft')[-1][0] output_data[point_name]['distance'] = case.get_val(