diff --git a/aviary/subsystems/geometry/flops_based/landing_gear.py b/aviary/subsystems/geometry/flops_based/landing_gear.py new file mode 100644 index 0000000000..5819cda329 --- /dev/null +++ b/aviary/subsystems/geometry/flops_based/landing_gear.py @@ -0,0 +1,198 @@ +import numpy as np +import openmdao.api as om + +from aviary.subsystems.mass.flops_based.distributed_prop import ( + distributed_nacelle_diam_factor, + distributed_nacelle_diam_factor_deriv, +) +from aviary.variable_info.functions import add_aviary_input, add_aviary_option, add_aviary_output +from aviary.variable_info.variables import Aircraft + +DEG2RAD = np.pi / 180.0 + + +class NoseGearLength(om.ExplicitComponent): + """ + Computation of nose gear oleo strut length from main gear oleo strut length: + NOSE_GEAR_OLEO_LENGTH = 0.7 * MAIN_GEAR_OLEO_LENGTH. + """ + + def setup(self): + add_aviary_input(self, Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, units='inch') + add_aviary_output(self, Aircraft.LandingGear.NOSE_GEAR_OLEO_LENGTH, units='inch') + + def setup_partials(self): + self.declare_partials( + Aircraft.LandingGear.NOSE_GEAR_OLEO_LENGTH, + Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, + val=0.7, + ) + + def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): + outputs[Aircraft.LandingGear.NOSE_GEAR_OLEO_LENGTH] = ( + 0.7 * inputs[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH] + ) + + +class MainGearLength(om.ExplicitComponent): + """ + Computation of main gear length. + + TODO does not support more than two wing engines, or more than one engine model + """ + + def initialize(self): + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) + add_aviary_option(self, Aircraft.Engine.NUM_WING_ENGINES) + + def setup(self): + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) + num_wing_engines_total = sum(self.options[Aircraft.Engine.NUM_WING_ENGINES]) + + add_aviary_input(self, Aircraft.Fuselage.LENGTH, units='ft') + add_aviary_input(self, Aircraft.Fuselage.MAX_WIDTH, units='ft') + add_aviary_input(self, Aircraft.Nacelle.AVG_DIAMETER, shape=num_engine_type, units='ft') + if num_wing_engines_total > 1: + add_aviary_input( + self, + Aircraft.Engine.WING_LOCATIONS, + shape=int(num_wing_engines_total / 2), + units='unitless', + ) + else: # this case is not tested + add_aviary_input(self, Aircraft.Engine.WING_LOCATIONS, units='unitless') + + add_aviary_input(self, Aircraft.Wing.DIHEDRAL, units='deg') + add_aviary_input(self, Aircraft.Wing.SPAN, units='ft') + + add_aviary_output(self, Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, units='inch') + + def setup_partials(self): + self.declare_partials('*', '*') + + def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): + num_eng = self.options[Aircraft.Engine.NUM_ENGINES][0] + + # TODO temp using first engine, heterogeneous engines not supported + num_wing_eng = self.options[Aircraft.Engine.NUM_WING_ENGINES][0] + + # TODO: high engine-count configuration. + y_eng_aft = 0 + + if num_wing_eng > 0: + y_eng_fore = inputs[Aircraft.Engine.WING_LOCATIONS][0] + + tan_dih = np.tan(inputs[Aircraft.Wing.DIHEDRAL] * DEG2RAD) + fuse_half_width = inputs[Aircraft.Fuselage.MAX_WIDTH] * 6.0 + + d_nacelle = inputs[Aircraft.Nacelle.AVG_DIAMETER][0] + # f_nacelle = d_nacelle + # if num_eng > 4: + # f_nacelle = 0.5 * d_nacelle * num_eng ** 0.5 + + f_nacelle = distributed_nacelle_diam_factor(d_nacelle, num_eng) + + yee = y_eng_fore + if num_wing_eng > 2 and y_eng_aft > 0.0: + yee = y_eng_aft + + if yee < 1.0: + # This is triggered when the input engine locations are normalized. + yee *= 6.0 * inputs[Aircraft.Wing.SPAN] + + cmlg = 12.0 * f_nacelle + (0.26 - tan_dih) * (yee - fuse_half_width) + + else: + cmlg = 0.0 + + if cmlg < 12.0: + cmlg = 0.75 * inputs[Aircraft.Fuselage.LENGTH] + + outputs[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH] = cmlg + + def compute_partials(self, inputs, partials, discrete_inputs=None): + # TODO temp using first engine, heterogeneous engines not supported + num_eng = self.options[Aircraft.Engine.NUM_ENGINES][0] + num_wing_eng = self.options[Aircraft.Engine.NUM_WING_ENGINES][0] + + y_eng_aft = 0 + + if num_wing_eng > 0: + y_eng_fore = inputs[Aircraft.Engine.WING_LOCATIONS][0] + + tan_dih = np.tan(inputs[Aircraft.Wing.DIHEDRAL] * DEG2RAD) + dtan_dih = DEG2RAD / np.cos(inputs[Aircraft.Wing.DIHEDRAL] * DEG2RAD) ** 2 + + fuse_half_width = inputs[Aircraft.Fuselage.MAX_WIDTH] * 6.0 + dhw_dfuse_wid = 6.0 + + d_nacelle = inputs[Aircraft.Nacelle.AVG_DIAMETER][0] + # f_nacelle = d_nacelle + # d_nac = 1.0 + # if num_eng > 4: + # f_nacelle = 0.5 * d_nacelle * num_eng ** 0.5 + # d_nac = 0.5 * num_eng ** 0.5 + + f_nacelle = distributed_nacelle_diam_factor(d_nacelle, num_eng) + d_nac = distributed_nacelle_diam_factor_deriv(num_eng) + + yee = y_eng_fore + if num_wing_eng > 2 and y_eng_aft > 0.0: + yee = y_eng_aft + + dyee_dwel = 1.0 + dyee_dspan = 1.0 + if yee < 1.0: + dyee_dwel = 6.0 * inputs[Aircraft.Wing.SPAN] + dyee_dspan = 6.0 * yee + + yee *= 6.0 * inputs[Aircraft.Wing.SPAN] + + cmlg = 12.0 * f_nacelle + (0.26 - tan_dih) * (yee - fuse_half_width) + dcmlg_dnac = 12.0 * d_nac + dcmlg_dtan = -(yee - fuse_half_width) + dcmlg_dyee = 0.26 - tan_dih + dcmlg_dhw = tan_dih - 0.26 + + else: + cmlg = 0.0 + + if cmlg < 12.0: + partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Fuselage.LENGTH] = 0.75 + + partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Fuselage.MAX_WIDTH] = 0.0 + + partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Nacelle.AVG_DIAMETER] = ( + 0.0 + ) + + partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Engine.WING_LOCATIONS] = ( + 0.0 + ) + + partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Wing.DIHEDRAL] = 0.0 + + partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Wing.SPAN] = 0.0 + + else: + partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Fuselage.LENGTH] = 0.0 + + partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Fuselage.MAX_WIDTH] = ( + dcmlg_dhw * dhw_dfuse_wid + ) + + partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Nacelle.AVG_DIAMETER][ + : + ] = dcmlg_dnac + + partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Engine.WING_LOCATIONS] = ( + dcmlg_dyee * dyee_dwel + ) + + partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Wing.DIHEDRAL] = ( + dcmlg_dtan * dtan_dih + ) + + partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Wing.SPAN] = ( + dcmlg_dyee * dyee_dspan + ) diff --git a/aviary/subsystems/geometry/flops_based/test/test_landing_gear.py b/aviary/subsystems/geometry/flops_based/test/test_landing_gear.py new file mode 100644 index 0000000000..a5f22c7880 --- /dev/null +++ b/aviary/subsystems/geometry/flops_based/test/test_landing_gear.py @@ -0,0 +1,69 @@ +import unittest + +import openmdao.api as om +from openmdao.utils.assert_utils import assert_check_partials +from openmdao.utils.testing_utils import use_tempdirs +from parameterized import parameterized + +from aviary.subsystems.geometry.flops_based.landing_gear import MainGearLength, NoseGearLength +from aviary.utils.test_utils.variable_test import assert_match_varnames +from aviary.validation_cases.validation_tests import ( + flops_validation_test, + get_flops_case_names, + get_flops_inputs, + print_case, + Version, +) +from aviary.variable_info.variables import Aircraft + + +@use_tempdirs +class LandingGearLengthTest(unittest.TestCase): + """This component is unrepresented in our test data.""" + + def setUp(self): + self.prob = om.Problem() + + @parameterized.expand(get_flops_case_names(only='AdvancedSingleAisle'), name_func=print_case) + def test_derivs(self, case_name): + prob = self.prob + model = prob.model + + inputs = get_flops_inputs(case_name, preprocess=True) + + options = { + Aircraft.Engine.NUM_ENGINES: inputs.get_val(Aircraft.Engine.NUM_ENGINES), + Aircraft.Engine.NUM_WING_ENGINES: inputs.get_val(Aircraft.Engine.NUM_WING_ENGINES), + } + + model.add_subsystem('main', MainGearLength(**options), promotes=['*']) + model.add_subsystem('nose', NoseGearLength(), promotes=['*']) + + prob.setup(force_alloc_complex=True) + + flops_validation_test( + self, + prob, + case_name, + input_keys=[ + Aircraft.Fuselage.LENGTH, + Aircraft.Fuselage.MAX_WIDTH, + Aircraft.Nacelle.AVG_DIAMETER, + Aircraft.Engine.WING_LOCATIONS, + Aircraft.Wing.DIHEDRAL, + Aircraft.Wing.SPAN, + ], + output_keys=[ + Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, + Aircraft.LandingGear.NOSE_GEAR_OLEO_LENGTH, + ], + version=Version.ALTERNATE, + atol=1e-11, + ) + + def test_IO(self): + assert_match_varnames(self.prob.model) + + +if __name__ == '__main__': + unittest.main() diff --git a/aviary/subsystems/mass/flops_based/engine.py b/aviary/subsystems/mass/flops_based/engine.py index 5778937c5f..a6d103f185 100644 --- a/aviary/subsystems/mass/flops_based/engine.py +++ b/aviary/subsystems/mass/flops_based/engine.py @@ -4,8 +4,7 @@ from aviary.variable_info.functions import add_aviary_input, add_aviary_option, add_aviary_output from aviary.variable_info.variables import Aircraft -# TODO should additional misc mass be separated out into a separate component? -# TODO include estimation for baseline (unscaled) mass if not provided (NTRS paper on FLOPS equations pg. 30) +# include estimation for baseline (unscaled) mass if not provided, issue #1097 class EngineMass(om.ExplicitComponent): diff --git a/aviary/subsystems/mass/flops_based/hydraulics.py b/aviary/subsystems/mass/flops_based/hydraulics.py index cfa2427b21..a58cbaf6b0 100644 --- a/aviary/subsystems/mass/flops_based/hydraulics.py +++ b/aviary/subsystems/mass/flops_based/hydraulics.py @@ -5,11 +5,6 @@ from aviary.variable_info.functions import add_aviary_input, add_aviary_option, add_aviary_output from aviary.variable_info.variables import Aircraft, Mission -# TODO: update non-transport components to new standard to remove these variables -_wing_engine_count_factor = 'aircraft:propulsion:control:wing_engine_count_factor' -_fuse_engine_count_factor = 'aircraft:propulsion:control:fuselage_engine_count_factor' -_max_mach = 'aircraft:design:dimensions:max_mach' - class TransportHydraulicsGroupMass(om.ExplicitComponent): """ diff --git a/aviary/subsystems/mass/flops_based/landing_gear.py b/aviary/subsystems/mass/flops_based/landing_gear.py index 88846c42a9..6dc20ebdbb 100644 --- a/aviary/subsystems/mass/flops_based/landing_gear.py +++ b/aviary/subsystems/mass/flops_based/landing_gear.py @@ -62,7 +62,7 @@ class MainGearMass(om.ExplicitComponent): equations, modified to output mass instead of weight. """ - # TODO: add in aircraft type and carrier factors as options and modify equations + # add in aircraft type and carrier factors as options and modify equations, see issue #1094. def setup(self): add_aviary_input(self, Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, units='inch') @@ -125,7 +125,7 @@ class NoseGearMass(om.ExplicitComponent): equations, modified to output mass instead of weight. """ - # TODO: add in aircraft type and carrier factors as options and modify equations + # add in aircraft type and carrier factors as options and modify equations, see issue #1094. def setup(self): add_aviary_input(self, Aircraft.LandingGear.NOSE_GEAR_OLEO_LENGTH, units='inch') @@ -288,191 +288,3 @@ def compute_partials(self, inputs, J): J[Aircraft.LandingGear.NOSE_GEAR_MASS, Aircraft.Design.GROSS_MASS] = ( 0.15 * total_gear_fact * nose_gear_scaler ) - - -# TODO move gear lengths to geometry? Would be different than FLOPS but makes sense otherwise -class NoseGearLength(om.ExplicitComponent): - """ - Computation of nose gear oleo strut length from main gear oleo strut length: - NOSE_GEAR_OLEO_LENGTH = 0.7 * MAIN_GEAR_OLEO_LENGTH. - """ - - def setup(self): - add_aviary_input(self, Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, units='inch') - add_aviary_output(self, Aircraft.LandingGear.NOSE_GEAR_OLEO_LENGTH, units='inch') - - def setup_partials(self): - self.declare_partials( - Aircraft.LandingGear.NOSE_GEAR_OLEO_LENGTH, - Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, - val=0.7, - ) - - def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): - outputs[Aircraft.LandingGear.NOSE_GEAR_OLEO_LENGTH] = ( - 0.7 * inputs[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH] - ) - - -class MainGearLength(om.ExplicitComponent): - """ - Computation of main gear length. - - TODO does not support more than two wing engines, or more than one engine model - """ - - def initialize(self): - add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) - add_aviary_option(self, Aircraft.Engine.NUM_WING_ENGINES) - - def setup(self): - num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) - num_wing_engines_total = sum(self.options[Aircraft.Engine.NUM_WING_ENGINES]) - - add_aviary_input(self, Aircraft.Fuselage.LENGTH, units='ft') - add_aviary_input(self, Aircraft.Fuselage.MAX_WIDTH, units='ft') - add_aviary_input(self, Aircraft.Nacelle.AVG_DIAMETER, shape=num_engine_type, units='ft') - if num_wing_engines_total > 1: - add_aviary_input( - self, - Aircraft.Engine.WING_LOCATIONS, - shape=int(num_wing_engines_total / 2), - units='unitless', - ) - else: # this case is not tested - add_aviary_input(self, Aircraft.Engine.WING_LOCATIONS, units='unitless') - - add_aviary_input(self, Aircraft.Wing.DIHEDRAL, units='deg') - add_aviary_input(self, Aircraft.Wing.SPAN, units='ft') - - add_aviary_output(self, Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, units='inch') - - def setup_partials(self): - self.declare_partials('*', '*') - - def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): - num_eng = self.options[Aircraft.Engine.NUM_ENGINES][0] - - # TODO temp using first engine, heterogeneous engines not supported - num_wing_eng = self.options[Aircraft.Engine.NUM_WING_ENGINES][0] - - # TODO: high engine-count configuration. - y_eng_aft = 0 - - if num_wing_eng > 0: - y_eng_fore = inputs[Aircraft.Engine.WING_LOCATIONS][0] - - tan_dih = np.tan(inputs[Aircraft.Wing.DIHEDRAL] * DEG2RAD) - fuse_half_width = inputs[Aircraft.Fuselage.MAX_WIDTH] * 6.0 - - d_nacelle = inputs[Aircraft.Nacelle.AVG_DIAMETER][0] - # f_nacelle = d_nacelle - # if num_eng > 4: - # f_nacelle = 0.5 * d_nacelle * num_eng ** 0.5 - - f_nacelle = distributed_nacelle_diam_factor(d_nacelle, num_eng) - - yee = y_eng_fore - if num_wing_eng > 2 and y_eng_aft > 0.0: - yee = y_eng_aft - - if yee < 1.0: - # This is triggered when the input engine locations are normalized. - yee *= 6.0 * inputs[Aircraft.Wing.SPAN] - - cmlg = 12.0 * f_nacelle + (0.26 - tan_dih) * (yee - fuse_half_width) - - else: - cmlg = 0.0 - - if cmlg < 12.0: - cmlg = 0.75 * inputs[Aircraft.Fuselage.LENGTH] - - outputs[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH] = cmlg - - def compute_partials(self, inputs, partials, discrete_inputs=None): - # TODO temp using first engine, heterogeneous engines not supported - num_eng = self.options[Aircraft.Engine.NUM_ENGINES][0] - num_wing_eng = self.options[Aircraft.Engine.NUM_WING_ENGINES][0] - - y_eng_aft = 0 - - if num_wing_eng > 0: - y_eng_fore = inputs[Aircraft.Engine.WING_LOCATIONS][0] - - tan_dih = np.tan(inputs[Aircraft.Wing.DIHEDRAL] * DEG2RAD) - dtan_dih = DEG2RAD / np.cos(inputs[Aircraft.Wing.DIHEDRAL] * DEG2RAD) ** 2 - - fuse_half_width = inputs[Aircraft.Fuselage.MAX_WIDTH] * 6.0 - dhw_dfuse_wid = 6.0 - - d_nacelle = inputs[Aircraft.Nacelle.AVG_DIAMETER][0] - # f_nacelle = d_nacelle - # d_nac = 1.0 - # if num_eng > 4: - # f_nacelle = 0.5 * d_nacelle * num_eng ** 0.5 - # d_nac = 0.5 * num_eng ** 0.5 - - f_nacelle = distributed_nacelle_diam_factor(d_nacelle, num_eng) - d_nac = distributed_nacelle_diam_factor_deriv(num_eng) - - yee = y_eng_fore - if num_wing_eng > 2 and y_eng_aft > 0.0: - yee = y_eng_aft - - dyee_dwel = 1.0 - dyee_dspan = 1.0 - if yee < 1.0: - dyee_dwel = 6.0 * inputs[Aircraft.Wing.SPAN] - dyee_dspan = 6.0 * yee - - yee *= 6.0 * inputs[Aircraft.Wing.SPAN] - - cmlg = 12.0 * f_nacelle + (0.26 - tan_dih) * (yee - fuse_half_width) - dcmlg_dnac = 12.0 * d_nac - dcmlg_dtan = -(yee - fuse_half_width) - dcmlg_dyee = 0.26 - tan_dih - dcmlg_dhw = tan_dih - 0.26 - - else: - cmlg = 0.0 - - if cmlg < 12.0: - partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Fuselage.LENGTH] = 0.75 - - partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Fuselage.MAX_WIDTH] = 0.0 - - partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Nacelle.AVG_DIAMETER] = ( - 0.0 - ) - - partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Engine.WING_LOCATIONS] = ( - 0.0 - ) - - partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Wing.DIHEDRAL] = 0.0 - - partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Wing.SPAN] = 0.0 - - else: - partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Fuselage.LENGTH] = 0.0 - - partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Fuselage.MAX_WIDTH] = ( - dcmlg_dhw * dhw_dfuse_wid - ) - - partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Nacelle.AVG_DIAMETER][ - : - ] = dcmlg_dnac - - partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Engine.WING_LOCATIONS] = ( - dcmlg_dyee * dyee_dwel - ) - - partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Wing.DIHEDRAL] = ( - dcmlg_dtan * dtan_dih - ) - - partials[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, Aircraft.Wing.SPAN] = ( - dcmlg_dyee * dyee_dspan - ) diff --git a/aviary/subsystems/mass/flops_based/landing_group.py b/aviary/subsystems/mass/flops_based/landing_group.py index f0c84985f5..66f01d9a63 100644 --- a/aviary/subsystems/mass/flops_based/landing_group.py +++ b/aviary/subsystems/mass/flops_based/landing_group.py @@ -1,11 +1,7 @@ import openmdao.api as om -from aviary.subsystems.mass.flops_based.landing_gear import ( - AltLandingGearMass, - LandingGearMass, - MainGearLength, - NoseGearLength, -) +from aviary.subsystems.geometry.flops_based.landing_gear import MainGearLength, NoseGearLength +from aviary.subsystems.mass.flops_based.landing_gear import AltLandingGearMass, LandingGearMass from aviary.subsystems.mass.flops_based.landing_mass import LandingMass, LandingTakeoffMassRatio from aviary.variable_info.functions import add_aviary_option from aviary.variable_info.variables import Aircraft diff --git a/aviary/subsystems/mass/flops_based/misc_engine.py b/aviary/subsystems/mass/flops_based/misc_engine.py index 5f2e9f9433..625aa47e7b 100644 --- a/aviary/subsystems/mass/flops_based/misc_engine.py +++ b/aviary/subsystems/mass/flops_based/misc_engine.py @@ -41,8 +41,8 @@ def setup(self): ) def compute(self, inputs, outputs): - # TODO temporarily using engine-level additional mass and multiplying - # by num_engines to get propulsion-level additional mass + # temporarily using engine-level additional mass and multiplying + # by num_engines to get propulsion-level additional mass, see issue # 1095 num_engines = self.options[Aircraft.Engine.NUM_ENGINES] addtl_mass = sum(inputs[Aircraft.Engine.ADDITIONAL_MASS] * num_engines) @@ -55,8 +55,8 @@ def compute(self, inputs, outputs): outputs[Aircraft.Propulsion.TOTAL_MISC_MASS] = misc_mass def compute_partials(self, inputs, J): - # TODO temporarily using engine-level additional mass and multiplying - # by num_engines to get propulsion-level additional mass + # temporarily using engine-level additional mass and multiplying + # by num_engines to get propulsion-level additional mass, see issue # 1095 num_engines = self.options[Aircraft.Engine.NUM_ENGINES] addtl_mass = inputs[Aircraft.Engine.ADDITIONAL_MASS] * num_engines diff --git a/aviary/subsystems/mass/flops_based/nacelle.py b/aviary/subsystems/mass/flops_based/nacelle.py index 48e610d23f..6f3fd10a89 100644 --- a/aviary/subsystems/mass/flops_based/nacelle.py +++ b/aviary/subsystems/mass/flops_based/nacelle.py @@ -65,7 +65,7 @@ def compute(self, inputs, outputs): scaler = inputs[Aircraft.Nacelle.MASS_SCALER] count_factor = nacelle_count_factor(num_eng) - # TODO: This should be distributed thrust factor + # This should be distributed thrust factor, see issue #1096. thrust = inputs[Aircraft.Engine.SCALED_SLS_THRUST] outputs[Aircraft.Nacelle.MASS] = ( @@ -79,7 +79,7 @@ def compute_partials(self, inputs, J): scaler = inputs[Aircraft.Nacelle.MASS_SCALER] count_factor = nacelle_count_factor(num_eng) - # TODO: This should be distributed thrust factor + # This should be distributed thrust factor, see issue #1096. thrust = inputs[Aircraft.Engine.SCALED_SLS_THRUST] thrust_exp = thrust**0.36 diff --git a/aviary/subsystems/mass/flops_based/test/test_canard.py b/aviary/subsystems/mass/flops_based/test/test_canard.py index d479db13c1..fcd89e66a3 100644 --- a/aviary/subsystems/mass/flops_based/test/test_canard.py +++ b/aviary/subsystems/mass/flops_based/test/test_canard.py @@ -32,7 +32,7 @@ def setUp(self): @parameterized.expand(canard_data_sets, name_func=print_case) def test_case1(self, case_name): - # TODO: No test cases with canards. Use dummy vars. + # No test cases with canards. Use dummy vars. See issue #1091 validation_data = canard_test_data[case_name] prob = self.prob diff --git a/aviary/subsystems/mass/flops_based/test/test_fin.py b/aviary/subsystems/mass/flops_based/test/test_fin.py index e0aaf23e98..e7aa11f946 100644 --- a/aviary/subsystems/mass/flops_based/test/test_fin.py +++ b/aviary/subsystems/mass/flops_based/test/test_fin.py @@ -18,8 +18,6 @@ ) from aviary.variable_info.variables import Aircraft, Mission -# TODO - None of the flops cases have any fins. - fin_test_data = {} fin_test_data['1'] = AviaryValues( { diff --git a/aviary/subsystems/mass/flops_based/test/test_landing_gear.py b/aviary/subsystems/mass/flops_based/test/test_landing_gear.py index e131d56a91..1d16385259 100644 --- a/aviary/subsystems/mass/flops_based/test/test_landing_gear.py +++ b/aviary/subsystems/mass/flops_based/test/test_landing_gear.py @@ -5,12 +5,7 @@ from openmdao.utils.testing_utils import use_tempdirs from parameterized import parameterized -from aviary.subsystems.mass.flops_based.landing_gear import ( - AltLandingGearMass, - LandingGearMass, - MainGearLength, - NoseGearLength, -) +from aviary.subsystems.mass.flops_based.landing_gear import AltLandingGearMass, LandingGearMass from aviary.utils.test_utils.variable_test import assert_match_varnames from aviary.validation_cases.validation_tests import ( flops_validation_test, @@ -154,52 +149,5 @@ def test_case(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -class LandingGearLengthTest(unittest.TestCase): - """This component is unrepresented in our test data.""" - - def setUp(self): - self.prob = om.Problem() - - @parameterized.expand(get_flops_case_names(only='AdvancedSingleAisle'), name_func=print_case) - def test_derivs(self, case_name): - prob = self.prob - model = prob.model - - inputs = get_flops_inputs(case_name, preprocess=True) - - options = { - Aircraft.Engine.NUM_ENGINES: inputs.get_val(Aircraft.Engine.NUM_ENGINES), - Aircraft.Engine.NUM_WING_ENGINES: inputs.get_val(Aircraft.Engine.NUM_WING_ENGINES), - } - - model.add_subsystem('main', MainGearLength(**options), promotes=['*']) - model.add_subsystem('nose', NoseGearLength(), promotes=['*']) - - prob.setup(force_alloc_complex=True) - - flops_validation_test( - self, - prob, - case_name, - input_keys=[ - Aircraft.Fuselage.LENGTH, - Aircraft.Fuselage.MAX_WIDTH, - Aircraft.Nacelle.AVG_DIAMETER, - Aircraft.Engine.WING_LOCATIONS, - Aircraft.Wing.DIHEDRAL, - Aircraft.Wing.SPAN, - ], - output_keys=[ - Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, - Aircraft.LandingGear.NOSE_GEAR_OLEO_LENGTH, - ], - version=Version.ALTERNATE, - atol=1e-11, - ) - - def test_IO(self): - assert_match_varnames(self.prob.model) - - if __name__ == '__main__': unittest.main()