From 915faaa7c65165ad70161477f2384ed9f41215f4 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Wed, 18 Sep 2024 17:33:55 -0400 Subject: [PATCH 01/58] Initial implementation of model options. --- aviary/interface/methods_for_level2.py | 6 +- .../aerodynamics/flops_based/design.py | 15 ++- .../flops_based/skin_friction_drag.py | 27 ++-- .../flops_based/test/test_design.py | 25 ++-- .../test/test_skinfriction_drag.py | 27 ++-- aviary/variable_info/functions.py | 120 +++++++++++++++++- aviary/variable_info/variable_meta_data.py | 3 +- 7 files changed, 170 insertions(+), 53 deletions(-) diff --git a/aviary/interface/methods_for_level2.py b/aviary/interface/methods_for_level2.py index e86487e85..8ec5d8707 100644 --- a/aviary/interface/methods_for_level2.py +++ b/aviary/interface/methods_for_level2.py @@ -46,7 +46,7 @@ from aviary.utils.aviary_values import AviaryValues from aviary.utils.functions import convert_strings_to_data, set_value -from aviary.variable_info.functions import setup_trajectory_params, override_aviary_vars +from aviary.variable_info.functions import setup_trajectory_params, override_aviary_vars, extract_options from aviary.variable_info.variables import Aircraft, Mission, Dynamic, Settings from aviary.variable_info.enums import AnalysisScheme, ProblemType, EquationsOfMotion, LegacyCode, Verbosity from aviary.variable_info.variable_meta_data import _MetaData as BaseMetaData @@ -1945,6 +1945,10 @@ def setup(self, **kwargs): self.model.options['aviary_metadata'] = self.meta_data self.model.options['phase_info'] = self.phase_info + # Use OpenMDAO's model options to pass all options through the system hierarchy. + self.model_options['*'] = extract_options(self.aviary_inputs, + self.meta_data) + warnings.simplefilter("ignore", om.OpenMDAOWarning) warnings.simplefilter("ignore", om.PromotionWarning) super().setup(**kwargs) diff --git a/aviary/subsystems/aerodynamics/flops_based/design.py b/aviary/subsystems/aerodynamics/flops_based/design.py index e95d5df21..f233600ac 100644 --- a/aviary/subsystems/aerodynamics/flops_based/design.py +++ b/aviary/subsystems/aerodynamics/flops_based/design.py @@ -7,7 +7,7 @@ from openmdao.components.interp_util.interp import InterpND from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission @@ -30,6 +30,9 @@ def initialize(self): 'aviary_options', types=AviaryValues, desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Wing.AIRFOIL_TECHNOLOGY) + add_aviary_option(self, Mission.Constraints.MAX_MACH) + def setup(self): # Aircraft design inputs add_aviary_input(self, Aircraft.Wing.ASPECT_RATIO, 0.0) @@ -45,9 +48,8 @@ def setup_partials(self): self.declare_partials(of='*', wrt='*') def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] - AITEK = aviary_options.get_val(Aircraft.Wing.AIRFOIL_TECHNOLOGY) - VMAX = aviary_options.get_val(Mission.Constraints.MAX_MACH) + AITEK = self.options[Aircraft.Wing.AIRFOIL_TECHNOLOGY] + VMAX = self.options[Mission.Constraints.MAX_MACH] AR, CAM, SW25, TC = inputs.values() @@ -88,9 +90,8 @@ def compute(self, inputs, outputs): outputs[Mission.Design.MACH] = DESM2D + DMDSWP + DMDAR def compute_partials(self, inputs, partials): - aviary_options: AviaryValues = self.options['aviary_options'] - AITEK = aviary_options.get_val(Aircraft.Wing.AIRFOIL_TECHNOLOGY) - VMAX = aviary_options.get_val(Mission.Constraints.MAX_MACH) + AITEK = self.options[Aircraft.Wing.AIRFOIL_TECHNOLOGY] + VMAX = self.options[Mission.Constraints.MAX_MACH] AR, CAM, SW25, TC = inputs.values() diff --git a/aviary/subsystems/aerodynamics/flops_based/skin_friction_drag.py b/aviary/subsystems/aerodynamics/flops_based/skin_friction_drag.py index c7a9edd0f..df91001c4 100644 --- a/aviary/subsystems/aerodynamics/flops_based/skin_friction_drag.py +++ b/aviary/subsystems/aerodynamics/flops_based/skin_friction_drag.py @@ -2,7 +2,7 @@ import openmdao.api as om from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, get_units +from aviary.variable_info.functions import add_aviary_input, get_units, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -31,20 +31,25 @@ def initialize(self): 'aviary_options', types=AviaryValues, desc='collection of Aircraft/Mission specific options') - # TODO: Convert these into aviary_options entries. + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) + add_aviary_option(self, Aircraft.Fuselage.NUM_FUSELAGES) + add_aviary_option(self, Aircraft.VerticalTail.NUM_TAILS) + add_aviary_option(self, Aircraft.Wing.AIRFOIL_TECHNOLOGY) + + # TODO: Bring this into the variable hierarchy. self.options.declare( 'excrescences_drag', default=0.06, desc='Drag contribution of excrescences as a percentage.') def setup(self): - aviary_options: AviaryValues = self.options['aviary_options'] nn = self.options['num_nodes'] - zero_count = (0, None) - nvtail, _ = aviary_options.get_item(Aircraft.VerticalTail.NUM_TAILS, zero_count) - nfuse, _ = aviary_options.get_item(Aircraft.Fuselage.NUM_FUSELAGES, zero_count) - num_engines, _ = aviary_options.get_item(Aircraft.Engine.NUM_ENGINES, zero_count) - self.nc = nc = 2 + nvtail + nfuse + int(sum(num_engines)) + nvtail = self.options[Aircraft.VerticalTail.NUM_TAILS] + nfuse = self.options[Aircraft.Fuselage.NUM_FUSELAGES] + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] + if not isinstance(num_engines, int): + num_engines = int(sum(num_engines)) + self.nc = nc = 2 + nvtail + nfuse + num_engines # Computed by other components in drag group. self.add_input('skin_friction_coeff', np.zeros((nn, nc)), units='unitless') @@ -96,7 +101,6 @@ def setup_partials(self): def compute(self, inputs, outputs): nc = self.nc - aviary_options: AviaryValues = self.options['aviary_options'] cf = inputs['skin_friction_coeff'] Re = inputs['Re'] @@ -136,7 +140,7 @@ def compute(self, inputs, outputs): # Form factor for surfaces. idx_surf = np.where(fineness <= 0.5)[0] fine = fineness[idx_surf] - airfoil = aviary_options.get_val(Aircraft.Wing.AIRFOIL_TECHNOLOGY) + airfoil = self.options[Aircraft.Wing.AIRFOIL_TECHNOLOGY] FF1 = 1.0 + fine * (F[7] + fine * (F[8] + fine * (F[9] + fine * (F[10] + fine * (F[11] + fine * F[12]))))) @@ -163,7 +167,6 @@ def compute(self, inputs, outputs): def compute_partials(self, inputs, partials): nc = self.nc nn = self.options["num_nodes"] - aviary_options: AviaryValues = self.options['aviary_options'] cf = inputs['skin_friction_coeff'] Re = inputs['Re'] @@ -209,7 +212,7 @@ def compute_partials(self, inputs, partials): idx_surf = np.where(fineness <= 0.5)[0] fine = fineness[idx_surf] - airfoil = aviary_options.get_val(Aircraft.Wing.AIRFOIL_TECHNOLOGY) + airfoil = self.options[Aircraft.Wing.AIRFOIL_TECHNOLOGY] FF1 = 1.0 + fine * ( F[7] + fine diff --git a/aviary/subsystems/aerodynamics/flops_based/test/test_design.py b/aviary/subsystems/aerodynamics/flops_based/test/test_design.py index bdf785b48..2a8ea8453 100644 --- a/aviary/subsystems/aerodynamics/flops_based/test/test_design.py +++ b/aviary/subsystems/aerodynamics/flops_based/test/test_design.py @@ -4,7 +4,6 @@ from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal from aviary.subsystems.aerodynamics.flops_based.design import Design -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.variables import Aircraft, Mission @@ -19,12 +18,12 @@ def test_derivs_supersonic1(self): model = prob.model options = {} - options[Aircraft.Wing.AIRFOIL_TECHNOLOGY] = (1.0, 'unitless') - options[Mission.Constraints.MAX_MACH] = (1.2, 'unitless') + options[Aircraft.Wing.AIRFOIL_TECHNOLOGY] = 1.0 + options[Mission.Constraints.MAX_MACH] = 1.2 model.add_subsystem( 'design', - Design(aviary_options=AviaryValues(options)), + Design(**options), promotes_inputs=['*'], promotes_outputs=[Mission.Design.MACH, Mission.Design.LIFT_COEFFICIENT] ) @@ -54,12 +53,12 @@ def test_derivs_subsonic1(self): model = prob.model options = {} - options[Aircraft.Wing.AIRFOIL_TECHNOLOGY] = (1.0, 'unitless') - options[Mission.Constraints.MAX_MACH] = (0.9, 'unitless') + options[Aircraft.Wing.AIRFOIL_TECHNOLOGY] = 1.0 + options[Mission.Constraints.MAX_MACH] = 0.9 model.add_subsystem( 'design', - Design(aviary_options=AviaryValues(options)), + Design(**options), promotes_inputs=['*'], promotes_outputs=[Mission.Design.MACH, Mission.Design.LIFT_COEFFICIENT], ) @@ -89,12 +88,12 @@ def test_derivs_supersonic2(self): model = prob.model options = {} - options[Aircraft.Wing.AIRFOIL_TECHNOLOGY] = (1.0, 'unitless') - options[Mission.Constraints.MAX_MACH] = (1.2, 'unitless') + options[Aircraft.Wing.AIRFOIL_TECHNOLOGY] = 1.0 + options[Mission.Constraints.MAX_MACH] = 1.2 model.add_subsystem( 'design', - Design(aviary_options=AviaryValues(options)), + Design(**options), promotes_inputs=['*'], promotes_outputs=[Mission.Design.MACH, Mission.Design.LIFT_COEFFICIENT], ) @@ -124,12 +123,12 @@ def test_derivs_subsonic2(self): model = prob.model options = {} - options[Aircraft.Wing.AIRFOIL_TECHNOLOGY] = (1.0, 'unitless') - options[Mission.Constraints.MAX_MACH] = (0.9, 'unitless') + options[Aircraft.Wing.AIRFOIL_TECHNOLOGY] = 1.0 + options[Mission.Constraints.MAX_MACH] = 0.9 model.add_subsystem( 'design', - Design(aviary_options=AviaryValues(options)), + Design(**options), promotes_inputs=['*'], promotes_outputs=[Mission.Design.MACH, Mission.Design.LIFT_COEFFICIENT], ) diff --git a/aviary/subsystems/aerodynamics/flops_based/test/test_skinfriction_drag.py b/aviary/subsystems/aerodynamics/flops_based/test/test_skinfriction_drag.py index 3be06d264..63435d039 100644 --- a/aviary/subsystems/aerodynamics/flops_based/test/test_skinfriction_drag.py +++ b/aviary/subsystems/aerodynamics/flops_based/test/test_skinfriction_drag.py @@ -6,7 +6,6 @@ from aviary.subsystems.aerodynamics.flops_based.skin_friction_drag import \ SkinFrictionDrag -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.variables import Aircraft @@ -28,14 +27,15 @@ def test_derivs(self): prob = om.Problem() model = prob.model - options = AviaryValues() - options.set_val(Aircraft.Fuselage.NUM_FUSELAGES, 1) - options.set_val(Aircraft.Engine.NUM_ENGINES, [2]) - options.set_val(Aircraft.VerticalTail.NUM_TAILS, 1) - options.set_val(Aircraft.Wing.AIRFOIL_TECHNOLOGY, 1.93) + options = { + Aircraft.Fuselage.NUM_FUSELAGES: 1, + Aircraft.Engine.NUM_ENGINES: [2], + Aircraft.VerticalTail.NUM_TAILS: 1, + Aircraft.Wing.AIRFOIL_TECHNOLOGY: 1.93, + } model.add_subsystem( - 'CDf', SkinFrictionDrag(num_nodes=nn, aviary_options=options), + 'CDf', SkinFrictionDrag(num_nodes=nn, **options), promotes_inputs=[Aircraft.Wing.AREA], promotes_outputs=['skin_friction_drag_coeff']) @@ -77,14 +77,15 @@ def test_derivs_multiengine(self): prob = om.Problem() model = prob.model - options = AviaryValues() - options.set_val(Aircraft.Fuselage.NUM_FUSELAGES, 1) - options.set_val(Aircraft.Engine.NUM_ENGINES, [2, 4]) - options.set_val(Aircraft.VerticalTail.NUM_TAILS, 1) - options.set_val(Aircraft.Wing.AIRFOIL_TECHNOLOGY, 1.93) + options = { + Aircraft.Fuselage.NUM_FUSELAGES: 1, + Aircraft.Engine.NUM_ENGINES: [2, 4], + Aircraft.VerticalTail.NUM_TAILS: 1, + Aircraft.Wing.AIRFOIL_TECHNOLOGY: 1.93, + } model.add_subsystem( - 'CDf', SkinFrictionDrag(num_nodes=nn, aviary_options=options), + 'CDf', SkinFrictionDrag(num_nodes=nn, **options), promotes_inputs=[Aircraft.Wing.AREA], promotes_outputs=['skin_friction_drag_coeff']) diff --git a/aviary/variable_info/functions.py b/aviary/variable_info/functions.py index 6dd7bee37..b3ba95d62 100644 --- a/aviary/variable_info/functions.py +++ b/aviary/variable_info/functions.py @@ -11,14 +11,35 @@ # --------------------------- -def add_aviary_input(comp, varname, val=None, units=None, desc=None, shape_by_conn=False, meta_data=_MetaData, shape=None): - ''' +def add_aviary_input(comp, varname, val=None, units=None, desc=None, shape_by_conn=False, + meta_data=_MetaData, shape=None): + """ This function provides a clean way to add variables from the variable hierarchy into components as Aviary inputs. It takes the standard OpenMDAO inputs of the variable's name, initial value, units, and description, as well as the component which the variable is being added to. - ''' + + Parameters + ---------- + comp: Component + OpenMDAO component to add this variable. + varname: str + Name of variable. + val: float or ndarray + Default value for variable. + units: str + (Optional) when speficying val, units should also be specified. + desc: str + (Optional) description text for the variable. + shape_by_conn: bool + Set to True to infer the shape from the connected output. + meta_data: dict + (Optional) Aviary metadata dictionary. If unspecified, the built-in metadata will + be used. + shape: tuple + (Optional) shape for this input. + """ meta = meta_data[varname] if units: input_units = units @@ -37,14 +58,34 @@ def add_aviary_input(comp, varname, val=None, units=None, desc=None, shape_by_co desc=input_desc, shape_by_conn=shape_by_conn, shape=shape) -def add_aviary_output(comp, varname, val, units=None, desc=None, shape_by_conn=False, meta_data=_MetaData): - ''' +def add_aviary_output(comp, varname, val, units=None, desc=None, shape_by_conn=False, + meta_data=_MetaData): + """ This function provides a clean way to add variables from the variable hierarchy into components as Aviary outputs. It takes the standard OpenMDAO inputs of the variable's name, initial value, units, and description, as well as the component which the variable is being added to. - ''' + + Parameters + ---------- + comp: Component + OpenMDAO component to add this variable. + varname: str + Name of variable. + val: float or ndarray + (Optional) Default value for variable. If not specified, the value from metadata + is used. + units: str + (Optional) when speficying val, units should also be specified. + desc: str + (Optional) description text for the variable. + shape_by_conn: bool + Set to True to infer the shape from the connected output. + meta_data: dict + (Optional) Aviary metadata dictionary. If unspecified, the built-in metadata will + be used. + """ meta = meta_data[varname] if units: output_units = units @@ -61,6 +102,34 @@ def add_aviary_output(comp, varname, val, units=None, desc=None, shape_by_conn=F desc=output_desc, shape_by_conn=shape_by_conn) +def add_aviary_option(comp, name, val=_unspecified, desc=None, meta_data=_MetaData): + """ + Adds an option to an Aviary component. Default values from the metadata are used + unless a new value is specified. + + Parameters + ---------- + comp: Component + OpenMDAO component to add this option. + name: str + Name of variable. + val: float or ndarray + (Optional) Default value for option. If not specified, the value from metadata + is used. + desc: str + (Optional) description text for the variable. + meta_data: dict + (Optional) Aviary metadata dictionary. If unspecified, the built-in metadata will + be used. + """ + meta = meta_data[name] + if not desc: + desc = meta['desc'] + if val is _unspecified: + val = meta['default_value'] + comp.options.declare(name, default=val, types=meta['types'], desc=desc) + + def override_aviary_vars(group, aviary_inputs: AviaryValues, manual_overrides=None, external_overrides=None): ''' @@ -251,3 +320,42 @@ def get_units(key, meta_data=None) -> str: meta_data = _MetaData return meta_data[key]['units'] + + +def extract_options(aviary_inputs: AviaryValues, metadata=_MetaData) -> dict: + """ + Extract a dictionary of options from the given aviary_inputs. + + Parameters + ---------- + aviary_inputs : AviaryValues + Instance of AviaryValues containing all initial values. + meta_data : dict + (Optional) Dictionary of aircraft metadata. Uses Aviary's built-in + metadata by default. + + Returns + ------- + dict + Dictionary of option names and values. + """ + options = {} + for key, meta in metadata.items(): + + if key not in aviary_inputs: + continue + + if not meta['option']: + continue + + val, units = aviary_inputs.get_item(key) + meta_units = meta['units'] + + if meta_units is 'unitless' or meta_units is None: + options[key] = val + + else: + # Implement as (quanitity, unit) + options[key] = (val, units) + + return options diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index df7ebe700..9caab4d27 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1979,7 +1979,7 @@ units='unitless', desc='total number of engines per model on the aircraft ' '(fuselage, wing, or otherwise)', - types=int, + types=(int, list, np.ndarray), option=True, default_value=2 ) @@ -4941,6 +4941,7 @@ 'conventional technology wing (Default); 2.0 represents advanced ' 'technology wing.', default_value=1.0, + types=float, option=True, ) From 14196fc0d3bce8a65362c787c35a46157e7f6810 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Wed, 18 Sep 2024 17:34:23 -0400 Subject: [PATCH 02/58] Initial implementation of model options. --- aviary/subsystems/aerodynamics/flops_based/skin_friction_drag.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aviary/subsystems/aerodynamics/flops_based/skin_friction_drag.py b/aviary/subsystems/aerodynamics/flops_based/skin_friction_drag.py index df91001c4..55e27d2cc 100644 --- a/aviary/subsystems/aerodynamics/flops_based/skin_friction_drag.py +++ b/aviary/subsystems/aerodynamics/flops_based/skin_friction_drag.py @@ -47,6 +47,7 @@ def setup(self): nvtail = self.options[Aircraft.VerticalTail.NUM_TAILS] nfuse = self.options[Aircraft.Fuselage.NUM_FUSELAGES] num_engines = self.options[Aircraft.Engine.NUM_ENGINES] + if not isinstance(num_engines, int): num_engines = int(sum(num_engines)) self.nc = nc = 2 + nvtail + nfuse + num_engines From 87328da80b00ea112b744788a591dd9beac3a31a Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Fri, 20 Sep 2024 17:53:53 -0400 Subject: [PATCH 03/58] checkpoint, much of flops done --- aviary/interface/methods_for_level2.py | 5 + .../flops_based/computed_aero_group.py | 8 +- .../aerodynamics/flops_based/induced_drag.py | 12 +- .../aerodynamics/flops_based/mux_component.py | 40 +++---- .../aerodynamics/flops_based/skin_friction.py | 22 ++-- .../flops_based/skin_friction_drag.py | 8 +- .../test/test_computed_aero_group.py | 17 ++- .../flops_based/test/test_induced_drag.py | 17 ++- .../flops_based/test/test_mux_component.py | 23 ++-- .../test/test_skinfriction_coef.py | 24 ++-- .../flops_based/characteristic_lengths.py | 113 ++++++++---------- .../geometry/flops_based/fuselage.py | 6 - .../geometry/flops_based/nacelle.py | 21 +--- .../geometry/flops_based/prep_geom.py | 72 +++++------ .../test/test_characteristic_lengths.py | 13 +- .../geometry/flops_based/test/test_nacelle.py | 10 +- .../flops_based/test/test_prep_geom.py | 89 +++++++++----- .../geometry/flops_based/wetted_area_total.py | 6 - .../mass/flops_based/air_conditioning.py | 32 ++--- .../subsystems/mass/flops_based/anti_icing.py | 21 ++-- aviary/subsystems/mass/flops_based/apu.py | 15 +-- .../subsystems/mass/flops_based/avionics.py | 13 +- aviary/subsystems/mass/flops_based/canard.py | 6 - aviary/subsystems/mass/flops_based/cargo.py | 10 +- .../mass/flops_based/cargo_containers.py | 6 - aviary/subsystems/mass/flops_based/crew.py | 38 ++---- .../subsystems/mass/flops_based/electrical.py | 40 +++---- .../mass/flops_based/empty_margin.py | 6 - aviary/subsystems/mass/flops_based/engine.py | 10 +- .../mass/flops_based/engine_controls.py | 15 +-- .../subsystems/mass/flops_based/engine_oil.py | 25 ++-- .../subsystems/mass/flops_based/engine_pod.py | 15 +-- aviary/subsystems/mass/flops_based/fin.py | 13 +- .../mass/flops_based/fuel_capacity.py | 14 +-- .../mass/flops_based/fuel_system.py | 28 ++--- .../mass/flops_based/furnishings.py | 111 ++++++----------- .../subsystems/mass/flops_based/fuselage.py | 31 ++--- .../mass/flops_based/horizontal_tail.py | 11 -- .../subsystems/mass/flops_based/hydraulics.py | 32 ++--- .../mass/flops_based/instruments.py | 32 ++--- .../mass/flops_based/landing_gear.py | 33 ++--- .../mass/flops_based/landing_group.py | 22 ++-- .../mass/flops_based/landing_mass.py | 11 -- .../mass/flops_based/mass_premission.py | 105 ++++++++-------- .../mass/flops_based/mass_summation.py | 87 +++----------- .../mass/flops_based/misc_engine.py | 18 +-- aviary/subsystems/mass/flops_based/nacelle.py | 19 +-- aviary/subsystems/mass/flops_based/paint.py | 6 - .../mass/flops_based/passenger_service.py | 46 +++---- aviary/subsystems/mass/flops_based/starter.py | 24 ++-- .../mass/flops_based/surface_controls.py | 17 +-- .../mass/flops_based/thrust_reverser.py | 16 +-- .../mass/flops_based/unusable_fuel.py | 23 ++-- .../mass/flops_based/vertical_tail.py | 18 +-- .../mass/flops_based/wing_common.py | 26 +--- .../mass/flops_based/wing_detailed.py | 28 ++--- .../subsystems/mass/flops_based/wing_group.py | 23 ++-- .../mass/flops_based/wing_simple.py | 13 +- aviary/validation_cases/validation_tests.py | 3 + aviary/variable_info/variable_meta_data.py | 4 +- 60 files changed, 587 insertions(+), 985 deletions(-) diff --git a/aviary/interface/methods_for_level2.py b/aviary/interface/methods_for_level2.py index 8ec5d8707..6c84d5bf8 100644 --- a/aviary/interface/methods_for_level2.py +++ b/aviary/interface/methods_for_level2.py @@ -1951,6 +1951,11 @@ def setup(self, **kwargs): warnings.simplefilter("ignore", om.OpenMDAOWarning) warnings.simplefilter("ignore", om.PromotionWarning) + + # OpenMDAO currently warns that ":" won't be supported in option names, but + # removing support has been reconsidered. + warnings.simplefilter("ignore", om.OMDeprecationWarning) + super().setup(**kwargs) def set_initial_guesses(self): diff --git a/aviary/subsystems/aerodynamics/flops_based/computed_aero_group.py b/aviary/subsystems/aerodynamics/flops_based/computed_aero_group.py index 5c643f68e..687b8f456 100644 --- a/aviary/subsystems/aerodynamics/flops_based/computed_aero_group.py +++ b/aviary/subsystems/aerodynamics/flops_based/computed_aero_group.py @@ -39,7 +39,7 @@ def setup(self): gamma = self.options['gamma'] aviary_options: AviaryValues = self.options['aviary_options'] - comp = MuxComponent(aviary_options=aviary_options) + comp = MuxComponent() self.add_subsystem( 'Mux', comp, promotes_inputs=['aircraft:*'], @@ -73,7 +73,7 @@ def setup(self): Aircraft.Wing.THICKNESS_TO_CHORD]) comp = InducedDrag( - num_nodes=num_nodes, gamma=gamma, aviary_options=aviary_options) + num_nodes=num_nodes, gamma=gamma) self.add_subsystem( 'InducedDrag', comp, promotes_inputs=[ @@ -101,7 +101,7 @@ def setup(self): Aircraft.Fuselage.DIAMETER_TO_WING_SPAN, Aircraft.Fuselage.LENGTH_TO_DIAMETER]) - comp = SkinFriction(num_nodes=num_nodes, aviary_options=aviary_options) + comp = SkinFriction(num_nodes=num_nodes) self.add_subsystem( 'SkinFrictionCoef', comp, promotes_inputs=[ @@ -109,7 +109,7 @@ def setup(self): 'characteristic_lengths'], promotes_outputs=['skin_friction_coeff', 'Re']) - comp = SkinFrictionDrag(num_nodes=num_nodes, aviary_options=aviary_options) + comp = SkinFrictionDrag(num_nodes=num_nodes) self.add_subsystem( 'SkinFrictionDrag', comp, promotes_inputs=[ diff --git a/aviary/subsystems/aerodynamics/flops_based/induced_drag.py b/aviary/subsystems/aerodynamics/flops_based/induced_drag.py index 8ac3f4726..2b71a6a26 100644 --- a/aviary/subsystems/aerodynamics/flops_based/induced_drag.py +++ b/aviary/subsystems/aerodynamics/flops_based/induced_drag.py @@ -3,7 +3,7 @@ import scipy.constants as _units from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input +from aviary.variable_info.functions import add_aviary_input, add_aviary_option from aviary.variable_info.variables import Aircraft, Dynamic @@ -23,6 +23,8 @@ def initialize(self): 'aviary_options', types=AviaryValues, desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION) + def setup(self): nn = self.options["num_nodes"] @@ -68,13 +70,11 @@ def setup_partials(self): def compute(self, inputs, outputs): options = self.options gamma = options['gamma'] - aviary_options: AviaryValues = options['aviary_options'] mach, lift, P, Sref, AR, span_efficiency_factor, SW25, TR = inputs.values() CL = 2.0 * lift / (Sref * gamma * P * mach ** 2) - redux, _ = aviary_options.get_item( - Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION, (False, None)) + redux = self.options[Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION] if redux: # Adjustment for extreme taper ratios. @@ -113,10 +113,8 @@ def compute(self, inputs, outputs): def compute_partials(self, inputs, partials): options = self.options gamma = options['gamma'] - aviary_options: AviaryValues = options['aviary_options'] mach, lift, P, Sref, AR, span_efficiency_factor, SW25, TR = inputs.values() - redux, _ = aviary_options.get_item( - Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION, (False, None)) + redux = self.options[Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION] if redux: sqrt_AR = np.sqrt(AR) diff --git a/aviary/subsystems/aerodynamics/flops_based/mux_component.py b/aviary/subsystems/aerodynamics/flops_based/mux_component.py index bd0ce2f44..8473f26a6 100644 --- a/aviary/subsystems/aerodynamics/flops_based/mux_component.py +++ b/aviary/subsystems/aerodynamics/flops_based/mux_component.py @@ -1,8 +1,7 @@ import numpy as np import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, get_units +from aviary.variable_info.functions import add_aviary_input, get_units, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -23,13 +22,12 @@ def __init__(self, **kwargs): super().__init__(**kwargs) def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) + add_aviary_option(self, Aircraft.Fuselage.NUM_FUSELAGES) + add_aviary_option(self, Aircraft.VerticalTail.NUM_TAILS) def setup(self): nc = 2 - aviary_options: AviaryValues = self.options['aviary_options'] # Wing (Always 1) add_aviary_input(self, Aircraft.Wing.WETTED_AREA, 1.0) @@ -45,9 +43,8 @@ def setup(self): add_aviary_input(self, Aircraft.HorizontalTail.LAMINAR_FLOW_UPPER, 0.0) add_aviary_input(self, Aircraft.HorizontalTail.LAMINAR_FLOW_LOWER, 0.0) - zero_count = (0, None) - # Vertical Tail - num, _ = aviary_options.get_item(Aircraft.VerticalTail.NUM_TAILS, zero_count) + num = self.options[Aircraft.VerticalTail.NUM_TAILS] + self.num_tails = num if num > 0: add_aviary_input(self, Aircraft.VerticalTail.WETTED_AREA, 1.0) @@ -58,7 +55,7 @@ def setup(self): nc += num # Fuselage - num, _ = aviary_options.get_item(Aircraft.Fuselage.NUM_FUSELAGES, zero_count) + num = self.options[Aircraft.Fuselage.NUM_FUSELAGES] self.num_fuselages = num if num > 0: add_aviary_input(self, Aircraft.Fuselage.WETTED_AREA, 1.0) @@ -68,19 +65,22 @@ def setup(self): add_aviary_input(self, Aircraft.Fuselage.LAMINAR_FLOW_LOWER, 0.0) nc += num - num_engines = aviary_options.get_val(Aircraft.Engine.NUM_ENGINES) - self.num_nacelles = int(sum(num_engines)) + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] + num_nacelles = int(sum(num_engines)) + num_engine_models = len(num_engines) + self.num_nacelles = num_nacelles + if self.num_nacelles > 0: add_aviary_input(self, Aircraft.Nacelle.WETTED_AREA, - np.zeros(len(num_engines))) + np.zeros(num_engine_models)) add_aviary_input(self, Aircraft.Nacelle.FINENESS, - np.zeros(len(num_engines))) + np.zeros(num_engine_models)) add_aviary_input(self, Aircraft.Nacelle.CHARACTERISTIC_LENGTH, - np.zeros(len(num_engines))) + np.zeros(num_engine_models)) add_aviary_input(self, Aircraft.Nacelle.LAMINAR_FLOW_UPPER, - np.zeros(len(num_engines))) + np.zeros(num_engine_models)) add_aviary_input(self, Aircraft.Nacelle.LAMINAR_FLOW_LOWER, - np.zeros(len(num_engines))) + np.zeros(num_engine_models)) nc += self.num_nacelles self.add_output( @@ -185,8 +185,8 @@ def setup_partials(self): # Nacelle if self.num_nacelles > 0: # derivatives w.r.t vectorized engine inputs have known sparsity pattern - num_engines = self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES) + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] + rows = ic + np.arange(self.num_nacelles) cols = [item for sublist in [[i]*j for i, j in enumerate(num_engines)] for item in sublist] @@ -268,7 +268,7 @@ def compute(self, inputs, outputs): ic += self.num_fuselages # Nacelle - num_engines = self.options['aviary_options'].get_val(Aircraft.Engine.NUM_ENGINES) + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] wetted_areas = inputs[Aircraft.Nacelle.WETTED_AREA] fineness = inputs[Aircraft.Nacelle.FINENESS] diff --git a/aviary/subsystems/aerodynamics/flops_based/skin_friction.py b/aviary/subsystems/aerodynamics/flops_based/skin_friction.py index 957ad53ac..ad4cb7c84 100644 --- a/aviary/subsystems/aerodynamics/flops_based/skin_friction.py +++ b/aviary/subsystems/aerodynamics/flops_based/skin_friction.py @@ -1,7 +1,7 @@ import numpy as np import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues +from aviary.variable_info.functions import add_aviary_option from aviary.variable_info.variables import Aircraft, Dynamic @@ -35,21 +35,17 @@ def initialize(self): self.options.declare( 'num_nodes', types=int, default=1, desc='The number of points at which the cross product is computed.') - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) + add_aviary_option(self, Aircraft.Fuselage.NUM_FUSELAGES) + add_aviary_option(self, Aircraft.VerticalTail.NUM_TAILS) def setup(self): nn = self.options['num_nodes'] - aviary_options: AviaryValues = self.options['aviary_options'] - zero_count = (0, None) - num_tails, _ = aviary_options.get_item( - Aircraft.VerticalTail.NUM_TAILS, zero_count) - num_fuselages, _ = aviary_options.get_item( - Aircraft.Fuselage.NUM_FUSELAGES, zero_count) - # TODO does not used vectorized heterogeneous engines. Temp using single engine - num_engines, _ = aviary_options.get_item( - Aircraft.Engine.NUM_ENGINES, zero_count) + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] + num_fuselages = self.options[Aircraft.Fuselage.NUM_FUSELAGES] + num_tails = self.options[Aircraft.VerticalTail.NUM_TAILS] + self.nc = nc = 2 + num_tails + num_fuselages + int(sum(num_engines)) # Simulation inputs diff --git a/aviary/subsystems/aerodynamics/flops_based/skin_friction_drag.py b/aviary/subsystems/aerodynamics/flops_based/skin_friction_drag.py index 55e27d2cc..3f377ba6b 100644 --- a/aviary/subsystems/aerodynamics/flops_based/skin_friction_drag.py +++ b/aviary/subsystems/aerodynamics/flops_based/skin_friction_drag.py @@ -1,7 +1,6 @@ import numpy as np import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, get_units, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -27,9 +26,6 @@ def initialize(self): self.options.declare( 'num_nodes', types=int, default=1, desc='The number of points at which the cross product is computed.') - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) add_aviary_option(self, Aircraft.Fuselage.NUM_FUSELAGES) @@ -48,9 +44,7 @@ def setup(self): nfuse = self.options[Aircraft.Fuselage.NUM_FUSELAGES] num_engines = self.options[Aircraft.Engine.NUM_ENGINES] - if not isinstance(num_engines, int): - num_engines = int(sum(num_engines)) - self.nc = nc = 2 + nvtail + nfuse + num_engines + self.nc = nc = 2 + nvtail + nfuse + int(sum(num_engines)) # Computed by other components in drag group. self.add_input('skin_friction_coeff', np.zeros((nn, nc)), units='unitless') diff --git a/aviary/subsystems/aerodynamics/flops_based/test/test_computed_aero_group.py b/aviary/subsystems/aerodynamics/flops_based/test/test_computed_aero_group.py index f7cbd7741..adffd1eb6 100644 --- a/aviary/subsystems/aerodynamics/flops_based/test/test_computed_aero_group.py +++ b/aviary/subsystems/aerodynamics/flops_based/test/test_computed_aero_group.py @@ -5,12 +5,14 @@ from openmdao.utils.assert_utils import assert_near_equal from aviary.subsystems.premission import CorePreMission -from aviary.utils.functions import set_aviary_initial_values -from aviary.validation_cases.validation_tests import get_flops_inputs, get_flops_outputs -from aviary.variable_info.variables import Aircraft, Dynamic, Settings from aviary.subsystems.propulsion.utils import build_engine_deck +from aviary.utils.functions import set_aviary_initial_values from aviary.utils.test_utils.default_subsystems import get_default_premission_subsystems from aviary.utils.preprocessors import preprocess_options +from aviary.validation_cases.validation_tests import get_flops_inputs, get_flops_outputs +from aviary.variable_info.functions import extract_options +from aviary.variable_info.variables import Aircraft, Dynamic, Settings +from aviary.variable_info.variable_meta_data import _MetaData class MissionDragTest(unittest.TestCase): @@ -80,6 +82,9 @@ def test_basic_large_single_aisle_1(self): promotes=['*'] ) + # Set all options + prob.model_options['*'] = extract_options(flops_inputs, _MetaData) + prob.setup(force_alloc_complex=True) prob.set_solver_print(level=2) @@ -190,6 +195,9 @@ def test_n3cc_drag(self): promotes=['*'] ) + # Set all options + prob.model_options['*'] = extract_options(flops_inputs, _MetaData) + prob.setup() # Mission params @@ -299,6 +307,9 @@ def test_large_single_aisle_2_drag(self): promotes=['*'] ) + # Set all options + prob.model_options['*'] = extract_options(flops_inputs, _MetaData) + prob.setup() # Mission params diff --git a/aviary/subsystems/aerodynamics/flops_based/test/test_induced_drag.py b/aviary/subsystems/aerodynamics/flops_based/test/test_induced_drag.py index 8d5a34d1e..6cd8a6294 100644 --- a/aviary/subsystems/aerodynamics/flops_based/test/test_induced_drag.py +++ b/aviary/subsystems/aerodynamics/flops_based/test/test_induced_drag.py @@ -5,7 +5,6 @@ from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal from aviary.subsystems.aerodynamics.flops_based.induced_drag import InducedDrag -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.variables import Aircraft, Dynamic @@ -21,13 +20,13 @@ def test_derivs(self): nn = len(CL) - prob = om.Problem(model=om.Group()) + prob = om.Problem() options = {} - options[Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION] = (False, 'unitless') + options[Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION] = False prob.model.add_subsystem('induced_drag', InducedDrag( - num_nodes=nn, aviary_options=AviaryValues(options)), promotes=['*']) + num_nodes=nn, **options), promotes=['*']) prob.setup(force_alloc_complex=True) prob.set_val(Dynamic.Mission.MACH, val=mach) @@ -60,13 +59,13 @@ def test_derivs_span_eff_redux(self): # High factor - prob = om.Problem(model=om.Group()) + prob = om.Problem() options = {} - options[Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION] = (True, 'unitless') + options[Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION] = True prob.model.add_subsystem('drag', InducedDrag( - num_nodes=nn, aviary_options=AviaryValues(options)), promotes=['*']) + num_nodes=nn, **options), promotes=['*']) prob.setup(force_alloc_complex=True) prob.set_val(Dynamic.Mission.MACH, val=mach) @@ -92,10 +91,10 @@ def test_derivs_span_eff_redux(self): prob = om.Problem(model=om.Group()) options = {} - options[Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION] = (True, 'unitless') + options[Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION] = True prob.model.add_subsystem('drag', InducedDrag( - num_nodes=nn, aviary_options=AviaryValues(options)), promotes=['*']) + num_nodes=nn, **options), promotes=['*']) prob.setup(force_alloc_complex=True) prob.set_val(Dynamic.Mission.MACH, val=mach) diff --git a/aviary/subsystems/aerodynamics/flops_based/test/test_mux_component.py b/aviary/subsystems/aerodynamics/flops_based/test/test_mux_component.py index e26321f57..592e71d06 100644 --- a/aviary/subsystems/aerodynamics/flops_based/test/test_mux_component.py +++ b/aviary/subsystems/aerodynamics/flops_based/test/test_mux_component.py @@ -6,7 +6,6 @@ from openmdao.utils.assert_utils import assert_check_partials from aviary.subsystems.aerodynamics.flops_based.mux_component import MuxComponent -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.variables import Aircraft @@ -16,13 +15,14 @@ def test_mux(self): prob = om.Problem() model = prob.model - aviary_options = AviaryValues() - aviary_options.set_val(Aircraft.VerticalTail.NUM_TAILS, 1) - aviary_options.set_val(Aircraft.Fuselage.NUM_FUSELAGES, 1) - aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([2])) + aviary_options = { + Aircraft.Engine.NUM_ENGINES: np.array([2]), + Aircraft.Fuselage.NUM_FUSELAGES: 1, + Aircraft.VerticalTail.NUM_TAILS: 1, + } model.add_subsystem( - 'mux', MuxComponent(aviary_options=aviary_options), + 'mux', MuxComponent(**aviary_options), promotes_inputs=['*']) prob.setup(force_alloc_complex=True) @@ -91,13 +91,14 @@ def test_mux_multiengine(self): prob = om.Problem() model = prob.model - aviary_options = AviaryValues() - aviary_options.set_val(Aircraft.VerticalTail.NUM_TAILS, 1) - aviary_options.set_val(Aircraft.Fuselage.NUM_FUSELAGES, 1) - aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([2, 3])) + aviary_options = { + Aircraft.Engine.NUM_ENGINES: np.array([2, 3]), + Aircraft.Fuselage.NUM_FUSELAGES: 1, + Aircraft.VerticalTail.NUM_TAILS: 1, + } model.add_subsystem( - 'mux', MuxComponent(aviary_options=aviary_options), + 'mux', MuxComponent(**aviary_options), promotes_inputs=['*']) prob.setup(force_alloc_complex=True) diff --git a/aviary/subsystems/aerodynamics/flops_based/test/test_skinfriction_coef.py b/aviary/subsystems/aerodynamics/flops_based/test/test_skinfriction_coef.py index cbb63666b..57abef974 100644 --- a/aviary/subsystems/aerodynamics/flops_based/test/test_skinfriction_coef.py +++ b/aviary/subsystems/aerodynamics/flops_based/test/test_skinfriction_coef.py @@ -24,12 +24,12 @@ def test_derivs(self): model = prob.model options = {} - options[Aircraft.VerticalTail.NUM_TAILS] = (0, 'unitless') - options[Aircraft.Fuselage.NUM_FUSELAGES] = (1, 'unitless') - options[Aircraft.Engine.NUM_ENGINES] = ([0], 'unitless') + options[Aircraft.VerticalTail.NUM_TAILS] = 0 + options[Aircraft.Fuselage.NUM_FUSELAGES] = 1 + options[Aircraft.Engine.NUM_ENGINES] = [0] model.add_subsystem( - 'cf', SkinFriction(num_nodes=n, aviary_options=AviaryValues(options)), promotes=['*']) + 'cf', SkinFriction(num_nodes=n, **options), promotes=['*']) prob.setup(force_alloc_complex=True) @@ -122,12 +122,12 @@ def test_derivs_multiengine(self): model = prob.model options = {} - options[Aircraft.VerticalTail.NUM_TAILS] = (0, 'unitless') - options[Aircraft.Fuselage.NUM_FUSELAGES] = (1, 'unitless') - options[Aircraft.Engine.NUM_ENGINES] = ([2, 4], 'unitless') + options[Aircraft.VerticalTail.NUM_TAILS] = 0 + options[Aircraft.Fuselage.NUM_FUSELAGES] = 1 + options[Aircraft.Engine.NUM_ENGINES] = [2, 4] model.add_subsystem( - 'cf', SkinFriction(num_nodes=n, aviary_options=AviaryValues(options)), promotes=['*']) + 'cf', SkinFriction(num_nodes=n, **options), promotes=['*']) prob.setup(force_alloc_complex=True) @@ -281,12 +281,12 @@ def test_skin_friction_algorithm(self): model = prob.model options = {} - options[Aircraft.VerticalTail.NUM_TAILS] = (0, 'unitless') - options[Aircraft.Fuselage.NUM_FUSELAGES] = (1, 'unitless') - options[Aircraft.Engine.NUM_ENGINES] = ([0], 'unitless') + options[Aircraft.VerticalTail.NUM_TAILS] = 0 + options[Aircraft.Fuselage.NUM_FUSELAGES] = 1 + options[Aircraft.Engine.NUM_ENGINES] = [0] model.add_subsystem( - 'cf', SkinFriction(num_nodes=n, aviary_options=AviaryValues(options))) + 'cf', SkinFriction(num_nodes=n, **options)) prob.setup(force_alloc_complex=True) diff --git a/aviary/subsystems/geometry/flops_based/characteristic_lengths.py b/aviary/subsystems/geometry/flops_based/characteristic_lengths.py index 57042125b..3eae168c3 100644 --- a/aviary/subsystems/geometry/flops_based/characteristic_lengths.py +++ b/aviary/subsystems/geometry/flops_based/characteristic_lengths.py @@ -2,20 +2,18 @@ import openmdao.api as om from aviary.subsystems.geometry.flops_based.utils import Names -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft class CharacteristicLengths(om.ExplicitComponent): + def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) + add_aviary_option(self, Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION) def setup(self): - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) self.add_input(Names.CROOT, 0.0, units='unitless') @@ -88,9 +86,8 @@ def setup_partials(self): self._setup_partials_nacelles() self._setup_partials_canard() - def compute( - self, inputs, outputs, discrete_inputs=None, discrete_outputs=None - ): + def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): + self._compute_wing(inputs, outputs, discrete_inputs, discrete_outputs) self._compute_horizontal_tail( @@ -136,9 +133,7 @@ def _setup_partials_wing(self): Aircraft.Wing.GLOVE_AND_BAT, ] - aviary_options: AviaryValues = self.options['aviary_options'] - - if aviary_options.get_val(Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION): + if self.options[Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION]: wrt = [ Names.CROOT, Aircraft.Wing.TAPER_RATIO, @@ -194,8 +189,7 @@ def _setup_partials_fuselage(self): def _setup_partials_nacelles(self): # derivatives w.r.t vectorized engine inputs have known sparsity pattern - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) shape = np.arange(num_engine_type) self.declare_partials( @@ -234,9 +228,7 @@ def _compute_wing( length = ((area - glove_and_bat) / aspect_ratio)**0.5 - aviary_options: AviaryValues = self.options['aviary_options'] - - if aviary_options.get_val(Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION): + if self.options[Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION]: taper_ratio = inputs[Aircraft.Wing.TAPER_RATIO] CROOT = inputs[Names.CROOT] @@ -305,7 +297,7 @@ def _compute_nacelles( ): # TODO do all engines support nacelles? If not, is this deliberate, or # just an artifact of the implementation? - num_eng = self.options['aviary_options'].get_val(Aircraft.Engine.NUM_ENGINES) + num_eng = self.options[Aircraft.Engine.NUM_ENGINES] avg_diam = inputs[Aircraft.Nacelle.AVG_DIAMETER] avg_length = inputs[Aircraft.Nacelle.AVG_LENGTH] @@ -324,66 +316,66 @@ def _compute_nacelles( outputs[Aircraft.Nacelle.CHARACTERISTIC_LENGTH] = char_len outputs[Aircraft.Nacelle.FINENESS] = fineness - def _compute_additional_fuselages( - self, inputs, outputs, discrete_inputs=None, discrete_outputs=None - ): - num_fuselages = inputs[Aircraft.Fuselage.NUM_FUSELAGES] + #def _compute_additional_fuselages( + #self, inputs, outputs, discrete_inputs=None, discrete_outputs=None + #): + #num_fuselages = inputs[Aircraft.Fuselage.NUM_FUSELAGES] - if num_fuselages < 2: - return + #if num_fuselages < 2: + #return - num_extra = num_fuselages - 1 + #num_extra = num_fuselages - 1 - idx = self._num_components - self._num_components += num_extra + #idx = self._num_components + #self._num_components += num_extra - lengths = outputs[Aircraft.Design.CHARACTERISTIC_LENGTHS] + #lengths = outputs[Aircraft.Design.CHARACTERISTIC_LENGTHS] - fineness = outputs[Aircraft.Design.FINENESS] + #fineness = outputs[Aircraft.Design.FINENESS] - laminar_flow_lower = outputs[Aircraft.Design.LAMINAR_FLOW_LOWER] - laminar_flow_upper = outputs[Aircraft.Design.LAMINAR_FLOW_UPPER] + #laminar_flow_lower = outputs[Aircraft.Design.LAMINAR_FLOW_LOWER] + #laminar_flow_upper = outputs[Aircraft.Design.LAMINAR_FLOW_UPPER] - for _ in range(num_extra): - lengths[idx] = lengths[3] + #for _ in range(num_extra): + #lengths[idx] = lengths[3] - fineness[idx] = fineness[3] + #fineness[idx] = fineness[3] - laminar_flow_lower[idx] = laminar_flow_lower[3] - laminar_flow_upper[idx] = laminar_flow_upper[3] + #laminar_flow_lower[idx] = laminar_flow_lower[3] + #laminar_flow_upper[idx] = laminar_flow_upper[3] - idx += 1 + #idx += 1 - def _compute_additional_vertical_tails( - self, inputs, outputs, discrete_inputs=None, discrete_outputs=None - ): - aviary_options: AviaryValues = self.options['aviary_options'] - num_tails = aviary_options.get_val(Aircraft.VerticalTail.NUM_TAILS) + #def _compute_additional_vertical_tails( + #self, inputs, outputs, discrete_inputs=None, discrete_outputs=None + #): + #aviary_options: AviaryValues = self.options['aviary_options'] + #num_tails = aviary_options.get_val(Aircraft.VerticalTail.NUM_TAILS) - if num_tails < 2: - return + #if num_tails < 2: + #return - num_extra = num_tails - 1 + #num_extra = num_tails - 1 - idx = self._num_components - self._num_components += num_extra + #idx = self._num_components + #self._num_components += num_extra - lengths = outputs[Aircraft.Design.CHARACTERISTIC_LENGTHS] + #lengths = outputs[Aircraft.Design.CHARACTERISTIC_LENGTHS] - fineness = outputs[Aircraft.Design.FINENESS] + #fineness = outputs[Aircraft.Design.FINENESS] - laminar_flow_lower = outputs[Aircraft.Design.LAMINAR_FLOW_LOWER] - laminar_flow_upper = outputs[Aircraft.Design.LAMINAR_FLOW_UPPER] + #laminar_flow_lower = outputs[Aircraft.Design.LAMINAR_FLOW_LOWER] + #laminar_flow_upper = outputs[Aircraft.Design.LAMINAR_FLOW_UPPER] - for _ in range(num_extra): - lengths[idx] = lengths[2] + #for _ in range(num_extra): + #lengths[idx] = lengths[2] - fineness[idx] = fineness[2] + #fineness[idx] = fineness[2] - laminar_flow_lower[idx] = laminar_flow_lower[2] - laminar_flow_upper[idx] = laminar_flow_upper[2] + #laminar_flow_lower[idx] = laminar_flow_lower[2] + #laminar_flow_upper[idx] = laminar_flow_upper[2] - idx += 1 + #idx += 1 def _compute_canard( self, inputs, outputs, discrete_inputs=None, discrete_outputs=None @@ -406,9 +398,8 @@ def _compute_canard( outputs[Aircraft.Canard.FINENESS] = thickness_to_chord def _compute_partials_wing(self, inputs, J, discrete_inputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] - if aviary_options.get_val(Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION): + if self.options[Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION]: taper_ratio = inputs[Aircraft.Wing.TAPER_RATIO] CROOT = inputs[Names.CROOT] @@ -513,7 +504,7 @@ def _compute_partials_fuselage(self, inputs, J, discrete_inputs=None): ] = -length / avg_diam**2.0 def _compute_partials_nacelles(self, inputs, J, discrete_inputs=None): - num_eng = self.options['aviary_options'].get_val(Aircraft.Engine.NUM_ENGINES) + num_eng = self.options[Aircraft.Engine.NUM_ENGINES] avg_diam = inputs[Aircraft.Nacelle.AVG_DIAMETER] avg_length = inputs[Aircraft.Nacelle.AVG_LENGTH] diff --git a/aviary/subsystems/geometry/flops_based/fuselage.py b/aviary/subsystems/geometry/flops_based/fuselage.py index ba62c90f1..5be311635 100644 --- a/aviary/subsystems/geometry/flops_based/fuselage.py +++ b/aviary/subsystems/geometry/flops_based/fuselage.py @@ -4,18 +4,12 @@ import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, add_aviary_output from aviary.variable_info.variables import Aircraft class FuselagePrelim(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.Fuselage.LENGTH, val=0.0) add_aviary_input(self, Aircraft.Fuselage.MAX_HEIGHT, val=0.0) diff --git a/aviary/subsystems/geometry/flops_based/nacelle.py b/aviary/subsystems/geometry/flops_based/nacelle.py index b8fd1e0e1..f98d82c91 100644 --- a/aviary/subsystems/geometry/flops_based/nacelle.py +++ b/aviary/subsystems/geometry/flops_based/nacelle.py @@ -1,8 +1,7 @@ import numpy as np import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -12,13 +11,10 @@ class Nacelles(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) def setup(self): - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) add_aviary_input(self, Aircraft.Nacelle.AVG_DIAMETER, val=np.zeros(num_engine_type)) add_aviary_input(self, Aircraft.Nacelle.AVG_LENGTH, @@ -32,8 +28,7 @@ def setup(self): def setup_partials(self): # derivatives w.r.t vectorized engine inputs have known sparsity pattern - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) shape = np.arange(num_engine_type) self.declare_partials( @@ -56,10 +51,7 @@ def setup_partials(self): def compute( self, inputs, outputs, discrete_inputs=None, discrete_outputs=None ): - aviary_options: AviaryValues = self.options['aviary_options'] - # how many of each unique engine type are on the aircraft (array) - num_engines = aviary_options.get_val(Aircraft.Engine.NUM_ENGINES) - # how many unique engine types are there (int) + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] num_engine_type = len(num_engines) avg_diam = inputs[Aircraft.Nacelle.AVG_DIAMETER] @@ -79,8 +71,7 @@ def compute( outputs[Aircraft.Nacelle.TOTAL_WETTED_AREA] = total_wetted_area def compute_partials(self, inputs, J, discrete_inputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] - num_engines = aviary_options.get_val(Aircraft.Engine.NUM_ENGINES) + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] avg_diam = inputs[Aircraft.Nacelle.AVG_DIAMETER] avg_length = inputs[Aircraft.Nacelle.AVG_LENGTH] diff --git a/aviary/subsystems/geometry/flops_based/prep_geom.py b/aviary/subsystems/geometry/flops_based/prep_geom.py index 2c45e0717..4d1f03a69 100644 --- a/aviary/subsystems/geometry/flops_based/prep_geom.py +++ b/aviary/subsystems/geometry/flops_based/prep_geom.py @@ -5,9 +5,10 @@ TODO: blended-wing-body support TODO: multiple engine model support ''' -import openmdao.api as om from numpy import pi +import openmdao.api as om + from aviary.subsystems.geometry.flops_based.canard import Canard from aviary.subsystems.geometry.flops_based.characteristic_lengths import \ CharacteristicLengths @@ -19,7 +20,7 @@ from aviary.subsystems.geometry.flops_based.wetted_area_total import TotalWettedArea from aviary.subsystems.geometry.flops_based.wing import WingPrelim from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -34,27 +35,26 @@ def initialize(self): desc='collection of Aircraft/Mission specific options') def setup(self): - aviary_options = self.options['aviary_options'] self.add_subsystem( - 'fuselage_prelim', FuselagePrelim(aviary_options=aviary_options), + 'fuselage_prelim', FuselagePrelim(), promotes_inputs=['*'], promotes_outputs=['*'] ) self.add_subsystem( - 'wing_prelim', WingPrelim(aviary_options=aviary_options), + 'wing_prelim', WingPrelim(), promotes_inputs=['*'], promotes_outputs=['*'] ) self.add_subsystem( - 'prelim', _Prelim(aviary_options=aviary_options), + 'prelim', _Prelim(), promotes_inputs=['*'], ) self.add_subsystem( - 'wing', _Wing(aviary_options=aviary_options), + 'wing', _Wing(), promotes_inputs=['aircraft*'], promotes_outputs=['*'] ) @@ -65,7 +65,7 @@ def setup(self): self.connect(f'prelim.{Names.XMULT}', f'wing.{Names.XMULT}') self.add_subsystem( - 'tail', _Tail(aviary_options=aviary_options), + 'tail', _Tail(), promotes_inputs=['aircraft*'], promotes_outputs=['*'] ) @@ -74,7 +74,7 @@ def setup(self): self.connect(f'prelim.{Names.XMULTV}', f'tail.{Names.XMULTV}') self.add_subsystem( - 'fuselage', _Fuselage(aviary_options=aviary_options), + 'fuselage', _Fuselage(), promotes_inputs=['aircraft*'], promotes_outputs=['*'] ) @@ -84,20 +84,20 @@ def setup(self): self.connect(f'prelim.{Names.CRTHTB}', f'fuselage.{Names.CRTHTB}') self.add_subsystem( - 'nacelles', Nacelles(aviary_options=aviary_options), + 'nacelles', Nacelles(), promotes_inputs=['aircraft*'], promotes_outputs=['*'] ) self.add_subsystem( - 'canard', Canard(aviary_options=aviary_options), + 'canard', Canard(), promotes_inputs=['aircraft*'], promotes_outputs=['*'] ) self.add_subsystem( 'characteristic_lengths', - CharacteristicLengths(aviary_options=aviary_options), + CharacteristicLengths(), promotes_inputs=['aircraft*'], promotes_outputs=['*'] ) @@ -120,9 +120,7 @@ class _Prelim(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION) def setup(self): add_aviary_input(self, Aircraft.Fuselage.AVG_DIAMETER, 0.0) @@ -478,9 +476,8 @@ def fuselage_var(self): Define the variable name associated with XDX. ''' value = Aircraft.Fuselage.AVG_DIAMETER - aviary_options: AviaryValues = self.options['aviary_options'] - if aviary_options.get_val(Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION): + if self.options[Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION]: value = Aircraft.Fuselage.MAX_WIDTH return value @@ -488,9 +485,7 @@ def fuselage_var(self): class _Wing(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Fuselage.NUM_FUSELAGES) def setup(self): self.add_input(Names.CROOT, 0.0, units='unitless') @@ -515,8 +510,7 @@ def setup_partials(self): def compute( self, inputs, outputs, discrete_inputs=None, discrete_outputs=None ): - aviary_options: AviaryValues = self.options['aviary_options'] - num_fuselage = aviary_options.get_val(Aircraft.Fuselage.NUM_FUSELAGES) + num_fuselage = self.options[Aircraft.Fuselage.NUM_FUSELAGES] area = inputs[Aircraft.Wing.AREA] CROOT = inputs[Names.CROOT] @@ -533,8 +527,7 @@ def compute( outputs[Aircraft.Wing.WETTED_AREA] = wetted_area def compute_partials(self, inputs, J, discrete_inputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] - num_fuselage = aviary_options.get_val(Aircraft.Fuselage.NUM_FUSELAGES) + num_fuselage = self.options[Aircraft.Fuselage.NUM_FUSELAGES] area = inputs[Aircraft.Wing.AREA] CROOT = inputs[Names.CROOT] @@ -564,9 +557,8 @@ def compute_partials(self, inputs, J, discrete_inputs=None): class _Tail(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES) + add_aviary_option(self, Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION) def setup(self): self.add_input(Names.XMULTH, 0.0, units='unitless') @@ -603,8 +595,7 @@ def setup_partials(self): ] ) - aviary_options: AviaryValues = self.options['aviary_options'] - redux = aviary_options.get_val(Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION) + redux = self.options[Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION] if not redux: self.declare_partials( @@ -622,12 +613,11 @@ def compute( wetted_area = scaler * XMULTH * area - aviary_options: AviaryValues = self.options['aviary_options'] - redux = aviary_options.get_val(Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION) + redux = self.options[Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION] if not redux: num_fuselage_engines = \ - aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES) + self.options[Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES] vertical_tail_fraction = \ inputs[Aircraft.HorizontalTail.VERTICAL_TAIL_FRACTION] @@ -649,8 +639,7 @@ def compute( outputs[Aircraft.VerticalTail.WETTED_AREA] = wetted_area def compute_partials(self, inputs, J, discrete_inputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] - redux = aviary_options.get_val(Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION) + redux = self.options[Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION] # horizontal tail XMULTH = inputs[Names.XMULTH] @@ -658,8 +647,8 @@ def compute_partials(self, inputs, J, discrete_inputs=None): scaler = inputs[Aircraft.HorizontalTail.WETTED_AREA_SCALER] if not redux: - num_fuselage_engines = aviary_options.get_val( - Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES) + num_fuselage_engines = \ + self.options[Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES] vertical_tail_fraction = \ inputs[Aircraft.HorizontalTail.VERTICAL_TAIL_FRACTION] @@ -721,9 +710,8 @@ def compute_partials(self, inputs, J, discrete_inputs=None): class _Fuselage(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION) + add_aviary_option(self, Aircraft.Fuselage.NUM_FUSELAGES) def setup(self): self.add_input(Names.CROOTB, 0.0, units='unitless') @@ -795,8 +783,7 @@ def setup_partials(self): def compute( self, inputs, outputs, discrete_inputs=None, discrete_outputs=None ): - aviary_options: AviaryValues = self.options['aviary_options'] - num_fuselages = aviary_options.get_val(Aircraft.Fuselage.NUM_FUSELAGES) + num_fuselages = self.options[Aircraft.Fuselage.NUM_FUSELAGES] area = inputs[Aircraft.Wing.AREA] aspect_ratio = inputs[Aircraft.Wing.ASPECT_RATIO] @@ -854,8 +841,7 @@ def compute( outputs[Aircraft.Fuselage.WETTED_AREA] = wetted_area def compute_partials(self, inputs, J, discrete_inputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] - num_fuselages = aviary_options.get_val(Aircraft.Fuselage.NUM_FUSELAGES) + num_fuselages = self.options[Aircraft.Fuselage.NUM_FUSELAGES] area = inputs[Aircraft.Wing.AREA] aspect_ratio = inputs[Aircraft.Wing.ASPECT_RATIO] diff --git a/aviary/subsystems/geometry/flops_based/test/test_characteristic_lengths.py b/aviary/subsystems/geometry/flops_based/test/test_characteristic_lengths.py index c9f86f442..6c40abf8a 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_characteristic_lengths.py +++ b/aviary/subsystems/geometry/flops_based/test/test_characteristic_lengths.py @@ -19,13 +19,16 @@ def test_case_multiengine(self): # test with multiple engine types prob = self.prob - aviary_options = get_flops_inputs('LargeSingleAisle1FLOPS') - aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([2, 2, 3])) - aviary_options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 7) + aviary_inputs = get_flops_inputs('LargeSingleAisle1FLOPS') + + aviary_options = { + Aircraft.Engine.NUM_ENGINES: np.array([2, 2, 3]), + Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION: aviary_inputs.get_val(Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION), + } prob.model.add_subsystem( 'char_lengths', - CharacteristicLengths(aviary_options=aviary_options), + CharacteristicLengths(**aviary_options), promotes_outputs=['*'], promotes_inputs=['*'] ) @@ -51,7 +54,7 @@ def test_case_multiengine(self): (Aircraft.Wing.THICKNESS_TO_CHORD, 'unitless') ] for var, units in input_list: - prob.set_val(var, aviary_options.get_val(var, units)) + prob.set_val(var, aviary_inputs.get_val(var, units)) # this is another component's output prob.set_val(Aircraft.Fuselage.AVG_DIAMETER, val=12.75) diff --git a/aviary/subsystems/geometry/flops_based/test/test_nacelle.py b/aviary/subsystems/geometry/flops_based/test/test_nacelle.py index 195eea80c..1713bbea9 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_nacelle.py +++ b/aviary/subsystems/geometry/flops_based/test/test_nacelle.py @@ -7,7 +7,7 @@ from aviary.subsystems.geometry.flops_based.nacelle import Nacelles from aviary.utils.test_utils.variable_test import assert_match_varnames from aviary.validation_cases.validation_tests import get_flops_inputs -from aviary.variable_info.variables import Aircraft, Settings +from aviary.variable_info.variables import Aircraft class NacelleTest(unittest.TestCase): @@ -19,13 +19,13 @@ def test_case_multiengine(self): # test with multiple engine types prob = self.prob - aviary_options = get_flops_inputs('LargeSingleAisle1FLOPS') - aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([2, 2, 3])) - aviary_options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 7) + options = { + Aircraft.Engine.NUM_ENGINES: np.array([2, 2, 3]), + } prob.model.add_subsystem( 'nacelles', - Nacelles(aviary_options=aviary_options), + Nacelles(**options), promotes_outputs=['*'], promotes_inputs=['*'] ) diff --git a/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py b/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py index ae81cc3b1..d4904616d 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py +++ b/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py @@ -64,20 +64,24 @@ def configure(self): override_aviary_vars(self, aviary_options) - options = get_flops_data(case_name, preprocess=True, - keys=[ - Aircraft.Fuselage.NUM_FUSELAGES, - Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES, - Aircraft.VerticalTail.NUM_TAILS, - Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION, - Aircraft.Engine.NUM_ENGINES, - Aircraft.Propulsion.TOTAL_NUM_ENGINES, - ]) + keys=[ + Aircraft.Fuselage.NUM_FUSELAGES, + Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES, + Aircraft.VerticalTail.NUM_TAILS, + Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION, + Aircraft.Engine.NUM_ENGINES, + Aircraft.Propulsion.TOTAL_NUM_ENGINES, + ] + + inputs = get_flops_data(case_name, preprocess=True, keys=keys) + options = {} + for key in keys: + options[key] = inputs.get_item(key)[0] prob = self.prob prob.model.add_subsystem( - 'premission', PreMission(aviary_options=options), promotes=['*'] + 'premission', PreMission(**options), promotes=['*'] ) prob.setup(check=False, force_alloc_complex=True) @@ -205,10 +209,15 @@ def test_case(self, case_name): prob = self.prob + keys = [Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION] + flops_inputs = get_flops_inputs(case_name, keys=keys) + options = {} + for key in keys: + options[key] = flops_inputs.get_item(key)[0] + prob.model.add_subsystem( 'prelim', - _Prelim(aviary_options=get_flops_inputs(case_name, - keys=[Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION])), + _Prelim(**options), promotes=['*'] ) @@ -263,10 +272,15 @@ def test_case(self, case_name): prob = self.prob + keys = [Aircraft.Fuselage.NUM_FUSELAGES] + flops_inputs = get_flops_inputs(case_name, keys=keys) + options = {} + for key in keys: + options[key] = flops_inputs.get_item(key)[0] + prob.model.add_subsystem( 'wings', - _Wing(aviary_options=get_flops_inputs(case_name, - keys=[Aircraft.Fuselage.NUM_FUSELAGES])), + _Wing(**options), promotes=['*']) prob.setup(check=False, force_alloc_complex=True) @@ -302,11 +316,16 @@ def test_case(self, case_name): prob = self.prob + keys = [Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION, + Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES] + flops_inputs = get_flops_data(case_name, keys=keys) + options = {} + for key in keys: + options[key] = flops_inputs.get_item(key)[0] + prob.model.add_subsystem( 'tails', - _Tail(aviary_options=get_flops_inputs(case_name, preprocess=True, - keys=[Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION, - Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES])), + _Tail(**options), promotes=['*']) prob.setup(check=False, force_alloc_complex=True) @@ -344,10 +363,15 @@ def test_case(self, case_name): prob = self.prob + keys = [Aircraft.Fuselage.NUM_FUSELAGES] + flops_inputs = get_flops_inputs(case_name, keys=keys) + options = {} + for key in keys: + options[key] = flops_inputs.get_item(key)[0] + prob.model.add_subsystem( 'fuse', - _Fuselage(aviary_options=get_flops_inputs(case_name, - keys=[Aircraft.Fuselage.NUM_FUSELAGES])), + _Fuselage(**options), promotes=['*']) prob.setup(check=False, force_alloc_complex=True) @@ -400,14 +424,15 @@ def test_case(self, case_name): prob = self.prob - flops_inputs = get_flops_inputs(case_name, preprocess=True, - keys=[Aircraft.Engine.NUM_ENGINES, - Aircraft.Fuselage.NUM_FUSELAGES, - ]) + keys = [Aircraft.Engine.NUM_ENGINES] + flops_inputs = get_flops_inputs(case_name, keys=keys) + options = {} + for key in keys: + options[key] = flops_inputs.get_item(key)[0] prob.model.add_subsystem( 'nacelles', - Nacelles(aviary_options=flops_inputs), + Nacelles(**options), promotes=['*']) prob.setup(check=False, force_alloc_complex=True) @@ -437,7 +462,7 @@ def test_case(self): prob.model.add_subsystem( 'canard', - Canard(aviary_options=AviaryValues()), + Canard(), promotes=['*']) prob.setup(check=False, force_alloc_complex=True) @@ -470,16 +495,16 @@ def test_case(self, case_name): prob = self.prob - flops_inputs = get_flops_inputs(case_name, preprocess=True, - keys=[Aircraft.Engine.NUM_ENGINES, - Aircraft.Fuselage.NUM_FUSELAGES, - Aircraft.VerticalTail.NUM_TAILS, - Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION, - ]) + keys = [Aircraft.Engine.NUM_ENGINES, + Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION,] + flops_inputs = get_flops_inputs(case_name, keys=keys) + options = {} + for key in keys: + options[key] = flops_inputs.get_item(key)[0] prob.model.add_subsystem( 'characteristic_lengths', - CharacteristicLengths(aviary_options=flops_inputs), + CharacteristicLengths(**options), promotes=['*'] ) diff --git a/aviary/subsystems/geometry/flops_based/wetted_area_total.py b/aviary/subsystems/geometry/flops_based/wetted_area_total.py index 4bb08d3e8..63b2a4fab 100644 --- a/aviary/subsystems/geometry/flops_based/wetted_area_total.py +++ b/aviary/subsystems/geometry/flops_based/wetted_area_total.py @@ -1,6 +1,5 @@ import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, add_aviary_output from aviary.variable_info.variables import Aircraft @@ -11,11 +10,6 @@ class TotalWettedArea(om.ExplicitComponent): It is simple enought to skip unit test """ - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.Canard.WETTED_AREA, 0.0) add_aviary_input(self, Aircraft.Fuselage.WETTED_AREA, 0.0) diff --git a/aviary/subsystems/mass/flops_based/air_conditioning.py b/aviary/subsystems/mass/flops_based/air_conditioning.py index 98605525e..d9d7a7f07 100644 --- a/aviary/subsystems/mass/flops_based/air_conditioning.py +++ b/aviary/subsystems/mass/flops_based/air_conditioning.py @@ -3,8 +3,7 @@ from aviary.constants import GRAV_ENGLISH_LBM from aviary.subsystems.mass.flops_based.distributed_prop import ( distributed_engine_count_factor, distributed_thrust_factor) -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission @@ -16,9 +15,8 @@ class TransportAirCondMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.CrewPayload.NUM_PASSENGERS) + add_aviary_option(self, Mission.Constraints.MAX_MACH) def setup(self): add_aviary_input(self, Aircraft.AirConditioning.MASS_SCALER, val=1.0) @@ -35,30 +33,26 @@ def setup_partials(self): self.declare_partials('*', '*') def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] - pax = aviary_options.get_val( - Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') + pax = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] scaler = inputs[Aircraft.AirConditioning.MASS_SCALER] avionics_wt = inputs[Aircraft.Avionics.MASS] * GRAV_ENGLISH_LBM height = inputs[Aircraft.Fuselage.MAX_HEIGHT] planform = inputs[Aircraft.Fuselage.PLANFORM_AREA] - max_mach = aviary_options.get_val(Mission.Constraints.MAX_MACH) + max_mach = self.options[Mission.Constraints.MAX_MACH] outputs[Aircraft.AirConditioning.MASS] = \ ((3.2 * (planform * height)**0.6 + 9 * pax**0.83) * max_mach + 0.075 * avionics_wt) * scaler / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - pax = aviary_options.get_val( - Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') + pax = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] scaler = inputs[Aircraft.AirConditioning.MASS_SCALER] avionics_wt = inputs[Aircraft.Avionics.MASS] * GRAV_ENGLISH_LBM height = inputs[Aircraft.Fuselage.MAX_HEIGHT] planform = inputs[Aircraft.Fuselage.PLANFORM_AREA] - max_mach = aviary_options.get_val(Mission.Constraints.MAX_MACH) + max_mach = self.options[Mission.Constraints.MAX_MACH] planform_exp = planform**0.6 height_exp = height**0.6 @@ -86,9 +80,7 @@ class AltAirCondMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.CrewPayload.NUM_PASSENGERS) def setup(self): add_aviary_input(self, Aircraft.AirConditioning.MASS_SCALER, val=1.0) @@ -99,9 +91,7 @@ def setup_partials(self): self.declare_partials(of=Aircraft.AirConditioning.MASS, wrt='*') def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] - num_pax = aviary_options.get_val( - Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') + num_pax = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] scaler = inputs[Aircraft.AirConditioning.MASS_SCALER] @@ -109,9 +99,7 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): 26.0 * num_pax * scaler / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - num_pax = aviary_options.get_val( - Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') + num_pax = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] J[Aircraft.AirConditioning.MASS, Aircraft.AirConditioning.MASS_SCALER] = \ 26.0 * num_pax / GRAV_ENGLISH_LBM diff --git a/aviary/subsystems/mass/flops_based/anti_icing.py b/aviary/subsystems/mass/flops_based/anti_icing.py index 779fc3ca0..9d7a485da 100644 --- a/aviary/subsystems/mass/flops_based/anti_icing.py +++ b/aviary/subsystems/mass/flops_based/anti_icing.py @@ -6,8 +6,7 @@ distributed_engine_count_factor, distributed_nacelle_diam_factor, distributed_nacelle_diam_factor_deriv) -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -18,13 +17,11 @@ class AntiIcingMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_ENGINES) def setup(self): - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) add_aviary_input(self, Aircraft.AntiIcing.MASS_SCALER, val=1.0) @@ -43,9 +40,8 @@ def setup_partials(self): self.declare_partials("*", "*") def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] - total_engines = aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES) - num_engines = aviary_options.get_val(Aircraft.Engine.NUM_ENGINES) + total_engines = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] scaler = inputs[Aircraft.AntiIcing.MASS_SCALER] max_width = inputs[Aircraft.Fuselage.MAX_WIDTH] @@ -61,9 +57,8 @@ def compute(self, inputs, outputs): + 3.8 * f_nacelle * count_factor + 1.5 * max_width) * scaler / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - total_engines = aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES) - num_engines = aviary_options.get_val(Aircraft.Engine.NUM_ENGINES) + total_engines = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] scaler = inputs[Aircraft.AntiIcing.MASS_SCALER] max_width = inputs[Aircraft.Fuselage.MAX_WIDTH] diff --git a/aviary/subsystems/mass/flops_based/apu.py b/aviary/subsystems/mass/flops_based/apu.py index c4858be1f..0526caea5 100644 --- a/aviary/subsystems/mass/flops_based/apu.py +++ b/aviary/subsystems/mass/flops_based/apu.py @@ -1,8 +1,7 @@ import openmdao.api as om from aviary.constants import GRAV_ENGLISH_LBM -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -13,9 +12,7 @@ class TransportAPUMass(om.ExplicitComponent): """ def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.CrewPayload.NUM_PASSENGERS) def setup(self): add_aviary_input(self, Aircraft.APU.MASS_SCALER, val=1.0) @@ -28,9 +25,7 @@ def setup_partials(self): self.declare_partials('*', '*') def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] - pax = aviary_options.get_val( - Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') + pax = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] scaler = inputs[Aircraft.APU.MASS_SCALER] planform = inputs[Aircraft.Fuselage.PLANFORM_AREA] @@ -38,9 +33,7 @@ def compute(self, inputs, outputs): 54.0 * planform ** 0.3 + 5.4 * pax ** 0.9) * scaler / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - pax = aviary_options.get_val( - Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') + pax = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] scaler = inputs[Aircraft.APU.MASS_SCALER] planform = inputs[Aircraft.Fuselage.PLANFORM_AREA] diff --git a/aviary/subsystems/mass/flops_based/avionics.py b/aviary/subsystems/mass/flops_based/avionics.py index 0c6e54522..1f7e75f7d 100644 --- a/aviary/subsystems/mass/flops_based/avionics.py +++ b/aviary/subsystems/mass/flops_based/avionics.py @@ -1,8 +1,7 @@ import openmdao.api as om from aviary.constants import GRAV_ENGLISH_LBM -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission @@ -14,9 +13,7 @@ class TransportAvionicsMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.CrewPayload.NUM_FLIGHT_CREW) def setup(self): add_aviary_input(self, Aircraft.Avionics.MASS_SCALER, val=1.0) @@ -31,8 +28,7 @@ def setup_partials(self): self.declare_partials('*', '*') def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] - crew = aviary_options.get_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW) + crew = self.options[Aircraft.CrewPayload.NUM_FLIGHT_CREW] scaler = inputs[Aircraft.Avionics.MASS_SCALER] planform = inputs[Aircraft.Fuselage.PLANFORM_AREA] des_range = inputs[Mission.Design.RANGE] @@ -41,8 +37,7 @@ def compute(self, inputs, outputs): 15.8 * des_range**0.1 * crew**0.7 * planform**0.43 * scaler / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - crew = aviary_options.get_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW) + crew = self.options[Aircraft.CrewPayload.NUM_FLIGHT_CREW] scaler = inputs[Aircraft.Avionics.MASS_SCALER] planform = inputs[Aircraft.Fuselage.PLANFORM_AREA] des_range = inputs[Mission.Design.RANGE] diff --git a/aviary/subsystems/mass/flops_based/canard.py b/aviary/subsystems/mass/flops_based/canard.py index 9223872f1..e40b374d3 100644 --- a/aviary/subsystems/mass/flops_based/canard.py +++ b/aviary/subsystems/mass/flops_based/canard.py @@ -1,7 +1,6 @@ import openmdao.api as om from aviary.constants import GRAV_ENGLISH_LBM -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, add_aviary_output from aviary.variable_info.variables import Aircraft, Mission @@ -12,11 +11,6 @@ class CanardMass(om.ExplicitComponent): equations, modified to output mass instead of weight. ''' - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Mission.Design.GROSS_MASS, val=0.0) add_aviary_input(self, Aircraft.Canard.AREA, val=0.0) diff --git a/aviary/subsystems/mass/flops_based/cargo.py b/aviary/subsystems/mass/flops_based/cargo.py index 8ac83f493..a8c9acef8 100644 --- a/aviary/subsystems/mass/flops_based/cargo.py +++ b/aviary/subsystems/mass/flops_based/cargo.py @@ -5,8 +5,7 @@ ''' import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission @@ -17,9 +16,7 @@ class CargoMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.CrewPayload.NUM_PASSENGERS) def setup(self): add_aviary_output(self, Aircraft.CrewPayload.PASSENGER_MASS, 0.) @@ -54,8 +51,7 @@ def setup_partials(self): def compute( self, inputs, outputs, discrete_inputs=None, discrete_outputs=None ): - aviary_options: AviaryValues = self.options['aviary_options'] - passenger_count = aviary_options.get_val(Aircraft.CrewPayload.NUM_PASSENGERS) + passenger_count = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] mass_per_passenger = aviary_options.get_val( Aircraft.CrewPayload.MASS_PER_PASSENGER, units='lbm') diff --git a/aviary/subsystems/mass/flops_based/cargo_containers.py b/aviary/subsystems/mass/flops_based/cargo_containers.py index df0967439..18460dcaf 100644 --- a/aviary/subsystems/mass/flops_based/cargo_containers.py +++ b/aviary/subsystems/mass/flops_based/cargo_containers.py @@ -2,7 +2,6 @@ import openmdao.api as om from aviary.constants import GRAV_ENGLISH_LBM -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, add_aviary_output from aviary.variable_info.variables import Aircraft @@ -14,11 +13,6 @@ class TransportCargoContainersMass(om.ExplicitComponent): the FLOPS weight equations, modified to output mass instead of weight. ''' - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input( self, Aircraft.CrewPayload.CARGO_CONTAINER_MASS_SCALER, val=1.0) diff --git a/aviary/subsystems/mass/flops_based/crew.py b/aviary/subsystems/mass/flops_based/crew.py index 60030710b..d592829e7 100644 --- a/aviary/subsystems/mass/flops_based/crew.py +++ b/aviary/subsystems/mass/flops_based/crew.py @@ -4,8 +4,7 @@ ''' import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -15,9 +14,8 @@ class NonFlightCrewMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.CrewPayload.NUM_FLIGHT_ATTENDANTS) + add_aviary_option(self, Aircraft.CrewPayload.NUM_GALLEY_CREW) def setup(self): add_aviary_input( @@ -34,11 +32,8 @@ def setup_partials(self): def compute( self, inputs, outputs, discrete_inputs=None, discrete_outputs=None ): - aviary_options: AviaryValues = self.options['aviary_options'] - flight_attendants_count = \ - aviary_options.get_val(Aircraft.CrewPayload.NUM_FLIGHT_ATTENDANTS) - galley_crew_count = \ - aviary_options.get_val(Aircraft.CrewPayload.NUM_GALLEY_CREW) + flight_attendants_count = self.options[Aircraft.CrewPayload.NUM_FLIGHT_ATTENDANTS] + galley_crew_count = self.options[Aircraft.CrewPayload.NUM_GALLEY_CREW] mass_per_flight_attendant = self._mass_per_flight_attendant mass_per_galley_crew = self._mass_per_galley_crew @@ -52,11 +47,8 @@ def compute( ) * mass_scaler def compute_partials(self, inputs, J, discrete_inputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] - flight_attendants_count = \ - aviary_options.get_val(Aircraft.CrewPayload.NUM_FLIGHT_ATTENDANTS) - galley_crew_count = \ - aviary_options.get_val(Aircraft.CrewPayload.NUM_GALLEY_CREW) + flight_attendants_count = self.options[Aircraft.CrewPayload.NUM_FLIGHT_ATTENDANTS] + galley_crew_count = self.options[Aircraft.CrewPayload.NUM_GALLEY_CREW] mass_per_flight_attendant = self._mass_per_flight_attendant mass_per_galley_crew = self._mass_per_galley_crew @@ -79,9 +71,8 @@ class FlightCrewMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.CrewPayload.NUM_FLIGHT_CREW) + add_aviary_option(self, Aircraft.LandingGear.CARRIER_BASED) def setup(self): add_aviary_input( @@ -98,9 +89,7 @@ def setup_partials(self): def compute( self, inputs, outputs, discrete_inputs=None, discrete_outputs=None ): - aviary_options: AviaryValues = self.options['aviary_options'] - flight_crew_count = \ - aviary_options.get_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW) + flight_crew_count = self.options[Aircraft.CrewPayload.NUM_FLIGHT_CREW] mass_per_flight_crew = self._mass_per_flight_crew(inputs) @@ -110,9 +99,7 @@ def compute( flight_crew_count * mass_per_flight_crew * mass_scaler def compute_partials(self, inputs, J, discrete_inputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] - flight_crew_count = \ - aviary_options.get_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW) + flight_crew_count = self.options[Aircraft.CrewPayload.NUM_FLIGHT_CREW] mass_per_flight_crew = self._mass_per_flight_crew(inputs) @@ -126,11 +113,10 @@ def _mass_per_flight_crew(self, inputs): Return the mass, in pounds, of one member of the flight crew and their baggage. ''' - aviary_options: AviaryValues = self.options['aviary_options'] mass_per_flight_crew = 225.0 # lbm # account for machine precision error - if 0.9 <= aviary_options.get_val(Aircraft.LandingGear.CARRIER_BASED): + if 0.9 <= self.options[Aircraft.LandingGear.CARRIER_BASED]: mass_per_flight_crew -= 35.0 # lbm return mass_per_flight_crew diff --git a/aviary/subsystems/mass/flops_based/electrical.py b/aviary/subsystems/mass/flops_based/electrical.py index d3b6e13ff..6814de397 100644 --- a/aviary/subsystems/mass/flops_based/electrical.py +++ b/aviary/subsystems/mass/flops_based/electrical.py @@ -3,8 +3,7 @@ from aviary.constants import GRAV_ENGLISH_LBM from aviary.subsystems.mass.flops_based.distributed_prop import \ distributed_engine_count_factor -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -15,9 +14,10 @@ class ElectricalMass(om.ExplicitComponent): """ def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.CrewPayload.NUM_FLIGHT_CREW) + add_aviary_option(self, Aircraft.CrewPayload.NUM_PASSENGERS) + add_aviary_option(self, Aircraft.Fuselage.NUM_FUSELAGES) + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_ENGINES) def setup(self): add_aviary_input(self, Aircraft.Fuselage.LENGTH, 0.0) @@ -30,13 +30,12 @@ def setup_partials(self): self.declare_partials(of='*', wrt='*') def compute(self, inputs, outputs): - options: AviaryValues = self.options['aviary_options'] - nfuse = options.get_val(Aircraft.Fuselage.NUM_FUSELAGES) - ncrew = options.get_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW) - npass = options.get_val(Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') + nfuse = self.options[Aircraft.Fuselage.NUM_FUSELAGES] + ncrew = self.options[Aircraft.CrewPayload.NUM_FLIGHT_CREW] + npass = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] length = inputs[Aircraft.Fuselage.LENGTH] width = inputs[Aircraft.Fuselage.MAX_WIDTH] - num_eng = options.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES) + num_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] num_engines_factor = distributed_engine_count_factor(num_eng) mass_scaler = inputs[Aircraft.Electrical.MASS_SCALER] @@ -45,13 +44,12 @@ def compute(self, inputs, outputs): * (1.0 + 0.044 * ncrew + 0.0015 * npass) * mass_scaler / GRAV_ENGLISH_LBM) def compute_partials(self, inputs, J): - options: AviaryValues = self.options['aviary_options'] - nfuse = options.get_val(Aircraft.Fuselage.NUM_FUSELAGES) - ncrew = options.get_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW) - npass = options.get_val(Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') + nfuse = self.options[Aircraft.Fuselage.NUM_FUSELAGES] + ncrew = self.options[Aircraft.CrewPayload.NUM_FLIGHT_CREW] + npass = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] length = inputs[Aircraft.Fuselage.LENGTH] width = inputs[Aircraft.Fuselage.MAX_WIDTH] - num_eng = options.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES) + num_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] num_engines_factor = distributed_engine_count_factor(num_eng) mass_scaler = inputs[Aircraft.Electrical.MASS_SCALER] @@ -78,9 +76,7 @@ class AltElectricalMass(om.ExplicitComponent): """ def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.CrewPayload.NUM_PASSENGERS) def setup(self): add_aviary_input(self, Aircraft.Electrical.MASS_SCALER, 1.0) @@ -91,18 +87,14 @@ def setup_partials(self): self.declare_partials(of='*', wrt='*') def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] - npass = aviary_options.get_val( - Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') + npass = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] mass_scaler = inputs[Aircraft.Electrical.MASS_SCALER] outputs[Aircraft.Electrical.MASS] = 16.3 * \ npass * mass_scaler / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - npass = aviary_options.get_val( - Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') + npass = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] J[Aircraft.Electrical.MASS, Aircraft.Electrical.MASS_SCALER] = \ 16.3 * npass / GRAV_ENGLISH_LBM diff --git a/aviary/subsystems/mass/flops_based/empty_margin.py b/aviary/subsystems/mass/flops_based/empty_margin.py index 4c4b5cf33..43fca2b20 100644 --- a/aviary/subsystems/mass/flops_based/empty_margin.py +++ b/aviary/subsystems/mass/flops_based/empty_margin.py @@ -1,6 +1,5 @@ import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, add_aviary_output from aviary.variable_info.variables import Aircraft @@ -10,11 +9,6 @@ class EmptyMassMargin(om.ExplicitComponent): Calculates the empty mass margin. """ - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.Propulsion.MASS, val=0.) diff --git a/aviary/subsystems/mass/flops_based/engine.py b/aviary/subsystems/mass/flops_based/engine.py index 5edf1511b..a60e0b988 100644 --- a/aviary/subsystems/mass/flops_based/engine.py +++ b/aviary/subsystems/mass/flops_based/engine.py @@ -1,8 +1,7 @@ import numpy as np import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -16,13 +15,10 @@ class EngineMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) def setup(self): - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) add_aviary_input(self, Aircraft.Engine.SCALED_SLS_THRUST, val=np.zeros(num_engine_type)) diff --git a/aviary/subsystems/mass/flops_based/engine_controls.py b/aviary/subsystems/mass/flops_based/engine_controls.py index c17868c1f..17058a821 100644 --- a/aviary/subsystems/mass/flops_based/engine_controls.py +++ b/aviary/subsystems/mass/flops_based/engine_controls.py @@ -3,8 +3,7 @@ from aviary.constants import GRAV_ENGLISH_LBM from aviary.subsystems.mass.flops_based.distributed_prop import ( distributed_engine_count_factor, distributed_thrust_factor) -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -25,9 +24,7 @@ class TransportEngineCtrlsMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_ENGINES) def setup(self): add_aviary_input( @@ -41,9 +38,7 @@ def setup_partials(self): [Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST]) def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] - - num_engines = aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES) + num_engines = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] num_engines_factor = distributed_engine_count_factor(num_engines) max_sls_thrust = inputs[Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST] @@ -55,9 +50,7 @@ def compute(self, inputs, outputs): total_controls_weight / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J, discrete_inputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] - - num_engines = aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES) + num_engines = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] max_sls_thrust = inputs[Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST] thrust_factor = distributed_thrust_factor(max_sls_thrust, num_engines) diff --git a/aviary/subsystems/mass/flops_based/engine_oil.py b/aviary/subsystems/mass/flops_based/engine_oil.py index 79cfde263..4655e3e37 100644 --- a/aviary/subsystems/mass/flops_based/engine_oil.py +++ b/aviary/subsystems/mass/flops_based/engine_oil.py @@ -3,8 +3,7 @@ from aviary.constants import GRAV_ENGLISH_LBM from aviary.subsystems.mass.flops_based.distributed_prop import ( distributed_engine_count_factor, distributed_thrust_factor) -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -22,9 +21,7 @@ class TransportEngineOilMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_ENGINES) def setup(self): add_aviary_input(self, Aircraft.Propulsion.ENGINE_OIL_MASS_SCALER, val=1.0) @@ -37,9 +34,8 @@ def setup_partials(self): self.declare_partials('*', '*') def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] scaler = inputs[Aircraft.Propulsion.ENGINE_OIL_MASS_SCALER] - num_eng = aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES) + num_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] num_eng_fact = distributed_engine_count_factor(num_eng) max_sls_thrust = inputs[Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST] thrust_factor = distributed_thrust_factor(max_sls_thrust, num_eng) @@ -48,9 +44,8 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): 0.082 * num_eng_fact * thrust_factor**0.65 * scaler / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] scaler = inputs[Aircraft.Propulsion.ENGINE_OIL_MASS_SCALER] - num_eng = aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES) + num_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] num_eng_fact = distributed_engine_count_factor(num_eng) max_sls_thrust = inputs[Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST] thrust_factor = distributed_thrust_factor(max_sls_thrust, num_eng) @@ -72,9 +67,7 @@ class AltEngineOilMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.CrewPayload.NUM_PASSENGERS) def setup(self): add_aviary_input(self, Aircraft.Propulsion.ENGINE_OIL_MASS_SCALER, val=1.0) @@ -85,9 +78,7 @@ def setup_partials(self): self.declare_partials('*', '*') def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] - pax = aviary_options.get_val( - Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') + pax = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] scaler = inputs[Aircraft.Propulsion.ENGINE_OIL_MASS_SCALER] @@ -95,9 +86,7 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): 240.0 * ((pax + 39) // 40) * scaler / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - pax = aviary_options.get_val( - Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') + pax = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] J[Aircraft.Propulsion.TOTAL_ENGINE_OIL_MASS, Aircraft.Propulsion.ENGINE_OIL_MASS_SCALER diff --git a/aviary/subsystems/mass/flops_based/engine_pod.py b/aviary/subsystems/mass/flops_based/engine_pod.py index 256c26d26..a2a73925b 100644 --- a/aviary/subsystems/mass/flops_based/engine_pod.py +++ b/aviary/subsystems/mass/flops_based/engine_pod.py @@ -3,7 +3,7 @@ from aviary.subsystems.mass.flops_based.distributed_prop import nacelle_count_factor from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -18,9 +18,7 @@ class EnginePodMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) def setup(self): num_engine_type = len(self.options['aviary_options'].get_val( @@ -46,8 +44,7 @@ def setup_partials(self): self.declare_partials('*', '*') # derivatives w.r.t vectorized engine inputs have known sparsity pattern - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) shape = np.arange(num_engine_type) self.declare_partials(Aircraft.Engine.POD_MASS, @@ -67,8 +64,7 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): # BUG this methodology completely ignores miscellaneous mass. There is a discrepency between this calculation # and miscellaneous mass. Engine control, starter, and additional mass have a scaler applied to them, and # if their calculated values are used directly this scaler is skipped - aviary_options: AviaryValues = self.options['aviary_options'] - num_eng = aviary_options.get_val(Aircraft.Engine.NUM_ENGINES) + num_eng = self.options[Aircraft.Engine.NUM_ENGINES] nacelle_count = nacelle_count_factor(num_eng) eng_thrust = inputs[Aircraft.Engine.SCALED_SLS_THRUST] @@ -113,8 +109,7 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): outputs[Aircraft.Engine.POD_MASS] = pod_mass def compute_partials(self, inputs, partials, discrete_inputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] - num_eng = aviary_options.get_val(Aircraft.Engine.NUM_ENGINES) + num_eng = self.options[Aircraft.Engine.NUM_ENGINES] count_factor = nacelle_count_factor(num_eng) m_start = inputs[Aircraft.Propulsion.TOTAL_STARTER_MASS] diff --git a/aviary/subsystems/mass/flops_based/fin.py b/aviary/subsystems/mass/flops_based/fin.py index 989ee1ee2..b4e9f79ab 100644 --- a/aviary/subsystems/mass/flops_based/fin.py +++ b/aviary/subsystems/mass/flops_based/fin.py @@ -1,8 +1,7 @@ import openmdao.api as om from aviary.constants import GRAV_ENGLISH_LBM -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission @@ -13,9 +12,7 @@ class FinMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Fins.NUM_FINS) def setup(self): add_aviary_input(self, Mission.Design.GROSS_MASS, val=0.0) @@ -29,8 +26,7 @@ def setup_partials(self): self.declare_partials("*", "*") def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] - num_fins = aviary_options.get_val(Aircraft.Fins.NUM_FINS) + num_fins = self.options[Aircraft.Fins.NUM_FINS] if num_fins > 0: togw = inputs[Mission.Design.GROSS_MASS] * GRAV_ENGLISH_LBM area = inputs[Aircraft.Fins.AREA] @@ -41,8 +37,7 @@ def compute(self, inputs, outputs): inputs[Aircraft.Fins.MASS_SCALER] / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - num_fins = aviary_options.get_val(Aircraft.Fins.NUM_FINS) + num_fins = self.options[Aircraft.Fins.NUM_FINS] if num_fins > 0: area = inputs[Aircraft.Fins.AREA] taper_ratio = inputs[Aircraft.Fins.TAPER_RATIO] diff --git a/aviary/subsystems/mass/flops_based/fuel_capacity.py b/aviary/subsystems/mass/flops_based/fuel_capacity.py index 98d50b2e9..d1d2009b6 100644 --- a/aviary/subsystems/mass/flops_based/fuel_capacity.py +++ b/aviary/subsystems/mass/flops_based/fuel_capacity.py @@ -1,6 +1,5 @@ import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, add_aviary_output from aviary.variable_info.variables import Aircraft @@ -10,17 +9,11 @@ class FuelCapacityGroup(om.Group): Compute the maximum fuel that can be carried. """ - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): - aviary_options = self.options['aviary_options'] self.add_subsystem( 'wing_fuel_capacity', - WingFuelCapacity(aviary_options=aviary_options), + WingFuelCapacity(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( @@ -126,11 +119,6 @@ class WingFuelCapacity(om.ExplicitComponent): Compute the maximum fuel that can be carried in the wing's enclosed space. """ - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.Fuel.DENSITY_RATIO, 1.0) add_aviary_input(self, Aircraft.Fuel.WING_REF_CAPACITY, 0.0) diff --git a/aviary/subsystems/mass/flops_based/fuel_system.py b/aviary/subsystems/mass/flops_based/fuel_system.py index a78851fe2..78dfe92bc 100644 --- a/aviary/subsystems/mass/flops_based/fuel_system.py +++ b/aviary/subsystems/mass/flops_based/fuel_system.py @@ -3,8 +3,7 @@ from aviary.constants import GRAV_ENGLISH_LBM from aviary.subsystems.mass.flops_based.distributed_prop import \ distributed_engine_count_factor -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission @@ -16,9 +15,8 @@ class TransportFuelSystemMass(om.ExplicitComponent): """ def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_ENGINES) + add_aviary_option(self, Mission.Constraints.MAX_MACH) def setup(self): add_aviary_input(self, Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER, val=1.0) @@ -31,24 +29,22 @@ def setup_partials(self): self.declare_partials('*', '*') def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] scaler = inputs[Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER] capacity = inputs[Aircraft.Fuel.TOTAL_CAPACITY] - num_eng = aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES) + num_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] num_eng_fact = distributed_engine_count_factor(num_eng) - max_mach = aviary_options.get_val(Mission.Constraints.MAX_MACH) + max_mach = self.options[Mission.Constraints.MAX_MACH] outputs[Aircraft.Fuel.FUEL_SYSTEM_MASS] = ( 1.07 * capacity**0.58 * num_eng_fact**0.43 * max_mach**0.34 * scaler) / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] scaler = inputs[Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER] capacity = inputs[Aircraft.Fuel.TOTAL_CAPACITY] - num_eng = aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES) + num_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] num_eng_fact = distributed_engine_count_factor(num_eng) - max_mach = aviary_options.get_val(Mission.Constraints.MAX_MACH) + max_mach = self.options[Mission.Constraints.MAX_MACH] J[Aircraft.Fuel.FUEL_SYSTEM_MASS, Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER] = ( 1.07 * capacity**0.58 * num_eng_fact**0.43 * max_mach**0.34 / GRAV_ENGLISH_LBM) @@ -66,9 +62,7 @@ class AltFuelSystemMass(om.ExplicitComponent): """ def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Fuel.NUM_TANKS) def setup(self): add_aviary_input(self, Aircraft.Fuel.TOTAL_CAPACITY, val=0.0) @@ -81,8 +75,7 @@ def setup_partials(self): self.declare_partials('*', '*') def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] - number_of_fuel_tanks = aviary_options.get_val(Aircraft.Fuel.NUM_TANKS) + number_of_fuel_tanks = self.options[Aircraft.Fuel.NUM_TANKS] total_fuel_capacity = inputs[Aircraft.Fuel.TOTAL_CAPACITY] scaler = inputs[Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER] @@ -97,8 +90,7 @@ def compute(self, inputs, outputs): fuel_sys_weight / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - number_of_fuel_tanks = aviary_options.get_val(Aircraft.Fuel.NUM_TANKS) + number_of_fuel_tanks = self.options[Aircraft.Fuel.NUM_TANKS] total_fuel_capacity = inputs[Aircraft.Fuel.TOTAL_CAPACITY] scaler = inputs[Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER] diff --git a/aviary/subsystems/mass/flops_based/furnishings.py b/aviary/subsystems/mass/flops_based/furnishings.py index 62fd9f7bf..fc4f57e0a 100644 --- a/aviary/subsystems/mass/flops_based/furnishings.py +++ b/aviary/subsystems/mass/flops_based/furnishings.py @@ -2,8 +2,7 @@ import openmdao.api as om from aviary.constants import GRAV_ENGLISH_LBM -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission @@ -14,9 +13,11 @@ class TransportFurnishingsGroupMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.CrewPayload.NUM_BUSINESS_CLASS) + add_aviary_option(self, Aircraft.CrewPayload.NUM_FLIGHT_CREW) + add_aviary_option(self, Aircraft.CrewPayload.NUM_FIRST_CLASS) + add_aviary_option(self, Aircraft.CrewPayload.NUM_TOURIST_CLASS) + add_aviary_option(self, Aircraft.Fuselage.NUM_FUSELAGES) def setup(self): add_aviary_input(self, Aircraft.Furnishings.MASS_SCALER, val=1.0) @@ -32,21 +33,14 @@ def setup(self): def setup_partials(self): self.declare_partials(of=Aircraft.Furnishings.MASS, wrt='*') - def compute( - self, inputs, outputs, discrete_inputs=None, discrete_outputs=None - ): - aviary_options: AviaryValues = self.options['aviary_options'] - - flight_crew_count = aviary_options.get_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW) - first_class_count = aviary_options.get_val(Aircraft.CrewPayload.NUM_FIRST_CLASS) - - business_class_count = aviary_options.get_val( - Aircraft.CrewPayload.NUM_BUSINESS_CLASS) + def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): - tourist_class_count = aviary_options.get_val( - Aircraft.CrewPayload.NUM_TOURIST_CLASS) + flight_crew_count = self.options[Aircraft.CrewPayload.NUM_FLIGHT_CREW] + first_class_count = self.options[Aircraft.CrewPayload.NUM_FIRST_CLASS] + business_class_count = self.options[Aircraft.CrewPayload.NUM_BUSINESS_CLASS] + tourist_class_count = self.options[Aircraft.CrewPayload.NUM_TOURIST_CLASS] - fuse_count = aviary_options.get_val(Aircraft.Fuselage.NUM_FUSELAGES) + fuse_count = self.options[Aircraft.Fuselage.NUM_FUSELAGES] scaler = inputs[Aircraft.Furnishings.MASS_SCALER] @@ -64,18 +58,12 @@ def compute( ) * scaler def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] + flight_crew_count = self.options[Aircraft.CrewPayload.NUM_FLIGHT_CREW] + first_class_count = self.options[Aircraft.CrewPayload.NUM_FIRST_CLASS] + business_class_count = self.options[Aircraft.CrewPayload.NUM_BUSINESS_CLASS] + tourist_class_count = self.options[Aircraft.CrewPayload.NUM_TOURIST_CLASS] - flight_crew_count = aviary_options.get_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW) - first_class_count = aviary_options.get_val(Aircraft.CrewPayload.NUM_FIRST_CLASS) - - business_class_count = aviary_options.get_val( - Aircraft.CrewPayload.NUM_BUSINESS_CLASS) - - tourist_class_count = aviary_options.get_val( - Aircraft.CrewPayload.NUM_TOURIST_CLASS) - - fuse_count = aviary_options.get_val(Aircraft.Fuselage.NUM_FUSELAGES) + fuse_count = self.options[Aircraft.Fuselage.NUM_FUSELAGES] scaler = inputs[Aircraft.Furnishings.MASS_SCALER] fuse_max_width = inputs[Aircraft.Fuselage.MAX_WIDTH] @@ -107,9 +95,12 @@ class BWBFurnishingsGroupMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.BWB.NUM_BAYS) + add_aviary_option(self, Aircraft.CrewPayload.NUM_BUSINESS_CLASS) + add_aviary_option(self, Aircraft.CrewPayload.NUM_FLIGHT_CREW) + add_aviary_option(self, Aircraft.CrewPayload.NUM_FIRST_CLASS) + add_aviary_option(self, Aircraft.CrewPayload.NUM_TOURIST_CLASS) + add_aviary_option(self, Aircraft.Fuselage.MILITARY_CARGO_FLOOR) def setup(self): add_aviary_input(self, Aircraft.Furnishings.MASS_SCALER, val=1.0) @@ -129,19 +120,12 @@ def setup(self): def setup_partials(self): self.declare_partials(of=Aircraft.Furnishings.MASS, wrt='*') - def compute( - self, inputs, outputs, discrete_inputs=None, discrete_outputs=None - ): - aviary_options: AviaryValues = self.options['aviary_options'] - - flight_crew_count = aviary_options.get_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW) - first_class_count = aviary_options.get_val(Aircraft.CrewPayload.NUM_FIRST_CLASS) + def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): - business_class_count = aviary_options.get_val( - Aircraft.CrewPayload.NUM_BUSINESS_CLASS) - - tourist_class_count = aviary_options.get_val( - Aircraft.CrewPayload.NUM_TOURIST_CLASS) + flight_crew_count = self.options[Aircraft.CrewPayload.NUM_FLIGHT_CREW] + first_class_count = self.options[Aircraft.CrewPayload.NUM_FIRST_CLASS] + business_class_count = self.options[Aircraft.CrewPayload.NUM_BUSINESS_CLASS] + tourist_class_count = self.options[Aircraft.CrewPayload.NUM_TOURIST_CLASS] scaler = inputs[Aircraft.Furnishings.MASS_SCALER] fuse_max_width = inputs[Aircraft.Fuselage.MAX_WIDTH] @@ -153,9 +137,9 @@ def compute( ) # outputs[Aircraft.Furnishings.MASS] = weight / GRAV_ENGLISH_LBM - if not aviary_options.get_val(Aircraft.Fuselage.MILITARY_CARGO_FLOOR): + if not self.options[Aircraft.Fuselage.MILITARY_CARGO_FLOOR]: acabin = inputs[Aircraft.BWB.CABIN_AREA] - nbay = aviary_options.get_val(Aircraft.BWB.NUM_BAYS) + nbay = self.options[Aircraft.BWB.NUM_BAYS] cos = np.cos( np.pi/180*(inputs[Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP]) @@ -170,16 +154,10 @@ def compute( outputs[Aircraft.Furnishings.MASS] = weight * scaler / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - - flight_crew_count = aviary_options.get_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW) - first_class_count = aviary_options.get_val(Aircraft.CrewPayload.NUM_FIRST_CLASS) - - business_class_count = aviary_options.get_val( - Aircraft.CrewPayload.NUM_BUSINESS_CLASS) - - tourist_class_count = aviary_options.get_val( - Aircraft.CrewPayload.NUM_TOURIST_CLASS) + flight_crew_count = self.options[Aircraft.CrewPayload.NUM_FLIGHT_CREW] + first_class_count = self.options[Aircraft.CrewPayload.NUM_FIRST_CLASS] + business_class_count = self.options[Aircraft.CrewPayload.NUM_BUSINESS_CLASS] + tourist_class_count = self.options[Aircraft.CrewPayload.NUM_TOURIST_CLASS] scaler = inputs[Aircraft.Furnishings.MASS_SCALER] @@ -188,7 +166,7 @@ def compute_partials(self, inputs, J): + 78.0 * business_class_count + 44.0 * tourist_class_count ) / GRAV_ENGLISH_LBM - if aviary_options.get_val(Aircraft.Fuselage.MILITARY_CARGO_FLOOR): + if self.options[Aircraft.Fuselage.MILITARY_CARGO_FLOOR]: J[Aircraft.Furnishings.MASS, Aircraft.BWB.CABIN_AREA] = 0.0 J[Aircraft.Furnishings.MASS, Aircraft.Fuselage.MAX_WIDTH] = 0.0 @@ -206,7 +184,7 @@ def compute_partials(self, inputs, J): tan = np.tan(d2r) acabin = inputs[Aircraft.BWB.CABIN_AREA] - nbay = aviary_options.get_val(Aircraft.BWB.NUM_BAYS) + nbay = self.options[Aircraft.BWB.NUM_BAYS] fuse_max_width = inputs[Aircraft.Fuselage.MAX_WIDTH] fuse_max_height = inputs[Aircraft.Fuselage.MAX_HEIGHT] cabin_area = inputs[Aircraft.BWB.CABIN_AREA] @@ -258,9 +236,7 @@ class AltFurnishingsGroupMassBase(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.CrewPayload.NUM_PASSENGERS) def setup(self): add_aviary_input(self, Aircraft.Furnishings.MASS_SCALER, val=1.0) @@ -273,18 +249,14 @@ def setup_partials(self): def compute( self, inputs, outputs, discrete_inputs=None, discrete_outputs=None ): - aviary_options: AviaryValues = self.options['aviary_options'] - pax_count = aviary_options.get_val( - Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') + pax_count = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] scaler = inputs[Aircraft.Furnishings.MASS_SCALER] outputs[Aircraft.Furnishings.MASS_BASE] = \ (82.15 * pax_count + 3600.0) * scaler def compute_partials(self, inputs, J, discrete_inputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] - pax_count = aviary_options.get_val( - Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') + pax_count = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] J[ Aircraft.Furnishings.MASS_BASE, @@ -299,11 +271,6 @@ class AltFurnishingsGroupMass(om.ExplicitComponent): equations, modified to output mass instead of weight. ''' - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.Furnishings.MASS_BASE, val=0.0) diff --git a/aviary/subsystems/mass/flops_based/fuselage.py b/aviary/subsystems/mass/flops_based/fuselage.py index 6b349ec20..dc0ad71ec 100644 --- a/aviary/subsystems/mass/flops_based/fuselage.py +++ b/aviary/subsystems/mass/flops_based/fuselage.py @@ -3,8 +3,7 @@ from aviary.constants import GRAV_ENGLISH_LBM from aviary.subsystems.mass.flops_based.distributed_prop import \ distributed_engine_count_factor -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -16,9 +15,9 @@ class TransportFuselageMass(om.ExplicitComponent): """ def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Fuselage.MILITARY_CARGO_FLOOR) + add_aviary_option(self, Aircraft.Fuselage.NUM_FUSELAGES) + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES) def setup(self): add_aviary_input(self, Aircraft.Fuselage.LENGTH, val=0.0) @@ -33,16 +32,15 @@ def setup_partials(self): self.declare_partials(Aircraft.Fuselage.MASS, "*") def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] length = inputs[Aircraft.Fuselage.LENGTH] scaler = inputs[Aircraft.Fuselage.MASS_SCALER] avg_diameter = inputs[Aircraft.Fuselage.AVG_DIAMETER] - num_fuse = aviary_options.get_val(Aircraft.Fuselage.NUM_FUSELAGES) - num_fuse_eng = aviary_options.get_val( - Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES) + num_fuse = self.options[Aircraft.Fuselage.NUM_FUSELAGES] + num_fuse_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES] + num_fuse_eng_fact = distributed_engine_count_factor(num_fuse_eng) - military_cargo = aviary_options.get_val(Aircraft.Fuselage.MILITARY_CARGO_FLOOR) + military_cargo = self.options[Aircraft.Fuselage.MILITARY_CARGO_FLOOR] mil_factor = 1.38 if military_cargo else 1.0 @@ -52,15 +50,13 @@ def compute(self, inputs, outputs): ) def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] length = inputs[Aircraft.Fuselage.LENGTH] scaler = inputs[Aircraft.Fuselage.MASS_SCALER] avg_diameter = inputs[Aircraft.Fuselage.AVG_DIAMETER] - num_fuse = aviary_options.get_val(Aircraft.Fuselage.NUM_FUSELAGES) - num_fuse_eng = aviary_options.get_val( - Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES) + num_fuse = self.options[Aircraft.Fuselage.NUM_FUSELAGES] + num_fuse_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES] num_fuse_eng_fact = distributed_engine_count_factor(num_fuse_eng) - military_cargo = aviary_options.get_val(Aircraft.Fuselage.MILITARY_CARGO_FLOOR) + military_cargo = self.options[Aircraft.Fuselage.MILITARY_CARGO_FLOOR] # avg_diameter = (max_height + max_width) / 2. avg_diameter_exp = avg_diameter ** 1.28 @@ -84,11 +80,6 @@ class AltFuselageMass(om.ExplicitComponent): of weight. """ - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.Fuselage.MASS_SCALER, 1.0) diff --git a/aviary/subsystems/mass/flops_based/horizontal_tail.py b/aviary/subsystems/mass/flops_based/horizontal_tail.py index c775a52b8..50ae43440 100644 --- a/aviary/subsystems/mass/flops_based/horizontal_tail.py +++ b/aviary/subsystems/mass/flops_based/horizontal_tail.py @@ -1,7 +1,6 @@ import openmdao.api as om from aviary.constants import GRAV_ENGLISH_LBM -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, add_aviary_output from aviary.variable_info.variables import Aircraft, Mission @@ -12,11 +11,6 @@ class HorizontalTailMass(om.ExplicitComponent): equations, modified to output mass instead of weight. ''' - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.HorizontalTail.AREA, val=0.0) @@ -70,11 +64,6 @@ class AltHorizontalTailMass(om.ExplicitComponent): output mass instead of weight. ''' - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.HorizontalTail.AREA, val=0.0) diff --git a/aviary/subsystems/mass/flops_based/hydraulics.py b/aviary/subsystems/mass/flops_based/hydraulics.py index aed93313f..e2f5ca58c 100644 --- a/aviary/subsystems/mass/flops_based/hydraulics.py +++ b/aviary/subsystems/mass/flops_based/hydraulics.py @@ -3,8 +3,7 @@ from aviary.constants import GRAV_ENGLISH_LBM from aviary.subsystems.mass.flops_based.distributed_prop import \ distributed_engine_count_factor -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission # TODO: update non-transport components to new standard to remove these variables @@ -23,9 +22,9 @@ class TransportHydraulicsGroupMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES) + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES) + add_aviary_option(self, Mission.Constraints.MAX_MACH) def setup(self): add_aviary_input(self, Aircraft.Fuselage.PLANFORM_AREA, val=0.0) @@ -44,11 +43,8 @@ def setup_partials(self): self.declare_partials('*', '*') def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] - num_wing_eng = aviary_options.get_val( - Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES) - num_fuse_eng = aviary_options.get_val( - Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES) + num_wing_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES] + num_fuse_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES] num_wing_eng_fact = distributed_engine_count_factor(num_wing_eng) num_fuse_eng_fact = distributed_engine_count_factor(num_fuse_eng) @@ -57,7 +53,7 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): scaler = inputs[Aircraft.Hydraulics.MASS_SCALER] area = inputs[Aircraft.Wing.AREA] var_sweep = inputs[Aircraft.Wing.VAR_SWEEP_MASS_PENALTY] - max_mach = aviary_options.get_val(Mission.Constraints.MAX_MACH) + max_mach = self.options[Mission.Constraints.MAX_MACH] outputs[Aircraft.Hydraulics.MASS] = ( 0.57 * (planform + 0.27 * area) @@ -66,11 +62,8 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): * scaler / GRAV_ENGLISH_LBM) def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - num_wing_eng = aviary_options.get_val( - Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES) - num_fuse_eng = aviary_options.get_val( - Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES) + num_wing_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES] + num_fuse_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES] num_wing_eng_fact = distributed_engine_count_factor(num_wing_eng) num_fuse_eng_fact = distributed_engine_count_factor(num_fuse_eng) @@ -79,7 +72,7 @@ def compute_partials(self, inputs, J): scaler = inputs[Aircraft.Hydraulics.MASS_SCALER] area = inputs[Aircraft.Wing.AREA] var_sweep = inputs[Aircraft.Wing.VAR_SWEEP_MASS_PENALTY] - max_mach = aviary_options.get_val(Mission.Constraints.MAX_MACH) + max_mach = self.options[Mission.Constraints.MAX_MACH] term1 = (planform + 0.27 * area) term2 = (1.0 + 0.03 * num_wing_eng_fact + 0.05 * num_fuse_eng_fact) @@ -111,11 +104,6 @@ class AltHydraulicsGroupMass(om.ExplicitComponent): output mass instead of weight. ''' - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.Wing.AREA, val=0.0) diff --git a/aviary/subsystems/mass/flops_based/instruments.py b/aviary/subsystems/mass/flops_based/instruments.py index 3b0c50f84..04bcda862 100644 --- a/aviary/subsystems/mass/flops_based/instruments.py +++ b/aviary/subsystems/mass/flops_based/instruments.py @@ -3,8 +3,7 @@ from aviary.constants import GRAV_ENGLISH_LBM from aviary.subsystems.mass.flops_based.distributed_prop import \ distributed_engine_count_factor -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission @@ -18,9 +17,10 @@ class TransportInstrumentMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.CrewPayload.NUM_FLIGHT_CREW) + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES) + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES) + add_aviary_option(self, Mission.Constraints.MAX_MACH) def setup(self): add_aviary_input(self, Aircraft.Fuselage.PLANFORM_AREA, 0.0) @@ -31,17 +31,14 @@ def setup(self): self.declare_partials("*", "*") def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] - num_crew = aviary_options.get_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW) - num_wing_eng = aviary_options.get_val( - Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES) - num_fuse_eng = aviary_options.get_val( - Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES) + num_crew = self.options[Aircraft.CrewPayload.NUM_FLIGHT_CREW] + num_wing_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES] + num_fuse_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES] num_wing_eng_fact = distributed_engine_count_factor(num_wing_eng) num_fuse_eng_fact = distributed_engine_count_factor(num_fuse_eng) fuse_area = inputs[Aircraft.Fuselage.PLANFORM_AREA] - max_mach = aviary_options.get_val(Mission.Constraints.MAX_MACH) + max_mach = self.options[Mission.Constraints.MAX_MACH] mass_scaler = inputs[Aircraft.Instruments.MASS_SCALER] instrument_weight = ( @@ -53,17 +50,14 @@ def compute(self, inputs, outputs): mass_scaler / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - num_crew = aviary_options.get_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW) - num_wing_eng = aviary_options.get_val( - Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES) - num_fuse_eng = aviary_options.get_val( - Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES) + num_crew = self.options[Aircraft.CrewPayload.NUM_FLIGHT_CREW] + num_wing_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES] + num_fuse_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES] num_wing_eng_fact = distributed_engine_count_factor(num_wing_eng) num_fuse_eng_fact = distributed_engine_count_factor(num_fuse_eng) fuse_area = inputs[Aircraft.Fuselage.PLANFORM_AREA] - max_mach = aviary_options.get_val(Mission.Constraints.MAX_MACH) + max_mach = self.options[Mission.Constraints.MAX_MACH] mass_scaler = inputs[Aircraft.Instruments.MASS_SCALER] fact = (10.0 + 2.5 * num_crew + num_wing_eng_fact + 1.5 * num_fuse_eng_fact) diff --git a/aviary/subsystems/mass/flops_based/landing_gear.py b/aviary/subsystems/mass/flops_based/landing_gear.py index 742e6e101..e413a739c 100644 --- a/aviary/subsystems/mass/flops_based/landing_gear.py +++ b/aviary/subsystems/mass/flops_based/landing_gear.py @@ -4,8 +4,7 @@ from aviary.constants import GRAV_ENGLISH_LBM from aviary.subsystems.mass.flops_based.distributed_prop import ( distributed_nacelle_diam_factor, distributed_nacelle_diam_factor_deriv) -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission DEG2RAD = np.pi / 180.0 @@ -19,11 +18,6 @@ class LandingGearMass(om.ExplicitComponent): # TODO: add in aircraft type and carrier factors as options and modify # equations - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, val=0.0) @@ -136,11 +130,6 @@ class AltLandingGearMass(om.ExplicitComponent): to output mass instead of weight. ''' - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, val=0.0) @@ -251,11 +240,6 @@ def compute_partials(self, inputs, J): class NoseGearLength(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, val=0.0) add_aviary_output(self, Aircraft.LandingGear.NOSE_GEAR_OLEO_LENGTH, val=0.0) @@ -273,9 +257,8 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): class MainGearLength(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + 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['aviary_options'].get_val( @@ -298,10 +281,9 @@ def setup_partials(self): self.declare_partials('*', '*') def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): - options: AviaryValues = self.options['aviary_options'] # TODO temp using first engine, heterogeneous engines not supported - num_eng = options.get_val(Aircraft.Engine.NUM_ENGINES)[0] - num_wing_eng = options.get_val(Aircraft.Engine.NUM_WING_ENGINES)[0] + num_eng = self.options[Aircraft.Engine.NUM_ENGINES] + num_wing_eng = self.options[Aircraft.Engine.NUM_WING_ENGINES] y_eng_fore = inputs[Aircraft.Engine.WING_LOCATIONS][0][0] @@ -338,10 +320,9 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): outputs[Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH] = cmlg def compute_partials(self, inputs, partials, discrete_inputs=None): - options: AviaryValues = self.options['aviary_options'] # TODO temp using first engine, heterogeneous engines not supported - num_eng = options.get_val(Aircraft.Engine.NUM_ENGINES)[0] - num_wing_eng = options.get_val(Aircraft.Engine.NUM_WING_ENGINES)[0] + num_eng = self.options[Aircraft.Engine.NUM_ENGINES] + num_wing_eng = self.options[Aircraft.Engine.NUM_WING_ENGINES] y_eng_fore = inputs[Aircraft.Engine.WING_LOCATIONS][0][0] y_eng_aft = 0 diff --git a/aviary/subsystems/mass/flops_based/landing_group.py b/aviary/subsystems/mass/flops_based/landing_group.py index e7f41c040..72d777954 100644 --- a/aviary/subsystems/mass/flops_based/landing_group.py +++ b/aviary/subsystems/mass/flops_based/landing_group.py @@ -4,41 +4,39 @@ AltLandingGearMass, LandingGearMass, MainGearLength, NoseGearLength) from aviary.subsystems.mass.flops_based.landing_mass import ( LandingMass, LandingTakeoffMassRatio) -from aviary.utils.aviary_values import AviaryValues +from aviary.variable_info.functions import add_aviary_option from aviary.variable_info.variables import Aircraft, Mission class LandingMassGroup(om.Group): + def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Design.USE_ALT_MASS) def setup(self): - aviary_options: AviaryValues = self.options['aviary_options'] - alt_mass = aviary_options.get_val(Aircraft.Design.USE_ALT_MASS) + alt_mass = self.options[Aircraft.Design.USE_ALT_MASS] self.add_subsystem('landing_to_takeoff_mass_ratio', - LandingTakeoffMassRatio(aviary_options=aviary_options), + LandingTakeoffMassRatio(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem('main_landing_gear_length', - MainGearLength(aviary_options=aviary_options), + MainGearLength(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem('nose_landing_gear_length', - NoseGearLength(aviary_options=aviary_options), + NoseGearLength(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem('landing_mass', - LandingMass(aviary_options=aviary_options), + LandingMass(), promotes_inputs=['*'], promotes_outputs=['*']) if alt_mass: self.add_subsystem('landing_gear', - AltLandingGearMass(aviary_options=aviary_options), + AltLandingGearMass(), promotes_inputs=['*'], promotes_outputs=['*']) else: self.add_subsystem('landing_gear', - LandingGearMass(aviary_options=aviary_options), + LandingGearMass(), promotes_inputs=['*'], promotes_outputs=['*']) diff --git a/aviary/subsystems/mass/flops_based/landing_mass.py b/aviary/subsystems/mass/flops_based/landing_mass.py index c34686fbe..b809b51dc 100644 --- a/aviary/subsystems/mass/flops_based/landing_mass.py +++ b/aviary/subsystems/mass/flops_based/landing_mass.py @@ -1,7 +1,6 @@ import numpy as np import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, add_aviary_output from aviary.variable_info.variables import Aircraft, Mission @@ -11,11 +10,6 @@ class LandingTakeoffMassRatio(om.ExplicitComponent): Calculate the ratio of maximum landing mass to maximum takeoff gross mass. ''' - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Mission.Summary.CRUISE_MACH, val=0.0) @@ -58,11 +52,6 @@ class LandingMass(om.ExplicitComponent): Maximum landing mass is maximum takeoff gross mass times the ratio of landing/takeoff mass. ''' - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Mission.Design.GROSS_MASS, val=0.0) diff --git a/aviary/subsystems/mass/flops_based/mass_premission.py b/aviary/subsystems/mass/flops_based/mass_premission.py index 1d6020dde..d4900581e 100644 --- a/aviary/subsystems/mass/flops_based/mass_premission.py +++ b/aviary/subsystems/mass/flops_based/mass_premission.py @@ -45,255 +45,248 @@ from aviary.subsystems.mass.flops_based.vertical_tail import ( AltVerticalTailMass, VerticalTailMass) from aviary.subsystems.mass.flops_based.wing_group import WingMassGroup -from aviary.utils.aviary_values import AviaryValues +from aviary.variable_info.functions import add_aviary_option from aviary.variable_info.variables import Aircraft, Mission class MassPremission(om.Group): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Design.USE_ALT_MASS) def setup(self): - aviary_options: AviaryValues = self.options['aviary_options'] - alt_mass = aviary_options.get_val(Aircraft.Design.USE_ALT_MASS) + alt_mass = self.options[Aircraft.Design.USE_ALT_MASS] self.add_subsystem( 'cargo', - CargoMass(aviary_options=aviary_options), + CargoMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'cargo_containers', - TransportCargoContainersMass( - aviary_options=aviary_options), + TransportCargoContainersMass(), promotes_inputs=['*', ], promotes_outputs=['*', ]) self.add_subsystem( 'engine_controls', - TransportEngineCtrlsMass(aviary_options=aviary_options), + TransportEngineCtrlsMass(), promotes_inputs=['*', ], promotes_outputs=['*', ]) self.add_subsystem( 'avionics', - TransportAvionicsMass(aviary_options=aviary_options), + TransportAvionicsMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'fuel_capacity_group', - FuelCapacityGroup(aviary_options=aviary_options), + FuelCapacityGroup(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'engine_mass', - EngineMass(aviary_options=aviary_options), + EngineMass(), promotes_inputs=['*'], promotes_outputs=['*']) if alt_mass: self.add_subsystem( 'fuel_system', - AltFuelSystemMass(aviary_options=aviary_options), + AltFuelSystemMass(), promotes_inputs=['*', ], promotes_outputs=['*', ]) self.add_subsystem( 'AC', - AltAirCondMass(aviary_options=aviary_options), + AltAirCondMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'engine_oil', - AltEngineOilMass(aviary_options=aviary_options), + AltEngineOilMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'furnishing_base', AltFurnishingsGroupMassBase( - aviary_options=aviary_options), + ), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'furnishings', - AltFurnishingsGroupMass(aviary_options=aviary_options), + AltFurnishingsGroupMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'hydraulics', - AltHydraulicsGroupMass(aviary_options=aviary_options), + AltHydraulicsGroupMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'pass_service', - AltPassengerServiceMass( - aviary_options=aviary_options), + AltPassengerServiceMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'unusable_fuel', - AltUnusableFuelMass(aviary_options=aviary_options), + AltUnusableFuelMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'electrical', - AltElectricalMass(aviary_options=aviary_options), + AltElectricalMass(), promotes_inputs=['*'], promotes_outputs=['*']) else: self.add_subsystem( 'fuel_system', - TransportFuelSystemMass(aviary_options=aviary_options), + TransportFuelSystemMass(), promotes_inputs=['*', ], promotes_outputs=['*', ]) self.add_subsystem( 'AC', - TransportAirCondMass(aviary_options=aviary_options), + TransportAirCondMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'engine_oil', - TransportEngineOilMass(aviary_options=aviary_options), + TransportEngineOilMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'furnishings', - TransportFurnishingsGroupMass( - aviary_options=aviary_options), + TransportFurnishingsGroupMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'hydraulics', - TransportHydraulicsGroupMass( - aviary_options=aviary_options), + TransportHydraulicsGroupMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'pass_service', - PassengerServiceMass(aviary_options=aviary_options), + PassengerServiceMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'unusable_fuel', - TransportUnusableFuelMass(aviary_options=aviary_options), + TransportUnusableFuelMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'electrical', - ElectricalMass(aviary_options=aviary_options), + ElectricalMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'starter', - TransportStarterMass(aviary_options=aviary_options), + TransportStarterMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'anti_icing', - AntiIcingMass(aviary_options=aviary_options), + AntiIcingMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'apu', - TransportAPUMass(aviary_options=aviary_options), + TransportAPUMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'nonflight_crew', - NonFlightCrewMass(aviary_options=aviary_options), + NonFlightCrewMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'flight_crew', - FlightCrewMass(aviary_options=aviary_options), + FlightCrewMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'instruments', - TransportInstrumentMass(aviary_options=aviary_options), + TransportInstrumentMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'misc_engine', - EngineMiscMass(aviary_options=aviary_options), + EngineMiscMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'nacelle', - NacelleMass(aviary_options=aviary_options), + NacelleMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'paint', - PaintMass(aviary_options=aviary_options), + PaintMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'thrust_rev', - ThrustReverserMass(aviary_options=aviary_options), + ThrustReverserMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'landing_group', - LandingMassGroup(aviary_options=aviary_options), + LandingMassGroup(), promotes_inputs=['*'], promotes_outputs=['*']) if alt_mass: self.add_subsystem( 'surf_ctrl', - AltSurfaceControlMass(aviary_options=aviary_options), + AltSurfaceControlMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'fuselage', - AltFuselageMass(aviary_options=aviary_options), + AltFuselageMass(), promotes_inputs=['*', ], promotes_outputs=['*', ]) self.add_subsystem( 'htail', - AltHorizontalTailMass(aviary_options=aviary_options), + AltHorizontalTailMass(), promotes_inputs=['*', ], promotes_outputs=['*', ]) self.add_subsystem( 'vert_tail', - AltVerticalTailMass(aviary_options=aviary_options), + AltVerticalTailMass(), promotes_inputs=['*'], promotes_outputs=['*']) else: self.add_subsystem( 'surf_ctrl', - SurfaceControlMass(aviary_options=aviary_options), + SurfaceControlMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'fuselage', - TransportFuselageMass(aviary_options=aviary_options), + TransportFuselageMass(), promotes_inputs=['*', ], promotes_outputs=['*', ]) self.add_subsystem( 'htail', - HorizontalTailMass(aviary_options=aviary_options), + HorizontalTailMass(), promotes_inputs=['*', ], promotes_outputs=['*', ]) self.add_subsystem( 'vert_tail', - VerticalTailMass(aviary_options=aviary_options), + VerticalTailMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'canard', - CanardMass(aviary_options=aviary_options), + CanardMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'fin', - FinMass(aviary_options=aviary_options), + FinMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'wing_group', - WingMassGroup(aviary_options=aviary_options), + WingMassGroup(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'total_mass', - MassSummation(aviary_options=aviary_options), + MassSummation(), promotes_inputs=['*'], promotes_outputs=['*']) diff --git a/aviary/subsystems/mass/flops_based/mass_summation.py b/aviary/subsystems/mass/flops_based/mass_summation.py index fed9a99f8..909ef8b87 100644 --- a/aviary/subsystems/mass/flops_based/mass_summation.py +++ b/aviary/subsystems/mass/flops_based/mass_summation.py @@ -3,81 +3,74 @@ import openmdao.api as om from aviary.subsystems.mass.flops_based.empty_margin import EmptyMassMargin -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission class MassSummation(om.Group): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Design.USE_ALT_MASS) def setup(self): - aviary_options: AviaryValues = self.options['aviary_options'] - alt_mass = aviary_options.get_val(Aircraft.Design.USE_ALT_MASS) + alt_mass = self.options[Aircraft.Design.USE_ALT_MASS] self.add_subsystem( - 'structure_mass', StructureMass(aviary_options=aviary_options), + 'structure_mass', StructureMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( - 'propulsion_mass', PropulsionMass(aviary_options=aviary_options), + 'propulsion_mass', PropulsionMass(), promotes_inputs=['*'], promotes_outputs=['*']) if alt_mass: self.add_subsystem( 'system_equip_mass_base', - AltSystemsEquipMassBase(aviary_options=aviary_options), + AltSystemsEquipMassBase(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( 'system_equip_mass', - AltSystemsEquipMass(aviary_options=aviary_options), + AltSystemsEquipMass(), promotes_inputs=['*'], promotes_outputs=['*']) else: self.add_subsystem( - 'system_equip_mass', SystemsEquipMass(aviary_options=aviary_options), + 'system_equip_mass', SystemsEquipMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( - 'empty_mass_margin', EmptyMassMargin(aviary_options=aviary_options), + 'empty_mass_margin', EmptyMassMargin(), promotes_inputs=['*'], promotes_outputs=['*']) if alt_mass: self.add_subsystem( - 'empty_mass', AltEmptyMass(aviary_options=aviary_options), + 'empty_mass', AltEmptyMass(), promotes_inputs=['*'], promotes_outputs=['*']) else: - self.add_subsystem('empty_mass', EmptyMass(aviary_options=aviary_options), + self.add_subsystem('empty_mass', EmptyMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( - 'operating_mass', OperatingMass(aviary_options=aviary_options), + 'operating_mass', OperatingMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( - 'zero_fuel_mass', ZeroFuelMass(aviary_options=aviary_options), + 'zero_fuel_mass', ZeroFuelMass(), promotes_inputs=['*'], promotes_outputs=['*']) - self.add_subsystem('fuel_mass', FuelMass(aviary_options=aviary_options), + self.add_subsystem('fuel_mass', FuelMass(), promotes_inputs=['*'], promotes_outputs=['*']) class StructureMass(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) def setup(self): - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) add_aviary_input(self, Aircraft.Canard.MASS, val=0.0) add_aviary_input(self, Aircraft.Fins.MASS, val=0.0) @@ -93,8 +86,7 @@ def setup(self): add_aviary_output(self, Aircraft.Design.STRUCTURE_MASS, val=0.0) def setup_partials(self): - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) self.declare_partials(Aircraft.Design.STRUCTURE_MASS, '*', val=1) self.declare_partials(Aircraft.Design.STRUCTURE_MASS, Aircraft.Nacelle.MASS, @@ -119,11 +111,6 @@ def compute(self, inputs, outputs): class PropulsionMass(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.Fuel.FUEL_SYSTEM_MASS, val=0.0) add_aviary_input(self, Aircraft.Propulsion.TOTAL_MISC_MASS, val=0.0) @@ -154,11 +141,6 @@ def compute(self, inputs, outputs): class SystemsEquipMass(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.AirConditioning.MASS, val=0.0) add_aviary_input(self, Aircraft.AntiIcing.MASS, val=0.0) @@ -196,11 +178,6 @@ def compute(self, inputs, outputs): class AltSystemsEquipMassBase(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.AirConditioning.MASS, val=0.0) add_aviary_input(self, Aircraft.AntiIcing.MASS, val=0.0) @@ -238,11 +215,6 @@ def compute(self, inputs, outputs): class AltSystemsEquipMass(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.Design.SYSTEMS_EQUIP_MASS_BASE, val=0.0) add_aviary_input(self, Aircraft.Design.STRUCTURE_MASS, val=0.0) @@ -275,11 +247,6 @@ def compute(self, inputs, outputs): class EmptyMass(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.Design.EMPTY_MASS_MARGIN, val=0.0) add_aviary_input(self, Aircraft.Design.STRUCTURE_MASS, val=0.0) @@ -303,11 +270,6 @@ def compute(self, inputs, outputs): class AltEmptyMass(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.Design.EMPTY_MASS_MARGIN, val=0.0) add_aviary_input(self, Aircraft.Design.STRUCTURE_MASS, val=0.0) @@ -338,11 +300,6 @@ def compute(self, inputs, outputs): class OperatingMass(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.CrewPayload.CARGO_CONTAINER_MASS, val=0.0) add_aviary_input(self, Aircraft.CrewPayload.NON_FLIGHT_CREW_MASS, val=0.0) @@ -373,11 +330,6 @@ def compute(self, inputs, outputs): class ZeroFuelMass(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.CrewPayload.PASSENGER_MASS, val=0.0) add_aviary_input(self, Aircraft.CrewPayload.BAGGAGE_MASS, val=0.0) @@ -401,11 +353,6 @@ def compute(self, inputs, outputs): class FuelMass(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Mission.Design.GROSS_MASS, val=0.0) add_aviary_input(self, Aircraft.Design.ZERO_FUEL_MASS, val=0.0) diff --git a/aviary/subsystems/mass/flops_based/misc_engine.py b/aviary/subsystems/mass/flops_based/misc_engine.py index dba079072..a77ca24c9 100644 --- a/aviary/subsystems/mass/flops_based/misc_engine.py +++ b/aviary/subsystems/mass/flops_based/misc_engine.py @@ -1,9 +1,8 @@ import numpy as np + import openmdao.api as om -import numpy as np -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -20,13 +19,10 @@ class EngineMiscMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) def setup(self): - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) add_aviary_input( self, Aircraft.Engine.ADDITIONAL_MASS, val=np.zeros(num_engine_type)) @@ -48,8 +44,7 @@ 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 - options: AviaryValues = self.options['aviary_options'] - num_engines = options.get_val(Aircraft.Engine.NUM_ENGINES) + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] addtl_mass = sum(inputs[Aircraft.Engine.ADDITIONAL_MASS] * num_engines) ctrl_mass = inputs[Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS] @@ -63,8 +58,7 @@ def compute(self, inputs, outputs): def compute_partials(self, inputs, J): # TODO temporarily using engine-level additional mass and multiplying # by num_engines to get propulsion-level additional mass - options: AviaryValues = self.options['aviary_options'] - num_engines = options.get_val(Aircraft.Engine.NUM_ENGINES) + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] addtl_mass = inputs[Aircraft.Engine.ADDITIONAL_MASS] * num_engines ctrl_mass = inputs[Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS] diff --git a/aviary/subsystems/mass/flops_based/nacelle.py b/aviary/subsystems/mass/flops_based/nacelle.py index 398d8f0af..7ec531053 100644 --- a/aviary/subsystems/mass/flops_based/nacelle.py +++ b/aviary/subsystems/mass/flops_based/nacelle.py @@ -3,8 +3,7 @@ from aviary.constants import GRAV_ENGLISH_LBM from aviary.subsystems.mass.flops_based.distributed_prop import nacelle_count_factor -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -21,13 +20,10 @@ class NacelleMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) def setup(self): - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) add_aviary_input(self, Aircraft.Nacelle.AVG_DIAMETER, val=np.zeros(num_engine_type)) @@ -45,8 +41,7 @@ def setup(self): def setup_partials(self): # derivatives w.r.t vectorized engine inputs have known sparsity pattern - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) shape = np.arange(num_engine_type) self.declare_partials(Aircraft.Nacelle.MASS, Aircraft.Nacelle.AVG_DIAMETER, @@ -59,8 +54,7 @@ def setup_partials(self): rows=shape, cols=shape, val=1.0) def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] - num_eng = aviary_options.get_val(Aircraft.Engine.NUM_ENGINES) + num_eng = self.options[Aircraft.Engine.NUM_ENGINES] avg_diam = inputs[Aircraft.Nacelle.AVG_DIAMETER] avg_length = inputs[Aircraft.Nacelle.AVG_LENGTH] scaler = inputs[Aircraft.Nacelle.MASS_SCALER] @@ -73,8 +67,7 @@ def compute(self, inputs, outputs): avg_diam * avg_length * thrust**0.36 * scaler / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - num_eng = aviary_options.get_val(Aircraft.Engine.NUM_ENGINES) + num_eng = self.options[Aircraft.Engine.NUM_ENGINES] avg_diam = inputs[Aircraft.Nacelle.AVG_DIAMETER] avg_length = inputs[Aircraft.Nacelle.AVG_LENGTH] scaler = inputs[Aircraft.Nacelle.MASS_SCALER] diff --git a/aviary/subsystems/mass/flops_based/paint.py b/aviary/subsystems/mass/flops_based/paint.py index 7e1df471a..4781a13e6 100644 --- a/aviary/subsystems/mass/flops_based/paint.py +++ b/aviary/subsystems/mass/flops_based/paint.py @@ -1,6 +1,5 @@ import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, add_aviary_output from aviary.variable_info.variables import Aircraft @@ -10,11 +9,6 @@ class PaintMass(om.ExplicitComponent): Calculates the mass of paint based on total wetted area. ''' - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.Design.TOTAL_WETTED_AREA, val=0.0) diff --git a/aviary/subsystems/mass/flops_based/passenger_service.py b/aviary/subsystems/mass/flops_based/passenger_service.py index 21c5a5ae2..4046a6945 100644 --- a/aviary/subsystems/mass/flops_based/passenger_service.py +++ b/aviary/subsystems/mass/flops_based/passenger_service.py @@ -5,8 +5,7 @@ import openmdao.api as om from aviary.constants import GRAV_ENGLISH_LBM -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission @@ -18,9 +17,10 @@ class PassengerServiceMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.CrewPayload.NUM_BUSINESS_CLASS) + add_aviary_option(self, Aircraft.CrewPayload.NUM_FIRST_CLASS) + add_aviary_option(self, Aircraft.CrewPayload.NUM_TOURIST_CLASS) + add_aviary_option(self, Mission.Constraints.MAX_MACH) def setup(self): add_aviary_input( @@ -45,16 +45,12 @@ def setup_partials(self): self.declare_partials('*', '*') def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] - first_class_count = aviary_options.get_val(Aircraft.CrewPayload.NUM_FIRST_CLASS) + first_class_count = self.options[Aircraft.CrewPayload.NUM_FIRST_CLASS] + business_class_count = self.options[Aircraft.CrewPayload.NUM_BUSINESS_CLASS] + tourist_class_count = self.options[Aircraft.CrewPayload.NUM_TOURIST_CLASS] - business_class_count = \ - aviary_options.get_val(Aircraft.CrewPayload.NUM_BUSINESS_CLASS) - - tourist_class_count = \ - aviary_options.get_val(Aircraft.CrewPayload.NUM_TOURIST_CLASS) design_range = inputs[Mission.Design.RANGE] - max_mach = aviary_options.get_val(Mission.Constraints.MAX_MACH) + max_mach = self.options[Mission.Constraints.MAX_MACH] passenger_service_mass_scaler = \ inputs[Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_SCALER] @@ -71,16 +67,12 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): passenger_service_weight / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J, discrete_inputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] - first_class_count = aviary_options.get_val(Aircraft.CrewPayload.NUM_FIRST_CLASS) - - business_class_count = \ - aviary_options.get_val(Aircraft.CrewPayload.NUM_BUSINESS_CLASS) + first_class_count = self.options[Aircraft.CrewPayload.NUM_FIRST_CLASS] + business_class_count = self.options[Aircraft.CrewPayload.NUM_BUSINESS_CLASS] + tourist_class_count = self.options[Aircraft.CrewPayload.NUM_TOURIST_CLASS] - tourist_class_count = \ - aviary_options.get_val(Aircraft.CrewPayload.NUM_TOURIST_CLASS) design_range = inputs[Mission.Design.RANGE] - max_mach = aviary_options.get_val(Mission.Constraints.MAX_MACH) + max_mach = self.options[Mission.Constraints.MAX_MACH] passenger_service_mass_scaler = \ inputs[Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_SCALER] @@ -114,9 +106,7 @@ class AltPassengerServiceMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.CrewPayload.NUM_PASSENGERS) def setup(self): add_aviary_input( @@ -130,9 +120,7 @@ def setup_partials(self): def compute( self, inputs, outputs, discrete_inputs=None, discrete_outputs=None ): - aviary_options: AviaryValues = self.options['aviary_options'] - passenger_count = aviary_options.get_val( - Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') + passenger_count = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] passenger_service_mass_scaler = \ inputs[Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_SCALER] @@ -144,9 +132,7 @@ def compute( passenger_service_weight / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J, discrete_inputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] - passenger_count = aviary_options.get_val( - Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') + passenger_count = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] J[ Aircraft.CrewPayload.PASSENGER_SERVICE_MASS, diff --git a/aviary/subsystems/mass/flops_based/starter.py b/aviary/subsystems/mass/flops_based/starter.py index e7b06a4d9..5951ece7d 100644 --- a/aviary/subsystems/mass/flops_based/starter.py +++ b/aviary/subsystems/mass/flops_based/starter.py @@ -1,11 +1,11 @@ -import openmdao.api as om import numpy as np +import openmdao.api as om + from aviary.constants import GRAV_ENGLISH_LBM from aviary.subsystems.mass.flops_based.distributed_prop import ( distributed_engine_count_factor, distributed_nacelle_diam_factor) -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission @@ -17,13 +17,11 @@ class TransportStarterMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_ENGINES) def setup(self): - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) add_aviary_input(self, Aircraft.Nacelle.AVG_DIAMETER, val=np.zeros(num_engine_type)) @@ -34,9 +32,8 @@ def setup_partials(self): self.declare_partials("*", "*") def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] - total_engines = aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES) - num_engines = aviary_options.get_val(Aircraft.Engine.NUM_ENGINES) + total_engines = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] d_nacelle = inputs[Aircraft.Nacelle.AVG_DIAMETER] max_mach = aviary_options.get_val(Mission.Constraints.MAX_MACH) @@ -47,9 +44,8 @@ def compute(self, inputs, outputs): 11.0 * num_engines_factor * max_mach**0.32 * f_nacelle**1.6) / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - total_engines = aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES) - num_engines = aviary_options.get_val(Aircraft.Engine.NUM_ENGINES) + total_engines = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] d_nacelle = inputs[Aircraft.Nacelle.AVG_DIAMETER] eng_count_factor = distributed_engine_count_factor(total_engines) diff --git a/aviary/subsystems/mass/flops_based/surface_controls.py b/aviary/subsystems/mass/flops_based/surface_controls.py index 441a7fcde..d12692275 100644 --- a/aviary/subsystems/mass/flops_based/surface_controls.py +++ b/aviary/subsystems/mass/flops_based/surface_controls.py @@ -2,7 +2,7 @@ from aviary.constants import GRAV_ENGLISH_LBM from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission @@ -13,9 +13,7 @@ class SurfaceControlMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Mission.Constraints.MAX_MACH) def setup(self): add_aviary_input(self, Aircraft.Wing.SURFACE_CONTROL_MASS_SCALER, val=1.0) @@ -31,9 +29,8 @@ def setup(self): Aircraft.Wing.CONTROL_SURFACE_AREA_RATIO, Aircraft.Wing.AREA]) def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] scaler = inputs[Aircraft.Wing.SURFACE_CONTROL_MASS_SCALER] - max_mach = aviary_options.get_val(Mission.Constraints.MAX_MACH) + max_mach = self.options[Mission.Constraints.MAX_MACH] gross_weight = inputs[Mission.Design.GROSS_MASS] * GRAV_ENGLISH_LBM flap_ratio = inputs[Aircraft.Wing.CONTROL_SURFACE_AREA_RATIO] wing_area = inputs[Aircraft.Wing.AREA] @@ -49,9 +46,8 @@ def compute(self, inputs, outputs): GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] scaler = inputs[Aircraft.Wing.SURFACE_CONTROL_MASS_SCALER] - max_mach = aviary_options.get_val(Mission.Constraints.MAX_MACH) + max_mach = self.options[Mission.Constraints.MAX_MACH] gross_weight = inputs[Mission.Design.GROSS_MASS] * GRAV_ENGLISH_LBM flap_ratio = inputs[Aircraft.Wing.CONTROL_SURFACE_AREA_RATIO] wing_area = inputs[Aircraft.Wing.AREA] @@ -93,11 +89,6 @@ class AltSurfaceControlMass(om.ExplicitComponent): output mass instead of weight. ''' - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.Wing.SURFACE_CONTROL_MASS_SCALER, val=1.0) add_aviary_input(self, Aircraft.Wing.AREA, val=0.0) diff --git a/aviary/subsystems/mass/flops_based/thrust_reverser.py b/aviary/subsystems/mass/flops_based/thrust_reverser.py index 028c2969c..174ac959a 100644 --- a/aviary/subsystems/mass/flops_based/thrust_reverser.py +++ b/aviary/subsystems/mass/flops_based/thrust_reverser.py @@ -3,8 +3,7 @@ from aviary.constants import GRAV_ENGLISH_LBM from aviary.subsystems.mass.flops_based.distributed_prop import nacelle_count_factor -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -23,9 +22,7 @@ class ThrustReverserMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) def setup(self): num_engine_type = len(self.options['aviary_options'].get_val( @@ -43,8 +40,7 @@ def setup(self): def setup_partials(self): # derivatives w.r.t vectorized engine inputs have known sparsity pattern - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) shape = np.arange(num_engine_type) self.declare_partials(Aircraft.Engine.THRUST_REVERSERS_MASS, @@ -64,8 +60,7 @@ def setup_partials(self): val=1.0) def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] - num_eng = aviary_options.get_val(Aircraft.Engine.NUM_ENGINES) + num_eng = self.options[Aircraft.Engine.NUM_ENGINES] scaler = inputs[Aircraft.Engine.THRUST_REVERSERS_MASS_SCALER] max_thrust = inputs[Aircraft.Engine.SCALED_SLS_THRUST] nac_count = nacelle_count_factor(num_eng) @@ -76,8 +71,7 @@ def compute(self, inputs, outputs): thrust_reverser_mass) def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - num_eng = aviary_options.get_val(Aircraft.Engine.NUM_ENGINES) + num_eng = self.options[Aircraft.Engine.NUM_ENGINES] scaler = inputs[Aircraft.Engine.THRUST_REVERSERS_MASS_SCALER] max_thrust = inputs[Aircraft.Engine.SCALED_SLS_THRUST] nac_count = nacelle_count_factor(num_eng) diff --git a/aviary/subsystems/mass/flops_based/unusable_fuel.py b/aviary/subsystems/mass/flops_based/unusable_fuel.py index 6b994718a..8913549ee 100644 --- a/aviary/subsystems/mass/flops_based/unusable_fuel.py +++ b/aviary/subsystems/mass/flops_based/unusable_fuel.py @@ -3,8 +3,7 @@ from aviary.constants import GRAV_ENGLISH_LBM from aviary.subsystems.mass.flops_based.distributed_prop import ( distributed_engine_count_factor, distributed_thrust_factor) -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -21,9 +20,8 @@ class TransportUnusableFuelMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Fuel.NUM_TANKS) + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_ENGINES) def setup(self): add_aviary_input( @@ -55,12 +53,11 @@ def setup_partials(self): Aircraft.Fuel.TOTAL_CAPACITY, Aircraft.Fuel.DENSITY_RATIO]) def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): - aviary_options: AviaryValues = self.options['aviary_options'] - tank_count = aviary_options.get_val(Aircraft.Fuel.NUM_TANKS) + tank_count = self.options[Aircraft.Fuel.NUM_TANKS] scaler = inputs[Aircraft.Fuel.UNUSABLE_FUEL_MASS_SCALER] density_ratio = inputs[Aircraft.Fuel.DENSITY_RATIO] total_capacity = inputs[Aircraft.Fuel.TOTAL_CAPACITY] - num_eng = aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES) + num_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] num_eng_fact = distributed_engine_count_factor(num_eng) max_sls_thrust = inputs[Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST] thrust_factor = distributed_thrust_factor(max_sls_thrust, num_eng) @@ -74,12 +71,11 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): total_capacity**0.28) * density_ratio) * scaler / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - tank_count = aviary_options.get_val(Aircraft.Fuel.NUM_TANKS) + tank_count = self.options[Aircraft.Fuel.NUM_TANKS] scaler = inputs[Aircraft.Fuel.UNUSABLE_FUEL_MASS_SCALER] density_ratio = inputs[Aircraft.Fuel.DENSITY_RATIO] total_capacity = inputs[Aircraft.Fuel.TOTAL_CAPACITY] - num_eng = aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES) + num_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] num_eng_fact = distributed_engine_count_factor(num_eng) max_sls_thrust = inputs[Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST] thrust_factor = distributed_thrust_factor(max_sls_thrust, num_eng) @@ -120,11 +116,6 @@ class AltUnusableFuelMass(om.ExplicitComponent): to output mass instead of weight. ''' - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.Fuel.UNUSABLE_FUEL_MASS_SCALER, val=1.0) diff --git a/aviary/subsystems/mass/flops_based/vertical_tail.py b/aviary/subsystems/mass/flops_based/vertical_tail.py index 68df78b73..0f95fb3da 100644 --- a/aviary/subsystems/mass/flops_based/vertical_tail.py +++ b/aviary/subsystems/mass/flops_based/vertical_tail.py @@ -1,8 +1,7 @@ import openmdao.api as om from aviary.constants import GRAV_ENGLISH_LBM -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission @@ -13,9 +12,7 @@ class VerticalTailMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.VerticalTail.NUM_TAILS) def setup(self): add_aviary_input(self, Aircraft.VerticalTail.AREA, val=0.0) @@ -32,8 +29,7 @@ def setup_partials(self): self.declare_partials("*", "*") def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] - num_tails = aviary_options.get_val(Aircraft.VerticalTail.NUM_TAILS) + num_tails = self.options[Aircraft.VerticalTail.NUM_TAILS] area = inputs[Aircraft.VerticalTail.AREA] taper_ratio = inputs[Aircraft.VerticalTail.TAPER_RATIO] @@ -45,8 +41,7 @@ def compute(self, inputs, outputs): num_tails ** 0.7 / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - num_tails = aviary_options.get_val(Aircraft.VerticalTail.NUM_TAILS) + num_tails = self.options[Aircraft.VerticalTail.NUM_TAILS] area = inputs[Aircraft.VerticalTail.AREA] gross_weight = inputs[Mission.Design.GROSS_MASS] * GRAV_ENGLISH_LBM @@ -81,11 +76,6 @@ class AltVerticalTailMass(om.ExplicitComponent): output mass instead of weight. ''' - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.VerticalTail.AREA, val=0.0) diff --git a/aviary/subsystems/mass/flops_based/wing_common.py b/aviary/subsystems/mass/flops_based/wing_common.py index 2d8be698f..507557222 100644 --- a/aviary/subsystems/mass/flops_based/wing_common.py +++ b/aviary/subsystems/mass/flops_based/wing_common.py @@ -2,8 +2,7 @@ import openmdao.api as om from aviary.constants import GRAV_ENGLISH_LBM -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission @@ -14,9 +13,7 @@ class WingBendingMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Fuselage.NUM_FUSELAGES) def setup(self): add_aviary_input(self, Mission.Design.GROSS_MASS, val=0.0) @@ -56,8 +53,7 @@ def compute(self, inputs, outputs): CAYE = inputs[Aircraft.Wing.ENG_POD_INERTIA_FACTOR] scaler = inputs[Aircraft.Wing.BENDING_MASS_SCALER] - num_fuse = self.options['aviary_options'].get_val( - Aircraft.Fuselage.NUM_FUSELAGES) + num_fuse = self.options[Aircraft.Fuselage.NUM_FUSELAGES] # Note: Calculation requires weights prior to being scaled, so we need to divide # by the scale factor. @@ -93,8 +89,7 @@ def compute_partials(self, inputs, J): W3scale = inputs[Aircraft.Wing.MISC_MASS_SCALER] scaler = inputs[Aircraft.Wing.BENDING_MASS_SCALER] - num_fuse = self.options['aviary_options'].get_val( - Aircraft.Fuselage.NUM_FUSELAGES) + num_fuse = self.options[Aircraft.Fuselage.NUM_FUSELAGES] deg2rad = np.pi / 180. term = 0.96 / np.cos(deg2rad * sweep) @@ -189,10 +184,6 @@ class WingShearControlMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - self.options.declare( 'aircraft_type', default='Transport', @@ -270,10 +261,6 @@ class WingMiscMass(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - self.options.declare( 'aircraft_type', default='Transport', @@ -327,11 +314,6 @@ def compute_partials(self, inputs, J): class WingTotalMass(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.Wing.BENDING_MASS, val=0.0) diff --git a/aviary/subsystems/mass/flops_based/wing_detailed.py b/aviary/subsystems/mass/flops_based/wing_detailed.py index 81ddc32fd..fe1b4567f 100644 --- a/aviary/subsystems/mass/flops_based/wing_detailed.py +++ b/aviary/subsystems/mass/flops_based/wing_detailed.py @@ -4,24 +4,23 @@ from openmdao.components.interp_util.interp import InterpND from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission class DetailedWingBendingFact(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES) + add_aviary_option(self, Aircraft.Wing.INPUT_STATION_DIST) + add_aviary_option(self, Aircraft.Wing.LOAD_DISTRIBUTION_CONTROL) def setup(self): - aviary_options: AviaryValues = self.options['aviary_options'] - input_station_dist = aviary_options.get_val(Aircraft.Wing.INPUT_STATION_DIST) + input_station_dist = self.options[Aircraft.Wing.INPUT_STATION_DIST] num_input_stations = len(input_station_dist) - total_num_wing_engines = aviary_options.get_val( - Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES) - num_engine_type = len(aviary_options.get_val(Aircraft.Engine.NUM_ENGINES)) + total_num_wing_engines = self.options[Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES] + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) # wing locations are different for each engine type - ragged array! # this "tricks" numpy into allowing a ragged array, with limitations (each index @@ -66,12 +65,10 @@ def setup_partials(self): self.declare_partials("*", "*", method='cs') def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] - input_station_dist = aviary_options.get_val(Aircraft.Wing.INPUT_STATION_DIST) + input_station_dist = self.options[Aircraft.Wing.INPUT_STATION_DIST] inp_stations = np.array(input_station_dist) - num_integration_stations = \ - aviary_options.get_val(Aircraft.Wing.NUM_INTEGRATION_STATIONS) - num_wing_engines = aviary_options.get_val(Aircraft.Engine.NUM_WING_ENGINES) + num_integration_stations = self.options[Aircraft.Wing.NUM_INTEGRATION_STATIONS] + num_wing_engines = self.options[Aircraft.Engine.NUM_WING_ENGINES] num_engine_type = len(num_wing_engines) # TODO: Support all options for this parameter. @@ -81,8 +78,7 @@ def compute(self, inputs, outputs): # 3.0 : rectangular distribution # 1.0-2.0 : blend of triangular and elliptical # 2.0-3.0 : blend of elliptical and rectangular - load_distribution_factor = \ - aviary_options.get_val(Aircraft.Wing.LOAD_DISTRIBUTION_CONTROL) + load_distribution_factor = self.options[Aircraft.Wing.LOAD_DISTRIBUTION_CONTROL] load_path_sweep = inputs[Aircraft.Wing.LOAD_PATH_SWEEP_DIST] thickness_to_chord = inputs[Aircraft.Wing.THICKNESS_TO_CHORD_DIST] diff --git a/aviary/subsystems/mass/flops_based/wing_group.py b/aviary/subsystems/mass/flops_based/wing_group.py index 2a2d8df75..73b9e483f 100644 --- a/aviary/subsystems/mass/flops_based/wing_group.py +++ b/aviary/subsystems/mass/flops_based/wing_group.py @@ -6,45 +6,42 @@ WingBendingMass, WingMiscMass, WingShearControlMass, WingTotalMass) from aviary.subsystems.mass.flops_based.wing_detailed import DetailedWingBendingFact from aviary.subsystems.mass.flops_based.wing_simple import SimpleWingBendingFact -from aviary.utils.aviary_values import AviaryValues +from aviary.variable_info.functions import add_aviary_option from aviary.variable_info.variables import Aircraft class WingMassGroup(om.Group): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Wing.INPUT_STATION_DIST) def setup(self): - aviary_options: AviaryValues = self.options['aviary_options'] self.add_subsystem('engine_pod_mass', - EnginePodMass(aviary_options=aviary_options), + EnginePodMass(), promotes_inputs=['*'], promotes_outputs=['*']) - if Aircraft.Wing.INPUT_STATION_DIST in aviary_options: + if self.options[Aircraft.Wing.INPUT_STATION_DIST] is not None: self.add_subsystem('wing_bending_factor', - DetailedWingBendingFact(aviary_options=aviary_options), + DetailedWingBendingFact(), promotes_inputs=['*'], promotes_outputs=['*']) else: self.add_subsystem('wing_bending_factor', - SimpleWingBendingFact(aviary_options=aviary_options), + SimpleWingBendingFact(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem('wing_misc', - WingMiscMass(aviary_options=aviary_options), + WingMiscMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem('wing_shear_control', - WingShearControlMass(aviary_options=aviary_options), + WingShearControlMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem('wing_bending', - WingBendingMass(aviary_options=aviary_options), + WingBendingMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem('wing_total', - WingTotalMass(aviary_options=aviary_options), + WingTotalMass(), promotes_inputs=['*'], promotes_outputs=['*']) diff --git a/aviary/subsystems/mass/flops_based/wing_simple.py b/aviary/subsystems/mass/flops_based/wing_simple.py index 9d101af64..e97095965 100644 --- a/aviary/subsystems/mass/flops_based/wing_simple.py +++ b/aviary/subsystems/mass/flops_based/wing_simple.py @@ -1,17 +1,14 @@ import numpy as np import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft class SimpleWingBendingFact(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES) def setup(self): add_aviary_input(self, Aircraft.Wing.AREA, val=0.0) @@ -46,8 +43,7 @@ def setup_partials(self): Aircraft.Wing.SWEEP]) def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] - num_wing_eng = aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES) + num_wing_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES] fstrt = inputs[Aircraft.Wing.STRUT_BRACING_FACTOR] span = inputs[Aircraft.Wing.SPAN] tr = inputs[Aircraft.Wing.TAPER_RATIO] @@ -79,8 +75,7 @@ def compute(self, inputs, outputs): outputs[Aircraft.Wing.ENG_POD_INERTIA_FACTOR] = 1.0 - 0.03 * num_wing_eng def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - num_wing_eng = aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES) + num_wing_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES] fstrt = inputs[Aircraft.Wing.STRUT_BRACING_FACTOR] span = inputs[Aircraft.Wing.SPAN] tr = inputs[Aircraft.Wing.TAPER_RATIO] diff --git a/aviary/validation_cases/validation_tests.py b/aviary/validation_cases/validation_tests.py index a873ce35a..b12448c69 100644 --- a/aviary/validation_cases/validation_tests.py +++ b/aviary/validation_cases/validation_tests.py @@ -272,6 +272,9 @@ def get_flops_data(case_name: str, keys: str = None, preprocess: bool = False) - keys : str, or iter of str List of variables whose values will be transferred from the validation data. The default is all variables. + preprocess: bool + If true, the input data will be passed through preprocess_options() to + fill in any missing options before being returned. The default is False. """ flops_data_copy: AviaryValues = get_flops_inputs(case_name, preprocess=preprocess) flops_data_copy.update(get_flops_outputs(case_name)) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 9caab4d27..6d8f775be 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1979,9 +1979,9 @@ units='unitless', desc='total number of engines per model on the aircraft ' '(fuselage, wing, or otherwise)', - types=(int, list, np.ndarray), + types=(list, np.ndarray, int), option=True, - default_value=2 + default_value=np.array([2]) ) add_meta_data( From 2c49c771af39630add107f36a4c8e32a611fdff0 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Mon, 23 Sep 2024 12:39:07 -0400 Subject: [PATCH 04/58] Checkpoint. Fixed some tests. Need to move engine scaler out of options on a separate story. --- aviary/subsystems/mass/flops_based/cargo.py | 11 +++--- aviary/subsystems/mass/flops_based/engine.py | 12 +++--- .../flops_based/test/test_air_conditioning.py | 10 +++-- .../mass/flops_based/test/test_anti_icing.py | 25 +++++++----- .../mass/flops_based/test/test_apu.py | 6 ++- .../mass/flops_based/test/test_avionics.py | 7 ++-- .../mass/flops_based/test/test_cargo.py | 12 ++++-- .../flops_based/test/test_cargo_containers.py | 7 ++-- .../mass/flops_based/test/test_crew.py | 11 ++++-- .../mass/flops_based/test/test_electrical.py | 11 ++++-- .../flops_based/test/test_empty_margin.py | 6 ++- .../mass/flops_based/test/test_engine.py | 9 +++-- aviary/validation_cases/validation_tests.py | 36 +++++++++++++++++ aviary/variable_info/functions.py | 39 +++++++++++++++++-- aviary/variable_info/variable_meta_data.py | 4 +- 15 files changed, 151 insertions(+), 55 deletions(-) diff --git a/aviary/subsystems/mass/flops_based/cargo.py b/aviary/subsystems/mass/flops_based/cargo.py index a8c9acef8..80cdb7a92 100644 --- a/aviary/subsystems/mass/flops_based/cargo.py +++ b/aviary/subsystems/mass/flops_based/cargo.py @@ -16,6 +16,9 @@ class CargoMass(om.ExplicitComponent): ''' def initialize(self): + add_aviary_option(self, Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER, + units='lbm') + add_aviary_option(self, Aircraft.CrewPayload.MASS_PER_PASSENGER, units='lbm') add_aviary_option(self, Aircraft.CrewPayload.NUM_PASSENGERS) def setup(self): @@ -52,12 +55,8 @@ def compute( self, inputs, outputs, discrete_inputs=None, discrete_outputs=None ): passenger_count = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] - - mass_per_passenger = aviary_options.get_val( - Aircraft.CrewPayload.MASS_PER_PASSENGER, units='lbm') - - baggage_mass_per_passenger = aviary_options.get_val( - Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER, 'lbm') + mass_per_passenger, _ = self.options[Aircraft.CrewPayload.MASS_PER_PASSENGER] + baggage_mass_per_passenger, _ = self.options[Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER] outputs[Aircraft.CrewPayload.PASSENGER_MASS] = \ mass_per_passenger * passenger_count diff --git a/aviary/subsystems/mass/flops_based/engine.py b/aviary/subsystems/mass/flops_based/engine.py index a60e0b988..8fda06dca 100644 --- a/aviary/subsystems/mass/flops_based/engine.py +++ b/aviary/subsystems/mass/flops_based/engine.py @@ -16,6 +16,7 @@ class EngineMass(om.ExplicitComponent): def initialize(self): add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) + add_aviary_option(self, Aircraft.Engine.SCALE_MASS) def setup(self): num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) @@ -23,16 +24,18 @@ def setup(self): add_aviary_input(self, Aircraft.Engine.SCALED_SLS_THRUST, val=np.zeros(num_engine_type)) + #add_aviary_input(self, Aircraft.Engine.MASS_SCALER, + # val=np.zeros(num_engine_type)) + add_aviary_output(self, Aircraft.Engine.MASS, val=np.zeros(num_engine_type)) add_aviary_output(self, Aircraft.Engine.ADDITIONAL_MASS, val=np.zeros(num_engine_type)) add_aviary_output(self, Aircraft.Propulsion.TOTAL_ENGINE_MASS, val=0.0) def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] - + options = self.options # cast to numpy arrays to ensure values are always correct type - num_engines = np.array(aviary_options.get_val(Aircraft.Engine.NUM_ENGINES)) + num_engines = options[Aircraft.Engine.NUM_ENGINES] scaling_parameter = np.array(aviary_options.get_val(Aircraft.Engine.MASS_SCALER)) scale_mass = np.array(aviary_options.get_val(Aircraft.Engine.SCALE_MASS)) addtl_mass_fraction = np.array(aviary_options.get_val( @@ -69,8 +72,7 @@ def compute(self, inputs, outputs): outputs[Aircraft.Engine.ADDITIONAL_MASS] = addtl_mass def setup_partials(self): - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) shape = np.arange(num_engine_type) self.declare_partials(Aircraft.Engine.MASS, diff --git a/aviary/subsystems/mass/flops_based/test/test_air_conditioning.py b/aviary/subsystems/mass/flops_based/test/test_air_conditioning.py index 68a939f24..4eb9be226 100644 --- a/aviary/subsystems/mass/flops_based/test/test_air_conditioning.py +++ b/aviary/subsystems/mass/flops_based/test/test_air_conditioning.py @@ -10,7 +10,7 @@ from aviary.validation_cases.validation_tests import (Version, flops_validation_test, get_flops_case_names, - get_flops_inputs, + get_flops_options, print_case) from aviary.variable_info.variables import Aircraft, Mission @@ -28,11 +28,13 @@ def test_case(self, case_name): prob.model.add_subsystem( "air_cond", - TransportAirCondMass(aviary_options=get_flops_inputs(case_name)), + TransportAirCondMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + prob.model_options['*'] = get_flops_options(case_name) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( @@ -68,11 +70,13 @@ def test_case(self, case_name): prob.model.add_subsystem( 'air_cond', - AltAirCondMass(aviary_options=get_flops_inputs(case_name)), + AltAirCondMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + prob.model_options['*'] = get_flops_options(case_name) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( diff --git a/aviary/subsystems/mass/flops_based/test/test_anti_icing.py b/aviary/subsystems/mass/flops_based/test/test_anti_icing.py index 8f37f3985..0e12b5141 100644 --- a/aviary/subsystems/mass/flops_based/test/test_anti_icing.py +++ b/aviary/subsystems/mass/flops_based/test/test_anti_icing.py @@ -11,6 +11,7 @@ from aviary.validation_cases.validation_tests import (flops_validation_test, get_flops_case_names, get_flops_inputs, + get_flops_options, print_case) from aviary.variable_info.variables import Aircraft @@ -28,11 +29,13 @@ def test_case(self, case_name): prob.model.add_subsystem( "anti_icing", - AntiIcingMass(aviary_options=get_flops_inputs(case_name, preprocess=True)), + AntiIcingMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( @@ -50,17 +53,19 @@ def test_case_2(self): # test with more than four engines prob = self.prob - aviary_options = get_flops_inputs('LargeSingleAisle1FLOPS') - aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([5])) - aviary_options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 5) + options = get_flops_options('LargeSingleAisle1FLOPS') + options[Aircraft.Engine.NUM_ENGINES] = np.array([5]) + options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] = 5 prob.model.add_subsystem( "anti_icing", - AntiIcingMass(aviary_options=aviary_options), + AntiIcingMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + prob.model_options['*'] = options + prob.setup(check=False, force_alloc_complex=True) prob.set_val(Aircraft.AntiIcing.MASS_SCALER, 1.0) @@ -83,17 +88,19 @@ def test_case_3(self): # test with multiple engine types prob = self.prob - aviary_options = get_flops_inputs('LargeSingleAisle1FLOPS') - aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([2, 2, 4])) - aviary_options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 8) + options = get_flops_options('LargeSingleAisle1FLOPS') + options[Aircraft.Engine.NUM_ENGINES] = np.array([2, 2, 4]) + options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] = 8 prob.model.add_subsystem( "anti_icing", - AntiIcingMass(aviary_options=aviary_options), + AntiIcingMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + prob.model_options['*'] = options + prob.setup(check=False, force_alloc_complex=True) prob.set_val(Aircraft.AntiIcing.MASS_SCALER, 1.0) diff --git a/aviary/subsystems/mass/flops_based/test/test_apu.py b/aviary/subsystems/mass/flops_based/test/test_apu.py index 17af12a24..307033a84 100644 --- a/aviary/subsystems/mass/flops_based/test/test_apu.py +++ b/aviary/subsystems/mass/flops_based/test/test_apu.py @@ -7,7 +7,7 @@ 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, + get_flops_options, print_case) from aviary.variable_info.variables import Aircraft @@ -25,11 +25,13 @@ def test_case(self, case_name): prob.model.add_subsystem( "apu", - TransportAPUMass(aviary_options=get_flops_inputs(case_name)), + TransportAPUMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( diff --git a/aviary/subsystems/mass/flops_based/test/test_avionics.py b/aviary/subsystems/mass/flops_based/test/test_avionics.py index ad1ec539e..6559c5072 100644 --- a/aviary/subsystems/mass/flops_based/test/test_avionics.py +++ b/aviary/subsystems/mass/flops_based/test/test_avionics.py @@ -8,7 +8,7 @@ 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, + get_flops_options, print_case) from aviary.variable_info.variables import Aircraft, Mission @@ -29,12 +29,13 @@ def test_case(self, case_name): prob.model.add_subsystem( "avionics", - TransportAvionicsMass(aviary_options=get_flops_inputs( - case_name, preprocess=True)), + TransportAvionicsMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( diff --git a/aviary/subsystems/mass/flops_based/test/test_cargo.py b/aviary/subsystems/mass/flops_based/test/test_cargo.py index 7d388fc1c..c7e9c289c 100644 --- a/aviary/subsystems/mass/flops_based/test/test_cargo.py +++ b/aviary/subsystems/mass/flops_based/test/test_cargo.py @@ -6,14 +6,12 @@ from aviary.subsystems.mass.flops_based.cargo import CargoMass from aviary.utils.aviary_values import AviaryValues from aviary.utils.test_utils.variable_test import assert_match_varnames -from aviary.validation_cases.validation_tests import do_validation_test, print_case +from aviary.validation_cases.validation_tests import do_validation_test, print_case, get_flops_options from aviary.variable_info.variables import Aircraft cargo_test_data = {} cargo_test_data['1'] = AviaryValues({ - Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER: (50, 'lbm'), Aircraft.CrewPayload.MISC_CARGO: (2000., 'lbm'), # custom - Aircraft.CrewPayload.MASS_PER_PASSENGER: (180., 'lbm'), Aircraft.CrewPayload.WING_CARGO: (1000., 'lbm'), # custom Aircraft.CrewPayload.BAGGAGE_MASS: (9200., 'lbm'), # custom Aircraft.CrewPayload.NUM_PASSENGERS: (184, 'unitless'), # custom @@ -38,11 +36,17 @@ def test_case(self, case_name): prob.model.add_subsystem( 'cargo_passenger', - CargoMass(aviary_options=validation_data), + CargoMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + prob.model_options['*'] = { + Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER: (50, 'lbm'), + Aircraft.CrewPayload.MASS_PER_PASSENGER: (180., 'lbm'), + Aircraft.CrewPayload.NUM_PASSENGERS: 184, # custom + } + prob.setup(check=False, force_alloc_complex=True) do_validation_test(prob, diff --git a/aviary/subsystems/mass/flops_based/test/test_cargo_containers.py b/aviary/subsystems/mass/flops_based/test/test_cargo_containers.py index a14950f29..d08ef99ec 100644 --- a/aviary/subsystems/mass/flops_based/test/test_cargo_containers.py +++ b/aviary/subsystems/mass/flops_based/test/test_cargo_containers.py @@ -8,7 +8,7 @@ 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, + get_flops_options, print_case) from aviary.variable_info.variables import Aircraft @@ -26,12 +26,13 @@ def test_case(self, case_name): prob.model.add_subsystem( "cargo_containers", - TransportCargoContainersMass( - aviary_options=get_flops_inputs(case_name)), + TransportCargoContainersMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( diff --git a/aviary/subsystems/mass/flops_based/test/test_crew.py b/aviary/subsystems/mass/flops_based/test/test_crew.py index bcd0dc2ce..e4800e0a7 100644 --- a/aviary/subsystems/mass/flops_based/test/test_crew.py +++ b/aviary/subsystems/mass/flops_based/test/test_crew.py @@ -7,7 +7,7 @@ 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, + get_flops_options, print_case) from aviary.variable_info.variables import Aircraft @@ -25,12 +25,13 @@ def test_case(self, case_name): prob.model.add_subsystem( "non_flight_crew", - NonFlightCrewMass(aviary_options=get_flops_inputs( - case_name, preprocess=True)), + NonFlightCrewMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( @@ -57,11 +58,13 @@ def test_case(self, case_name): prob.model.add_subsystem( "flight_crew", - FlightCrewMass(aviary_options=get_flops_inputs(case_name, preprocess=True)), + FlightCrewMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( diff --git a/aviary/subsystems/mass/flops_based/test/test_electrical.py b/aviary/subsystems/mass/flops_based/test/test_electrical.py index 6247ed187..b40e7a8f4 100644 --- a/aviary/subsystems/mass/flops_based/test/test_electrical.py +++ b/aviary/subsystems/mass/flops_based/test/test_electrical.py @@ -9,7 +9,7 @@ from aviary.validation_cases.validation_tests import (Version, flops_validation_test, get_flops_case_names, - get_flops_inputs, + get_flops_options, print_case) from aviary.variable_info.variables import Aircraft @@ -27,7 +27,7 @@ def test_case(self, case_name): prob.model.add_subsystem( "electric_test", - ElectricalMass(aviary_options=get_flops_inputs(case_name, preprocess=True)), + ElectricalMass(), promotes_outputs=[ Aircraft.Electrical.MASS, ], @@ -38,6 +38,8 @@ def test_case(self, case_name): ] ) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( @@ -66,8 +68,7 @@ def test_case(self, case_name): prob.model.add_subsystem( "electric_test", - AltElectricalMass(aviary_options=get_flops_inputs( - case_name, preprocess=True)), + AltElectricalMass(), promotes_outputs=[ Aircraft.Electrical.MASS, ], @@ -76,6 +77,8 @@ def test_case(self, case_name): ] ) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( diff --git a/aviary/subsystems/mass/flops_based/test/test_empty_margin.py b/aviary/subsystems/mass/flops_based/test/test_empty_margin.py index 29b45f3fb..20ca3cad3 100644 --- a/aviary/subsystems/mass/flops_based/test/test_empty_margin.py +++ b/aviary/subsystems/mass/flops_based/test/test_empty_margin.py @@ -7,7 +7,7 @@ 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, + get_flops_options, print_case) from aviary.variable_info.variables import Aircraft @@ -25,11 +25,13 @@ def test_case(self, case_name): prob.model.add_subsystem( "margin", - EmptyMassMargin(aviary_options=get_flops_inputs(case_name)), + EmptyMassMargin(), promotes_inputs=['*'], promotes_outputs=['*'], ) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( diff --git a/aviary/subsystems/mass/flops_based/test/test_engine.py b/aviary/subsystems/mass/flops_based/test/test_engine.py index 74cf0bdf2..c2269d5f0 100644 --- a/aviary/subsystems/mass/flops_based/test/test_engine.py +++ b/aviary/subsystems/mass/flops_based/test/test_engine.py @@ -13,7 +13,7 @@ from aviary.utils.functions import get_path from aviary.validation_cases.validation_tests import (flops_validation_test, get_flops_case_names, - get_flops_inputs, + get_flops_options, print_case) from aviary.variable_info.variables import Aircraft, Settings @@ -31,11 +31,13 @@ def test_case(self, case_name): prob.model.add_subsystem( "engine_mass", - EngineMass(aviary_options=get_flops_inputs(case_name, preprocess=True)), + EngineMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( @@ -81,8 +83,7 @@ def test_case_2(self): engine3 = EngineDeck(name='engine3', options=options) preprocess_propulsion(options, [engine, engine2, engine3]) - prob.model.add_subsystem('engine_mass', EngineMass( - aviary_options=options), promotes=['*']) + prob.model.add_subsystem('engine_mass', EngineMass(), promotes=['*']) prob.setup(force_alloc_complex=True) prob.set_val(Aircraft.Engine.SCALED_SLS_THRUST, np.array([28000] * 3), units='lbf') diff --git a/aviary/validation_cases/validation_tests.py b/aviary/validation_cases/validation_tests.py index b12448c69..4f30fa787 100644 --- a/aviary/validation_cases/validation_tests.py +++ b/aviary/validation_cases/validation_tests.py @@ -12,7 +12,9 @@ from aviary.utils.preprocessors import preprocess_options from aviary.validation_cases.validation_data.flops_data.FLOPS_Test_Data import \ FLOPS_Test_Data, FLOPS_Lacking_Test_Data +from aviary.variable_info.functions import extract_options from aviary.variable_info.variables import Aircraft +from aviary.variable_info.variable_meta_data import _MetaData Version = Enum('Version', ['ALL', 'TRANSPORT', 'ALTERNATE', 'BWB']) @@ -317,6 +319,40 @@ def get_flops_inputs(case_name: str, keys: str = None, preprocess: bool = False) return AviaryValues({key: flops_inputs_copy.get_item(key) for key in keys_list}) +def get_flops_options(case_name: str, keys: str = None, preprocess: bool = False) -> AviaryValues: + """ + Returns a dictionary containing options for the named FLOPS validation case. + + Parameters + ---------- + case_name : str + Name of the case being run. Input data will be looked up from + the corresponding case in the FLOPS validation data collection. + keys : str, or iter of str + List of variables whose values will be transferred from the input data. + The default is all variables. + preprocess: bool + If true, the input data will be passed through preprocess_options() to + fill in any missing options before being returned. The default is False. + """ + try: + flops_data: dict = FLOPS_Test_Data[case_name] + except KeyError: + flops_data: dict = FLOPS_Lacking_Test_Data[case_name] + + flops_inputs_copy: AviaryValues = flops_data['inputs'].deepcopy() + if preprocess: + preprocess_options(flops_inputs_copy, + engine_models=build_engine_deck(flops_inputs_copy)) + + if keys is None: + options = extract_options(flops_inputs_copy, _MetaData) + else: + options = extract_options(keys, _MetaData) + + return options + + def get_flops_outputs(case_name: str, keys: str = None) -> AviaryValues: """ Returns an AviaryValues object containing output data for the named FLOPS validation case. diff --git a/aviary/variable_info/functions.py b/aviary/variable_info/functions.py index b3ba95d62..b00032bef 100644 --- a/aviary/variable_info/functions.py +++ b/aviary/variable_info/functions.py @@ -1,7 +1,8 @@ -import dymos as dm import openmdao.api as om -from dymos.utils.misc import _unspecified from openmdao.core.component import Component +from openmdao.utils.units import convert_units +import dymos as dm +from dymos.utils.misc import _unspecified from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.variable_meta_data import _MetaData @@ -102,7 +103,30 @@ def add_aviary_output(comp, varname, val, units=None, desc=None, shape_by_conn=F desc=output_desc, shape_by_conn=shape_by_conn) -def add_aviary_option(comp, name, val=_unspecified, desc=None, meta_data=_MetaData): +def units_setter(opt_meta, value): + """ + Check and convert new units tuple into + + Parameters + ---------- + opt_meta : dict + Dictionary of entries for the option. + value : any + New value for the option. + + Returns + ------- + any + Post processed value to set into the option. + """ + new_val, new_units = value + old_val, units = opt_meta['val'] + + converted_val = convert_units(new_val, new_units, units) + return (converted_val, units) + + +def add_aviary_option(comp, name, val=_unspecified, units=None, desc=None, meta_data=_MetaData): """ Adds an option to an Aviary component. Default values from the metadata are used unless a new value is specified. @@ -118,6 +142,8 @@ def add_aviary_option(comp, name, val=_unspecified, desc=None, meta_data=_MetaDa is used. desc: str (Optional) description text for the variable. + units: str + (Optional) OpenMDAO units string. This can be specified for variables with units. meta_data: dict (Optional) Aviary metadata dictionary. If unspecified, the built-in metadata will be used. @@ -127,7 +153,12 @@ def add_aviary_option(comp, name, val=_unspecified, desc=None, meta_data=_MetaDa desc = meta['desc'] if val is _unspecified: val = meta['default_value'] - comp.options.declare(name, default=val, types=meta['types'], desc=desc) + + if units not in [None, 'unitless']: + comp.options.declare(name, default=(val, units), types=meta['types'], desc=desc, + set_function=units_setter) + else: + comp.options.declare(name, default=val, types=meta['types'], desc=desc) def override_aviary_vars(group, aviary_inputs: AviaryValues, diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 6d8f775be..6c4f487e4 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -642,7 +642,7 @@ units='lbm', desc='baggage mass per passenger', option=True, - default_value=None, + default_value=50., ) add_meta_data( @@ -2226,7 +2226,7 @@ }, desc='Toggle for enabling scaling of engine mass', option=True, - types=bool, + types=(bool, list), default_value=True, ) From 5515ec1048b02375e627d4f9a5148176a099ba97 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Mon, 23 Sep 2024 17:30:10 -0400 Subject: [PATCH 05/58] Fixed some more tests. --- aviary/subsystems/mass/flops_based/starter.py | 5 +++-- .../flops_based/test/test_mass_summation.py | 8 ++++++- .../mass/flops_based/test/test_misc_engine.py | 18 ++++++++++++--- .../mass/flops_based/test/test_nacelle.py | 18 ++++++++++++--- .../mass/flops_based/test/test_paint.py | 3 +-- .../test/test_passenger_service.py | 10 ++++++--- .../mass/flops_based/test/test_starter.py | 22 +++++++++++++------ .../flops_based/test/test_surface_controls.py | 10 ++++++--- .../flops_based/test/test_thrust_reverser.py | 17 ++++++++++---- .../flops_based/test/test_unusable_fuel.py | 9 ++++---- .../mass/flops_based/thrust_reverser.py | 3 +-- 11 files changed, 89 insertions(+), 34 deletions(-) diff --git a/aviary/subsystems/mass/flops_based/starter.py b/aviary/subsystems/mass/flops_based/starter.py index 5951ece7d..2bf04fb07 100644 --- a/aviary/subsystems/mass/flops_based/starter.py +++ b/aviary/subsystems/mass/flops_based/starter.py @@ -19,6 +19,7 @@ class TransportStarterMass(om.ExplicitComponent): def initialize(self): add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_ENGINES) + add_aviary_option(self, Mission.Constraints.MAX_MACH) def setup(self): num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) @@ -34,9 +35,9 @@ def setup_partials(self): def compute(self, inputs, outputs): total_engines = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] num_engines = self.options[Aircraft.Engine.NUM_ENGINES] + max_mach = self.options[Mission.Constraints.MAX_MACH] d_nacelle = inputs[Aircraft.Nacelle.AVG_DIAMETER] - max_mach = aviary_options.get_val(Mission.Constraints.MAX_MACH) num_engines_factor = distributed_engine_count_factor(total_engines) f_nacelle = distributed_nacelle_diam_factor(d_nacelle, num_engines) @@ -46,10 +47,10 @@ def compute(self, inputs, outputs): def compute_partials(self, inputs, J): total_engines = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] num_engines = self.options[Aircraft.Engine.NUM_ENGINES] + max_mach = self.options[Mission.Constraints.MAX_MACH] d_nacelle = inputs[Aircraft.Nacelle.AVG_DIAMETER] eng_count_factor = distributed_engine_count_factor(total_engines) - max_mach = aviary_options.get_val(Mission.Constraints.MAX_MACH) d_avg = sum(d_nacelle * num_engines) / total_engines diff --git a/aviary/subsystems/mass/flops_based/test/test_mass_summation.py b/aviary/subsystems/mass/flops_based/test/test_mass_summation.py index 0dd9a3fec..4d85dfa7e 100644 --- a/aviary/subsystems/mass/flops_based/test/test_mass_summation.py +++ b/aviary/subsystems/mass/flops_based/test/test_mass_summation.py @@ -99,9 +99,15 @@ def test_case(self, case_name): prob = self.prob + inputs = get_flops_inputs(case_name, preprocess=True) + + options = { + Aircraft.Design.USE_ALT_MASS: inputs.get_val(Aircraft.Design.USE_ALT_MASS), + } + prob.model.add_subsystem( "tot", - MassSummation(), + MassSummation(**options), promotes_inputs=['*'], promotes_outputs=['*'], ) diff --git a/aviary/subsystems/mass/flops_based/test/test_misc_engine.py b/aviary/subsystems/mass/flops_based/test/test_misc_engine.py index dc90b0b99..65f582752 100644 --- a/aviary/subsystems/mass/flops_based/test/test_misc_engine.py +++ b/aviary/subsystems/mass/flops_based/test/test_misc_engine.py @@ -28,9 +28,15 @@ def test_case(self, case_name): prob = self.prob + inputs = get_flops_inputs(case_name, preprocess=True) + + options = { + Aircraft.Engine.NUM_ENGINES: inputs.get_val(Aircraft.Engine.NUM_ENGINES), + } + prob.model.add_subsystem( "misc_mass", - EngineMiscMass(aviary_options=get_flops_inputs(case_name, preprocess=True)), + EngineMiscMass(**options), promotes_inputs=['*'], promotes_outputs=['*'] ) @@ -65,9 +71,15 @@ def test_case_multiengine(self): preprocess_propulsion(options, [engineModel1, engineModel2, engineModel3]) - prob.model.add_subsystem('misc_engine_mass', EngineMiscMass( - aviary_options=options), promotes=['*']) + comp_options = { + Aircraft.Engine.NUM_ENGINES: options.get_val(Aircraft.Engine.NUM_ENGINES), + } + + prob.model.add_subsystem('misc_engine_mass', EngineMiscMass(**comp_options), + promotes=['*']) + prob.setup(force_alloc_complex=True) + prob.set_val(Aircraft.Engine.ADDITIONAL_MASS, np.array([100, 26, 30]), units='lbm') prob.set_val(Aircraft.Propulsion.MISC_MASS_SCALER, 1.02, units='unitless') diff --git a/aviary/subsystems/mass/flops_based/test/test_nacelle.py b/aviary/subsystems/mass/flops_based/test/test_nacelle.py index 3a0de4379..8bae01ee1 100644 --- a/aviary/subsystems/mass/flops_based/test/test_nacelle.py +++ b/aviary/subsystems/mass/flops_based/test/test_nacelle.py @@ -28,9 +28,15 @@ def test_case(self, case_name): prob = self.prob + inputs = get_flops_inputs(case_name, preprocess=True) + + options = { + Aircraft.Engine.NUM_ENGINES: inputs.get_val(Aircraft.Engine.NUM_ENGINES), + } + prob.model.add_subsystem( "nacelle", - NacelleMass(aviary_options=get_flops_inputs(case_name, preprocess=True)), + NacelleMass(**options), promotes_inputs=['*'], promotes_outputs=['*'], ) @@ -66,9 +72,15 @@ def test_case_multiengine(self): preprocess_propulsion(options, [engineModel1, engineModel2, engineModel3]) - prob.model.add_subsystem('nacelle_mass', NacelleMass( - aviary_options=options), promotes=['*']) + comp_options = { + Aircraft.Engine.NUM_ENGINES: options.get_val(Aircraft.Engine.NUM_ENGINES), + } + + prob.model.add_subsystem('nacelle_mass', NacelleMass(**comp_options), + promotes=['*']) + prob.setup(force_alloc_complex=True) + prob.set_val(Aircraft.Nacelle.AVG_DIAMETER, np.array([5.0, 3.0, 8.0]), units='ft') prob.set_val(Aircraft.Nacelle.AVG_LENGTH, diff --git a/aviary/subsystems/mass/flops_based/test/test_paint.py b/aviary/subsystems/mass/flops_based/test/test_paint.py index bb434b136..046c4e33e 100644 --- a/aviary/subsystems/mass/flops_based/test/test_paint.py +++ b/aviary/subsystems/mass/flops_based/test/test_paint.py @@ -7,7 +7,6 @@ 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) from aviary.variable_info.variables import Aircraft @@ -24,7 +23,7 @@ def test_case(self, case_name): prob.model.add_subsystem( "paint", - PaintMass(aviary_options=get_flops_inputs(case_name)), + PaintMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) diff --git a/aviary/subsystems/mass/flops_based/test/test_passenger_service.py b/aviary/subsystems/mass/flops_based/test/test_passenger_service.py index ef312fee1..a8e3a72ac 100644 --- a/aviary/subsystems/mass/flops_based/test/test_passenger_service.py +++ b/aviary/subsystems/mass/flops_based/test/test_passenger_service.py @@ -9,7 +9,7 @@ from aviary.validation_cases.validation_tests import (Version, flops_validation_test, get_flops_case_names, - get_flops_inputs, + get_flops_options, print_case) from aviary.variable_info.variables import Aircraft, Mission @@ -27,11 +27,13 @@ def test_case(self, case_name): prob.model.add_subsystem( 'passenger_service_weight', - PassengerServiceMass(aviary_options=get_flops_inputs(case_name)), + PassengerServiceMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( @@ -60,11 +62,13 @@ def test_case(self, case_name): prob.model.add_subsystem( 'alternate_passenger_service_weight', - AltPassengerServiceMass(aviary_options=get_flops_inputs(case_name)), + AltPassengerServiceMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( diff --git a/aviary/subsystems/mass/flops_based/test/test_starter.py b/aviary/subsystems/mass/flops_based/test/test_starter.py index e069767ed..d2a805c40 100644 --- a/aviary/subsystems/mass/flops_based/test/test_starter.py +++ b/aviary/subsystems/mass/flops_based/test/test_starter.py @@ -25,10 +25,17 @@ def test_case_1(self, case_name): prob = self.prob + inputs = get_flops_inputs(case_name, preprocess=True) + + options = { + Aircraft.Engine.NUM_ENGINES: inputs.get_val(Aircraft.Engine.NUM_ENGINES), + Aircraft.Propulsion.TOTAL_NUM_ENGINES: inputs.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES), + Mission.Constraints.MAX_MACH: inputs.get_val(Mission.Constraints.MAX_MACH), + } + prob.model.add_subsystem( "starter_test", - TransportStarterMass(aviary_options=get_flops_inputs( - case_name, preprocess=True)), + TransportStarterMass(**options), promotes_outputs=['*'], promotes_inputs=['*'] ) @@ -45,14 +52,15 @@ def test_case_2(self): # test with more than 4 engines prob = self.prob - aviary_options = get_flops_inputs('LargeSingleAisle1FLOPS') - aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([5])) - aviary_options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 5) - aviary_options.set_val(Mission.Constraints.MAX_MACH, 0.785) + options = { + Aircraft.Engine.NUM_ENGINES: np.array([5]), + Aircraft.Propulsion.TOTAL_NUM_ENGINES: 5, + Mission.Constraints.MAX_MACH: 0.785, + } prob.model.add_subsystem( "starter_test", - TransportStarterMass(aviary_options=aviary_options), + TransportStarterMass(**options), promotes_outputs=['*'], promotes_inputs=['*'] ) diff --git a/aviary/subsystems/mass/flops_based/test/test_surface_controls.py b/aviary/subsystems/mass/flops_based/test/test_surface_controls.py index bd7eee00f..8f55e42b6 100644 --- a/aviary/subsystems/mass/flops_based/test/test_surface_controls.py +++ b/aviary/subsystems/mass/flops_based/test/test_surface_controls.py @@ -9,7 +9,7 @@ from aviary.validation_cases.validation_tests import (Version, flops_validation_test, get_flops_case_names, - get_flops_inputs, + get_flops_options, print_case) from aviary.variable_info.variables import Aircraft, Mission @@ -27,10 +27,12 @@ def test_case(self, case_name): prob.model.add_subsystem( "surf_ctrl", - SurfaceControlMass(aviary_options=get_flops_inputs(case_name)), + SurfaceControlMass(), promotes=['*'] ) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( @@ -63,10 +65,12 @@ def test_case(self, case_name): prob.model.add_subsystem( "surf_ctrl", - AltSurfaceControlMass(aviary_options=get_flops_inputs(case_name)), + AltSurfaceControlMass(), promotes=['*'] ) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( diff --git a/aviary/subsystems/mass/flops_based/test/test_thrust_reverser.py b/aviary/subsystems/mass/flops_based/test/test_thrust_reverser.py index 02e9e290b..242e41787 100644 --- a/aviary/subsystems/mass/flops_based/test/test_thrust_reverser.py +++ b/aviary/subsystems/mass/flops_based/test/test_thrust_reverser.py @@ -28,10 +28,15 @@ def test_case(self, case_name): prob = self.prob + inputs = get_flops_inputs(case_name, preprocess=True) + + options = { + Aircraft.Engine.NUM_ENGINES: inputs.get_val(Aircraft.Engine.NUM_ENGINES), + } + prob.model.add_subsystem( "thrust_rev", - ThrustReverserMass(aviary_options=get_flops_inputs( - case_name, preprocess=True)), + ThrustReverserMass(**options), promotes=['*'] ) @@ -63,8 +68,12 @@ def test_case_multiengine(self): preprocess_propulsion(aviary_options, [engineModel1, engineModel2, engineModel3]) - prob.model.add_subsystem('thrust_reverser_mass', ThrustReverserMass( - aviary_options=aviary_options), promotes=['*']) + options = { + Aircraft.Engine.NUM_ENGINES: aviary_options.get_val(Aircraft.Engine.NUM_ENGINES), + } + + prob.model.add_subsystem('thrust_reverser_mass', ThrustReverserMass(**options), + promotes=['*']) prob.setup(force_alloc_complex=True) diff --git a/aviary/subsystems/mass/flops_based/test/test_unusable_fuel.py b/aviary/subsystems/mass/flops_based/test/test_unusable_fuel.py index d2bc4c1ba..5e142f670 100644 --- a/aviary/subsystems/mass/flops_based/test/test_unusable_fuel.py +++ b/aviary/subsystems/mass/flops_based/test/test_unusable_fuel.py @@ -9,7 +9,7 @@ from aviary.validation_cases.validation_tests import (Version, flops_validation_test, get_flops_case_names, - get_flops_inputs, + get_flops_options, print_case) from aviary.variable_info.variables import Aircraft @@ -27,15 +27,16 @@ def setUp(self): def test_case(self, case_name): prob = self.prob - flops_inputs = get_flops_inputs(case_name, preprocess=True) prob.model.add_subsystem( 'unusable_fuel', - TransportUnusableFuelMass(aviary_options=flops_inputs), + TransportUnusableFuelMass(), promotes_outputs=['*'], promotes_inputs=['*'] ) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( @@ -72,7 +73,7 @@ def test_case(self, case_name): prob.model.add_subsystem( 'unusable_fuel', - AltUnusableFuelMass(aviary_options=get_flops_inputs(case_name)), + AltUnusableFuelMass(), promotes_outputs=['*'], promotes_inputs=['*'] ) diff --git a/aviary/subsystems/mass/flops_based/thrust_reverser.py b/aviary/subsystems/mass/flops_based/thrust_reverser.py index 174ac959a..6821f182b 100644 --- a/aviary/subsystems/mass/flops_based/thrust_reverser.py +++ b/aviary/subsystems/mass/flops_based/thrust_reverser.py @@ -25,8 +25,7 @@ def initialize(self): add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) def setup(self): - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) add_aviary_input( self, Aircraft.Engine.THRUST_REVERSERS_MASS_SCALER, val=np.zeros(num_engine_type)) From 691b80a3123ca0a3923ccf88bb0be94b4afbeba3 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Tue, 24 Sep 2024 11:39:18 -0400 Subject: [PATCH 06/58] All flops mass unit tests pass. --- .../flops_based/test/test_vertical_tail.py | 8 ++-- .../mass/flops_based/test/test_wing_common.py | 8 +++- .../flops_based/test/test_wing_detailed.py | 38 ++++++++++++++++--- .../mass/flops_based/test/test_wing_simple.py | 9 ++++- .../mass/flops_based/wing_detailed.py | 2 + .../mass/flops_based/wing_simple.py | 1 - 6 files changed, 53 insertions(+), 13 deletions(-) diff --git a/aviary/subsystems/mass/flops_based/test/test_vertical_tail.py b/aviary/subsystems/mass/flops_based/test/test_vertical_tail.py index 77b6f1248..9fac1fd11 100644 --- a/aviary/subsystems/mass/flops_based/test/test_vertical_tail.py +++ b/aviary/subsystems/mass/flops_based/test/test_vertical_tail.py @@ -9,7 +9,7 @@ from aviary.validation_cases.validation_tests import (Version, flops_validation_test, get_flops_case_names, - get_flops_inputs, + get_flops_options, print_case) from aviary.variable_info.variables import Aircraft, Mission @@ -27,11 +27,13 @@ def test_case(self, case_name): prob.model.add_subsystem( "vertical_tail", - VerticalTailMass(aviary_options=get_flops_inputs(case_name)), + VerticalTailMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( @@ -61,7 +63,7 @@ def test_case(self, case_name): prob.model.add_subsystem( "vertical_tail", - AltVerticalTailMass(aviary_options=get_flops_inputs(case_name)), + AltVerticalTailMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) diff --git a/aviary/subsystems/mass/flops_based/test/test_wing_common.py b/aviary/subsystems/mass/flops_based/test/test_wing_common.py index 2fce180f7..5a8fc26df 100644 --- a/aviary/subsystems/mass/flops_based/test/test_wing_common.py +++ b/aviary/subsystems/mass/flops_based/test/test_wing_common.py @@ -5,7 +5,6 @@ from aviary.subsystems.mass.flops_based.wing_common import ( WingBendingMass, WingMiscMass, WingShearControlMass) -from aviary.variable_info.options import get_option_defaults 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, @@ -81,9 +80,14 @@ def test_IO(self): class WingBendingMassTest(unittest.TestCase): def setUp(self): prob = self.prob = om.Problem() + + opts = { + Aircraft.Fuselage.NUM_FUSELAGES: 1, + } + prob.model.add_subsystem( "wing", - WingBendingMass(aviary_options=get_option_defaults()), + WingBendingMass(**opts), promotes_inputs=['*'], promotes_outputs=['*'], ) diff --git a/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py b/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py index 075fd3261..68545eaa1 100644 --- a/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py +++ b/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py @@ -31,10 +31,20 @@ def test_case(self, case_name): prob = self.prob + 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), + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: inputs.get_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES), + Aircraft.Wing.INPUT_STATION_DIST: inputs.get_val(Aircraft.Wing.INPUT_STATION_DIST), + Aircraft.Wing.LOAD_DISTRIBUTION_CONTROL: inputs.get_val(Aircraft.Wing.LOAD_DISTRIBUTION_CONTROL), + Aircraft.Wing.NUM_INTEGRATION_STATIONS: inputs.get_val(Aircraft.Wing.NUM_INTEGRATION_STATIONS), + } + self.prob.model.add_subsystem( "wing", - DetailedWingBendingFact( - aviary_options=get_flops_inputs(case_name, preprocess=True)), + DetailedWingBendingFact(**options), promotes_inputs=['*'], promotes_outputs=['*'], ) @@ -79,8 +89,17 @@ def test_case_multiengine(self): preprocess_propulsion(aviary_options, [engineModel1, engineModel2, engineModel3]) - prob.model.add_subsystem('detailed_wing', DetailedWingBendingFact( - aviary_options=aviary_options), promotes=['*']) + options = { + Aircraft.Engine.NUM_ENGINES: aviary_options.get_val(Aircraft.Engine.NUM_ENGINES), + Aircraft.Engine.NUM_WING_ENGINES: aviary_options.get_val(Aircraft.Engine.NUM_WING_ENGINES), + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES), + Aircraft.Wing.INPUT_STATION_DIST: aviary_options.get_val(Aircraft.Wing.INPUT_STATION_DIST), + Aircraft.Wing.LOAD_DISTRIBUTION_CONTROL: aviary_options.get_val(Aircraft.Wing.LOAD_DISTRIBUTION_CONTROL), + Aircraft.Wing.NUM_INTEGRATION_STATIONS: aviary_options.get_val(Aircraft.Wing.NUM_INTEGRATION_STATIONS), + } + + prob.model.add_subsystem('detailed_wing', DetailedWingBendingFact(**options), + promotes=['*']) prob.setup(force_alloc_complex=True) @@ -140,9 +159,18 @@ def test_extreme_engine_loc(self): preprocess_propulsion(aviary_options, [engineModel]) + options = { + Aircraft.Engine.NUM_ENGINES: aviary_options.get_val(Aircraft.Engine.NUM_ENGINES), + Aircraft.Engine.NUM_WING_ENGINES: aviary_options.get_val(Aircraft.Engine.NUM_WING_ENGINES), + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES), + Aircraft.Wing.INPUT_STATION_DIST: aviary_options.get_val(Aircraft.Wing.INPUT_STATION_DIST), + Aircraft.Wing.LOAD_DISTRIBUTION_CONTROL: aviary_options.get_val(Aircraft.Wing.LOAD_DISTRIBUTION_CONTROL), + Aircraft.Wing.NUM_INTEGRATION_STATIONS: aviary_options.get_val(Aircraft.Wing.NUM_INTEGRATION_STATIONS), + } + self.prob.model.add_subsystem( "wing", - DetailedWingBendingFact(aviary_options=aviary_options), + DetailedWingBendingFact(**options), promotes_inputs=['*'], promotes_outputs=['*'], ) diff --git a/aviary/subsystems/mass/flops_based/test/test_wing_simple.py b/aviary/subsystems/mass/flops_based/test/test_wing_simple.py index da5d4148b..56804c2ae 100644 --- a/aviary/subsystems/mass/flops_based/test/test_wing_simple.py +++ b/aviary/subsystems/mass/flops_based/test/test_wing_simple.py @@ -23,10 +23,15 @@ def test_case(self, case_name): prob = self.prob + inputs = get_flops_inputs(case_name, preprocess=True) + + options = { + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: inputs.get_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES), + } + prob.model.add_subsystem( "wing", - SimpleWingBendingFact(aviary_options=get_flops_inputs( - case_name, preprocess=True)), + SimpleWingBendingFact(**options), promotes_inputs=['*'], promotes_outputs=['*'], ) diff --git a/aviary/subsystems/mass/flops_based/wing_detailed.py b/aviary/subsystems/mass/flops_based/wing_detailed.py index fe1b4567f..2526fb85e 100644 --- a/aviary/subsystems/mass/flops_based/wing_detailed.py +++ b/aviary/subsystems/mass/flops_based/wing_detailed.py @@ -12,9 +12,11 @@ class DetailedWingBendingFact(om.ExplicitComponent): def initialize(self): add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) + add_aviary_option(self, Aircraft.Engine.NUM_WING_ENGINES) add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES) add_aviary_option(self, Aircraft.Wing.INPUT_STATION_DIST) add_aviary_option(self, Aircraft.Wing.LOAD_DISTRIBUTION_CONTROL) + add_aviary_option(self, Aircraft.Wing.NUM_INTEGRATION_STATIONS) def setup(self): input_station_dist = self.options[Aircraft.Wing.INPUT_STATION_DIST] diff --git a/aviary/subsystems/mass/flops_based/wing_simple.py b/aviary/subsystems/mass/flops_based/wing_simple.py index e97095965..6c71bf1fa 100644 --- a/aviary/subsystems/mass/flops_based/wing_simple.py +++ b/aviary/subsystems/mass/flops_based/wing_simple.py @@ -75,7 +75,6 @@ def compute(self, inputs, outputs): outputs[Aircraft.Wing.ENG_POD_INERTIA_FACTOR] = 1.0 - 0.03 * num_wing_eng def compute_partials(self, inputs, J): - num_wing_eng = self.options[Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES] fstrt = inputs[Aircraft.Wing.STRUT_BRACING_FACTOR] span = inputs[Aircraft.Wing.SPAN] tr = inputs[Aircraft.Wing.TAPER_RATIO] From 0b6740c987d888d1e552b7e58c6f5d281edbc90b Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Tue, 24 Sep 2024 17:24:44 -0400 Subject: [PATCH 07/58] checkpoint --- .../geometry/flops_based/prep_geom.py | 2 +- aviary/subsystems/mass/mass_builder.py | 2 +- aviary/subsystems/propulsion/engine_deck.py | 1 - .../subsystems/propulsion/engine_scaling.py | 75 ++++++++++--------- aviary/subsystems/propulsion/engine_sizing.py | 21 ++---- .../gearbox/model/gearbox_mission.py | 6 -- .../gearbox/model/gearbox_premission.py | 8 +- .../propulsion/throttle_allocation.py | 25 +++---- aviary/variable_info/variable_meta_data.py | 2 +- 9 files changed, 60 insertions(+), 82 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/prep_geom.py b/aviary/subsystems/geometry/flops_based/prep_geom.py index 4d1f03a69..e5284e2ca 100644 --- a/aviary/subsystems/geometry/flops_based/prep_geom.py +++ b/aviary/subsystems/geometry/flops_based/prep_geom.py @@ -107,7 +107,7 @@ def setup(self): ) self.add_subsystem( - 'total_wetted_area', TotalWettedArea(aviary_options=aviary_options), + 'total_wetted_area', TotalWettedArea(), promotes_inputs=['*'], promotes_outputs=['*'] ) diff --git a/aviary/subsystems/mass/mass_builder.py b/aviary/subsystems/mass/mass_builder.py index e99e0ac3d..362797949 100644 --- a/aviary/subsystems/mass/mass_builder.py +++ b/aviary/subsystems/mass/mass_builder.py @@ -54,7 +54,7 @@ def build_pre_mission(self, aviary_inputs): mass_premission = MassPremissionGASP(aviary_options=aviary_inputs,) elif code_origin is FLOPS: - mass_premission = MassPremissionFLOPS(aviary_options=aviary_inputs) + mass_premission = MassPremissionFLOPS() return mass_premission diff --git a/aviary/subsystems/propulsion/engine_deck.py b/aviary/subsystems/propulsion/engine_deck.py index 9f126d855..6f989d18e 100644 --- a/aviary/subsystems/propulsion/engine_deck.py +++ b/aviary/subsystems/propulsion/engine_deck.py @@ -1013,7 +1013,6 @@ def build_mission(self, num_nodes, aviary_inputs) -> om.Group: 'engine_scaling', subsys=EngineScaling( num_nodes=num_nodes, - aviary_options=self.options, engine_variables=engine_outputs, ), promotes_inputs=[Aircraft.Engine.SCALE_FACTOR, Dynamic.Mission.MACH], diff --git a/aviary/subsystems/propulsion/engine_scaling.py b/aviary/subsystems/propulsion/engine_scaling.py index 2366aff8a..57242d45e 100644 --- a/aviary/subsystems/propulsion/engine_scaling.py +++ b/aviary/subsystems/propulsion/engine_scaling.py @@ -1,9 +1,8 @@ import numpy as np import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues from aviary.subsystems.propulsion.utils import EngineModelVariables, max_variables -from aviary.variable_info.functions import add_aviary_input +from aviary.variable_info.functions import add_aviary_input, add_aviary_option from aviary.variable_info.variables import Aircraft, Dynamic, Mission @@ -39,19 +38,22 @@ class EngineScaling(om.ExplicitComponent): def initialize(self): self.options.declare('num_nodes', types=int) - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - self.options.declare( 'engine_variables', types=dict, desc='dict of variables to be scaled for this engine with units', ) + add_aviary_option(self, Aircraft.Engine.CONSTANT_FUEL_CONSUMPTION, units='lbm/h') + add_aviary_option(self, Aircraft.Engine.FUEL_FLOW_SCALER_CONSTANT_TERM) + add_aviary_option(self, Aircraft.Engine.FUEL_FLOW_SCALER_LINEAR_TERM) + add_aviary_option(self, Aircraft.Engine.SCALE_PERFORMANCE) + add_aviary_option(self, Aircraft.Engine.SUBSONIC_FUEL_FLOW_SCALER) + add_aviary_option(self, Aircraft.Engine.SUPERSONIC_FUEL_FLOW_SCALER) + add_aviary_option(self, Mission.Summary.FUEL_FLOW_SCALER) + def setup(self): nn = self.options['num_nodes'] - options: AviaryValues = self.options['aviary_options'] engine_variables = self.options['engine_variables'] add_aviary_input(self, Aircraft.Engine.SCALE_FACTOR, val=1.0) @@ -96,20 +98,17 @@ def setup(self): ) def compute(self, inputs, outputs): - nn = self.options['num_nodes'] - options: AviaryValues = self.options['aviary_options'] - engine_variables = self.options['engine_variables'] - scale_performance = options.get_val(Aircraft.Engine.SCALE_PERFORMANCE) - - subsonic_fuel_factor = options.get_val(Aircraft.Engine.SUBSONIC_FUEL_FLOW_SCALER) - supersonic_fuel_factor = options.get_val( - Aircraft.Engine.SUPERSONIC_FUEL_FLOW_SCALER) - constant_fuel_term = options.get_val( - Aircraft.Engine.FUEL_FLOW_SCALER_CONSTANT_TERM) - linear_fuel_term = options.get_val(Aircraft.Engine.FUEL_FLOW_SCALER_LINEAR_TERM) - constant_fuel_flow = options.get_val( - Aircraft.Engine.CONSTANT_FUEL_CONSUMPTION, units='lbm/h') - mission_fuel_scaler = options.get_val(Mission.Summary.FUEL_FLOW_SCALER) + options = self.options + nn = options['num_nodes'] + engine_variables = options['engine_variables'] + scale_performance = options[Aircraft.Engine.SCALE_PERFORMANCE] + + subsonic_fuel_factor = options[Aircraft.Engine.SUBSONIC_FUEL_FLOW_SCALER] + supersonic_fuel_factor = options[Aircraft.Engine.SUPERSONIC_FUEL_FLOW_SCALER] + constant_fuel_term = options[Aircraft.Engine.FUEL_FLOW_SCALER_CONSTANT_TERM] + linear_fuel_term = options[Aircraft.Engine.FUEL_FLOW_SCALER_LINEAR_TERM] + constant_fuel_flow, _ = options[Aircraft.Engine.CONSTANT_FUEL_CONSUMPTION] + mission_fuel_scaler = options[Mission.Summary.FUEL_FLOW_SCALER] # thrust-based engine scaling factor engine_scale_factor = inputs[Aircraft.Engine.SCALE_FACTOR] @@ -144,10 +143,14 @@ def compute(self, inputs, outputs): for variable in engine_variables: if variable not in skip_variables: if variable is FUEL_FLOW: - outputs[Dynamic.Mission.FUEL_FLOW_RATE_NEGATIVE] = -( - inputs['fuel_flow_rate_unscaled'] * fuel_flow_scale_factor - + constant_fuel_flow - ) + try: + + outputs[Dynamic.Mission.FUEL_FLOW_RATE_NEGATIVE] = -( + inputs['fuel_flow_rate_unscaled'] * fuel_flow_scale_factor + + constant_fuel_flow + ) + except: + print('z') else: outputs[variable.value] = ( inputs[variable.value + '_unscaled'] * scale_factor @@ -210,18 +213,16 @@ def setup_partials(self): ) def compute_partials(self, inputs, J): - nn = self.options['num_nodes'] - options: AviaryValues = self.options['aviary_options'] - engine_variables = self.options['engine_variables'] - scale_performance = options.get_val(Aircraft.Engine.SCALE_PERFORMANCE) - - subsonic_fuel_factor = options.get_val(Aircraft.Engine.SUBSONIC_FUEL_FLOW_SCALER) - supersonic_fuel_factor = options.get_val( - Aircraft.Engine.SUPERSONIC_FUEL_FLOW_SCALER) - constant_fuel_term = options.get_val( - Aircraft.Engine.FUEL_FLOW_SCALER_CONSTANT_TERM, units='unitless') - linear_fuel_term = options.get_val(Aircraft.Engine.FUEL_FLOW_SCALER_LINEAR_TERM) - mission_fuel_scaler = options.get_val(Mission.Summary.FUEL_FLOW_SCALER) + options = self.options + nn = options['num_nodes'] + engine_variables = options['engine_variables'] + scale_performance = options[Aircraft.Engine.SCALE_PERFORMANCE] + + subsonic_fuel_factor = options[Aircraft.Engine.SUBSONIC_FUEL_FLOW_SCALER] + supersonic_fuel_factor = options[Aircraft.Engine.SUPERSONIC_FUEL_FLOW_SCALER] + constant_fuel_term = options[Aircraft.Engine.FUEL_FLOW_SCALER_CONSTANT_TERM] + linear_fuel_term = options[Aircraft.Engine.FUEL_FLOW_SCALER_LINEAR_TERM] + mission_fuel_scaler = options[Mission.Summary.FUEL_FLOW_SCALER] mach_number = inputs[Dynamic.Mission.MACH] engine_scale_factor = inputs[Aircraft.Engine.SCALE_FACTOR] diff --git a/aviary/subsystems/propulsion/engine_sizing.py b/aviary/subsystems/propulsion/engine_sizing.py index 379c5272b..e6dee3a6e 100644 --- a/aviary/subsystems/propulsion/engine_sizing.py +++ b/aviary/subsystems/propulsion/engine_sizing.py @@ -1,8 +1,7 @@ import numpy as np import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -16,9 +15,8 @@ class SizeEngine(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Engine.REFERENCE_SLS_THRUST, units='lbf') + add_aviary_option(self, Aircraft.Engine.SCALE_PERFORMANCE) def setup(self): add_aviary_input(self, Aircraft.Engine.SCALED_SLS_THRUST, val=0.0) @@ -34,12 +32,9 @@ def setup(self): # TODO - nacelle_wetted_area: if length, diam get scaled - this should be covered by geom def compute(self, inputs, outputs): - options: AviaryValues = self.options['aviary_options'] - scale_engine = options.get_val(Aircraft.Engine.SCALE_PERFORMANCE) - - reference_sls_thrust = options.get_val(Aircraft.Engine.REFERENCE_SLS_THRUST, - units='lbf') + scale_engine = self.options[Aircraft.Engine.SCALE_PERFORMANCE] + reference_sls_thrust = self.options[Aircraft.Engine.REFERENCE_SLS_THRUST] scaled_sls_thrust = inputs[Aircraft.Engine.SCALED_SLS_THRUST] @@ -56,10 +51,8 @@ def setup_partials(self): Aircraft.Engine.SCALED_SLS_THRUST) def compute_partials(self, inputs, J): - options: AviaryValues = self.options['aviary_options'] - scale_engine = options.get_val(Aircraft.Engine.SCALE_PERFORMANCE) - reference_sls_thrust = options.get_val( - Aircraft.Engine.REFERENCE_SLS_THRUST, units='lbf') + scale_engine = self.options[Aircraft.Engine.SCALE_PERFORMANCE] + reference_sls_thrust = self.options[Aircraft.Engine.REFERENCE_SLS_THRUST] deriv_scale_factor = 0 if scale_engine: diff --git a/aviary/subsystems/propulsion/gearbox/model/gearbox_mission.py b/aviary/subsystems/propulsion/gearbox/model/gearbox_mission.py index 87243747e..557a04389 100644 --- a/aviary/subsystems/propulsion/gearbox/model/gearbox_mission.py +++ b/aviary/subsystems/propulsion/gearbox/model/gearbox_mission.py @@ -1,7 +1,6 @@ import numpy as np import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.variables import Dynamic, Aircraft, Mission @@ -11,11 +10,6 @@ class GearboxMission(om.Group): def initialize(self): self.options.declare("num_nodes", types=int) - self.options.declare( - 'aviary_inputs', types=AviaryValues, - desc='collection of Aircraft/Mission specific options', - default=None, - ) self.name = 'gearbox_mission' def setup(self): diff --git a/aviary/subsystems/propulsion/gearbox/model/gearbox_premission.py b/aviary/subsystems/propulsion/gearbox/model/gearbox_premission.py index 226fca7cc..ec8cb6208 100644 --- a/aviary/subsystems/propulsion/gearbox/model/gearbox_premission.py +++ b/aviary/subsystems/propulsion/gearbox/model/gearbox_premission.py @@ -2,24 +2,18 @@ import numpy as np from aviary.variable_info.variables import Aircraft, Dynamic -from aviary.utils.aviary_values import AviaryValues class GearboxPreMission(om.Group): """ Calculate gearbox mass for a single gearbox. - Gearbox design assumes collective control which means that RPM coming into the + Gearbox design assumes collective control which means that RPM coming into the gearbox is fixed and RPM going out of the gearbox is fixed over the whole mission. """ def initialize(self, ): self.options.declare("simple_mass", types=bool, default=True) - self.options.declare( - "aviary_inputs", types=AviaryValues, - desc="collection of Aircraft/Mission specific options", - default=None, - ) self.name = 'gearbox_premission' def setup(self): diff --git a/aviary/subsystems/propulsion/throttle_allocation.py b/aviary/subsystems/propulsion/throttle_allocation.py index fd0543fe2..120f74693 100644 --- a/aviary/subsystems/propulsion/throttle_allocation.py +++ b/aviary/subsystems/propulsion/throttle_allocation.py @@ -4,6 +4,7 @@ from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.enums import ThrottleAllocation +from aviary.variable_info.functions import add_aviary_option from aviary.variable_info.variables import Aircraft, Dynamic @@ -19,21 +20,17 @@ def initialize(self): types=int, lower=0 ) - self.options.declare( - 'aviary_options', - types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) self.options.declare( 'throttle_allocation', default=ThrottleAllocation.FIXED, types=ThrottleAllocation, desc='Flag that determines how to handle throttles for multiple engines.' ) + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) + def setup(self): - options: AviaryValues = self.options['aviary_options'] nn = self.options['num_nodes'] - num_engine_type = len(options.get_val(Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) alloc_mode = self.options['throttle_allocation'] self.add_input( @@ -101,19 +98,20 @@ def setup(self): val=1.0) def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): - nn = self.options['num_nodes'] alloc_mode = self.options['throttle_allocation'] agg_throttle = inputs["aggregate_throttle"] allocation = inputs["throttle_allocations"] if alloc_mode == ThrottleAllocation.DYNAMIC: - outputs[Dynamic.Mission.THROTTLE][:, :- - 1] = np.einsum("i,ij->ij", agg_throttle, allocation) + outputs[Dynamic.Mission.THROTTLE][:, :-1] = ( + np.einsum("i,ij->ij", agg_throttle, allocation) + ) sum_alloc = np.sum(allocation, axis=1) else: - outputs[Dynamic.Mission.THROTTLE][:, :- - 1] = np.einsum("i,j->ij", agg_throttle, allocation) + outputs[Dynamic.Mission.THROTTLE][:, :-1] = ( + np.einsum("i,j->ij", agg_throttle, allocation) + ) sum_alloc = np.sum(allocation) outputs[Dynamic.Mission.THROTTLE][:, -1] = agg_throttle * (1.0 - sum_alloc) @@ -121,10 +119,9 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): outputs["throttle_allocation_sum"] = sum_alloc def compute_partials(self, inputs, partials, discrete_inputs=None): - options: AviaryValues = self.options['aviary_options'] nn = self.options['num_nodes'] alloc_mode = self.options['throttle_allocation'] - num_engine_type = len(options.get_val(Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) agg_throttle = inputs["aggregate_throttle"] allocation = inputs["throttle_allocations"] diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 2a619cf01..7b4c5393a 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -2242,7 +2242,7 @@ desc='Toggle for enabling scaling of engine performance including thrust, fuel flow, ' 'and electric power', option=True, - types=bool, + types=(bool, list), default_value=True, ) From 4617bf9a25c461b87cb6a3a0040c22dd518fde8d Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Tue, 24 Sep 2024 17:38:13 -0400 Subject: [PATCH 08/58] Merged out, fixing incoming code. --- .../mass/flops_based/test/test_air_conditioning.py | 13 +++++++++++-- .../mass/flops_based/test/test_anti_icing.py | 13 +++++++++---- aviary/subsystems/mass/flops_based/test/test_apu.py | 5 ++++- .../mass/flops_based/test/test_avionics.py | 6 ++++-- .../mass/flops_based/test/test_cargo_containers.py | 5 +++-- 5 files changed, 31 insertions(+), 11 deletions(-) diff --git a/aviary/subsystems/mass/flops_based/test/test_air_conditioning.py b/aviary/subsystems/mass/flops_based/test/test_air_conditioning.py index 03ca075c1..ff176c26e 100644 --- a/aviary/subsystems/mass/flops_based/test/test_air_conditioning.py +++ b/aviary/subsystems/mass/flops_based/test/test_air_conditioning.py @@ -69,12 +69,16 @@ def tearDown(self): def test_case(self): prob = om.Problem() + prob.model.add_subsystem( "air_cond", - TransportAirCondMass(aviary_options=get_flops_inputs("N3CC")), + TransportAirCondMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + + prob.model_options['*'] = get_flops_options("N3CC") + prob.model.set_input_defaults( Aircraft.AirConditioning.MASS_SCALER, val=0.98094, units="unitless") prob.model.set_input_defaults( @@ -83,6 +87,7 @@ def test_case(self): Aircraft.Fuselage.MAX_HEIGHT, val=13., units="ft") prob.model.set_input_defaults( Aircraft.Fuselage.PLANFORM_AREA, val=1537.5, units="ft**2") + prob.setup(check=False, force_alloc_complex=True) partial_data = prob.check_partials(out_stream=None, method="cs") @@ -141,12 +146,16 @@ def tearDown(self): def test_case(self): prob = om.Problem() + prob.model.add_subsystem( 'air_cond', - AltAirCondMass(aviary_options=get_flops_inputs("N3CC")), + AltAirCondMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + + prob.model_options['*'] = get_flops_options("N3CC") + prob.model.set_input_defaults( Aircraft.AirConditioning.MASS_SCALER, val=0.98094, units="unitless") prob.setup(check=False, force_alloc_complex=True) diff --git a/aviary/subsystems/mass/flops_based/test/test_anti_icing.py b/aviary/subsystems/mass/flops_based/test/test_anti_icing.py index 0cde39d66..3cf156548 100644 --- a/aviary/subsystems/mass/flops_based/test/test_anti_icing.py +++ b/aviary/subsystems/mass/flops_based/test/test_anti_icing.py @@ -139,15 +139,20 @@ def tearDown(self): def test_case_2(self): prob = om.Problem() - aviary_options = get_flops_inputs('N3CC') - aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([5])) - aviary_options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 5) + + options = get_flops_options('N3CC') + options[Aircraft.Engine.NUM_ENGINES] = np.array([5]) + options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] = 5 + prob.model.add_subsystem( "anti_icing", - AntiIcingMass(aviary_options=aviary_options), + AntiIcingMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + + prob.model_options['*'] = options + prob.setup(check=False, force_alloc_complex=True) prob.set_val(Aircraft.AntiIcing.MASS_SCALER, 1.0) prob.set_val(Aircraft.Fuselage.MAX_WIDTH, 12.33, 'ft') diff --git a/aviary/subsystems/mass/flops_based/test/test_apu.py b/aviary/subsystems/mass/flops_based/test/test_apu.py index 8b57cdffb..f0706f3fb 100644 --- a/aviary/subsystems/mass/flops_based/test/test_apu.py +++ b/aviary/subsystems/mass/flops_based/test/test_apu.py @@ -64,10 +64,13 @@ def test_case(self): prob = om.Problem() prob.model.add_subsystem( "apu", - TransportAPUMass(aviary_options=get_flops_inputs("N3CC")), + TransportAPUMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + + prob.model_options['*'] = get_flops_options("N3CC", preprocess=True) + prob.setup(check=False, force_alloc_complex=True) prob.set_val(Aircraft.Fuselage.PLANFORM_AREA, 100.0, 'ft**2') diff --git a/aviary/subsystems/mass/flops_based/test/test_avionics.py b/aviary/subsystems/mass/flops_based/test/test_avionics.py index dfe71bde8..084afb5ce 100644 --- a/aviary/subsystems/mass/flops_based/test/test_avionics.py +++ b/aviary/subsystems/mass/flops_based/test/test_avionics.py @@ -69,11 +69,13 @@ def test_case(self): prob = om.Problem() prob.model.add_subsystem( "avionics", - TransportAvionicsMass(aviary_options=get_flops_inputs( - "N3CC", preprocess=True)), + TransportAvionicsMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + + prob.model_options['*'] = get_flops_options("N3CC", preprocess=True) + prob.setup(check=False, force_alloc_complex=True) prob.set_val(Aircraft.Fuselage.PLANFORM_AREA, 1500.0, 'ft**2') prob.set_val(Mission.Design.RANGE, 3500.0, 'nmi') diff --git a/aviary/subsystems/mass/flops_based/test/test_cargo_containers.py b/aviary/subsystems/mass/flops_based/test/test_cargo_containers.py index 4f1c5e7d7..35eca64a4 100644 --- a/aviary/subsystems/mass/flops_based/test/test_cargo_containers.py +++ b/aviary/subsystems/mass/flops_based/test/test_cargo_containers.py @@ -68,12 +68,13 @@ def test_case(self): prob.model.add_subsystem( "cargo_containers", - TransportCargoContainersMass( - aviary_options=get_flops_inputs("N3CC")), + TransportCargoContainersMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + prob.model_options['*'] = get_flops_options("N3CC", preprocess=True) + prob.setup(check=False, force_alloc_complex=True) prob.set_val(Aircraft.CrewPayload.BAGGAGE_MASS, 5000.0, 'lbm') From f044ec2c68bd8f788272e272d287e8ab318aa320 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Wed, 25 Sep 2024 11:13:38 -0400 Subject: [PATCH 09/58] more tests fixed. --- .../flops_based/test/test_prep_geom.py | 14 +++++------ .../mass/flops_based/test/test_electrical.py | 9 ++++++-- .../flops_based/test/test_engine_controls.py | 6 +++-- .../mass/flops_based/test/test_engine_oil.py | 19 ++++++++++----- .../mass/flops_based/test/test_fin.py | 7 ++++-- .../mass/flops_based/test/test_fuel_system.py | 23 +++++++++++++++---- .../mass/flops_based/test/test_furnishings.py | 17 ++++++++++---- .../mass/flops_based/test/test_fuselage.py | 8 ++++--- .../flops_based/test/test_horizontail_tail.py | 4 ++-- .../mass/flops_based/test/test_hydraulics.py | 15 ++++++++---- .../mass/flops_based/test/test_instruments.py | 13 +++++++++-- .../flops_based/test/test_landing_gear.py | 4 ++-- .../mass/flops_based/test/test_nacelle.py | 21 ++++++++++++++--- .../test/test_passenger_service.py | 10 ++++++-- .../mass/flops_based/test/test_starter.py | 13 +++++++---- .../flops_based/test/test_surface_controls.py | 10 ++++++-- .../flops_based/test/test_thrust_reverser.py | 10 ++++++-- .../flops_based/test/test_unusable_fuel.py | 9 +++++--- .../flops_based/test/test_vertical_tail.py | 5 +++- .../mass/flops_based/test/test_wing_common.py | 7 +++++- aviary/subsystems/propulsion/engine_deck.py | 2 +- aviary/subsystems/propulsion/engine_sizing.py | 4 ++-- .../propulsion/propulsion_mission.py | 23 +++++++------------ .../propulsion/propulsion_premission.py | 16 +++++-------- .../propulsion/test/test_engine_scaling.py | 8 ++++++- .../propulsion/test/test_engine_sizing.py | 17 ++++++++++---- .../test/test_propulsion_mission.py | 7 +++--- .../test/test_propulsion_premission.py | 8 +++---- .../test/test_throttle_allocation.py | 15 ++++++------ .../test/test_flops_based_premission.py | 13 ++++++++--- 30 files changed, 224 insertions(+), 113 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py b/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py index d4904616d..4d62f207b 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py +++ b/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py @@ -54,9 +54,7 @@ def initialize(self): desc='collection of Aircraft/Mission specific options') def setup(self): - aviary_options = self.options['aviary_options'] - - self.add_subsystem('prep_geom', PrepGeom(aviary_options=aviary_options), + self.add_subsystem('prep_geom', PrepGeom(), promotes=['*']) def configure(self): @@ -73,17 +71,19 @@ def configure(self): Aircraft.Propulsion.TOTAL_NUM_ENGINES, ] - inputs = get_flops_data(case_name, preprocess=True, keys=keys) - options = {} + options = get_flops_data(case_name, preprocess=True, keys=keys) + model_options = {} for key in keys: - options[key] = inputs.get_item(key)[0] + model_options[key] = options.get_item(key)[0] prob = self.prob prob.model.add_subsystem( - 'premission', PreMission(**options), promotes=['*'] + 'premission', PreMission(aviary_options=options), promotes=['*'] ) + prob.model_options['*'] = model_options + prob.setup(check=False, force_alloc_complex=True) output_keys = [Aircraft.Fuselage.AVG_DIAMETER, diff --git a/aviary/subsystems/mass/flops_based/test/test_electrical.py b/aviary/subsystems/mass/flops_based/test/test_electrical.py index 5996ddb5e..42567dbb9 100644 --- a/aviary/subsystems/mass/flops_based/test/test_electrical.py +++ b/aviary/subsystems/mass/flops_based/test/test_electrical.py @@ -67,7 +67,7 @@ def test_case(self): prob.model.add_subsystem( "electric_test", - ElectricalMass(aviary_options=get_flops_inputs("N3CC", preprocess=True)), + ElectricalMass(), promotes_outputs=[ Aircraft.Electrical.MASS, ], @@ -78,6 +78,8 @@ def test_case(self): ] ) + prob.model_options['*'] = get_flops_options("N3CC", preprocess=True) + prob.setup(check=False, force_alloc_complex=True) flops_validation_test( @@ -108,7 +110,7 @@ def test_case(self): prob = om.Problem() prob.model.add_subsystem( "electric_test", - ElectricalMass(aviary_options=get_flops_inputs("N3CC", preprocess=True)), + ElectricalMass(), promotes_outputs=[ Aircraft.Electrical.MASS, ], @@ -118,6 +120,9 @@ def test_case(self): Aircraft.Electrical.MASS_SCALER ] ) + + prob.model_options['*'] = get_flops_options("N3CC", preprocess=True) + prob.setup(check=False, force_alloc_complex=True) prob.set_val(Aircraft.Fuselage.LENGTH, 100.0, 'ft') prob.set_val(Aircraft.Fuselage.MAX_WIDTH, 12.0, 'ft') diff --git a/aviary/subsystems/mass/flops_based/test/test_engine_controls.py b/aviary/subsystems/mass/flops_based/test/test_engine_controls.py index 9ceb8ee17..e7d28489f 100644 --- a/aviary/subsystems/mass/flops_based/test/test_engine_controls.py +++ b/aviary/subsystems/mass/flops_based/test/test_engine_controls.py @@ -65,14 +65,16 @@ def tearDown(self): control.GRAV_ENGLISH_LBM = 1.0 def test_case(self): - flops_inputs = get_flops_inputs("LargeSingleAisle1FLOPS", preprocess=True) prob = om.Problem() prob.model.add_subsystem( 'engine_ctrls', - TransportEngineCtrlsMass(aviary_options=flops_inputs), + TransportEngineCtrlsMass(), promotes_outputs=['*'], promotes_inputs=['*'] ) + + prob.model_options['*'] = get_flops_options("LargeSingleAisle1FLOPS", preprocess=True) + prob.setup(force_alloc_complex=True) prob.set_val(Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, 50000.0, 'lbf') diff --git a/aviary/subsystems/mass/flops_based/test/test_engine_oil.py b/aviary/subsystems/mass/flops_based/test/test_engine_oil.py index 7819b3b73..00c9af05f 100644 --- a/aviary/subsystems/mass/flops_based/test/test_engine_oil.py +++ b/aviary/subsystems/mass/flops_based/test/test_engine_oil.py @@ -73,12 +73,14 @@ def tearDown(self): def test_case(self): prob = om.Problem() - options = get_flops_inputs("N3CC") - options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2) + + options = { + Aircraft.Propulsion.TOTAL_NUM_ENGINES: 2, + } prob.model.add_subsystem( 'engine_oil', - TransportEngineOilMass(aviary_options=options), + TransportEngineOilMass(**options), promotes_outputs=['*'], promotes_inputs=['*'] ) @@ -146,11 +148,16 @@ def tearDown(self): def test_case(self): prob = om.Problem() - options = get_flops_inputs("N3CC") - options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2) + + inputs = get_flops_inputs("N3CC", preprocess=True) + + options = { + Aircraft.CrewPayload.NUM_PASSENGERS: inputs.get_val(Aircraft.CrewPayload.NUM_PASSENGERS), + } + prob.model.add_subsystem( 'engine_oil', - AltEngineOilMass(aviary_options=options), + AltEngineOilMass(**options), promotes_outputs=['*'], promotes_inputs=['*'] ) diff --git a/aviary/subsystems/mass/flops_based/test/test_fin.py b/aviary/subsystems/mass/flops_based/test/test_fin.py index 1bad1cd65..fb75e20a9 100644 --- a/aviary/subsystems/mass/flops_based/test/test_fin.py +++ b/aviary/subsystems/mass/flops_based/test/test_fin.py @@ -76,11 +76,14 @@ def tearDown(self): fin.GRAV_ENGLISH_LBM = 1.0 def test_case(self): - validation_data = fin_test_data["1"] prob = om.Problem() + + options = { + Aircraft.Fins.NUM_FINS: 1, + } prob.model.add_subsystem( "fin", - FinMass(aviary_options=validation_data), + FinMass(**options), promotes_inputs=['*'], promotes_outputs=['*'], ) diff --git a/aviary/subsystems/mass/flops_based/test/test_fuel_system.py b/aviary/subsystems/mass/flops_based/test/test_fuel_system.py index adfb1b95f..7aa2ad9cc 100644 --- a/aviary/subsystems/mass/flops_based/test/test_fuel_system.py +++ b/aviary/subsystems/mass/flops_based/test/test_fuel_system.py @@ -12,7 +12,7 @@ get_flops_case_names, get_flops_inputs, print_case) -from aviary.variable_info.variables import Aircraft +from aviary.variable_info.variables import Aircraft, Mission class AltFuelSystemTest(unittest.TestCase): @@ -68,10 +68,16 @@ def tearDown(self): def test_case(self): prob = om.Problem() + + inputs = get_flops_inputs("N3CC", preprocess=True) + + options = { + Aircraft.Fuel.NUM_TANKS: inputs.get_val(Aircraft.Fuel.NUM_TANKS), + } + prob.model.add_subsystem( "alt_fuel_sys_test", - AltFuelSystemMass(aviary_options=get_flops_inputs( - "N3CC", preprocess=True)), + AltFuelSystemMass(**options), promotes_outputs=['*'], promotes_inputs=['*'] ) @@ -137,10 +143,17 @@ def tearDown(self): def test_case(self): prob = om.Problem() + + inputs = get_flops_inputs("N3CC", preprocess=True) + + options = { + Aircraft.Propulsion.TOTAL_NUM_ENGINES: inputs.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES), + Mission.Constraints.MAX_MACH: inputs.get_val(Mission.Constraints.MAX_MACH), + } + prob.model.add_subsystem( "transport_fuel_sys_test", - TransportFuelSystemMass( - aviary_options=get_flops_inputs("N3CC", preprocess=True)), + TransportFuelSystemMass(**options), promotes_outputs=['*'], promotes_inputs=['*'] ) diff --git a/aviary/subsystems/mass/flops_based/test/test_furnishings.py b/aviary/subsystems/mass/flops_based/test/test_furnishings.py index 155c82212..11c403610 100644 --- a/aviary/subsystems/mass/flops_based/test/test_furnishings.py +++ b/aviary/subsystems/mass/flops_based/test/test_furnishings.py @@ -133,14 +133,21 @@ def tearDown(self): def test_case(self): prob = om.Problem() + flops_inputs = get_flops_inputs("N3CC", preprocess=True) - flops_inputs.update({ - Aircraft.Fuselage.MILITARY_CARGO_FLOOR: (False, 'unitless'), - Aircraft.BWB.NUM_BAYS: (5, 'unitless') - }) + + opts = { + Aircraft.BWB.NUM_BAYS: 5, + Aircraft.CrewPayload.NUM_BUSINESS_CLASS: flops_inputs.get_val(Aircraft.CrewPayload.NUM_BUSINESS_CLASS), + Aircraft.CrewPayload.NUM_FLIGHT_CREW: flops_inputs.get_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW), + Aircraft.CrewPayload.NUM_FIRST_CLASS: flops_inputs.get_val(Aircraft.CrewPayload.NUM_FIRST_CLASS), + Aircraft.CrewPayload.NUM_TOURIST_CLASS: flops_inputs.get_val(Aircraft.CrewPayload.NUM_TOURIST_CLASS), + Aircraft.Fuselage.MILITARY_CARGO_FLOOR: False, + } + prob.model.add_subsystem( 'furnishings', - BWBFurnishingsGroupMass(aviary_options=flops_inputs), + BWBFurnishingsGroupMass(**opts), promotes_outputs=['*'], promotes_inputs=['*'] ) diff --git a/aviary/subsystems/mass/flops_based/test/test_fuselage.py b/aviary/subsystems/mass/flops_based/test/test_fuselage.py index 8611579fb..554ae7284 100644 --- a/aviary/subsystems/mass/flops_based/test/test_fuselage.py +++ b/aviary/subsystems/mass/flops_based/test/test_fuselage.py @@ -68,11 +68,13 @@ def test_case(self): prob = om.Problem() prob.model.add_subsystem( "fuselage", - TransportFuselageMass(aviary_options=get_flops_inputs( - "N3CC", preprocess=True)), + TransportFuselageMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + + prob.model_options['*'] = get_flops_options("N3CC", preprocess=True) + prob.setup(check=False, force_alloc_complex=True) prob.set_val(Aircraft.Fuselage.LENGTH, 100.0, 'ft') prob.set_val(Aircraft.Fuselage.AVG_DIAMETER, 10.0, 'ft') @@ -132,7 +134,7 @@ def test_case(self): prob = om.Problem() prob.model.add_subsystem( "fuselage", - AltFuselageMass(aviary_options=get_flops_inputs("N3CC")), + AltFuselageMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) diff --git a/aviary/subsystems/mass/flops_based/test/test_horizontail_tail.py b/aviary/subsystems/mass/flops_based/test/test_horizontail_tail.py index 140e6f5bd..ca45ce0fb 100644 --- a/aviary/subsystems/mass/flops_based/test/test_horizontail_tail.py +++ b/aviary/subsystems/mass/flops_based/test/test_horizontail_tail.py @@ -66,7 +66,7 @@ def test_case(self): prob = om.Problem() prob.model.add_subsystem( "horizontal_tail", - HorizontalTailMass(aviary_options=get_flops_inputs("N3CC")), + HorizontalTailMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) @@ -128,7 +128,7 @@ def test_case(self): prob = om.Problem() prob.model.add_subsystem( "horizontal_tail", - AltHorizontalTailMass(aviary_options=get_flops_inputs("N3CC")), + AltHorizontalTailMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) diff --git a/aviary/subsystems/mass/flops_based/test/test_hydraulics.py b/aviary/subsystems/mass/flops_based/test/test_hydraulics.py index 4b137b863..f17d1f252 100644 --- a/aviary/subsystems/mass/flops_based/test/test_hydraulics.py +++ b/aviary/subsystems/mass/flops_based/test/test_hydraulics.py @@ -77,10 +77,18 @@ def tearDown(self): def test_case(self): prob = om.Problem() + + inputs = get_flops_inputs("N3CC", preprocess=True) + + options = { + Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES: inputs.get_val(Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES), + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: inputs.get_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES), + Mission.Constraints.MAX_MACH: inputs.get_val(Mission.Constraints.MAX_MACH), + } + prob.model.add_subsystem( 'hydraulics', - TransportHydraulicsGroupMass( - aviary_options=get_flops_inputs("N3CC", preprocess=True)), + TransportHydraulicsGroupMass(**options), promotes_outputs=['*'], promotes_inputs=['*'] ) @@ -148,8 +156,7 @@ def test_case(self): prob = om.Problem() prob.model.add_subsystem( 'hydraulics', - AltHydraulicsGroupMass( - aviary_options=get_flops_inputs("N3CC", preprocess=True)), + AltHydraulicsGroupMass(), promotes_outputs=['*'], promotes_inputs=['*'] ) diff --git a/aviary/subsystems/mass/flops_based/test/test_instruments.py b/aviary/subsystems/mass/flops_based/test/test_instruments.py index 295b635e5..5a0521b5e 100644 --- a/aviary/subsystems/mass/flops_based/test/test_instruments.py +++ b/aviary/subsystems/mass/flops_based/test/test_instruments.py @@ -74,10 +74,19 @@ def tearDown(self): def test_case(self): prob = om.Problem() + + inputs = get_flops_inputs("N3CC", preprocess=True) + + options = { + Aircraft.CrewPayload.NUM_FLIGHT_CREW: inputs.get_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW), + Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES: inputs.get_val(Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES), + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: inputs.get_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES), + Mission.Constraints.MAX_MACH: inputs.get_val(Mission.Constraints.MAX_MACH), + } + prob.model.add_subsystem( "instruments_tests", - TransportInstrumentMass( - aviary_options=get_flops_inputs("N3CC", preprocess=True)), + TransportInstrumentMass(**options), promotes_outputs=[ Aircraft.Instruments.MASS, ], 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 9993b5fb8..d70d371ec 100644 --- a/aviary/subsystems/mass/flops_based/test/test_landing_gear.py +++ b/aviary/subsystems/mass/flops_based/test/test_landing_gear.py @@ -66,7 +66,7 @@ def test_case(self): prob = om.Problem() prob.model.add_subsystem( "landing_gear", - LandingGearMass(aviary_options=get_flops_inputs("N3CC")), + LandingGearMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) @@ -130,7 +130,7 @@ def test_case(self): prob = om.Problem() prob.model.add_subsystem( "landing_gear_alt", - AltLandingGearMass(aviary_options=get_flops_inputs("N3CC")), + AltLandingGearMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) diff --git a/aviary/subsystems/mass/flops_based/test/test_nacelle.py b/aviary/subsystems/mass/flops_based/test/test_nacelle.py index b55779111..9534dfb84 100644 --- a/aviary/subsystems/mass/flops_based/test/test_nacelle.py +++ b/aviary/subsystems/mass/flops_based/test/test_nacelle.py @@ -116,9 +116,16 @@ def tearDown(self): def test_case(self): prob = om.Problem() + + inputs = get_flops_inputs("N3CC", preprocess=True) + + options = { + Aircraft.Engine.NUM_ENGINES: inputs.get_val(Aircraft.Engine.NUM_ENGINES), + } + prob.model.add_subsystem( "nacelle", - NacelleMass(aviary_options=get_flops_inputs("N3CC", preprocess=True)), + NacelleMass(**options), promotes_inputs=['*'], promotes_outputs=['*'], ) @@ -142,10 +149,18 @@ def test_case_multiengine(self): options.set_val(Aircraft.Engine.NUM_ENGINES, 2) engineModel2 = EngineDeck(options=options) engineModel3 = EngineDeck(options=options) + preprocess_propulsion(options, [engineModel1, engineModel2, engineModel3]) - prob.model.add_subsystem('nacelle_mass', NacelleMass( - aviary_options=options), promotes=['*']) + + comp_options = { + Aircraft.Engine.NUM_ENGINES: options.get_val(Aircraft.Engine.NUM_ENGINES), + } + + prob.model.add_subsystem('nacelle_mass', NacelleMass(**comp_options), + promotes=['*']) + prob.setup(force_alloc_complex=True) + prob.set_val(Aircraft.Nacelle.AVG_DIAMETER, np.array([5.0, 3.0, 8.0]), units='ft') prob.set_val(Aircraft.Nacelle.AVG_LENGTH, diff --git a/aviary/subsystems/mass/flops_based/test/test_passenger_service.py b/aviary/subsystems/mass/flops_based/test/test_passenger_service.py index f22c1223b..31cc6e115 100644 --- a/aviary/subsystems/mass/flops_based/test/test_passenger_service.py +++ b/aviary/subsystems/mass/flops_based/test/test_passenger_service.py @@ -67,10 +67,13 @@ def test_case(self): prob = om.Problem() prob.model.add_subsystem( 'passenger_service_weight', - PassengerServiceMass(aviary_options=get_flops_inputs("N3CC")), + PassengerServiceMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + + prob.model_options['*'] = get_flops_options("N3CC", preprocess=True) + prob.setup(check=False, force_alloc_complex=True) prob.set_val(Mission.Design.RANGE, 3500.0, 'nmi') @@ -128,10 +131,13 @@ def test_case(self): prob = om.Problem() prob.model.add_subsystem( 'alternate_passenger_service_weight', - AltPassengerServiceMass(aviary_options=get_flops_inputs("N3CC")), + AltPassengerServiceMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + + prob.model_options['*'] = get_flops_options("N3CC", preprocess=True) + prob.setup(check=False, force_alloc_complex=True) partial_data = prob.check_partials(out_stream=None, method="cs") diff --git a/aviary/subsystems/mass/flops_based/test/test_starter.py b/aviary/subsystems/mass/flops_based/test/test_starter.py index d9b303174..a8577c19d 100644 --- a/aviary/subsystems/mass/flops_based/test/test_starter.py +++ b/aviary/subsystems/mass/flops_based/test/test_starter.py @@ -98,13 +98,16 @@ def tearDown(self): def test_case_2(self): prob = om.Problem() - aviary_options = get_flops_inputs('LargeSingleAisle1FLOPS') - aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([5])) - aviary_options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 5) - aviary_options.set_val(Mission.Constraints.MAX_MACH, 0.785) + + options = { + Aircraft.Engine.NUM_ENGINES: np.array([5]), + Aircraft.Propulsion.TOTAL_NUM_ENGINES: 5, + Mission.Constraints.MAX_MACH: 0.785, + } + prob.model.add_subsystem( "starter_test", - TransportStarterMass(aviary_options=aviary_options), + TransportStarterMass(**options), promotes_outputs=['*'], promotes_inputs=['*'] ) diff --git a/aviary/subsystems/mass/flops_based/test/test_surface_controls.py b/aviary/subsystems/mass/flops_based/test/test_surface_controls.py index 04adc5d5e..961f46502 100644 --- a/aviary/subsystems/mass/flops_based/test/test_surface_controls.py +++ b/aviary/subsystems/mass/flops_based/test/test_surface_controls.py @@ -71,9 +71,12 @@ def test_case(self): prob = om.Problem() prob.model.add_subsystem( "surf_ctrl", - SurfaceControlMass(aviary_options=get_flops_inputs("N3CC")), + SurfaceControlMass(), promotes=['*'] ) + + prob.model_options['*'] = get_flops_options("N3CC", preprocess=True) + prob.setup(check=False, force_alloc_complex=True) prob.set_val(Mission.Design.GROSS_MASS, 130000, 'lbm') prob.set_val(Aircraft.Wing.CONTROL_SURFACE_AREA_RATIO, 1, 'unitless') @@ -137,9 +140,12 @@ def test_case(self): prob = om.Problem() prob.model.add_subsystem( "surf_ctrl", - AltSurfaceControlMass(aviary_options=get_flops_inputs("N3CC")), + AltSurfaceControlMass(), promotes=['*'] ) + + prob.model_options['*'] = get_flops_options("N3CC", preprocess=True) + prob.setup(check=False, force_alloc_complex=True) prob.set_val(Aircraft.Wing.AREA, 1000, 'ft**2') prob.set_val(Aircraft.HorizontalTail.WETTED_AREA, 100, 'ft**2') diff --git a/aviary/subsystems/mass/flops_based/test/test_thrust_reverser.py b/aviary/subsystems/mass/flops_based/test/test_thrust_reverser.py index 72ddedeba..aa09a187a 100644 --- a/aviary/subsystems/mass/flops_based/test/test_thrust_reverser.py +++ b/aviary/subsystems/mass/flops_based/test/test_thrust_reverser.py @@ -119,10 +119,16 @@ def tearDown(self): def test_case(self): prob = om.Problem() + + inputs = get_flops_inputs("N3CC", preprocess=True) + + options = { + Aircraft.Engine.NUM_ENGINES: inputs.get_val(Aircraft.Engine.NUM_ENGINES), + } + prob.model.add_subsystem( "thrust_rev", - ThrustReverserMass(aviary_options=get_flops_inputs( - "N3CC", preprocess=True)), + ThrustReverserMass(**options), promotes=['*'] ) prob.setup(check=False, force_alloc_complex=True) diff --git a/aviary/subsystems/mass/flops_based/test/test_unusable_fuel.py b/aviary/subsystems/mass/flops_based/test/test_unusable_fuel.py index e223671ec..85f79aaf2 100644 --- a/aviary/subsystems/mass/flops_based/test/test_unusable_fuel.py +++ b/aviary/subsystems/mass/flops_based/test/test_unusable_fuel.py @@ -73,13 +73,16 @@ def tearDown(self): def test_case(self): prob = om.Problem() - flops_inputs = get_flops_inputs("N3CC", preprocess=True) + prob.model.add_subsystem( 'unusable_fuel', - TransportUnusableFuelMass(aviary_options=flops_inputs), + TransportUnusableFuelMass(), promotes_outputs=['*'], promotes_inputs=['*'] ) + + prob.model_options['*'] = get_flops_options("N3CC", preprocess=True) + prob.setup(check=False, force_alloc_complex=True) prob.set_val(Aircraft.Fuel.TOTAL_CAPACITY, 30000.0, 'lbm') prob.set_val(Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, 40000.0, 'lbf') @@ -142,7 +145,7 @@ def test_case(self): prob = om.Problem() prob.model.add_subsystem( 'unusable_fuel', - AltUnusableFuelMass(aviary_options=get_flops_inputs("N3CC")), + AltUnusableFuelMass(), promotes_outputs=['*'], promotes_inputs=['*'] ) diff --git a/aviary/subsystems/mass/flops_based/test/test_vertical_tail.py b/aviary/subsystems/mass/flops_based/test/test_vertical_tail.py index 624704534..9df1f1748 100644 --- a/aviary/subsystems/mass/flops_based/test/test_vertical_tail.py +++ b/aviary/subsystems/mass/flops_based/test/test_vertical_tail.py @@ -68,10 +68,13 @@ def test_case(self): prob = om.Problem() prob.model.add_subsystem( "vertical_tail", - VerticalTailMass(aviary_options=get_flops_inputs("N3CC")), + VerticalTailMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) + + prob.model_options['*'] = get_flops_options("N3CC", preprocess=True) + prob.setup(check=False, force_alloc_complex=True) prob.set_val(Aircraft.VerticalTail.AREA, 100, 'ft**2') prob.set_val(Mission.Design.GROSS_MASS, 1000.0, 'lbm') diff --git a/aviary/subsystems/mass/flops_based/test/test_wing_common.py b/aviary/subsystems/mass/flops_based/test/test_wing_common.py index 66cfaceec..97e5e81cc 100644 --- a/aviary/subsystems/mass/flops_based/test/test_wing_common.py +++ b/aviary/subsystems/mass/flops_based/test/test_wing_common.py @@ -202,9 +202,14 @@ def tearDown(self): def test_case(self): prob = om.Problem() + + opts = { + Aircraft.Fuselage.NUM_FUSELAGES: 1, + } + prob.model.add_subsystem( "wing", - WingBendingMass(aviary_options=get_option_defaults()), + WingBendingMass(**opts), promotes_inputs=['*'], promotes_outputs=['*'], ) diff --git a/aviary/subsystems/propulsion/engine_deck.py b/aviary/subsystems/propulsion/engine_deck.py index 6f989d18e..5a1f6b5b2 100644 --- a/aviary/subsystems/propulsion/engine_deck.py +++ b/aviary/subsystems/propulsion/engine_deck.py @@ -770,7 +770,7 @@ def build_pre_mission(self, aviary_inputs) -> om.ExplicitComponent: scaling factors. """ - return SizeEngine(aviary_options=self.options) + return SizeEngine() def _build_engine_interpolator(self, num_nodes, aviary_inputs): """ diff --git a/aviary/subsystems/propulsion/engine_sizing.py b/aviary/subsystems/propulsion/engine_sizing.py index e6dee3a6e..3ccf6e661 100644 --- a/aviary/subsystems/propulsion/engine_sizing.py +++ b/aviary/subsystems/propulsion/engine_sizing.py @@ -34,7 +34,7 @@ def setup(self): def compute(self, inputs, outputs): scale_engine = self.options[Aircraft.Engine.SCALE_PERFORMANCE] - reference_sls_thrust = self.options[Aircraft.Engine.REFERENCE_SLS_THRUST] + reference_sls_thrust, _ = self.options[Aircraft.Engine.REFERENCE_SLS_THRUST] scaled_sls_thrust = inputs[Aircraft.Engine.SCALED_SLS_THRUST] @@ -52,7 +52,7 @@ def setup_partials(self): def compute_partials(self, inputs, J): scale_engine = self.options[Aircraft.Engine.SCALE_PERFORMANCE] - reference_sls_thrust = self.options[Aircraft.Engine.REFERENCE_SLS_THRUST] + reference_sls_thrust, _ = self.options[Aircraft.Engine.REFERENCE_SLS_THRUST] deriv_scale_factor = 0 if scale_engine: diff --git a/aviary/subsystems/propulsion/propulsion_mission.py b/aviary/subsystems/propulsion/propulsion_mission.py index 6237f7dcf..8208d5e10 100644 --- a/aviary/subsystems/propulsion/propulsion_mission.py +++ b/aviary/subsystems/propulsion/propulsion_mission.py @@ -4,6 +4,7 @@ import openmdao.api as om from aviary.utils.aviary_values import AviaryValues +from aviary.variable_info.functions import add_aviary_option from aviary.variable_info.variables import Aircraft, Dynamic, Settings @@ -54,7 +55,7 @@ def setup(self): for i, engine in enumerate(engine_models): self.add_subsystem( engine.name, - subsys=engine.build_mission(num_nodes=nn, aviary_inputs=options), + subsys=engine.build_mission(num_nodes=nn), promotes_inputs=['*'], ) @@ -137,7 +138,7 @@ def setup(self): self.add_subsystem( 'propulsion_sum', - subsys=PropulsionSum(num_nodes=nn, aviary_options=options), + subsys=PropulsionSum(num_nodes=nn), promotes_inputs=['*'], promotes_outputs=['*'], ) @@ -226,17 +227,12 @@ class PropulsionSum(om.ExplicitComponent): def initialize(self): self.options.declare('num_nodes', types=int, lower=0) - - self.options.declare( - 'aviary_options', - types=AviaryValues, - desc='collection of Aircraft/Mission specific options', - ) + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) def setup(self): nn = self.options['num_nodes'] num_engine_type = len( - self.options['aviary_options'].get_val(Aircraft.Engine.NUM_ENGINES) + self.options[Aircraft.Engine.NUM_ENGINES] ) self.add_input( @@ -273,9 +269,8 @@ def setup(self): def setup_partials(self): nn = self.options['num_nodes'] - num_engines = self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES - ) + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] + num_engine_type = len(num_engines) deriv = np.tile(num_engines, nn) @@ -319,9 +314,7 @@ def setup_partials(self): ) def compute(self, inputs, outputs): - num_engines = self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES - ) + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] thrust = inputs[Dynamic.Mission.THRUST] thrust_max = inputs[Dynamic.Mission.THRUST_MAX] diff --git a/aviary/subsystems/propulsion/propulsion_premission.py b/aviary/subsystems/propulsion/propulsion_premission.py index 7480211bf..bd5c022b5 100644 --- a/aviary/subsystems/propulsion/propulsion_premission.py +++ b/aviary/subsystems/propulsion/propulsion_premission.py @@ -4,7 +4,7 @@ import openmdao.api as om from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Settings from aviary.variable_info.enums import Verbosity @@ -57,8 +57,7 @@ def setup(self): self.add_subsystem( 'propulsion_sum', - subsys=PropulsionSum( - aviary_options=options), + subsys=PropulsionSum(), promotes_inputs=['*'], promotes_outputs=['*'] ) @@ -183,13 +182,10 @@ class PropulsionSum(om.ExplicitComponent): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) def setup(self): - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) add_aviary_input(self, Aircraft.Engine.SCALED_SLS_THRUST, val=np.zeros(num_engine_type)) @@ -198,13 +194,13 @@ def setup(self): self, Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, val=0.0) def setup_partials(self): - num_engines = self.options['aviary_options'].get_val(Aircraft.Engine.NUM_ENGINES) + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] self.declare_partials(Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, Aircraft.Engine.SCALED_SLS_THRUST, val=num_engines) def compute(self, inputs, outputs): - num_engines = self.options['aviary_options'].get_val(Aircraft.Engine.NUM_ENGINES) + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] thrust = inputs[Aircraft.Engine.SCALED_SLS_THRUST] diff --git a/aviary/subsystems/propulsion/test/test_engine_scaling.py b/aviary/subsystems/propulsion/test/test_engine_scaling.py index 75daf047b..e045efffb 100644 --- a/aviary/subsystems/propulsion/test/test_engine_scaling.py +++ b/aviary/subsystems/propulsion/test/test_engine_scaling.py @@ -9,7 +9,9 @@ from aviary.utils.aviary_values import AviaryValues from aviary.utils.preprocessors import preprocess_propulsion from aviary.utils.functions import get_path +from aviary.variable_info.functions import extract_options from aviary.variable_info.variables import Aircraft, Dynamic, Mission +from aviary.variable_info.variable_meta_data import _MetaData as BaseMetaData from aviary.subsystems.propulsion.utils import EngineModelVariables @@ -57,11 +59,15 @@ def test_case(self): self.prob.model.add_subsystem( 'engine', EngineScaling( - num_nodes=nn, aviary_options=options, engine_variables=engine_variables + num_nodes=nn, engine_variables=engine_variables ), promotes=['*'], ) + + self.prob.model_options['*'] = extract_options(options, BaseMetaData) + self.prob.setup(force_alloc_complex=True) + self.prob.set_val( 'thrust_net_unscaled', np.ones([nn, count]) * 1000, units='lbf' ) diff --git a/aviary/subsystems/propulsion/test/test_engine_sizing.py b/aviary/subsystems/propulsion/test/test_engine_sizing.py index b273050a9..7c5497d07 100644 --- a/aviary/subsystems/propulsion/test/test_engine_sizing.py +++ b/aviary/subsystems/propulsion/test/test_engine_sizing.py @@ -13,7 +13,7 @@ class EngineSizingTest1(unittest.TestCase): def setUp(self): - self.prob = om.Problem(model=om.Group()) + self.prob = om.Problem() def test_case_multiengine(self): filename = 'models/engines/turbofan_28k.deck' @@ -31,15 +31,22 @@ def test_case_multiengine(self): options.set_val(Aircraft.Engine.GEOPOTENTIAL_ALT, False) engine = EngineDeck(name='engine', options=options) - options.set_val(Aircraft.Engine.REFERENCE_SLS_THRUST, engine.get_val( - Aircraft.Engine.REFERENCE_SLS_THRUST, 'lbf'), 'lbf') # options.set_val(Aircraft.Engine.SCALE_PERFORMANCE, False) # engine2 = EngineDeck(name='engine2', options=options) # preprocess_propulsion(options, [engine, engine2]) - self.prob.model.add_subsystem('engine', SizeEngine( - aviary_options=options), promotes=['*']) + ref_thrust = engine.get_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 'lbf') + + options = { + Aircraft.Engine.SCALE_PERFORMANCE: True, + Aircraft.Engine.REFERENCE_SLS_THRUST: (ref_thrust, 'lbf'), + } + + self.prob.model.add_subsystem('engine', SizeEngine(**options), + promotes=['*']) + self.prob.setup(force_alloc_complex=True) + self.prob.set_val( Aircraft.Engine.SCALED_SLS_THRUST, np.array([15250]), diff --git a/aviary/subsystems/propulsion/test/test_propulsion_mission.py b/aviary/subsystems/propulsion/test/test_propulsion_mission.py index b334b10d3..91b802e7f 100644 --- a/aviary/subsystems/propulsion/test/test_propulsion_mission.py +++ b/aviary/subsystems/propulsion/test/test_propulsion_mission.py @@ -101,12 +101,13 @@ def test_case_1(self): def test_propulsion_sum(self): nn = 2 - options = self.options - options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([3, 2])) + options = { + Aircraft.Engine.NUM_ENGINES: np.array([3, 2]), + } self.prob.model = om.Group() self.prob.model.add_subsystem('propsum', PropulsionSum(num_nodes=nn, - aviary_options=options), + **options), promotes=['*']) self.prob.setup(force_alloc_complex=True) diff --git a/aviary/subsystems/propulsion/test/test_propulsion_premission.py b/aviary/subsystems/propulsion/test/test_propulsion_premission.py index a56a17d3a..a2f84526c 100644 --- a/aviary/subsystems/propulsion/test/test_propulsion_premission.py +++ b/aviary/subsystems/propulsion/test/test_propulsion_premission.py @@ -70,12 +70,12 @@ def test_multi_engine(self): assert_check_partials(partial_data, atol=1e-10, rtol=1e-10) def test_propulsion_sum(self): - options = AviaryValues() - options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([1, 2, 5])) - options.set_val(Settings.VERBOSITY, 0) + options = { + Aircraft.Engine.NUM_ENGINES: np.array([1, 2, 5]), + } self.prob.model = om.Group() self.prob.model.add_subsystem('propsum', - PropulsionSum(aviary_options=options), + PropulsionSum(**options), promotes=['*']) self.prob.setup(force_alloc_complex=True) diff --git a/aviary/subsystems/propulsion/test/test_throttle_allocation.py b/aviary/subsystems/propulsion/test/test_throttle_allocation.py index 969e28c60..a132f562e 100644 --- a/aviary/subsystems/propulsion/test/test_throttle_allocation.py +++ b/aviary/subsystems/propulsion/test/test_throttle_allocation.py @@ -15,17 +15,16 @@ class ThrottleAllocationTest(unittest.TestCase): def setUp(self): - aviary_inputs = AviaryValues() - aviary_inputs.set_val(Aircraft.Engine.NUM_ENGINES, np.array([1, 1, 1])) - - self.aviary_inputs = aviary_inputs + self.options = { + Aircraft.Engine.NUM_ENGINES: np.array([1, 1, 1]), + } def test_derivs_fixed_or_static(self): prob = om.Problem() model = prob.model model.add_subsystem('comp', ThrottleAllocator(num_nodes=4, - aviary_options=self.aviary_inputs, - throttle_allocation=ThrottleAllocation.FIXED), + throttle_allocation=ThrottleAllocation.FIXED, + **self.options), promotes=['*']) prob.setup(force_alloc_complex=True) @@ -41,8 +40,8 @@ def test_derivs_dynamic(self): prob = om.Problem() model = prob.model model.add_subsystem('comp', ThrottleAllocator(num_nodes=4, - aviary_options=self.aviary_inputs, - throttle_allocation=ThrottleAllocation.DYNAMIC), + throttle_allocation=ThrottleAllocation.DYNAMIC, + **self.options), promotes=['*']) prob.setup(force_alloc_complex=True) diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index 7d8934b44..56b142198 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -5,15 +5,18 @@ from openmdao.utils.assert_utils import assert_near_equal, assert_check_partials from aviary.subsystems.premission import CorePreMission +from aviary.subsystems.propulsion.utils import build_engine_deck from aviary.utils.aviary_values import AviaryValues from aviary.utils.functions import set_aviary_initial_values +from aviary.utils.preprocessors import preprocess_options +from aviary.utils.test_utils.default_subsystems import get_default_premission_subsystems from aviary.validation_cases.validation_tests import ( flops_validation_test, get_flops_inputs, get_flops_outputs, get_flops_case_names, print_case ) + +from aviary.variable_info.functions import extract_options from aviary.variable_info.variables import Aircraft, Mission, Settings -from aviary.subsystems.propulsion.utils import build_engine_deck -from aviary.utils.test_utils.default_subsystems import get_default_premission_subsystems -from aviary.utils.preprocessors import preprocess_options +from aviary.variable_info.variable_meta_data import _MetaData as BaseMetaData class PreMissionGroupTest(unittest.TestCase): @@ -45,6 +48,8 @@ def test_case(self, case_name): promotes_outputs=['*'], ) + self.prob.model_options['*'] = extract_options(flops_inputs, BaseMetaData) + prob.setup(check=False, force_alloc_complex=True) prob.set_solver_print(2) @@ -104,6 +109,8 @@ def test_diff_configuration_mass(self): promotes_outputs=['*'], ) + self.prob.model_options['*'] = extract_options(flops_inputs, BaseMetaData) + prob.setup(check=False) set_aviary_initial_values(prob, flops_inputs) From 1eb1c79d4a2e7b35fad0f3a58290c5a0b74c9e80 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Wed, 25 Sep 2024 15:23:29 -0400 Subject: [PATCH 10/58] Most unit tests pass in gasp --- .../test/test_time_integration_phases.py | 11 +- .../aerodynamics/aerodynamics_builder.py | 6 +- .../test/test_computed_aero_group.py | 7 +- .../gasp_based/flaps_model/flaps_model.py | 14 +- .../gasp_based/flaps_model/meta_model.py | 10 +- .../flaps_model/test/test_flaps_group.py | 12 +- .../flaps_model/test/test_metamodel.py | 22 +-- .../gasp_based/premission_aero.py | 15 +- .../geometry/gasp_based/electric.py | 13 +- .../geometry/gasp_based/empennage.py | 34 +--- .../subsystems/geometry/gasp_based/engine.py | 15 +- .../geometry/gasp_based/fuselage.py | 54 ++---- .../gasp_based/non_dimensional_conversion.py | 54 +++--- .../geometry/gasp_based/size_group.py | 27 +-- .../subsystems/geometry/gasp_based/strut.py | 5 - .../geometry/gasp_based/test/test_electric.py | 13 +- .../gasp_based/test/test_empennage.py | 6 +- .../geometry/gasp_based/test/test_engine.py | 11 +- .../geometry/gasp_based/test/test_fuselage.py | 33 +++- .../test/test_non_dimensional_conversion.py | 36 ++-- .../geometry/gasp_based/test/test_override.py | 9 + .../gasp_based/test/test_size_group.py | 25 +-- .../geometry/gasp_based/test/test_strut.py | 3 +- .../geometry/gasp_based/test/test_wing.py | 45 ++--- aviary/subsystems/geometry/gasp_based/wing.py | 70 +++----- .../subsystems/geometry/geometry_builder.py | 9 +- .../subsystems/mass/gasp_based/design_load.py | 103 ++++------- .../gasp_based/equipment_and_useful_load.py | 47 +++-- aviary/subsystems/mass/gasp_based/fixed.py | 169 ++++++------------ aviary/subsystems/mass/gasp_based/fuel.py | 56 ++---- .../mass/gasp_based/mass_premission.py | 27 +-- .../mass/gasp_based/test/test_design_load.py | 123 ++++++++----- .../test/test_equipment_and_useful_load.py | 40 +++-- .../mass/gasp_based/test/test_fixed.py | 93 ++++++---- .../mass/gasp_based/test/test_fuel.py | 47 ++--- .../gasp_based/test/test_mass_summation.py | 91 ++++------ .../mass/gasp_based/test/test_wing.py | 54 ++++-- aviary/subsystems/mass/gasp_based/wing.py | 65 +++---- aviary/subsystems/mass/mass_builder.py | 4 +- .../propulsion/test/test_engine_scaling.py | 3 +- .../test/test_flops_based_premission.py | 5 +- aviary/utils/conflict_checks.py | 5 +- aviary/validation_cases/validation_tests.py | 5 +- aviary/variable_info/variable_meta_data.py | 4 +- 44 files changed, 679 insertions(+), 821 deletions(-) diff --git a/aviary/mission/flops_based/phases/test/test_time_integration_phases.py b/aviary/mission/flops_based/phases/test/test_time_integration_phases.py index 4ad6330e5..ffe95a6d2 100644 --- a/aviary/mission/flops_based/phases/test/test_time_integration_phases.py +++ b/aviary/mission/flops_based/phases/test/test_time_integration_phases.py @@ -1,3 +1,7 @@ +import warnings +import unittest +import importlib + import openmdao.api as om from openmdao.utils.assert_utils import assert_near_equal @@ -14,12 +18,9 @@ from aviary.subsystems.propulsion.utils import build_engine_deck from aviary.utils.process_input_decks import create_vehicle from aviary.utils.preprocessors import preprocess_propulsion +from aviary.variable_info.functions import extract_options from aviary.variable_info.variable_meta_data import _MetaData as BaseMetaData -import warnings -import unittest -import importlib - @unittest.skipUnless(importlib.util.find_spec("pyoptsparse") is not None, "pyoptsparse is not installed") class HE_SGMDescentTestCase(unittest.TestCase): @@ -102,6 +103,8 @@ def setup_prob(self, phases) -> om.Problem: prob.model.add_objective(Mission.Objectives.FUEL, ref=1e4) + prob.model_options['*'] = extract_options(aviary_options) + with warnings.catch_warnings(): warnings.simplefilter("ignore", om.PromotionWarning) diff --git a/aviary/subsystems/aerodynamics/aerodynamics_builder.py b/aviary/subsystems/aerodynamics/aerodynamics_builder.py index 9d4dfe375..e53fb72ca 100644 --- a/aviary/subsystems/aerodynamics/aerodynamics_builder.py +++ b/aviary/subsystems/aerodynamics/aerodynamics_builder.py @@ -73,17 +73,17 @@ def build_pre_mission(self, aviary_inputs): code_origin = self.code_origin if code_origin is GASP: - aero_group = PreMissionAero(aviary_options=aviary_inputs) + aero_group = PreMissionAero() elif code_origin is FLOPS: aero_group = om.Group() aero_group.add_subsystem( - 'design', Design(aviary_options=aviary_inputs), + 'design', Design(), promotes_inputs=['*'], promotes_outputs=['*']) aero_group.add_subsystem( - 'aero_report', AeroReport(aviary_options=aviary_inputs), + 'aero_report', AeroReport(), promotes_inputs=['*'], promotes_outputs=['*']) diff --git a/aviary/subsystems/aerodynamics/flops_based/test/test_computed_aero_group.py b/aviary/subsystems/aerodynamics/flops_based/test/test_computed_aero_group.py index adffd1eb6..928dcfa59 100644 --- a/aviary/subsystems/aerodynamics/flops_based/test/test_computed_aero_group.py +++ b/aviary/subsystems/aerodynamics/flops_based/test/test_computed_aero_group.py @@ -12,7 +12,6 @@ from aviary.validation_cases.validation_tests import get_flops_inputs, get_flops_outputs from aviary.variable_info.functions import extract_options from aviary.variable_info.variables import Aircraft, Dynamic, Settings -from aviary.variable_info.variable_meta_data import _MetaData class MissionDragTest(unittest.TestCase): @@ -83,7 +82,7 @@ def test_basic_large_single_aisle_1(self): ) # Set all options - prob.model_options['*'] = extract_options(flops_inputs, _MetaData) + prob.model_options['*'] = extract_options(flops_inputs) prob.setup(force_alloc_complex=True) prob.set_solver_print(level=2) @@ -196,7 +195,7 @@ def test_n3cc_drag(self): ) # Set all options - prob.model_options['*'] = extract_options(flops_inputs, _MetaData) + prob.model_options['*'] = extract_options(flops_inputs) prob.setup() @@ -308,7 +307,7 @@ def test_large_single_aisle_2_drag(self): ) # Set all options - prob.model_options['*'] = extract_options(flops_inputs, _MetaData) + prob.model_options['*'] = extract_options(flops_inputs) prob.setup() diff --git a/aviary/subsystems/aerodynamics/gasp_based/flaps_model/flaps_model.py b/aviary/subsystems/aerodynamics/gasp_based/flaps_model/flaps_model.py index 54c842073..ccdd12c8d 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/flaps_model/flaps_model.py +++ b/aviary/subsystems/aerodynamics/gasp_based/flaps_model/flaps_model.py @@ -8,9 +8,9 @@ LiftAndDragIncrements from aviary.subsystems.aerodynamics.gasp_based.flaps_model.meta_model import \ MetaModelGroup -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.enums import FlapType from aviary.variable_info.variables import Aircraft, Dynamic +from aviary.variable_info.functions import add_aviary_option class FlapsGroup(om.Group): @@ -19,10 +19,7 @@ class FlapsGroup(om.Group): """ def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Wing.FLAP_TYPE) # optimum trailing edge flap deflection angle defaults (ADELTO table in GASP) self.optimum_flap_defls = { @@ -37,8 +34,6 @@ def initialize(self): def setup(self): - aviary_options = self.options['aviary_options'] - self.add_subsystem( "BasicFlapsCalculations", BasicFlapsCalculations(), @@ -80,7 +75,7 @@ def setup(self): self.add_subsystem( "LookupTables", - MetaModelGroup(aviary_options=aviary_options), + MetaModelGroup(), promotes_inputs=[ "flap_defl_ratio", "flap_defl", @@ -144,7 +139,6 @@ def setup(self): # set default trailing edge deflection angle per GASP self.set_input_defaults( Aircraft.Wing.OPTIMUM_FLAP_DEFLECTION, - self.optimum_flap_defls[self.options["aviary_options"].get_val( - Aircraft.Wing.FLAP_TYPE, units='unitless')], + self.optimum_flap_defls[self.options[Aircraft.Wing.FLAP_TYPE]], units="deg", ) diff --git a/aviary/subsystems/aerodynamics/gasp_based/flaps_model/meta_model.py b/aviary/subsystems/aerodynamics/gasp_based/flaps_model/meta_model.py index 41df6b4a6..901d1def8 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/flaps_model/meta_model.py +++ b/aviary/subsystems/aerodynamics/gasp_based/flaps_model/meta_model.py @@ -1,22 +1,18 @@ import numpy as np import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.enums import FlapType +from aviary.variable_info.functions import add_aviary_option from aviary.variable_info.variables import Aircraft, Dynamic class MetaModelGroup(om.Group): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Wing.FLAP_TYPE) def setup(self): - flap_type = self.options["aviary_options"].get_val( - Aircraft.Wing.FLAP_TYPE, units='unitless') + flap_type = self.options[Aircraft.Wing.FLAP_TYPE] # VDEL1 VDEL1_interp = self.add_subsystem( diff --git a/aviary/subsystems/aerodynamics/gasp_based/flaps_model/test/test_flaps_group.py b/aviary/subsystems/aerodynamics/gasp_based/flaps_model/test/test_flaps_group.py index 0bf9cb917..3a208ae37 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/flaps_model/test/test_flaps_group.py +++ b/aviary/subsystems/aerodynamics/gasp_based/flaps_model/test/test_flaps_group.py @@ -23,7 +23,7 @@ def setUp(self): options.set_val(Aircraft.Wing.FLAP_TYPE, val=FlapType.TRIPLE_SLOTTED, units='unitless') - self.prob.model = FCC = FlapsGroup(aviary_options=options) + self.prob.model = FCC = FlapsGroup() self.prob.setup() @@ -125,7 +125,7 @@ def setUp(self): options = get_option_defaults() options.set_val(Aircraft.Wing.FLAP_TYPE, val=FlapType.SPLIT, units='unitless') - self.prob.model = FCC = FlapsGroup(aviary_options=options) + self.prob.model = FCC = FlapsGroup() self.prob.setup() @@ -228,7 +228,7 @@ def setUp(self): options.set_val(Aircraft.Wing.FLAP_TYPE, val=FlapType.SINGLE_SLOTTED, units='unitless') - self.prob.model = FCC = FlapsGroup(aviary_options=options) + self.prob.model = FCC = FlapsGroup() self.prob.setup() @@ -331,7 +331,7 @@ def setUp(self): options = get_option_defaults() options.set_val(Aircraft.Wing.FLAP_TYPE, val=FlapType.PLAIN, units='unitless') - self.prob.model = FCC = FlapsGroup(aviary_options=options) + self.prob.model = FCC = FlapsGroup() self.prob.setup() @@ -433,7 +433,7 @@ def setUp(self): options = get_option_defaults() options.set_val(Aircraft.Wing.FLAP_TYPE, val=FlapType.FOWLER, units='unitless') - self.prob.model = FCC = FlapsGroup(aviary_options=options) + self.prob.model = FCC = FlapsGroup() self.prob.setup() @@ -536,7 +536,7 @@ def setUp(self): options.set_val(Aircraft.Wing.FLAP_TYPE, val=FlapType.DOUBLE_SLOTTED_FOWLER, units='unitless') - self.prob.model = FCC = FlapsGroup(aviary_options=options) + self.prob.model = FCC = FlapsGroup() self.prob.setup() diff --git a/aviary/subsystems/aerodynamics/gasp_based/flaps_model/test/test_metamodel.py b/aviary/subsystems/aerodynamics/gasp_based/flaps_model/test/test_metamodel.py index 84581a8ea..4b3740b1b 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/flaps_model/test/test_metamodel.py +++ b/aviary/subsystems/aerodynamics/gasp_based/flaps_model/test/test_metamodel.py @@ -20,9 +20,10 @@ class MetaModelTestCasePlain(unittest.TestCase): def setUp(self): self.prob = om.Problem() - options = get_option_defaults() - options.set_val(Aircraft.Wing.FLAP_TYPE, val=FlapType.PLAIN, units='unitless') - self.prob.model = LuTMMa = MetaModelGroup(aviary_options=options) + options = { + Aircraft.Wing.FLAP_TYPE: FlapType.PLAIN, + } + self.prob.model = LuTMMa = MetaModelGroup(**options) self.prob.setup() self.prob.set_val(Aircraft.Wing.FLAP_CHORD_RATIO, 0.3) @@ -113,10 +114,10 @@ class MetaModelTestCaseSingleSlotted(unittest.TestCase): def setUp(self): self.prob = om.Problem() - options = get_option_defaults() - options.set_val(Aircraft.Wing.FLAP_TYPE, - val=FlapType.SINGLE_SLOTTED, units='unitless') - self.prob.model = LuTMMb = MetaModelGroup(aviary_options=options) + options = { + Aircraft.Wing.FLAP_TYPE: FlapType.SINGLE_SLOTTED, + } + self.prob.model = LuTMMb = MetaModelGroup(**options) self.prob.setup() self.prob.set_val(Aircraft.Wing.FLAP_CHORD_RATIO, 0.3) @@ -152,9 +153,10 @@ class MetaModelTestCaseFowler(unittest.TestCase): def setUp(self): self.prob = om.Problem() - options = get_option_defaults() - options.set_val(Aircraft.Wing.FLAP_TYPE, val=FlapType.FOWLER, units='unitless') - self.prob.model = LuTMMc = MetaModelGroup(aviary_options=options) + options = { + Aircraft.Wing.FLAP_TYPE: FlapType.FOWLER, + } + self.prob.model = LuTMMc = MetaModelGroup(**options) self.prob.setup() self.prob.set_val(Aircraft.Wing.FLAP_CHORD_RATIO, 0.3) diff --git a/aviary/subsystems/aerodynamics/gasp_based/premission_aero.py b/aviary/subsystems/aerodynamics/gasp_based/premission_aero.py index 619b5dd50..788c4438f 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/premission_aero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/premission_aero.py @@ -8,7 +8,6 @@ from aviary.subsystems.atmosphere.atmosphere import Atmosphere from aviary.subsystems.aerodynamics.gasp_based.flaps_model import FlapsGroup -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.variables import Aircraft, Dynamic, Mission from aviary.variable_info.enums import SpeedType @@ -19,16 +18,8 @@ class PreMissionAero(om.Group): """Takeoff and landing flaps modeling""" - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) - def setup(self): - aviary_options = self.options['aviary_options'] - # speeds weren't originally computed here, speedtype of Mach is intended # to avoid multiple sources for computed Mach (gets calculated somewhere upstream) self.add_subsystem( @@ -51,7 +42,7 @@ def setup(self): self.add_subsystem( "flaps_up", - FlapsGroup(aviary_options=aviary_options), + FlapsGroup(), promotes_inputs=[ "*", ("flap_defl", "flap_defl_up"), @@ -61,7 +52,7 @@ def setup(self): ) self.add_subsystem( "flaps_takeoff", - FlapsGroup(aviary_options=aviary_options), + FlapsGroup(), # slat deflection same for takeoff and landing promotes_inputs=["*", ("flap_defl", Aircraft.Wing.FLAP_DEFLECTION_TAKEOFF), ("slat_defl", Aircraft.Wing.MAX_SLAT_DEFLECTION_TAKEOFF)], @@ -79,7 +70,7 @@ def setup(self): ) self.add_subsystem( "flaps_landing", - FlapsGroup(aviary_options=aviary_options), + FlapsGroup(), promotes_inputs=["*", ("flap_defl", Aircraft.Wing.FLAP_DEFLECTION_LANDING), ("slat_defl", Aircraft.Wing.MAX_SLAT_DEFLECTION_LANDING)], promotes_outputs=[ diff --git a/aviary/subsystems/geometry/gasp_based/electric.py b/aviary/subsystems/geometry/gasp_based/electric.py index 2f4811ea6..9aaf0b09e 100644 --- a/aviary/subsystems/geometry/gasp_based/electric.py +++ b/aviary/subsystems/geometry/gasp_based/electric.py @@ -1,24 +1,17 @@ import numpy as np import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft class CableSize(om.ExplicitComponent): def initialize(self): - - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES) def setup(self): - aviary_options = self.options['aviary_options'] - total_num_wing_engines = aviary_options.get_val( - Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES) + total_num_wing_engines = self.options[Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES] add_aviary_input(self, Aircraft.Engine.WING_LOCATIONS, val=np.full(int(total_num_wing_engines/2), 0.35)) diff --git a/aviary/subsystems/geometry/gasp_based/empennage.py b/aviary/subsystems/geometry/gasp_based/empennage.py index c0133bc54..5cdb6aa03 100644 --- a/aviary/subsystems/geometry/gasp_based/empennage.py +++ b/aviary/subsystems/geometry/gasp_based/empennage.py @@ -1,8 +1,7 @@ import numpy as np import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input +from aviary.variable_info.functions import add_aviary_input, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -17,10 +16,6 @@ class TailVolCoef(om.ExplicitComponent): """ def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) self.options.declare( "vertical", default=False, @@ -93,13 +88,6 @@ class TailSize(om.ExplicitComponent): to tail moment arm and the wing span are input. """ - def initialize(self): - - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) - def setup(self): # defaults here for Large Single Aisle 1 horizontal tail self.add_input( @@ -207,10 +195,8 @@ class EmpennageSize(om.Group): """ def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF) + add_aviary_option(self, Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF) def setup(self): # TODO: For cruciform/T-tail configurations, GASP checks to make sure the V tail @@ -220,8 +206,6 @@ def setup(self): # overrides the H tail aspect ratio. H tail taper ratio is used in landing gear # mass calculation. - aviary_options = self.options['aviary_options'] - # higher inputs that are input to groups other than this one, or calculated in groups other than this one higher_level_inputs_htail_vc = [ ("cab_w", Aircraft.Fuselage.AVG_DIAMETER), @@ -288,24 +272,24 @@ def setup(self): ("vol_coef", Aircraft.VerticalTail.VOLUME_COEFFICIENT), ] - if self.options["aviary_options"].get_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, units='unitless'): + if self.options[Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF]: self.add_subsystem( "htail_vc", - TailVolCoef(aviary_options=aviary_options), + TailVolCoef(), promotes_inputs=higher_level_inputs_htail_vc + ["aircraft:*"], promotes_outputs=connected_outputs_htail_vc, ) - if self.options["aviary_options"].get_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, units='unitless'): + if self.options[Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF]: self.add_subsystem( "vtail_vc", - TailVolCoef(aviary_options=aviary_options, vertical=True), + TailVolCoef(vertical=True), promotes_inputs=higher_level_inputs_vtail_vc + ["aircraft:*"], promotes_outputs=connected_outputs_vtail_vc, ) self.add_subsystem( "htail", - TailSize(aviary_options=aviary_options,), + TailSize(), promotes_inputs=higher_level_inputs_htail + rename_inputs_htail + connected_inputs_htail @@ -315,7 +299,7 @@ def setup(self): self.add_subsystem( "vtail", - TailSize(aviary_options=aviary_options,), + TailSize(), promotes_inputs=higher_level_inputs_vtail + rename_inputs_vtail + connected_inputs_vtail diff --git a/aviary/subsystems/geometry/gasp_based/engine.py b/aviary/subsystems/geometry/gasp_based/engine.py index 98e203659..20cdc0377 100644 --- a/aviary/subsystems/geometry/gasp_based/engine.py +++ b/aviary/subsystems/geometry/gasp_based/engine.py @@ -1,8 +1,7 @@ import numpy as np import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -10,15 +9,10 @@ class EngineSize(om.ExplicitComponent): """GASP engine geometry calculation.""" def initialize(self): - - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) def setup(self): - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) add_aviary_input(self, Aircraft.Engine.REFERENCE_DIAMETER, np.full(num_engine_type, 5.8)) @@ -36,8 +30,7 @@ def setup(self): def setup_partials(self): # derivatives w.r.t vectorized engine inputs have known sparsity pattern - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) shape = np.arange(num_engine_type) innames = [ diff --git a/aviary/subsystems/geometry/gasp_based/fuselage.py b/aviary/subsystems/geometry/gasp_based/fuselage.py index 8fcb23859..78c9ef600 100644 --- a/aviary/subsystems/geometry/gasp_based/fuselage.py +++ b/aviary/subsystems/geometry/gasp_based/fuselage.py @@ -1,9 +1,8 @@ import numpy as np import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.options import get_option_defaults -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -21,11 +20,12 @@ def dSigXdX(x): class FuselageParameters(om.ExplicitComponent): def initialize(self): - - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.CrewPayload.NUM_PASSENGERS) + add_aviary_option(self, Aircraft.Fuselage.AISLE_WIDTH, units='inch') + add_aviary_option(self, Aircraft.Fuselage.NUM_AISLES) + add_aviary_option(self, Aircraft.Fuselage.NUM_SEATS_ABREAST) + add_aviary_option(self, Aircraft.Fuselage.SEAT_PITCH, units='inch') + add_aviary_option(self, Aircraft.Fuselage.SEAT_WIDTH, units='inch') def setup(self): @@ -51,14 +51,14 @@ def setup(self): ) def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] - seats_abreast = aviary_options.get_val(Aircraft.Fuselage.NUM_SEATS_ABREAST) - seat_width = aviary_options.get_val(Aircraft.Fuselage.SEAT_WIDTH, units='inch') - num_aisle = aviary_options.get_val(Aircraft.Fuselage.NUM_AISLES) - aisle_width = aviary_options.get_val(Aircraft.Fuselage.AISLE_WIDTH, units='inch') - PAX = self.options['aviary_options'].get_val( - Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') - seat_pitch = aviary_options.get_val(Aircraft.Fuselage.SEAT_PITCH, units='inch') + options = self.options + seats_abreast = options[Aircraft.Fuselage.NUM_SEATS_ABREAST] + seat_width, _ = options[Aircraft.Fuselage.SEAT_WIDTH] + num_aisle = options[Aircraft.Fuselage.NUM_AISLES] + aisle_width, _ = options[Aircraft.Fuselage.AISLE_WIDTH] + PAX = options[Aircraft.CrewPayload.NUM_PASSENGERS] + seat_pitch, _= options[Aircraft.Fuselage.SEAT_PITCH] + delta_diameter = inputs[Aircraft.Fuselage.DELTA_DIAMETER] cabin_width = seats_abreast * seat_width + num_aisle * aisle_width + 12 @@ -89,8 +89,8 @@ def compute(self, inputs, outputs): nose_height_b*sigX(100*(seats_abreast-1.5)) def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - seats_abreast = aviary_options.get_val(Aircraft.Fuselage.NUM_SEATS_ABREAST) + options = self.options + seats_abreast = options[Aircraft.Fuselage.NUM_SEATS_ABREAST] J["nose_height", Aircraft.Fuselage.DELTA_DIAMETER] = sigX( 100*(seats_abreast-1.5))*(-1) @@ -99,12 +99,6 @@ def compute_partials(self, inputs, J): class FuselageSize(om.ExplicitComponent): - def initialize(self): - - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) def setup(self): @@ -240,32 +234,22 @@ def compute_partials(self, inputs, J): class FuselageGroup(om.Group): - def initialize(self): - - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) def setup(self): - aviary_options = self.options['aviary_options'] - # outputs from parameters that are used in size but not outside of this group connected_input_outputs = ["cabin_height", "cabin_len", "nose_height"] parameters = self.add_subsystem( "parameters", - FuselageParameters( - aviary_options=aviary_options, - ), + FuselageParameters(), promotes_inputs=["aircraft:*"], promotes_outputs=["aircraft:*"] + connected_input_outputs, ) size = self.add_subsystem( "size", - FuselageSize(aviary_options=aviary_options,), + FuselageSize(), promotes_inputs=connected_input_outputs + ["aircraft:*"], promotes_outputs=["aircraft:*"], ) diff --git a/aviary/subsystems/geometry/gasp_based/non_dimensional_conversion.py b/aviary/subsystems/geometry/gasp_based/non_dimensional_conversion.py index 867976a37..2ea8e963d 100644 --- a/aviary/subsystems/geometry/gasp_based/non_dimensional_conversion.py +++ b/aviary/subsystems/geometry/gasp_based/non_dimensional_conversion.py @@ -1,21 +1,19 @@ import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft class StrutCalcs(om.ExplicitComponent): + def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED) + add_aviary_option(self, Aircraft.Wing.HAS_STRUT) def setup(self): add_aviary_input(self, Aircraft.Wing.SPAN, val=0) - if self.options["aviary_options"].get_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, units='unitless'): + if self.options[Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED]: add_aviary_input(self, Aircraft.Strut.ATTACHMENT_LOCATION, val=0) add_aviary_output( self, Aircraft.Strut.ATTACHMENT_LOCATION_DIMENSIONLESS, val=0) @@ -26,7 +24,7 @@ def setup(self): def setup_partials(self): - if self.options["aviary_options"].get_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, units='unitless'): + if self.options[Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED]: self.declare_partials( Aircraft.Strut.ATTACHMENT_LOCATION_DIMENSIONLESS, [Aircraft.Strut.ATTACHMENT_LOCATION, Aircraft.Wing.SPAN]) else: @@ -37,8 +35,8 @@ def compute(self, inputs, outputs): wing_span = inputs[Aircraft.Wing.SPAN] strut_loc_name = Aircraft.Strut.ATTACHMENT_LOCATION - if self.options["aviary_options"].get_val(Aircraft.Wing.HAS_STRUT, units='unitless'): - if self.options["aviary_options"].get_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, units='unitless'): + if self.options[Aircraft.Wing.HAS_STRUT]: + if self.options[Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED]: strut_x = inputs[strut_loc_name] outputs[strut_loc_name+"_dimensionless"] = strut_x / wing_span else: @@ -49,8 +47,8 @@ def compute_partials(self, inputs, partials): wing_span = inputs[Aircraft.Wing.SPAN] strut_loc_name = Aircraft.Strut.ATTACHMENT_LOCATION - if self.options["aviary_options"].get_val(Aircraft.Wing.HAS_STRUT, units='unitless'): - if self.options["aviary_options"].get_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, units='unitless'): + if self.options[Aircraft.Wing.HAS_STRUT]: + if self.options[Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED]: partials[strut_loc_name+"_dimensionless", strut_loc_name] = 1 / wing_span partials[strut_loc_name+"_dimensionless", Aircraft.Wing.SPAN] = - inputs[strut_loc_name] / wing_span**2 @@ -61,16 +59,14 @@ def compute_partials(self, inputs, partials): class FoldCalcs(om.ExplicitComponent): + def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED) def setup(self): add_aviary_input(self, Aircraft.Wing.SPAN, val=0) - if self.options["aviary_options"].get_val(Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, units='unitless'): + if self.options[Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED]: add_aviary_input(self, Aircraft.Wing.FOLDED_SPAN, val=0) add_aviary_output(self, Aircraft.Wing.FOLDED_SPAN_DIMENSIONLESS, val=0) else: @@ -79,7 +75,7 @@ def setup(self): def setup_partials(self): - if self.options["aviary_options"].get_val(Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, units='unitless'): + if self.options[Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED]: self.declare_partials( Aircraft.Wing.FOLDED_SPAN_DIMENSIONLESS, [Aircraft.Wing.FOLDED_SPAN, Aircraft.Wing.SPAN]) else: @@ -90,7 +86,7 @@ def compute(self, inputs, outputs): wing_span = inputs[Aircraft.Wing.SPAN] folded_span_name = Aircraft.Wing.FOLDED_SPAN - if self.options["aviary_options"].get_val(Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, units='unitless'): + if self.options[Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED]: fold_y = inputs[folded_span_name] outputs[folded_span_name+"_dimensionless"] = fold_y / wing_span else: @@ -101,7 +97,7 @@ def compute_partials(self, inputs, partials): wing_span = inputs[Aircraft.Wing.SPAN] folded_span_name = Aircraft.Wing.FOLDED_SPAN - if self.options["aviary_options"].get_val(Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, units='unitless'): + if self.options[Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED]: partials[folded_span_name+"_dimensionless", folded_span_name] = 1 / wing_span partials[folded_span_name+"_dimensionless", Aircraft.Wing.SPAN] = - \ inputs[folded_span_name] / (wing_span**2) @@ -112,29 +108,25 @@ def compute_partials(self, inputs, partials): class DimensionalNonDimensionalInterchange(om.Group): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + def initialize(self): + add_aviary_option(self, Aircraft.Wing.HAS_FOLD) + add_aviary_option(self, Aircraft.Wing.HAS_STRUT) def setup(self): - aviary_options = self.options['aviary_options'] - - if aviary_options.get_val(Aircraft.Wing.HAS_STRUT, units='unitless'): + if self.options[Aircraft.Wing.HAS_STRUT]: self.add_subsystem( "strut_calcs", - StrutCalcs(aviary_options=aviary_options,), + StrutCalcs(), promotes_inputs=["aircraft:*"], promotes_outputs=["aircraft:*"], ) - if aviary_options.get_val(Aircraft.Wing.HAS_FOLD, units='unitless'): + if self.options[Aircraft.Wing.HAS_FOLD]: self.add_subsystem( "fold_calcs", - FoldCalcs(aviary_options=aviary_options,), + FoldCalcs(), promotes_inputs=["aircraft:*"], promotes_outputs=["aircraft:*"], ) diff --git a/aviary/subsystems/geometry/gasp_based/size_group.py b/aviary/subsystems/geometry/gasp_based/size_group.py index c17acae03..bb061764c 100644 --- a/aviary/subsystems/geometry/gasp_based/size_group.py +++ b/aviary/subsystems/geometry/gasp_based/size_group.py @@ -5,61 +5,50 @@ from aviary.subsystems.geometry.gasp_based.engine import EngineSize from aviary.subsystems.geometry.gasp_based.fuselage import FuselageGroup from aviary.subsystems.geometry.gasp_based.wing import WingGroup -from aviary.utils.aviary_values import AviaryValues +from aviary.variable_info.functions import add_aviary_option from aviary.variable_info.variables import Aircraft class SizeGroup(om.Group): - """ Group to pull together all the different components and subgroups of the SIZE subroutine - """ def initialize(self): - - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Electrical.HAS_HYBRID_SYSTEM) def setup(self): - aviary_options = self.options['aviary_options'] self.add_subsystem( "fuselage", - FuselageGroup( - aviary_options=aviary_options, - ), + FuselageGroup(), promotes_inputs=["aircraft:*"], promotes_outputs=["aircraft:*"], ) self.add_subsystem( "wing", - WingGroup( - aviary_options=aviary_options, - ), + WingGroup(), promotes=["aircraft:*", "mission:*"], ) self.add_subsystem( "empennage", - EmpennageSize(aviary_options=aviary_options,), + EmpennageSize(), promotes=["aircraft:*"], ) self.add_subsystem( "engine", - EngineSize(aviary_options=aviary_options,), + EngineSize(), promotes_inputs=["aircraft:*"], promotes_outputs=["aircraft:*"], ) - if self.options["aviary_options"].get_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, units='unitless'): + if self.options[Aircraft.Electrical.HAS_HYBRID_SYSTEM]: self.add_subsystem( "cable", - CableSize(aviary_options=aviary_options,), + CableSize(), promotes_inputs=["aircraft:*"], promotes_outputs=["aircraft:*"], ) diff --git a/aviary/subsystems/geometry/gasp_based/strut.py b/aviary/subsystems/geometry/gasp_based/strut.py index b8bbc9d4b..ad8cedb87 100644 --- a/aviary/subsystems/geometry/gasp_based/strut.py +++ b/aviary/subsystems/geometry/gasp_based/strut.py @@ -9,11 +9,6 @@ class StrutGeom(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) def setup(self): diff --git a/aviary/subsystems/geometry/gasp_based/test/test_electric.py b/aviary/subsystems/geometry/gasp_based/test/test_electric.py index 05ac0bd71..32e9a9a28 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_electric.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_electric.py @@ -5,6 +5,7 @@ from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal from aviary.subsystems.geometry.gasp_based.electric import CableSize +from aviary.variable_info.functions import extract_options from aviary.variable_info.variables import Aircraft from aviary.utils.aviary_values import AviaryValues @@ -17,8 +18,8 @@ def setUp(self): aviary_options = AviaryValues() aviary_options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 2) - self.prob.model.add_subsystem("cable", CableSize( - aviary_options=aviary_options), promotes=["*"]) + self.prob.model.add_subsystem("cable", CableSize(), + promotes=["*"]) self.prob.model.set_input_defaults( Aircraft.Engine.WING_LOCATIONS, 0.35, units="unitless" @@ -30,6 +31,8 @@ def setUp(self): Aircraft.Fuselage.AVG_DIAMETER, 10, units="ft" ) # not actual GASP value + self.prob.model_options['*'] = extract_options(aviary_options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -53,8 +56,8 @@ def test_case_multiengine(self): # aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([2, 4])) aviary_options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 6) - prob.model.add_subsystem("cable", CableSize( - aviary_options=aviary_options), promotes=["*"]) + prob.model.add_subsystem("cable", CableSize(), + promotes=["*"]) prob.model.set_input_defaults( Aircraft.Engine.WING_LOCATIONS, np.array([0.35, 0.2, 0.6]), units="unitless" @@ -66,6 +69,8 @@ def test_case_multiengine(self): Aircraft.Fuselage.AVG_DIAMETER, 10, units="ft" ) + prob.model_options['*'] = extract_options(aviary_options) + prob.setup(check=False, force_alloc_complex=True) prob.run_model() diff --git a/aviary/subsystems/geometry/gasp_based/test/test_empennage.py b/aviary/subsystems/geometry/gasp_based/test/test_empennage.py index d5eb4e813..b778eb509 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_empennage.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_empennage.py @@ -7,6 +7,7 @@ from aviary.subsystems.geometry.gasp_based.empennage import (EmpennageSize, TailSize, TailVolCoef) +from aviary.variable_info.functions import extract_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft @@ -158,7 +159,6 @@ def setUp(self): ) def test_large_sinle_aisle_1_defaults(self): - self.prob.model.emp.options["aviary_options"] = get_option_defaults() self.prob.setup(check=False, force_alloc_complex=True) @@ -193,7 +193,9 @@ def test_large_sinle_aisle_1_calc_volcoefs(self): val=True, units='unitless') options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=True, units='unitless') - self.prob.model.emp.options["aviary_options"] = options + + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) self.prob.set_val( diff --git a/aviary/subsystems/geometry/gasp_based/test/test_engine.py b/aviary/subsystems/geometry/gasp_based/test/test_engine.py index 5e9538972..3c2d6e713 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_engine.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_engine.py @@ -5,6 +5,7 @@ from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal from aviary.subsystems.geometry.gasp_based.engine import EngineSize +from aviary.variable_info.functions import extract_options from aviary.variable_info.variables import Aircraft from aviary.utils.aviary_values import AviaryValues @@ -18,8 +19,7 @@ def setUp(self): aviary_options = AviaryValues() aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([2])) - self.prob.model.add_subsystem("engsz", EngineSize( - aviary_options=aviary_options), promotes=["*"]) + self.prob.model.add_subsystem("engsz", EngineSize(), promotes=["*"]) self.prob.model.set_input_defaults( Aircraft.Engine.REFERENCE_DIAMETER, 5.8, units="ft") @@ -31,6 +31,8 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Nacelle.FINENESS, 2, units="unitless") + self.prob.model_options['*'] = extract_options(aviary_options) + self.prob.setup(check=False, force_alloc_complex=True) def test_large_sinle_aisle_1_defaults(self): @@ -52,8 +54,7 @@ def test_case_multiengine(self): aviary_options = AviaryValues() aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([2, 4])) - prob.model.add_subsystem("cable", EngineSize( - aviary_options=aviary_options), promotes=["*"]) + prob.model.add_subsystem("cable", EngineSize(), promotes=["*"]) prob.model.set_input_defaults( Aircraft.Engine.REFERENCE_DIAMETER, np.array([5.8, 8.2]), units="ft") @@ -65,6 +66,8 @@ def test_case_multiengine(self): prob.model.set_input_defaults( Aircraft.Nacelle.FINENESS, np.array([2, 2.21]), units="unitless") + prob.model_options['*'] = extract_options(aviary_options) + prob.setup(check=False, force_alloc_complex=True) prob.run_model() diff --git a/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py b/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py index b40f34f9d..34935f47e 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py @@ -6,6 +6,7 @@ from aviary.subsystems.geometry.gasp_based.fuselage import (FuselageGroup, FuselageParameters, FuselageSize) +from aviary.variable_info.functions import extract_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft @@ -28,7 +29,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "parameters", - FuselageParameters(aviary_options=options), + FuselageParameters(), promotes=["*"], ) @@ -37,6 +38,8 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units="ft") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -67,7 +70,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "parameters", - FuselageParameters(aviary_options=options), + FuselageParameters(), promotes=["*"], ) @@ -76,6 +79,8 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units="ft") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case2(self): @@ -93,7 +98,7 @@ def test_case2(self): class FuselageSizeTestCase1(unittest.TestCase): - """ + """ this is the GASP test case, input and output values based on large single aisle 1 v3 without bug fix """ @@ -101,7 +106,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( - "size", FuselageSize(aviary_options=get_option_defaults()), promotes=["*"] + "size", FuselageSize(), promotes=["*"] ) self.prob.model.set_input_defaults( @@ -144,7 +149,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( - "parameters", FuselageSize(aviary_options=options), promotes=["*"] + "parameters", FuselageSize(), promotes=["*"] ) self.prob.model.set_input_defaults( @@ -159,6 +164,8 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Fuselage.WETTED_AREA_SCALER, 1, units="unitless") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case2(self): @@ -196,7 +203,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "group", - FuselageGroup(aviary_options=options), + FuselageGroup(), promotes=["*"], ) @@ -211,6 +218,8 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units="ft") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -248,7 +257,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "group", - FuselageGroup(aviary_options=options), + FuselageGroup(), promotes=["*"], ) @@ -267,6 +276,8 @@ def setUp(self): Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units="ft" ) # not actual GASP value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -308,7 +319,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "group", - FuselageGroup(aviary_options=options), + FuselageGroup(), promotes=["*"], ) @@ -327,6 +338,8 @@ def setUp(self): Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units="ft" ) # not actual GASP value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -368,7 +381,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "group", - FuselageGroup(aviary_options=options), + FuselageGroup(), promotes=["*"], ) @@ -387,6 +400,8 @@ def setUp(self): Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units="ft" ) # not actual GASP value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): diff --git a/aviary/subsystems/geometry/gasp_based/test/test_non_dimensional_conversion.py b/aviary/subsystems/geometry/gasp_based/test/test_non_dimensional_conversion.py index adc7f6963..7b52d27f7 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_non_dimensional_conversion.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_non_dimensional_conversion.py @@ -8,6 +8,7 @@ from aviary.variable_info.variables import Aircraft from aviary.subsystems.geometry.gasp_based.non_dimensional_conversion import DimensionalNonDimensionalInterchange +from aviary.variable_info.functions import extract_options from aviary.variable_info.options import get_option_defaults @@ -20,8 +21,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem("dimensionless_calcs", - DimensionalNonDimensionalInterchange( - aviary_options=options), + DimensionalNonDimensionalInterchange(), promotes_inputs=["aircraft:*"], promotes_outputs=["aircraft:*"] ) @@ -33,6 +33,8 @@ def setUp(self): Aircraft.Wing.FOLDED_SPAN, val=118.0, units="ft" ) # not actual GASP value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -55,8 +57,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem("dimensionless_calcs", - DimensionalNonDimensionalInterchange( - aviary_options=options), + DimensionalNonDimensionalInterchange(), promotes_inputs=["aircraft:*"], promotes_outputs=["aircraft:*"] ) @@ -68,6 +69,8 @@ def setUp(self): Aircraft.Wing.FOLDED_SPAN_DIMENSIONLESS, val=0.5, units="unitless" ) # not actual GASP value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -90,8 +93,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem("dimensionless_calcs", - DimensionalNonDimensionalInterchange( - aviary_options=options), + DimensionalNonDimensionalInterchange(), promotes_inputs=["aircraft:*"], promotes_outputs=["aircraft:*"] ) @@ -103,6 +105,8 @@ def setUp(self): Aircraft.Strut.ATTACHMENT_LOCATION, val=118.0, units="ft" ) # not actual GASP value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -125,8 +129,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem("dimensionless_calcs", - DimensionalNonDimensionalInterchange( - aviary_options=options), + DimensionalNonDimensionalInterchange(), promotes_inputs=["aircraft:*"], promotes_outputs=["aircraft:*"] ) @@ -138,6 +141,8 @@ def setUp(self): Aircraft.Strut.ATTACHMENT_LOCATION_DIMENSIONLESS, val=0.5, units="unitless" ) # not actual GASP value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -163,8 +168,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem("dimensionless_calcs", - DimensionalNonDimensionalInterchange( - aviary_options=options), + DimensionalNonDimensionalInterchange(), promotes_inputs=["aircraft:*"], promotes_outputs=["aircraft:*"] ) @@ -179,6 +183,8 @@ def setUp(self): Aircraft.Strut.ATTACHMENT_LOCATION_DIMENSIONLESS, val=0.5, units="unitless" ) # not actual GASP value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -207,8 +213,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem("dimensionless_calcs", - DimensionalNonDimensionalInterchange( - aviary_options=options), + DimensionalNonDimensionalInterchange(), promotes_inputs=["aircraft:*"], promotes_outputs=["aircraft:*"] ) @@ -223,6 +228,8 @@ def setUp(self): Aircraft.Strut.ATTACHMENT_LOCATION, val=90.0, units="ft" ) # not actual GASP value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -251,8 +258,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem("dimensionless_calcs", - DimensionalNonDimensionalInterchange( - aviary_options=options), + DimensionalNonDimensionalInterchange(), promotes_inputs=["aircraft:*"], promotes_outputs=["aircraft:*"] ) @@ -267,6 +273,8 @@ def setUp(self): Aircraft.Strut.ATTACHMENT_LOCATION, val=108.0, units="ft" ) # not actual GASP value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): diff --git a/aviary/subsystems/geometry/gasp_based/test/test_override.py b/aviary/subsystems/geometry/gasp_based/test/test_override.py index c6f77cee7..f7182e7c0 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_override.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_override.py @@ -9,6 +9,7 @@ from aviary.subsystems.propulsion.utils import build_engine_deck from aviary.utils.process_input_decks import create_vehicle from aviary.utils.preprocessors import preprocess_propulsion +from aviary.variable_info.functions import extract_options from aviary.variable_info.variable_meta_data import _MetaData as BaseMetaData import warnings @@ -51,6 +52,8 @@ def test_case1(self): self.aviary_inputs.set_val( Aircraft.Fuselage.WETTED_AREA, val=4000.0, units="ft**2") + prob.model_options['*'] = extract_options(self.aviary_inputs) + with warnings.catch_warnings(): warnings.simplefilter("ignore", om.PromotionWarning) prob.setup() @@ -65,6 +68,8 @@ def test_case2(self): # self.aviary_inputs.set_val(Aircraft.Fuselage.WETTED_AREA, val=4000, units="ft**2") + prob.model_options['*'] = extract_options(self.aviary_inputs) + with warnings.catch_warnings(): warnings.simplefilter("ignore", om.PromotionWarning) prob.setup() @@ -81,6 +86,8 @@ def test_case3(self): self.aviary_inputs.set_val( Aircraft.Fuselage.WETTED_AREA_SCALER, val=0.5, units="unitless") + prob.model_options['*'] = extract_options(self.aviary_inputs) + with warnings.catch_warnings(): warnings.simplefilter("ignore", om.PromotionWarning) prob.setup() @@ -98,6 +105,8 @@ def test_case4(self): self.aviary_inputs.set_val( Aircraft.Fuselage.WETTED_AREA_SCALER, val=0.5, units="unitless") + prob.model_options['*'] = extract_options(self.aviary_inputs) + with warnings.catch_warnings(): warnings.simplefilter("ignore", om.PromotionWarning) prob.setup() diff --git a/aviary/subsystems/geometry/gasp_based/test/test_size_group.py b/aviary/subsystems/geometry/gasp_based/test/test_size_group.py index 0a9530218..be0400e27 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_size_group.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_size_group.py @@ -5,6 +5,7 @@ from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal from aviary.subsystems.geometry.gasp_based.size_group import SizeGroup +from aviary.variable_info.functions import extract_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft, Mission @@ -27,9 +28,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "size", - SizeGroup( - aviary_options=options, - ), + SizeGroup(), promotes=["*"], ) @@ -97,6 +96,8 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Nacelle.FINENESS, 2, units="unitless") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -179,9 +180,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "size", - SizeGroup( - aviary_options=options, - ), + SizeGroup(), promotes=["*"], ) @@ -252,6 +251,8 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Nacelle.FINENESS, 2, units="unitless") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -396,9 +397,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "size", - SizeGroup( - aviary_options=options, - ), + SizeGroup(), promotes=["*"], ) @@ -475,6 +474,8 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Nacelle.FINENESS, 2, units="unitless") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -617,9 +618,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "size", - SizeGroup( - aviary_options=options, - ), + SizeGroup(), promotes=["*"], ) @@ -696,6 +695,8 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Nacelle.FINENESS, 2, units="unitless") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): diff --git a/aviary/subsystems/geometry/gasp_based/test/test_strut.py b/aviary/subsystems/geometry/gasp_based/test/test_strut.py index d2c14daa8..e3eaf569b 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_strut.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_strut.py @@ -12,8 +12,7 @@ class SizeGroupTestCase1(unittest.TestCase): def setUp(self): self.prob = om.Problem() - self.prob.model.add_subsystem("strut", StrutGeom( - aviary_options=get_option_defaults()), promotes=["*"]) + self.prob.model.add_subsystem("strut", StrutGeom(), promotes=["*"]) self.prob.model.set_input_defaults( Aircraft.Strut.AREA_RATIO, val=.2, units=None diff --git a/aviary/subsystems/geometry/gasp_based/test/test_wing.py b/aviary/subsystems/geometry/gasp_based/test/test_wing.py index 0bbd89fbc..105f85f6f 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_wing.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_wing.py @@ -6,6 +6,7 @@ from aviary.subsystems.geometry.gasp_based.wing import (WingFold, WingGroup, WingParameters, WingSize) +from aviary.variable_info.functions import extract_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft, Mission @@ -71,7 +72,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( - "parameters", WingParameters(aviary_options=get_option_defaults()), promotes=["*"] + "parameters", WingParameters(), promotes=["*"] ) self.prob.model.set_input_defaults(Aircraft.Wing.AREA, 1370.3, units="ft**2") @@ -121,7 +122,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( - "parameters", WingParameters(aviary_options=options), promotes=["*"] + "parameters", WingParameters(), promotes=["*"] ) self.prob.model.set_input_defaults(Aircraft.Wing.AREA, 1370.3, units="ft**2") @@ -141,6 +142,8 @@ def setUp(self): Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units="unitless" ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -170,9 +173,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "group", - WingFold( - aviary_options=options, - ), + WingFold(), promotes=["*"], ) @@ -195,6 +196,8 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units="unitless" ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -236,9 +239,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "group", - WingFold( - aviary_options=options - ), + WingFold(), promotes=["*"], ) @@ -261,6 +262,8 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units="unitless" ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -299,7 +302,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( - "group", WingGroup(aviary_options=get_option_defaults()), promotes=["*"] + "group", WingGroup(), promotes=["*"] ) self.prob.model.set_input_defaults( @@ -371,9 +374,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "group", - WingGroup( - aviary_options=options, - ), + WingGroup(), promotes=["*"], ) @@ -410,6 +411,8 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units="unitless" ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -473,9 +476,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "group", - WingGroup( - aviary_options=options, - ), + WingGroup(), promotes=["*"], ) @@ -508,6 +509,8 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units="unitless" ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -567,9 +570,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "group", - WingGroup( - aviary_options=options, - ), + WingGroup(), promotes=["*"], ) @@ -580,6 +581,8 @@ def setUp(self): Aircraft.Strut.ATTACHMENT_LOCATION, val=0, units="ft" ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -623,9 +626,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "group", - WingGroup( - aviary_options=options, - ), + WingGroup(), promotes=["*"], ) @@ -668,6 +669,8 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units="unitless" ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): diff --git a/aviary/subsystems/geometry/gasp_based/wing.py b/aviary/subsystems/geometry/gasp_based/wing.py index 0daf4749d..1acd91773 100644 --- a/aviary/subsystems/geometry/gasp_based/wing.py +++ b/aviary/subsystems/geometry/gasp_based/wing.py @@ -7,18 +7,12 @@ from aviary.subsystems.geometry.gasp_based.strut import StrutGeom from aviary.utils.aviary_values import AviaryValues from aviary.utils.conflict_checks import check_fold_location_definition -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission class WingSize(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) - def setup(self): add_aviary_input(self, Mission.Design.GROSS_MASS, val=152000) @@ -79,11 +73,7 @@ def compute_partials(self, inputs, J): class WingParameters(om.ExplicitComponent): def initialize(self): - - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Wing.HAS_FOLD) def setup(self): @@ -96,7 +86,7 @@ def setup(self): add_aviary_input(self, Aircraft.Fuselage.AVG_DIAMETER, val=10) add_aviary_input(self, Aircraft.Wing.THICKNESS_TO_CHORD_TIP, val=0.1) - if not self.options["aviary_options"].get_val(Aircraft.Wing.HAS_FOLD, units='unitless'): + if not self.options[Aircraft.Wing.HAS_FOLD]: add_aviary_input(self, Aircraft.Fuel.WING_FUEL_FRACTION, val=0.6) add_aviary_output(self, Aircraft.Fuel.WING_VOLUME_GEOMETRIC_MAX, val=0) @@ -207,7 +197,7 @@ def compute(self, inputs, outputs): outputs[Aircraft.Wing.ROOT_CHORD] = root_chord outputs[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED] = tc_ratio_avg - if not self.options["aviary_options"].get_val(Aircraft.Wing.HAS_FOLD, units='unitless'): + if not self.options[Aircraft.Wing.HAS_FOLD]: fuel_vol_frac = inputs[Aircraft.Fuel.WING_FUEL_FRACTION] geometric_fuel_vol = ( @@ -423,7 +413,7 @@ def compute_partials(self, inputs, J): np.pi * AR**2 * trp1**2 / denom / 180 / np.cos(swprad) ** 2 ) - if not self.options["aviary_options"].get_val(Aircraft.Wing.HAS_FOLD, units='unitless'): + if not self.options[Aircraft.Wing.HAS_FOLD]: fuel_vol_frac = inputs[Aircraft.Fuel.WING_FUEL_FRACTION] geometric_fuel_vol = ( fuel_vol_frac @@ -509,16 +499,13 @@ def compute_partials(self, inputs, J): class WingFold(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + def initialize(self): + add_aviary_option(self, Aircraft.Wing.CHOOSE_FOLD_LOCATION) def setup(self): - if not self.options["aviary_options"].get_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, units='unitless'): + if not self.options[Aircraft.Wing.CHOOSE_FOLD_LOCATION]: self.add_input( "strut_y", val=25, @@ -626,7 +613,7 @@ def compute(self, inputs, outputs): tc_ratio_tip = inputs[Aircraft.Wing.THICKNESS_TO_CHORD_TIP] fuel_vol_frac = inputs[Aircraft.Fuel.WING_FUEL_FRACTION] - if not self.options["aviary_options"].get_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, units='unitless'): + if not self.options[Aircraft.Wing.CHOOSE_FOLD_LOCATION]: strut_y = inputs["strut_y"] location = strut_y @@ -679,7 +666,7 @@ def compute_partials(self, inputs, J): tc_ratio_tip = inputs[Aircraft.Wing.THICKNESS_TO_CHORD_TIP] fuel_vol_frac = inputs[Aircraft.Fuel.WING_FUEL_FRACTION] - if not self.options["aviary_options"].get_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, units='unitless'): + if not self.options[Aircraft.Wing.CHOOSE_FOLD_LOCATION]: strut_y = inputs["strut_y"] location = strut_y @@ -953,61 +940,58 @@ def compute_partials(self, inputs, J): class WingGroup(om.Group): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + def initialize(self): + add_aviary_option(self, Aircraft.Wing.CHOOSE_FOLD_LOCATION) + add_aviary_option(self, Aircraft.Wing.HAS_FOLD) + add_aviary_option(self, Aircraft.Wing.HAS_STRUT) def setup(self): - aviary_options = self.options['aviary_options'] + has_fold = self.options[Aircraft.Wing.HAS_FOLD] + has_strut = self.options[Aircraft.Wing.HAS_STRUT] size = self.add_subsystem( "size", - WingSize(aviary_options=aviary_options,), + WingSize(), promotes_inputs=["aircraft:*", "mission:*"], promotes_outputs=["aircraft:*"], ) - if self.options["aviary_options"].get_val(Aircraft.Wing.HAS_FOLD, units='unitless') or self.options["aviary_options"].get_val(Aircraft.Wing.HAS_STRUT, units='unitless'): + if has_fold or has_strut: self.add_subsystem( "dimensionless_calcs", - DimensionalNonDimensionalInterchange(aviary_options=aviary_options), + DimensionalNonDimensionalInterchange(), promotes_inputs=["aircraft:*"], promotes_outputs=["aircraft:*"] ) parameters = self.add_subsystem( "parameters", - WingParameters(aviary_options=aviary_options,), + WingParameters(), promotes_inputs=["aircraft:*"], promotes_outputs=["aircraft:*"], ) - if self.options["aviary_options"].get_val(Aircraft.Wing.HAS_STRUT, units='unitless'): + if has_strut: strut = self.add_subsystem( "strut", - StrutGeom( - aviary_options=aviary_options, - ), + StrutGeom(), promotes_inputs=["aircraft:*"], promotes_outputs=["aircraft:*"], ) - if self.options["aviary_options"].get_val(Aircraft.Wing.HAS_FOLD, units='unitless'): + if has_fold: fold = self.add_subsystem( "fold", - WingFold( - aviary_options=aviary_options, - ), + WingFold(), promotes_inputs=["aircraft:*"], promotes_outputs=["aircraft:*"], ) - if not self.options["aviary_options"].get_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, units='unitless'): - check_fold_location_definition(None, aviary_options) + choose_fold_location = self.options[Aircraft.Wing.CHOOSE_FOLD_LOCATION] + if not choose_fold_location: + check_fold_location_definition(None, choose_fold_location, has_strut) self.promotes("strut", outputs=["strut_y"]) self.promotes("fold", inputs=["strut_y"]) diff --git a/aviary/subsystems/geometry/geometry_builder.py b/aviary/subsystems/geometry/geometry_builder.py index 7c6c899cc..ff0cfa04e 100644 --- a/aviary/subsystems/geometry/geometry_builder.py +++ b/aviary/subsystems/geometry/geometry_builder.py @@ -60,21 +60,20 @@ def build_pre_mission(self, aviary_inputs): geom_group = None if both_geom: - geom_group = CombinedGeometry(aviary_options=aviary_inputs, - code_origin_to_prioritize=code_origin_to_prioritize) + geom_group = CombinedGeometry(code_origin_to_prioritize=code_origin_to_prioritize) elif code_origin is GASP: - geom_group = SizeGroup(aviary_options=aviary_inputs) + geom_group = SizeGroup() geom_group.manual_overrides = None elif code_origin is FLOPS: - geom_group = PrepGeom(aviary_options=aviary_inputs) + geom_group = PrepGeom() geom_group.manual_overrides = None return geom_group def build_mission(self, num_nodes, aviary_inputs, **kwargs): - super().build_mission(num_nodes, aviary_inputs) + super().build_mission(num_nodes) def get_parameters(self, aviary_inputs=None, phase_info=None): num_engine_type = len(aviary_inputs.get_val(Aircraft.Engine.NUM_ENGINES)) diff --git a/aviary/subsystems/mass/gasp_based/design_load.py b/aviary/subsystems/mass/gasp_based/design_load.py index 3b6b2d325..41efc0e9f 100644 --- a/aviary/subsystems/mass/gasp_based/design_load.py +++ b/aviary/subsystems/mass/gasp_based/design_load.py @@ -3,7 +3,7 @@ from aviary.constants import RHO_SEA_LEVEL_ENGLISH from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission @@ -21,17 +21,16 @@ def dquotient(u, v, du, dv): class LoadSpeeds(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Design.PART25_STRUCTURAL_CATEGORY) + add_aviary_option(self, Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES) + add_aviary_option(self, Aircraft.Wing.LOADING_ABOVE_20) def setup(self): add_aviary_input(self, Aircraft.Design.MAX_STRUCTURAL_SPEED, val=200, units="mi/h") - if self.options["aviary_options"].get_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, units='unitless') < 3: + if self.options[Aircraft.Design.PART25_STRUCTURAL_CATEGORY] < 3: add_aviary_input(self, Aircraft.Wing.LOADING, val=128) @@ -62,12 +61,9 @@ def compute(self, inputs, outputs): max_struct_speed_mph = inputs[Aircraft.Design.MAX_STRUCTURAL_SPEED] - CATD = self.options["aviary_options"].get_val( - Aircraft.Design.PART25_STRUCTURAL_CATEGORY, units='unitless') - smooth = self.options["aviary_options"].get_val( - Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, units='unitless') - WGS_greater_than_20_flag = self.options["aviary_options"].get_val( - Aircraft.Wing.LOADING_ABOVE_20, units='unitless') + CATD = self.options[Aircraft.Design.PART25_STRUCTURAL_CATEGORY] + smooth = self.options[Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES] + WGS_greater_than_20_flag = self.options[Aircraft.Wing.LOADING_ABOVE_20] max_struct_speed_kts = max_struct_speed_mph / 1.15 @@ -150,12 +146,9 @@ def compute_partials(self, inputs, partials): max_struct_speed_mph = inputs[Aircraft.Design.MAX_STRUCTURAL_SPEED] - CATD = self.options["aviary_options"].get_val( - Aircraft.Design.PART25_STRUCTURAL_CATEGORY, units='unitless') - smooth = self.options["aviary_options"].get_val( - Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, units='unitless') - WGS_greater_than_20_flag = self.options["aviary_options"].get_val( - Aircraft.Wing.LOADING_ABOVE_20, units='unitless') + CATD = self.options[Aircraft.Design.PART25_STRUCTURAL_CATEGORY] + smooth = self.options[Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES] + WGS_greater_than_20_flag = self.options[Aircraft.Wing.LOADING_ABOVE_20] max_struct_speed_kts = max_struct_speed_mph / 1.15 dmax_struct_speed_kts_dmax_struct_speed_mph = 1 / 1.15 @@ -371,10 +364,8 @@ def compute_partials(self, inputs, partials): class LoadParameters(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Design.PART25_STRUCTURAL_CATEGORY) + add_aviary_option(self, Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES) def setup(self): @@ -392,6 +383,12 @@ def setup(self): desc="VM0: maximum operating equivalent airspeed", ) + add_aviary_input( + self, + Mission.Design.CRUISE_ALTITUDE, + units='ft', + ) + self.add_output( "max_mach", val=0, units="unitless", desc="EMM0: maximum operating mach number" ) @@ -414,12 +411,9 @@ def compute(self, inputs, outputs): vel_c = inputs["vel_c"] max_airspeed = inputs["max_airspeed"] - cruise_alt = self.options["aviary_options"].get_val( - Mission.Design.CRUISE_ALTITUDE, units='ft') - CATD = self.options["aviary_options"].get_val( - Aircraft.Design.PART25_STRUCTURAL_CATEGORY, units='unitless') - smooth = self.options["aviary_options"].get_val( - Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, units='unitless') + cruise_alt = inputs[Mission.Design.CRUISE_ALTITUDE] + CATD = self.options[Aircraft.Design.PART25_STRUCTURAL_CATEGORY] + smooth = self.options[Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES] if cruise_alt <= 22500.0: max_mach = max_airspeed / 486.33 @@ -485,12 +479,9 @@ def compute_partials(self, inputs, partials): vel_c = inputs["vel_c"] max_airspeed = inputs["max_airspeed"] - cruise_alt = self.options["aviary_options"].get_val( - Mission.Design.CRUISE_ALTITUDE, units='ft') - CATD = self.options["aviary_options"].get_val( - Aircraft.Design.PART25_STRUCTURAL_CATEGORY, units='unitless') - smooth = self.options["aviary_options"].get_val( - Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, units='unitless') + cruise_alt = inputs[Mission.Design.CRUISE_ALTITUDE] + CATD = self.options[Aircraft.Design.PART25_STRUCTURAL_CATEGORY] + smooth = self.options[Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES] if cruise_alt <= 22500.0: max_mach = max_airspeed / 486.33 @@ -673,10 +664,8 @@ def compute_partials(self, inputs, partials): class LoadFactors(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES) + add_aviary_option(self, Aircraft.Design.ULF_CALCULATED_FROM_MANEUVER) def setup(self): @@ -719,10 +708,8 @@ def compute(self, inputs, outputs): avg_chord = inputs[Aircraft.Wing.AVERAGE_CHORD] Cl_alpha = inputs[Aircraft.Design.LIFT_CURVE_SLOPE] - ULF_from_maneuver = self.options["aviary_options"].get_val( - Aircraft.Design.ULF_CALCULATED_FROM_MANEUVER, units='unitless') - smooth = self.options["aviary_options"].get_val( - Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, units='unitless') + ULF_from_maneuver = self.options[Aircraft.Design.ULF_CALCULATED_FROM_MANEUVER] + smooth = self.options[Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES] mass_ratio = ( 2.0 * wing_loading / @@ -781,10 +768,8 @@ def compute_partials(self, inputs, partials): avg_chord = inputs[Aircraft.Wing.AVERAGE_CHORD] Cl_alpha = inputs[Aircraft.Design.LIFT_CURVE_SLOPE] - ULF_from_maneuver = self.options["aviary_options"].get_val( - Aircraft.Design.ULF_CALCULATED_FROM_MANEUVER, units='unitless') - smooth = self.options["aviary_options"].get_val( - Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, units='unitless') + ULF_from_maneuver = self.options[Aircraft.Design.ULF_CALCULATED_FROM_MANEUVER] + smooth = self.options[Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES] mass_ratio = ( 2.0 * wing_loading / @@ -1225,22 +1210,12 @@ def compute_partials(self, inputs, partials): class DesignLoadGroup(om.Group): - def initialize(self): - - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) def setup(self): - aviary_options = self.options['aviary_options'] - self.add_subsystem( "speeds", - LoadSpeeds( - aviary_options=aviary_options, - ), + LoadSpeeds(), promotes_inputs=['aircraft:*'], promotes_outputs=[ "max_airspeed", @@ -1252,10 +1227,12 @@ def setup(self): self.add_subsystem( "params", - LoadParameters( - aviary_options=aviary_options, - ), - promotes_inputs=["max_airspeed", "vel_c"], + LoadParameters(), + promotes_inputs=[ + "max_airspeed", + "vel_c", + Mission.Design.CRUISE_ALTITUDE, + ], promotes_outputs=["density_ratio", "V9", "max_mach"], ) @@ -1268,9 +1245,7 @@ def setup(self): self.add_subsystem( "factors", - LoadFactors( - aviary_options=aviary_options, - ), + LoadFactors(), promotes_inputs=[ "max_maneuver_factor", "min_dive_vel", diff --git a/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py b/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py index 642bafc27..3c345ae31 100644 --- a/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py +++ b/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py @@ -4,7 +4,7 @@ from aviary.constants import GRAV_ENGLISH_LBM from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.enums import GASPEngineType -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission @@ -17,16 +17,17 @@ def dsig(x): class EquipAndUsefulLoadMass(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + def initialize(self): + add_aviary_option(self, Aircraft.CrewPayload.NUM_PASSENGERS) + add_aviary_option(self, Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES) + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) + add_aviary_option(self, Aircraft.Engine.TYPE) + add_aviary_option(self, Aircraft.LandingGear.FIXED_GEAR) + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_ENGINES) def setup(self): - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) add_aviary_input( self, Aircraft.AirConditioning.MASS_COEFFICIENT, val=1, units="unitless") @@ -76,17 +77,15 @@ def setup(self): def compute(self, inputs, outputs): - options: AviaryValues = self.options["aviary_options"] - PAX = options.get_val(Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') - smooth = options.get_val( - Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, units='unitless') + PAX = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] + smooth = self.options[Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES] gross_wt_initial = inputs[Mission.Design.GROSS_MASS] * GRAV_ENGLISH_LBM - num_engines = self.options['aviary_options'].get_val( - Aircraft.Propulsion.TOTAL_NUM_ENGINES, units='unitless') + num_engines = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] fus_len = inputs[Aircraft.Fuselage.LENGTH] wingspan = inputs[Aircraft.Wing.SPAN] - if options.get_val(Aircraft.LandingGear.FIXED_GEAR, units='unitless'): + + if self.options[Aircraft.LandingGear.FIXED_GEAR]: gear_type = 1 else: gear_type = 0 @@ -103,7 +102,7 @@ def compute(self, inputs, outputs): fuel_vol_frac = inputs[Aircraft.Fuel.WING_FUEL_FRACTION] subsystems_wt = inputs[Aircraft.Design.EXTERNAL_SUBSYSTEMS_MASS] - engine_type = options.get_val(Aircraft.Engine.TYPE, units='unitless')[0] + engine_type = self.options[Aircraft.Engine.TYPE][0] APU_wt = 0.0 if PAX > 35.0: @@ -387,19 +386,19 @@ def compute(self, inputs, outputs): GRAV_ENGLISH_LBM def compute_partials(self, inputs, partials): - options = self.options['aviary_options'] - PAX = options.get_val(Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') - smooth = options.get_val( - Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, units='unitless') + PAX = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] + smooth = self.options[Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES] + gross_wt_initial = inputs[Mission.Design.GROSS_MASS] * GRAV_ENGLISH_LBM - num_engines = self.options['aviary_options'].get_val( - Aircraft.Propulsion.TOTAL_NUM_ENGINES, units='unitless') + num_engines = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] fus_len = inputs[Aircraft.Fuselage.LENGTH] wingspan = inputs[Aircraft.Wing.SPAN] - if options.get_val(Aircraft.LandingGear.FIXED_GEAR, units='unitless'): + + if self.options[Aircraft.LandingGear.FIXED_GEAR]: gear_type = 1 else: gear_type = 0 + landing_gear_wt = inputs[Aircraft.LandingGear.TOTAL_MASS] * \ GRAV_ENGLISH_LBM control_wt = inputs[Aircraft.Controls.TOTAL_MASS] * GRAV_ENGLISH_LBM @@ -410,7 +409,7 @@ def compute_partials(self, inputs, partials): cabin_width = inputs[Aircraft.Fuselage.AVG_DIAMETER] fuel_vol_frac = inputs[Aircraft.Fuel.WING_FUEL_FRACTION] - engine_type = options.get_val(Aircraft.Engine.TYPE, units='unitless')[0] + engine_type = self.options[Aircraft.Engine.TYPE][0] dAPU_wt_dmass_coeff_0 = 0.0 if ~( diff --git a/aviary/subsystems/mass/gasp_based/fixed.py b/aviary/subsystems/mass/gasp_based/fixed.py index 9b4b28914..9d27fd24d 100644 --- a/aviary/subsystems/mass/gasp_based/fixed.py +++ b/aviary/subsystems/mass/gasp_based/fixed.py @@ -5,7 +5,7 @@ from aviary.constants import GRAV_ENGLISH_LBM, RHO_SEA_LEVEL_ENGLISH from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.enums import FlapType -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission @@ -23,14 +23,13 @@ def dSigXdX(x): class MassParameters(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) + add_aviary_option(self, Aircraft.Engine.NUM_FUSELAGE_ENGINES) + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_ENGINES) + add_aviary_option(self, Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES) def setup(self): - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) add_aviary_input(self, Aircraft.Wing.SWEEP, val=25) add_aviary_input(self, Aircraft.Wing.TAPER_RATIO, val=0.33) @@ -93,14 +92,12 @@ def setup(self): "c_gear_loc", Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0) def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] sweep_c4 = inputs[Aircraft.Wing.SWEEP] taper_ratio = inputs[Aircraft.Wing.TAPER_RATIO] AR = inputs[Aircraft.Wing.ASPECT_RATIO] wingspan = inputs[Aircraft.Wing.SPAN] - num_engines = aviary_options.get_val( - Aircraft.Propulsion.TOTAL_NUM_ENGINES, units='unitless') + num_engines = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] max_mach = inputs["max_mach"] strut_x = inputs[Aircraft.Strut.ATTACHMENT_LOCATION_DIMENSIONLESS] gear_location = inputs[Aircraft.LandingGear.MAIN_GEAR_LOCATION] @@ -114,15 +111,12 @@ def compute(self, inputs, outputs): c_material = 1.0 + 2.5 / (struct_span**0.5) c_strut_braced = 1.0 - strut_x**2 - not_fuselage_mounted = self.options["aviary_options"].get_val( - Aircraft.Engine.NUM_FUSELAGE_ENGINES) == 0 + not_fuselage_mounted = self.options[Aircraft.Engine.NUM_FUSELAGE_ENGINES] == 0 # note: c_gear_loc doesn't actually depend on any of the inputs... perhaps use a # set_input_defaults call to declare this at a higher level c_gear_loc = 1.0 - if aviary_options.get_val( - Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, units='unitless' - ): + if self.options[Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES]: # smooth transition for c_gear_loc from 0.95 to 1 when gear_location varies # between 0 and 1% of span c_gear_loc = .95 * sigX((0.005 - gear_location)*100) + \ @@ -148,14 +142,12 @@ def compute(self, inputs, outputs): outputs["half_sweep"] = half_sweep def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] sweep_c4 = inputs[Aircraft.Wing.SWEEP] taper_ratio = inputs[Aircraft.Wing.TAPER_RATIO] AR = inputs[Aircraft.Wing.ASPECT_RATIO] wingspan = inputs[Aircraft.Wing.SPAN] - num_engines = aviary_options.get_val( - Aircraft.Propulsion.TOTAL_NUM_ENGINES, units='unitless') + num_engines = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] max_mach = inputs["max_mach"] strut_x = inputs[Aircraft.Strut.ATTACHMENT_LOCATION_DIMENSIONLESS] gear_location = inputs[Aircraft.LandingGear.MAIN_GEAR_LOCATION] @@ -168,8 +160,7 @@ def compute_partials(self, inputs, J): struct_span = wingspan / cos_half_sweep c_material = 1.0 + 2.5 / (struct_span**0.5) - not_fuselage_mounted = self.options["aviary_options"].get_val( - Aircraft.Engine.NUM_FUSELAGE_ENGINES) == 0 + not_fuselage_mounted = self.options[Aircraft.Engine.NUM_FUSELAGE_ENGINES] == 0 dTanHS_dSC4 = (1 / np.cos(sweep_c4 * 0.017453) ** 2) * 0.017453 dTanHS_TR = ( @@ -239,9 +230,7 @@ def compute_partials(self, inputs, J): J["c_strut_braced", Aircraft.Strut.ATTACHMENT_LOCATION_DIMENSIONLESS] = \ -2 * strut_x - if aviary_options.get_val( - Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, units='unitless' - ): + if self.options[Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES]: J["c_gear_loc", Aircraft.LandingGear.MAIN_GEAR_LOCATION] = ( .95 * (-100) * dSigXdX((0.005 - gear_location)*100) + 1 * (100) * dSigXdX(100*(gear_location - 0.005))) @@ -249,10 +238,8 @@ def compute_partials(self, inputs, J): class PayloadMass(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.CrewPayload.NUM_PASSENGERS) + add_aviary_option(self, Aircraft.CrewPayload.PASSENGER_MASS_WITH_BAGS, units='lbm') def setup(self): add_aviary_input(self, Aircraft.CrewPayload.CARGO_MASS, val=10040) @@ -276,11 +263,8 @@ def setup(self): val=1.0) def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options['aviary_options'] - pax_mass = aviary_options.get_val( - Aircraft.CrewPayload.PASSENGER_MASS_WITH_BAGS, units='lbm') - PAX = aviary_options.get_val( - Aircraft.CrewPayload.NUM_PASSENGERS, units='unitless') + pax_mass, _ = self.options[Aircraft.CrewPayload.PASSENGER_MASS_WITH_BAGS] + PAX = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] cargo_mass = inputs[Aircraft.CrewPayload.CARGO_MASS] outputs[Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS] = \ @@ -291,10 +275,7 @@ def compute(self, inputs, outputs): class ElectricAugmentationMass(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_ENGINES) def setup(self): self.add_input( @@ -418,8 +399,7 @@ def compute(self, inputs, outputs): motor_spec_wt = inputs["motor_spec_mass"] / GRAV_ENGLISH_LBM inverter_spec_wt = inputs["inverter_spec_mass"] / GRAV_ENGLISH_LBM TMS_spec_wt = inputs["TMS_spec_mass"] * GRAV_ENGLISH_LBM - num_engines = self.options['aviary_options'].get_val( - Aircraft.Propulsion.TOTAL_NUM_ENGINES, units='unitless') + num_engines = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] motor_current = 1000.0 * motor_power / motor_voltage num_wires = motor_current / max_amp_per_wire @@ -460,8 +440,7 @@ def compute_partials(self, inputs, J): motor_spec_wt = inputs["motor_spec_mass"] / GRAV_ENGLISH_LBM inverter_spec_wt = inputs["inverter_spec_mass"] / GRAV_ENGLISH_LBM TMS_spec_wt = inputs["TMS_spec_mass"] * GRAV_ENGLISH_LBM - num_engines = self.options['aviary_options'].get_val( - Aircraft.Propulsion.TOTAL_NUM_ENGINES, units='unitless') + num_engines = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] motor_current = 1000.0 * motor_power / motor_voltage num_wires = motor_current / max_amp_per_wire @@ -575,15 +554,13 @@ def compute_partials(self, inputs, J): class EngineMass(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Electrical.HAS_HYBRID_SYSTEM) + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) + add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_ENGINES) def setup(self): - aviary_options: AviaryValues = self.options['aviary_options'] - num_engine_type = len(aviary_options.get_val(Aircraft.Engine.NUM_ENGINES)) - total_num_engines = aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) + total_num_engines = self.options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] add_aviary_input(self, Aircraft.Engine.MASS_SPECIFIC, val=np.full(num_engine_type, 0.21366)) @@ -608,8 +585,7 @@ def setup(self): add_aviary_input(self, Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0.15) - has_hybrid_system = aviary_options.get_val( - Aircraft.Electrical.HAS_HYBRID_SYSTEM, units='unitless') + has_hybrid_system = self.options[Aircraft.Electrical.HAS_HYBRID_SYSTEM] if has_hybrid_system: self.add_input( @@ -661,8 +637,7 @@ def setup(self): self.declare_partials("wing_mounted_mass", "prop_mass") # derivatives w.r.t vectorized engine inputs have known sparsity pattern - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) shape = np.arange(num_engine_type) self.declare_partials( @@ -743,12 +718,11 @@ def setup(self): ) def compute(self, inputs, outputs): - aviary_options = self.options['aviary_options'] - num_engine_type = len(aviary_options.get_val(Aircraft.Engine.NUM_ENGINES)) + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] + num_engine_type = len(num_engines) eng_spec_wt = inputs[Aircraft.Engine.MASS_SPECIFIC] * GRAV_ENGLISH_LBM Fn_SLS = inputs[Aircraft.Engine.SCALED_SLS_THRUST] - num_engines = aviary_options.get_val( - Aircraft.Engine.NUM_ENGINES, units='unitless') + spec_nacelle_wt = inputs[Aircraft.Nacelle.MASS_SPECIFIC] * GRAV_ENGLISH_LBM nacelle_area = inputs[Aircraft.Nacelle.SURFACE_AREA] @@ -778,15 +752,13 @@ def compute(self, inputs, outputs): outputs["eng_comb_mass"] = (sum( CK5 * dry_wt_eng * num_engines) + CK7 * eng_instl_wt_all) / GRAV_ENGLISH_LBM - if aviary_options.get_val( - Aircraft.Electrical.HAS_HYBRID_SYSTEM, units='unitless' - ): + if self.options[Aircraft.Electrical.HAS_HYBRID_SYSTEM]: aug_wt = inputs["aug_mass"] * GRAV_ENGLISH_LBM outputs["eng_comb_mass"] = (sum(CK5 * dry_wt_eng * num_engines) + CK7 * eng_instl_wt_all + aug_wt) / GRAV_ENGLISH_LBM # prop_wt = np.zeros(num_engine_type) - # prop_idx = np.where(aviary_options.get_val(Aircraft.Engine.HAS_PROPELLERS)) + # prop_idx = np.where(self.options[Aircraft.Engine.HAS_PROPELLERS)) # prop_wt[prop_idx] = inputs["prop_mass"] * GRAV_ENGLISH_LBM prop_wt = inputs["prop_mass"] * GRAV_ENGLISH_LBM outputs["prop_mass_all"] = sum(num_engines * prop_wt) / GRAV_ENGLISH_LBM @@ -804,15 +776,11 @@ def compute(self, inputs, outputs): ) + main_gear_wt * loc_main_gear / (loc_main_gear + 0.001)) / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options['aviary_options'] - num_engine_type = len(aviary_options.get_val(Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) eng_spec_wt = inputs[Aircraft.Engine.MASS_SPECIFIC] * GRAV_ENGLISH_LBM Fn_SLS = inputs[Aircraft.Engine.SCALED_SLS_THRUST] - num_engines = self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES, units='unitless') - total_num_engines = self.options['aviary_options'].get_val( - Aircraft.Propulsion.TOTAL_NUM_ENGINES, units='unitless') + num_engines = self.options[Aircraft.Engine.NUM_ENGINES] spec_nacelle_wt = inputs[Aircraft.Nacelle.MASS_SPECIFIC] * GRAV_ENGLISH_LBM nacelle_area = inputs[Aircraft.Nacelle.SURFACE_AREA] @@ -894,7 +862,7 @@ def compute_partials(self, inputs, J): pod_wt = (nacelle_wt + pylon_wt) eng_instl_wt = c_instl * dry_wt_eng - # prop_idx = np.where(aviary_options.get_val(Aircraft.Engine.HAS_PROPELLERS)) + # prop_idx = np.where(self.options[Aircraft.Engine.HAS_PROPELLERS)) prop_wt = inputs["prop_mass"] * GRAV_ENGLISH_LBM # prop_wt_all = sum(num_engines * prop_wt) / GRAV_ENGLISH_LBM @@ -949,18 +917,12 @@ def compute_partials(self, inputs, J): J["wing_mounted_mass", "prop_mass"] = span_frac_factor_sum * num_engines - if self.options["aviary_options"].get_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, units='unitless'): + if self.options[Aircraft.Electrical.HAS_HYBRID_SYSTEM]: J["eng_comb_mass", "aug_mass"] = 1 class TailMass(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) - def setup(self): add_aviary_input(self, Aircraft.VerticalTail.TAPER_RATIO, val=0.801) add_aviary_input(self, Aircraft.VerticalTail.ASPECT_RATIO, val=1.67) @@ -1578,10 +1540,8 @@ def compute_partials(self, inputs, J): class HighLiftMass(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Wing.FLAP_TYPE) + add_aviary_option(self, Aircraft.Wing.NUM_FLAP_SEGMENTS) def setup(self): add_aviary_input(self, Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT, val=2.66) @@ -1638,11 +1598,10 @@ def setup(self): Mission.Landing.LIFT_COEFFICIENT_MAX]) def compute(self, inputs, outputs): - aviary_options: AviaryValues = self.options["aviary_options"] - flap_type = aviary_options.get_val(Aircraft.Wing.FLAP_TYPE, units='unitless') + flap_type = self.options[Aircraft.Wing.FLAP_TYPE] c_mass_trend_high_lift = inputs[Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT] wing_area = inputs[Aircraft.Wing.AREA] - num_flaps = aviary_options.get_val(Aircraft.Wing.NUM_FLAP_SEGMENTS) + num_flaps = self.options[Aircraft.Wing.NUM_FLAP_SEGMENTS] slat_chord_ratio = inputs[Aircraft.Wing.SLAT_CHORD_RATIO] flap_chord_ratio = inputs[Aircraft.Wing.FLAP_CHORD_RATIO] taper_ratio = inputs[Aircraft.Wing.TAPER_RATIO] @@ -1703,11 +1662,10 @@ def compute(self, inputs, outputs): WLED / GRAV_ENGLISH_LBM def compute_partials(self, inputs, J): - aviary_options: AviaryValues = self.options["aviary_options"] - flap_type = aviary_options.get_val(Aircraft.Wing.FLAP_TYPE, units='unitless') + flap_type = self.options[Aircraft.Wing.FLAP_TYPE] c_mass_trend_high_lift = inputs[Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT] wing_area = inputs[Aircraft.Wing.AREA] - num_flaps = aviary_options.get_val(Aircraft.Wing.NUM_FLAP_SEGMENTS) + num_flaps = self.options[Aircraft.Wing.NUM_FLAP_SEGMENTS] slat_chord_ratio = inputs[Aircraft.Wing.SLAT_CHORD_RATIO] flap_chord_ratio = inputs[Aircraft.Wing.FLAP_CHORD_RATIO] taper_ratio = inputs[Aircraft.Wing.TAPER_RATIO] @@ -2048,11 +2006,6 @@ def compute_partials(self, inputs, J): class ControlMass(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) def setup(self): add_aviary_input( @@ -2275,14 +2228,10 @@ def compute_partials(self, inputs, J): class GearMass(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) def setup(self): - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) add_aviary_input(self, Aircraft.Wing.MOUNTING_TYPE, val=0) add_aviary_input(self, Aircraft.LandingGear.MASS_COEFFICIENT, val=0.04) @@ -2420,22 +2369,13 @@ def compute_partials(self, inputs, J): class FixedMassGroup(om.Group): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Electrical.HAS_HYBRID_SYSTEM) def setup(self): - aviary_options: AviaryValues = self.options['aviary_options'] - - n_eng = aviary_options.get_val( - Aircraft.Propulsion.TOTAL_NUM_ENGINES, units='unitless') self.add_subsystem( "params", - MassParameters( - aviary_options=aviary_options, - ), + MassParameters(), promotes_inputs=["max_mach", ] + ["aircraft:*"], promotes_outputs=["c_strut_braced", "c_gear_loc", "half_sweep", ] + ["aircraft:*"], @@ -2443,54 +2383,51 @@ def setup(self): self.add_subsystem( "payload", - PayloadMass(aviary_options=aviary_options), + PayloadMass(), promotes_inputs=["aircraft:*"], promotes_outputs=["payload_mass_des", "payload_mass_max", ] + ["aircraft:*"], ) self.add_subsystem( "tail", - TailMass(aviary_options=aviary_options), + TailMass(), promotes_inputs=["min_dive_vel", ] + ["aircraft:*", "mission:*"], promotes_outputs=["aircraft:*"], ) self.add_subsystem( "HL", - HighLiftMass(aviary_options=aviary_options), + HighLiftMass(), promotes_inputs=["density"] + ["aircraft:*", "mission:*"], promotes_outputs=["aircraft:*"], ) self.add_subsystem( "controls", - ControlMass(aviary_options=aviary_options), + ControlMass(), promotes_inputs=["min_dive_vel", ] + ["aircraft:*", "mission:*"], promotes_outputs=["aircraft:*"], ) self.add_subsystem( "gear", - GearMass(aviary_options=aviary_options), + GearMass(), promotes_inputs=["mission:*", "aircraft:*"], promotes_outputs=[Aircraft.LandingGear.MAIN_GEAR_MASS, ] + ["aircraft:*"], ) - has_hybrid_system = aviary_options.get_val( - Aircraft.Electrical.HAS_HYBRID_SYSTEM, units='unitless') + has_hybrid_system = self.options[Aircraft.Electrical.HAS_HYBRID_SYSTEM] if has_hybrid_system: self.add_subsystem( "augmentation", - ElectricAugmentationMass( - aviary_options=aviary_options, - ), + ElectricAugmentationMass(), promotes_inputs=["aircraft:*"], promotes_outputs=["aug_mass", ], ) self.add_subsystem( "engine", - EngineMass(aviary_options=aviary_options), + EngineMass(), promotes_inputs=["aircraft:*"] + [Aircraft.LandingGear.MAIN_GEAR_MASS, ], promotes_outputs=["wing_mounted_mass", "eng_comb_mass"] + ["aircraft:*"], ) diff --git a/aviary/subsystems/mass/gasp_based/fuel.py b/aviary/subsystems/mass/gasp_based/fuel.py index df1734897..edc865a91 100644 --- a/aviary/subsystems/mass/gasp_based/fuel.py +++ b/aviary/subsystems/mass/gasp_based/fuel.py @@ -3,8 +3,7 @@ import openmdao.api as om from aviary.constants import GRAV_ENGLISH_LBM -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission check = 1 @@ -26,11 +25,9 @@ def dSigXdX(x): class BodyTankCalculations(om.ExplicitComponent): + def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES) def setup(self): @@ -129,8 +126,7 @@ def compute(self, inputs, outputs): fuel_wt_des = inputs[Mission.Design.FUEL_MASS] * GRAV_ENGLISH_LBM OEW = inputs[Aircraft.Design.OPERATING_MASS] * GRAV_ENGLISH_LBM - smooth = self.options["aviary_options"].get_val( - Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, units='unitless') + smooth = self.options[Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES] extra_fuel_volume = sigX(design_fuel_vol - max_wingfuel_vol) * ( design_fuel_vol - geometric_fuel_vol @@ -179,8 +175,7 @@ def compute_partials(self, inputs, J): fuel_wt_des = inputs[Mission.Design.FUEL_MASS] * GRAV_ENGLISH_LBM OEW = inputs[Aircraft.Design.OPERATING_MASS] * GRAV_ENGLISH_LBM - smooth = self.options["aviary_options"].get_val( - Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, units='unitless') + smooth = self.options[Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES] extra_fuel_volume = sigX(design_fuel_vol - max_wingfuel_vol) * ( design_fuel_vol - geometric_fuel_vol @@ -344,11 +339,6 @@ def compute_partials(self, inputs, J): class FuelAndOEMOutputs(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) def setup(self): @@ -711,11 +701,6 @@ def compute_partials(self, inputs, J): class FuelSysAndFullFuselageMass(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) def setup(self): @@ -840,15 +825,12 @@ def compute_partials(self, inputs, J): class FuselageAndStructMass(om.ExplicitComponent): + def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) def setup(self): - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) self.add_input( "fus_mass_full", @@ -1178,11 +1160,6 @@ def compute_partials(self, inputs, J): class FuelMass(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) def setup(self): @@ -1479,16 +1456,9 @@ def compute_partials(self, inputs, J): class FuelMassGroup(om.Group): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) def setup(self): - aviary_options = self.options['aviary_options'] - # variables that are calculated at a higher level higher_level_inputs1 = ["wing_mounted_mass"] higher_level_inputs2 = [ @@ -1521,7 +1491,7 @@ def setup(self): self.add_subsystem( "sys_and_full_fus", - FuelSysAndFullFuselageMass(aviary_options=aviary_options), + FuelSysAndFullFuselageMass(), promotes_inputs=connected_inputs1 + higher_level_inputs1 + ["aircraft:*", "mission:*"], @@ -1530,14 +1500,14 @@ def setup(self): self.add_subsystem( "fus_and_struct", - FuselageAndStructMass(aviary_options=aviary_options), + FuselageAndStructMass(), promotes_inputs=connected_inputs2 + higher_level_inputs2 + ["aircraft:*"], promotes_outputs=["aircraft:*"], ) self.add_subsystem( "fuel", - FuelMass(aviary_options=aviary_options), + FuelMass(), promotes_inputs=higher_level_inputs3 + ["aircraft:*", "mission:*"], promotes_outputs=connected_outputs3 + ["aircraft:*", "mission:*"], @@ -1545,14 +1515,14 @@ def setup(self): self.add_subsystem( "fuel_and_oem", - FuelAndOEMOutputs(aviary_options=aviary_options), + FuelAndOEMOutputs(), promotes_inputs=["aircraft:*", "mission:*"], promotes_outputs=connected_outputs4 + ["aircraft:*"], ) self.add_subsystem( "body_tank", - BodyTankCalculations(aviary_options=aviary_options), + BodyTankCalculations(), promotes_inputs=connected_inputs5 + ["aircraft:*", "mission:*"], promotes_outputs=connected_outputs5 + ["aircraft:*"], diff --git a/aviary/subsystems/mass/gasp_based/mass_premission.py b/aviary/subsystems/mass/gasp_based/mass_premission.py index 1a74a851d..2305eccfd 100644 --- a/aviary/subsystems/mass/gasp_based/mass_premission.py +++ b/aviary/subsystems/mass/gasp_based/mass_premission.py @@ -6,22 +6,13 @@ from aviary.subsystems.mass.gasp_based.fixed import FixedMassGroup from aviary.subsystems.mass.gasp_based.fuel import FuelMassGroup from aviary.subsystems.mass.gasp_based.wing import WingMassGroup -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.variables import Aircraft class MassPremission(om.Group): - def initialize(self): - - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) def setup(self): - aviary_options = self.options['aviary_options'] - # output values from design_load that are connected to fixed_mass via promotion fixed_mass_design_load_values = [ "max_mach", "min_dive_vel"] @@ -62,43 +53,35 @@ def setup(self): self.add_subsystem( "design_load", - DesignLoadGroup( - aviary_options=aviary_options, - ), + DesignLoadGroup(), promotes_inputs=["aircraft:*", "mission:*"], promotes_outputs=["*"], ) self.add_subsystem( "fixed_mass", - FixedMassGroup( - aviary_options=aviary_options, - ), + FixedMassGroup(), promotes_inputs=fixed_mass_inputs + ["aircraft:*", "mission:*"], promotes_outputs=fixed_mass_outputs + ["aircraft:*"], ) self.add_subsystem( "equip_and_useful_mass", - EquipAndUsefulLoadMass( - aviary_options=aviary_options, - ), + EquipAndUsefulLoadMass(), promotes_inputs=["aircraft:*", "mission:*"], promotes_outputs=["aircraft:*"], ) self.add_subsystem( "wing_mass", - WingMassGroup( - aviary_options=aviary_options, - ), + WingMassGroup(), promotes_inputs=wing_mass_inputs + ["aircraft:*", "mission:*"], promotes_outputs=["aircraft:*"], ) self.add_subsystem( "fuel_mass", - FuelMassGroup(aviary_options=aviary_options), + FuelMassGroup(), promotes_inputs=fuel_mass_inputs + ["aircraft:*", "mission:*"], promotes_outputs=[ "aircraft:*", "mission:*" diff --git a/aviary/subsystems/mass/gasp_based/test/test_design_load.py b/aviary/subsystems/mass/gasp_based/test/test_design_load.py index 91f50f664..52a9f4db8 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_design_load.py +++ b/aviary/subsystems/mass/gasp_based/test/test_design_load.py @@ -9,6 +9,7 @@ LoadParameters, LiftCurveSlopeAtCruise, LoadSpeeds) +from aviary.variable_info.functions import extract_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft, Mission @@ -20,7 +21,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "speeds", - LoadSpeeds(aviary_options=get_option_defaults()), + LoadSpeeds(), promotes=["*"], ) @@ -54,7 +55,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "speeds", - LoadSpeeds(aviary_options=options), + LoadSpeeds(), promotes=["*"], ) @@ -65,6 +66,8 @@ def setUp(self): Aircraft.Wing.LOADING, val=128, units="lbf/ft**2" ) # not actual bug fixed value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -98,7 +101,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "speeds", - LoadSpeeds(aviary_options=options), + LoadSpeeds(), promotes=["*"], ) @@ -109,6 +112,8 @@ def setUp(self): Aircraft.Wing.LOADING, val=128, units="lbf/ft**2" ) # not actual bug fixed value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -141,7 +146,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "speeds", - LoadSpeeds(aviary_options=options), + LoadSpeeds(), promotes=["*"], ) @@ -152,6 +157,8 @@ def setUp(self): Aircraft.Wing.LOADING, val=128, units="lbf/ft**2" ) # not actual bug fixed value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -185,7 +192,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "speeds", - LoadSpeeds(aviary_options=options), + LoadSpeeds(), promotes=["*"], ) @@ -193,6 +200,8 @@ def setUp(self): Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units="mi/h" ) # not actual bug fixed value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -223,9 +232,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "speeds", - LoadSpeeds( - aviary_options=options - ), + LoadSpeeds(), promotes=["*"], ) @@ -233,6 +240,8 @@ def setUp(self): Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units="mi/h" ) # bug fixed value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -261,9 +270,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "speeds", - LoadSpeeds( - aviary_options=options - ), + LoadSpeeds(), promotes=["*"], ) @@ -274,6 +281,8 @@ def setUp(self): Aircraft.Wing.LOADING, val=128, units="lbf/ft**2" ) # not actual bug fixed value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -309,9 +318,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "speeds", - LoadSpeeds( - aviary_options=options, - ), + LoadSpeeds(), promotes=["*"], ) @@ -322,6 +329,8 @@ def setUp(self): Aircraft.Wing.LOADING, val=128, units="lbf/ft**2" ) # not actual bug fixed value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -356,9 +365,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "speeds", - LoadSpeeds( - aviary_options=options, - ), + LoadSpeeds(), promotes=["*"], ) @@ -369,6 +376,8 @@ def setUp(self): Aircraft.Wing.LOADING, val=128, units="lbf/ft**2" ) # not actual bug fixed value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -404,9 +413,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "speeds", - LoadSpeeds( - aviary_options=options, - ), + LoadSpeeds(), promotes=["*"], ) @@ -414,6 +421,8 @@ def setUp(self): Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units="mi/h" ) # not actual bug fixed value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -436,12 +445,9 @@ def test_case1(self): class LoadParametersTestCase1(unittest.TestCase): def setUp(self): - options = get_option_defaults() - options.set_val(Mission.Design.CRUISE_ALTITUDE, val=37500, units='ft') - self.prob = om.Problem() self.prob.model.add_subsystem( - "params", LoadParameters(aviary_options=options), promotes=["*"] + "params", LoadParameters(), promotes=["*"] ) self.prob.model.set_input_defaults( @@ -453,6 +459,8 @@ def setUp(self): self.prob.setup(check=False, force_alloc_complex=True) + self.prob.set_val(Mission.Design.CRUISE_ALTITUDE, val=37500, units='ft') + def test_case1(self): self.prob.run_model() @@ -472,11 +480,10 @@ def setUp(self): options = get_option_defaults() options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, val=2, units='unitless') - options.set_val(Mission.Design.CRUISE_ALTITUDE, val=30000, units='ft') self.prob = om.Problem() self.prob.model.add_subsystem( - "params", LoadParameters(aviary_options=options), promotes=["*"] + "params", LoadParameters(), promotes=["*"] ) self.prob.model.set_input_defaults( @@ -486,8 +493,12 @@ def setUp(self): "max_airspeed", val=350, units="kn" ) # bug fixed value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) + self.prob.set_val(Mission.Design.CRUISE_ALTITUDE, val=30000, units='ft') + def test_case1(self): self.prob.run_model() @@ -508,11 +519,10 @@ def setUp(self): options = get_option_defaults() options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, val=4, units='unitless') - options.set_val(Mission.Design.CRUISE_ALTITUDE, val=22000, units='ft') self.prob = om.Problem() self.prob.model.add_subsystem( - "params", LoadParameters(aviary_options=options), promotes=["*"] + "params", LoadParameters(), promotes=["*"] ) self.prob.model.set_input_defaults( @@ -522,8 +532,12 @@ def setUp(self): "max_airspeed", val=350, units="kn" ) # bug fixed value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) + self.prob.set_val(Mission.Design.CRUISE_ALTITUDE, val=22000, units='ft') + def test_case1(self): self.prob.run_model() @@ -543,14 +557,13 @@ class LoadParametersTestCase4smooth(unittest.TestCase): def setUp(self): options = get_option_defaults() - options.set_val(Mission.Design.CRUISE_ALTITUDE, val=37500, units='ft') options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, val=True, units='unitless') self.prob = om.Problem() self.prob.model.add_subsystem( "params", - LoadParameters(aviary_options=options,), + LoadParameters(), promotes=["*"], ) @@ -561,8 +574,12 @@ def setUp(self): "max_airspeed", val=350, units="kn" ) # bug fixed value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) + self.prob.set_val(Mission.Design.CRUISE_ALTITUDE, val=37500, units='ft') + def test_case1(self): self.prob.run_model() @@ -582,14 +599,13 @@ def setUp(self): options = get_option_defaults() options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, val=2, units='unitless') - options.set_val(Mission.Design.CRUISE_ALTITUDE, val=30000, units='ft') options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, val=True, units='unitless') self.prob = om.Problem() self.prob.model.add_subsystem( "params", - LoadParameters(aviary_options=options,), + LoadParameters(), promotes=["*"], ) @@ -600,8 +616,12 @@ def setUp(self): "max_airspeed", val=350, units="kn" ) # bug fixed value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) + self.prob.set_val(Mission.Design.CRUISE_ALTITUDE, val=30000, units='ft') + def test_case1(self): self.prob.run_model() @@ -622,14 +642,13 @@ def setUp(self): options = get_option_defaults() options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, val=4, units='unitless') - options.set_val(Mission.Design.CRUISE_ALTITUDE, val=22000, units='ft') options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, val=True, units='unitless') self.prob = om.Problem() self.prob.model.add_subsystem( "params", - LoadParameters(aviary_options=options,), + LoadParameters(), promotes=["*"], ) @@ -640,8 +659,12 @@ def setUp(self): "max_airspeed", val=350, units="kn" ) # bug fixed value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) + self.prob.set_val(Mission.Design.CRUISE_ALTITUDE, val=22000, units='ft') + def test_case1(self): self.prob.run_model() @@ -689,7 +712,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( - "factors", LoadFactors(aviary_options=get_option_defaults()), promotes=["*"] + "factors", LoadFactors(), promotes=["*"] ) self.prob.model.set_input_defaults( @@ -735,7 +758,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( - "factors", LoadFactors(aviary_options=options), promotes=["*"] + "factors", LoadFactors(), promotes=["*"] ) self.prob.model.set_input_defaults( @@ -756,6 +779,8 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Design.LIFT_CURVE_SLOPE, val=7.1765, units="1/rad") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -781,7 +806,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "factors", - LoadFactors(aviary_options=options), + LoadFactors(), promotes=["*"], ) @@ -805,6 +830,8 @@ def setUp(self): Aircraft.Design.LIFT_CURVE_SLOPE, val=7.1765, units="1/rad" ) # bug fixed value and original value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -829,7 +856,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "factors", - LoadFactors(aviary_options=options,), + LoadFactors(), promotes=["*"], ) @@ -851,6 +878,8 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Design.LIFT_CURVE_SLOPE, val=7.1765, units="1/rad") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -869,16 +898,11 @@ def test_case1(self): class DesignLoadGroupTestCase1(unittest.TestCase): def setUp(self): - options = get_option_defaults() - options.set_val(Mission.Design.CRUISE_ALTITUDE, val=37500, units='ft') - self.prob = om.Problem() self.prob.model.add_subsystem( "Dload", - DesignLoadGroup( - aviary_options=options, - ), + DesignLoadGroup(), promotes=["*"], ) @@ -895,6 +919,8 @@ def setUp(self): self.prob.setup(check=False, force_alloc_complex=True) + self.prob.set_val(Mission.Design.CRUISE_ALTITUDE, val=37500, units='ft') + def test_case1(self): self.prob.run_model() @@ -913,7 +939,6 @@ class DesignLoadGroupTestCase2smooth(unittest.TestCase): def setUp(self): options = get_option_defaults() - options.set_val(Mission.Design.CRUISE_ALTITUDE, val=37500, units='ft') options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, val=True, units='unitless') @@ -921,9 +946,7 @@ def setUp(self): self.prob.model.add_subsystem( "Dload", - DesignLoadGroup( - aviary_options=options, - ), + DesignLoadGroup(), promotes=["*"], ) @@ -938,8 +961,12 @@ def setUp(self): Aircraft.Wing.AVERAGE_CHORD, val=12.71, units="ft" ) # bug fixed value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) + self.prob.set_val(Mission.Design.CRUISE_ALTITUDE, val=37500, units='ft') + def test_case1(self): self.prob.run_model() diff --git a/aviary/subsystems/mass/gasp_based/test/test_equipment_and_useful_load.py b/aviary/subsystems/mass/gasp_based/test/test_equipment_and_useful_load.py index fe0d4c988..8fd10865e 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_equipment_and_useful_load.py +++ b/aviary/subsystems/mass/gasp_based/test/test_equipment_and_useful_load.py @@ -6,6 +6,7 @@ from aviary.subsystems.mass.gasp_based.equipment_and_useful_load import \ EquipAndUsefulLoadMass +from aviary.variable_info.functions import extract_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.enums import GASPEngineType from aviary.variable_info.variables import Aircraft, Mission @@ -23,7 +24,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "equip", - EquipAndUsefulLoadMass(aviary_options=options), + EquipAndUsefulLoadMass(), promotes=["*"], ) @@ -85,6 +86,8 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, val=0.6, units="unitless" ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -112,7 +115,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "equip", - EquipAndUsefulLoadMass(aviary_options=options), + EquipAndUsefulLoadMass(), promotes=["*"], ) @@ -174,6 +177,8 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, val=0.6, units="unitless" ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -203,7 +208,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "equip", - EquipAndUsefulLoadMass(aviary_options=options), + EquipAndUsefulLoadMass(), promotes=["*"], ) @@ -265,6 +270,8 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, val=0.6, units="unitless" ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -297,9 +304,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "equip", - EquipAndUsefulLoadMass( - aviary_options=options, - ), + EquipAndUsefulLoadMass(), promotes=["*"], ) @@ -361,6 +366,8 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, val=0.6, units="unitless" ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -391,9 +398,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "equip", - EquipAndUsefulLoadMass( - aviary_options=options, - ), + EquipAndUsefulLoadMass(), promotes=["*"], ) @@ -455,6 +460,8 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, val=0.6, units="unitless" ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -487,9 +494,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "equip", - EquipAndUsefulLoadMass( - aviary_options=options - ), + EquipAndUsefulLoadMass(), promotes=["*"], ) @@ -551,6 +556,8 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, val=0.6, units="unitless" ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -581,7 +588,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "group", - EquipAndUsefulLoadMass(aviary_options=options), + EquipAndUsefulLoadMass(), promotes=["*"], ) @@ -645,6 +652,8 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, val=0.6, units="unitless" ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -683,7 +692,7 @@ def test_case1(self): prob = om.Problem() prob.model.add_subsystem( "equip", - EquipAndUsefulLoadMass(aviary_options=options), + EquipAndUsefulLoadMass(), promotes=["*"], ) @@ -736,6 +745,9 @@ def test_case1(self): Aircraft.Engine.SCALED_SLS_THRUST, val=[29500.0], units="lbf") prob.model.set_input_defaults( Aircraft.Fuel.WING_FUEL_FRACTION, val=0.6, units="unitless") + + prob.model_options['*'] = extract_options(options) + prob.setup(check=False, force_alloc_complex=True) partial_data = prob.check_partials(out_stream=None, method="cs") diff --git a/aviary/subsystems/mass/gasp_based/test/test_fixed.py b/aviary/subsystems/mass/gasp_based/test/test_fixed.py index 500322167..dbd2269c1 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_fixed.py +++ b/aviary/subsystems/mass/gasp_based/test/test_fixed.py @@ -16,6 +16,7 @@ MassParameters, PayloadMass, TailMass) from aviary.utils.aviary_values import AviaryValues, get_keys +from aviary.variable_info.functions import extract_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft, Mission @@ -32,9 +33,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "parameters", - MassParameters( - aviary_options=options - ), + MassParameters(), promotes=["*"], ) @@ -54,6 +53,8 @@ def setUp(self): "max_mach", val=0.9, units="unitless" ) # bug fixed value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -85,9 +86,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "parameters", - MassParameters( - aviary_options=options, - ), + MassParameters(), promotes=["*"], ) @@ -108,6 +107,8 @@ def setUp(self): Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0 ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -140,9 +141,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "parameters", - MassParameters( - aviary_options=options, - ), + MassParameters(), promotes=["*"], ) @@ -163,6 +162,8 @@ def setUp(self): Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0 ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -196,9 +197,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "parameters", - MassParameters( - aviary_options=options, - ), + MassParameters(), promotes=["*"], ) @@ -219,6 +218,8 @@ def setUp(self): Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0 ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -252,9 +253,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "parameters", - MassParameters( - aviary_options=options, - ), + MassParameters(), promotes=["*"], ) @@ -275,6 +274,8 @@ def setUp(self): Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0 ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -308,12 +309,14 @@ def setUp(self): val=200, units="lbm") # bug fixed value and original value self.prob = om.Problem() - self.prob.model.add_subsystem("payload", PayloadMass( - aviary_options=options), promotes=["*"]) + self.prob.model.add_subsystem("payload", PayloadMass(), + promotes=["*"]) self.prob.model.set_input_defaults( Aircraft.CrewPayload.CARGO_MASS, val=10040, units="lbm" ) # bug fixed value and original value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -339,8 +342,12 @@ class ElectricAugmentationTestCase(unittest.TestCase): def setUp(self): self.prob = om.Problem() + + options = { + Aircraft.Propulsion.TOTAL_NUM_ENGINES: 2, + } self.prob.model.add_subsystem( - "aug", ElectricAugmentationMass(aviary_options=get_option_defaults()), promotes=["*"] + "aug", ElectricAugmentationMass(**options), promotes=["*"] ) self.prob.model.set_input_defaults( @@ -391,6 +398,7 @@ def setUp(self): self.prob.model.set_input_defaults( "TMS_spec_mass", val=0.125, units="lbm/kW" ) # electrified diff configuration value v3.6 + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -416,7 +424,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "engine", - EngineMass(aviary_options=options), + EngineMass(), promotes=["*"], ) @@ -454,6 +462,8 @@ def setUp(self): Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0.15, units="unitless" ) # bug fixed value and original value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -490,7 +500,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "engine", - EngineMass(aviary_options=options), + EngineMass(), promotes=["*"], ) @@ -534,6 +544,8 @@ def setUp(self): Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0.15, units="unitless" ) # bug fixed value and original value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -578,7 +590,7 @@ def test_case_1(self): self.prob = om.Problem() self.prob.model.add_subsystem( "engine", - EngineMass(aviary_options=options), + EngineMass(), promotes=["*"], ) @@ -605,6 +617,8 @@ def test_case_1(self): self.prob.model.set_input_defaults( Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0.15, units="unitless") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) self.prob.run_model() @@ -635,7 +649,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( - "tail", TailMass(aviary_options=get_option_defaults()), promotes=["*"] + "tail", TailMass(), promotes=["*"] ) self.prob.model.set_input_defaults( @@ -734,7 +748,7 @@ def setUp(self): aviary_options.set_val(Aircraft.Wing.NUM_FLAP_SEGMENTS, val=2) self.prob.model.add_subsystem( - "HL", HighLiftMass(aviary_options=aviary_options), promotes=["*"] + "HL", HighLiftMass(), promotes=["*"] ) self.prob.model.set_input_defaults( @@ -777,6 +791,8 @@ def setUp(self): Mission.Landing.LIFT_COEFFICIENT_MAX, val=2.3648, units="unitless" ) + self.prob.model_options['*'] = extract_options(aviary_options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -797,8 +813,8 @@ class ControlMassTestCase(unittest.TestCase): def setUp(self): self.prob = om.Problem() - self.prob.model.add_subsystem("payload", ControlMass( - aviary_options=get_option_defaults()), promotes=["*"]) + self.prob.model.add_subsystem("payload", ControlMass(), + promotes=["*"]) self.prob.model.set_input_defaults( Aircraft.Wing.SURFACE_CONTROL_MASS_COEFFICIENT, val=0.95, units="unitless" @@ -853,7 +869,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( - "payload", GearMass(aviary_options=get_option_defaults()), promotes=["*"] + "payload", GearMass(), promotes=["*"] ) self.prob.model.set_input_defaults( @@ -898,7 +914,7 @@ def setUp(self): options = get_option_defaults() self.prob = om.Problem() self.prob.model.add_subsystem( - "payload", GearMass(aviary_options=options), promotes=["*"] + "payload", GearMass(), promotes=["*"] ) self.prob.model.set_input_defaults( @@ -913,6 +929,8 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Wing.MOUNTING_TYPE, val=0.1, units="unitless") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -940,7 +958,7 @@ def test_case1(self): self.prob = om.Problem() self.prob.model.add_subsystem( "gear_mass", - GearMass(aviary_options=options), + GearMass(), promotes=["*"], ) @@ -951,6 +969,8 @@ def test_case1(self): Aircraft.Nacelle.AVG_DIAMETER, val=[7.5, 8.22], units='ft' ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) self.prob.run_model() @@ -978,9 +998,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "group", - FixedMassGroup( - aviary_options=options, - ), + FixedMassGroup(), promotes=["*"], ) @@ -1143,6 +1161,8 @@ def setUp(self): Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0.15, units="unitless" ) # bug fixed value and original value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -1233,9 +1253,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "group", - FixedMassGroup( - aviary_options=options, - ), + FixedMassGroup(), promotes=["*"], ) @@ -1449,6 +1467,8 @@ def setUp(self): "engine.prop_mass", val=0, units="lbm" ) # bug fixed value and original value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -1535,9 +1555,12 @@ def _run_case(self, data): prob = om.Problem() prob.model.add_subsystem( 'fixed_mass', - FixedMassGroup(aviary_options=data), + FixedMassGroup(), promotes=['*'], ) + + prob.model_options['*'] = extract_options(data) + prob.setup(force_alloc_complex=True) for key in get_keys(data): diff --git a/aviary/subsystems/mass/gasp_based/test/test_fuel.py b/aviary/subsystems/mass/gasp_based/test/test_fuel.py index 80dd7ac94..4992431be 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_fuel.py +++ b/aviary/subsystems/mass/gasp_based/test/test_fuel.py @@ -19,7 +19,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( - "wing_calcs", BodyTankCalculations(aviary_options=get_option_defaults(), ), promotes=["*"] + "wing_calcs", BodyTankCalculations(), promotes=["*"] ) self.prob.model.set_input_defaults( @@ -76,7 +76,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( - "wing_calcs", BodyTankCalculations(aviary_options=get_option_defaults(), ), promotes=["*"] + "wing_calcs", BodyTankCalculations(), promotes=["*"] ) self.prob.model.set_input_defaults( @@ -134,7 +134,7 @@ def tearDown(self): def test_case1(self): self.prob = om.Problem() self.prob.model.add_subsystem( - "wing_calcs", BodyTankCalculations(aviary_options=get_option_defaults(), ), promotes=["*"] + "wing_calcs", BodyTankCalculations(), promotes=["*"] ) self.prob.model.set_input_defaults( Aircraft.Fuel.WING_VOLUME_DESIGN, val=989.2, units="ft**3") @@ -165,8 +165,9 @@ class FuelAndOEMTestCase(unittest.TestCase): def setUp(self): self.prob = om.Problem() - self.prob.model.add_subsystem("wing_calcs", FuelAndOEMOutputs( - aviary_options=get_option_defaults(), ), promotes=["*"]) + self.prob.model.add_subsystem("wing_calcs", + FuelAndOEMOutputs(), + promotes=["*"]) self.prob.model.set_input_defaults( Aircraft.Fuel.DENSITY, val=6.687, units="lbm/galUS") @@ -229,8 +230,8 @@ def tearDown(self): def test_case1(self): prob = om.Problem() - prob.model.add_subsystem("wing_calcs", FuelAndOEMOutputs( - aviary_options=get_option_defaults(), ), promotes=["*"] + prob.model.add_subsystem("wing_calcs", FuelAndOEMOutputs(), + promotes=["*"] ) prob.model.set_input_defaults( Aircraft.Fuel.DENSITY, val=6.687, units="lbm/galUS") @@ -267,7 +268,9 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( - "sys_and_fus", FuelSysAndFullFuselageMass(aviary_options=get_option_defaults(), ), promotes=["*"] + "sys_and_fus", + FuelSysAndFullFuselageMass(), + promotes=["*"] ) self.prob.model.set_input_defaults( @@ -320,7 +323,9 @@ def tearDown(self): def test_case1(self): self.prob = om.Problem() self.prob.model.add_subsystem( - "sys_and_fus", FuelSysAndFullFuselageMass(aviary_options=get_option_defaults(), ), promotes=["*"] + "sys_and_fus", + FuelSysAndFullFuselageMass(), + promotes=["*"] ) self.prob.model.set_input_defaults( Mission.Design.GROSS_MASS, val=175400, units="lbm") @@ -351,7 +356,9 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( - "fus_and_struct", FuselageAndStructMass(aviary_options=get_option_defaults(), ), promotes=["*"] + "fus_and_struct", + FuselageAndStructMass(), + promotes=["*"] ) self.prob.model.set_input_defaults("fus_mass_full", val=102270, units="lbm") @@ -426,7 +433,9 @@ def tearDown(self): def test_case1(self): self.prob = om.Problem() self.prob.model.add_subsystem( - "fus_and_struct", FuselageAndStructMass(aviary_options=get_option_defaults(), ), promotes=["*"] + "fus_and_struct", + FuselageAndStructMass(), + promotes=["*"] ) self.prob.model.set_input_defaults("fus_mass_full", val=102270, units="lbm") @@ -478,8 +487,8 @@ class FuelMassTestCase(unittest.TestCase): # this is the large single aisle 1 V def setUp(self): self.prob = om.Problem() - self.prob.model.add_subsystem("fuel", FuelMass( - aviary_options=get_option_defaults(), ), promotes=["*"]) + self.prob.model.add_subsystem("fuel", FuelMass(), + promotes=["*"]) self.prob.model.set_input_defaults( Aircraft.Design.STRUCTURE_MASS, val=50461.0, units="lbm") @@ -540,8 +549,7 @@ def tearDown(self): def test_case1(self): prob = om.Problem() - prob.model.add_subsystem("fuel", FuelMass( - aviary_options=get_option_defaults(), ), promotes=["*"]) + prob.model.add_subsystem("fuel", FuelMass(), promotes=["*"]) prob.model.set_input_defaults( Aircraft.Design.STRUCTURE_MASS, val=50461.0, units="lbm") prob.model.set_input_defaults( @@ -578,8 +586,7 @@ class FuelMassGroupTestCase1(unittest.TestCase): def setUp(self): self.prob = om.Problem() - self.prob.model.add_subsystem("group", FuelMassGroup( - aviary_options=get_option_defaults(), ), promotes=["*"]) + self.prob.model.add_subsystem("group", FuelMassGroup(), promotes=["*"]) # top level self.prob.model.set_input_defaults( @@ -718,8 +725,7 @@ class FuelMassGroupTestCase2( def setUp(self): self.prob = om.Problem() - self.prob.model.add_subsystem("group", FuelMassGroup( - aviary_options=get_option_defaults(), ), promotes=["*"]) + self.prob.model.add_subsystem("group", FuelMassGroup(), promotes=["*"]) # top level self.prob.model.set_input_defaults( @@ -858,8 +864,7 @@ class FuelMassGroupTestCase3( def setUp(self): self.prob = om.Problem() - self.prob.model.add_subsystem("group", FuelMassGroup( - aviary_options=get_option_defaults(), ), promotes=["*"]) + self.prob.model.add_subsystem("group", FuelMassGroup(), promotes=["*"]) # top level self.prob.model.set_input_defaults( diff --git a/aviary/subsystems/mass/gasp_based/test/test_mass_summation.py b/aviary/subsystems/mass/gasp_based/test/test_mass_summation.py index 4101e5325..355837413 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_mass_summation.py +++ b/aviary/subsystems/mass/gasp_based/test/test_mass_summation.py @@ -7,6 +7,7 @@ from aviary.subsystems.geometry.gasp_based.size_group import SizeGroup from aviary.subsystems.mass.gasp_based.mass_premission import MassPremission from aviary.utils.aviary_values import get_items +from aviary.variable_info.functions import extract_options from aviary.variable_info.options import get_option_defaults, is_option from aviary.models.large_single_aisle_1.V3_bug_fixed_IO import ( V3_bug_fixed_non_metadata, V3_bug_fixed_options) @@ -25,9 +26,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "gasp_based_geom", - SizeGroup( - aviary_options=V3_bug_fixed_options, - ), + SizeGroup(), promotes_inputs=["aircraft:*", "mission:*"], promotes_outputs=[ "aircraft:*", @@ -35,9 +34,7 @@ def setUp(self): ) self.prob.model.add_subsystem( "total_mass", - MassPremission( - aviary_options=V3_bug_fixed_options, - ), + MassPremission(), promotes=['*'], ) @@ -56,6 +53,8 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Fuselage.WETTED_AREA_SCALER, val=0.86215, units="unitless") + self.prob.model_options['*'] = extract_options(V3_bug_fixed_options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -194,9 +193,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "size", - SizeGroup( - aviary_options=options, - ), + SizeGroup(), promotes_inputs=["aircraft:*", "mission:*"], promotes_outputs=[ "aircraft:*", @@ -204,9 +201,7 @@ def setUp(self): ) self.prob.model.add_subsystem( "GASP_mass", - MassPremission( - aviary_options=options, - ), + MassPremission(), promotes=["*"], ) @@ -446,6 +441,8 @@ def setUp(self): self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units="ft") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -583,9 +580,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "size", - SizeGroup( - aviary_options=options, - ), + SizeGroup(), promotes_inputs=["aircraft:*", "mission:*"], promotes_outputs=[ "aircraft:*", @@ -593,9 +588,7 @@ def setUp(self): ) self.prob.model.add_subsystem( "GASP_mass", - MassPremission( - aviary_options=options, - ), + MassPremission(), promotes=["*"], ) @@ -836,6 +829,8 @@ def setUp(self): self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units="ft") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -963,9 +958,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "size", - SizeGroup( - aviary_options=options, - ), + SizeGroup(), promotes_inputs=["aircraft:*", "mission:*"], promotes_outputs=[ "aircraft:*", @@ -973,9 +966,7 @@ def setUp(self): ) self.prob.model.add_subsystem( "GASP_mass", - MassPremission( - aviary_options=options, - ), + MassPremission(), promotes=["*"], ) @@ -1217,6 +1208,8 @@ def setUp(self): self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units="ft") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -1344,9 +1337,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "size", - SizeGroup( - aviary_options=options, - ), + SizeGroup(), promotes_inputs=["aircraft:*", "mission:*"], promotes_outputs=[ "aircraft:*", @@ -1354,9 +1345,7 @@ def setUp(self): ) self.prob.model.add_subsystem( "GASP_mass", - MassPremission( - aviary_options=options, - ), + MassPremission(), promotes=["*"], ) @@ -1598,6 +1587,8 @@ def setUp(self): self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units="ft") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -1724,9 +1715,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "size", - SizeGroup( - aviary_options=options, - ), + SizeGroup(), promotes_inputs=["aircraft:*", "mission:*"], promotes_outputs=[ "aircraft:*", @@ -1734,9 +1723,7 @@ def setUp(self): ) self.prob.model.add_subsystem( "GASP_mass", - MassPremission( - aviary_options=options, - ), + MassPremission(), promotes=["*"], ) @@ -1978,6 +1965,8 @@ def setUp(self): self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units="ft") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -2105,9 +2094,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "size", - SizeGroup( - aviary_options=options, - ), + SizeGroup(), promotes_inputs=["aircraft:*", "mission:*"], promotes_outputs=[ "aircraft:*", @@ -2115,9 +2102,7 @@ def setUp(self): ) self.prob.model.add_subsystem( "GASP_mass", - MassPremission( - aviary_options=options, - ), + MassPremission(), promotes=["*"], ) @@ -2363,6 +2348,8 @@ def setUp(self): self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units="ft") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -2496,9 +2483,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "size", - SizeGroup( - aviary_options=options, - ), + SizeGroup(), promotes_inputs=["aircraft:*", "mission:*"], promotes_outputs=[ "aircraft:*", @@ -2506,9 +2491,7 @@ def setUp(self): ) self.prob.model.add_subsystem( "GASP_mass", - MassPremission( - aviary_options=options, - ), + MassPremission(), promotes=["*"], ) @@ -2762,6 +2745,8 @@ def setUp(self): self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units="ft") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -2890,9 +2875,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "size", - SizeGroup( - aviary_options=options, - ), + SizeGroup(), promotes_inputs=["aircraft:*", "mission:*"], promotes_outputs=[ "aircraft:*", @@ -2900,9 +2883,7 @@ def setUp(self): ) self.prob.model.add_subsystem( "GASP_mass", - MassPremission( - aviary_options=options, - ), + MassPremission(), promotes=["*"], ) @@ -3201,6 +3182,8 @@ def setUp(self): self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units="ft") + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): diff --git a/aviary/subsystems/mass/gasp_based/test/test_wing.py b/aviary/subsystems/mass/gasp_based/test/test_wing.py index 7163be6c9..11a026000 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_wing.py +++ b/aviary/subsystems/mass/gasp_based/test/test_wing.py @@ -7,6 +7,7 @@ from aviary.subsystems.mass.gasp_based.wing import (WingMassGroup, WingMassSolve, WingMassTotal) +from aviary.variable_info.functions import extract_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft, Mission @@ -16,8 +17,8 @@ class WingMassSolveTestCase(unittest.TestCase): def setUp(self): self.prob = om.Problem() - self.prob.model.add_subsystem("wingfuel", WingMassSolve( - aviary_options=get_option_defaults()), promotes=["*"]) + self.prob.model.add_subsystem("wingfuel", WingMassSolve(), + promotes=["*"]) self.prob.model.set_input_defaults( Mission.Design.GROSS_MASS, val=175400, units="lbm" @@ -86,8 +87,8 @@ def tearDown(self): def test_case1(self): prob = om.Problem() - prob.model.add_subsystem("wingfuel", WingMassSolve( - aviary_options=get_option_defaults()), promotes=["*"]) + prob.model.add_subsystem("wingfuel", WingMassSolve(), + promotes=["*"]) prob.model.set_input_defaults( Mission.Design.GROSS_MASS, val=175400, units="lbm") prob.model.set_input_defaults( @@ -137,7 +138,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "total", - WingMassTotal(aviary_options=get_option_defaults()), + WingMassTotal(), promotes=["*"], ) @@ -170,7 +171,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "total", - WingMassTotal(aviary_options=options), + WingMassTotal(), promotes=["*"], ) @@ -186,6 +187,8 @@ def setUp(self): Aircraft.Wing.FOLD_MASS_COEFFICIENT, val=0.2, units="unitless" ) # not actual GASP value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -214,7 +217,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "total", - WingMassTotal(aviary_options=options), + WingMassTotal(), promotes=["*"], ) @@ -224,6 +227,8 @@ def setUp(self): Aircraft.Strut.MASS_COEFFICIENT, val=0.5, units="unitless" ) # not actual GASP value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -252,7 +257,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( - "total", WingMassTotal(aviary_options=options), promotes=["*"] + "total", WingMassTotal(), promotes=["*"] ) self.prob.model.set_input_defaults( @@ -270,6 +275,8 @@ def setUp(self): Aircraft.Strut.MASS_COEFFICIENT, val=0.5, units="unitless" ) # not actual GASP value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -303,7 +310,7 @@ def test_case1(self): prob = om.Problem() prob.model.add_subsystem( "total", - WingMassTotal(aviary_options=get_option_defaults()), + WingMassTotal(), promotes=["*"], ) prob.model.set_input_defaults( @@ -334,7 +341,7 @@ def test_case1(self): self.prob = om.Problem() self.prob.model.add_subsystem( "total", - WingMassTotal(aviary_options=options), + WingMassTotal(), promotes=["*"], ) self.prob.model.set_input_defaults( @@ -345,6 +352,9 @@ def test_case1(self): Aircraft.Wing.FOLDING_AREA, val=50, units="ft**2") self.prob.model.set_input_defaults( Aircraft.Wing.FOLD_MASS_COEFFICIENT, val=0.2, units="unitless") + + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) partial_data = self.prob.check_partials(out_stream=None, method="cs") @@ -371,13 +381,16 @@ def test_case1(self): prob = om.Problem() prob.model.add_subsystem( "total", - WingMassTotal(aviary_options=options), + WingMassTotal(), promotes=["*"], ) prob.model.set_input_defaults( "isolated_wing_mass", val=15830.0, units="lbm") prob.model.set_input_defaults( Aircraft.Strut.MASS_COEFFICIENT, val=0.5, units="unitless") + + prob.model_options['*'] = extract_options(options) + prob.setup(check=False, force_alloc_complex=True) partial_data = prob.check_partials(out_stream=None, method="cs") @@ -404,7 +417,7 @@ def test_case1(self): options.set_val(Aircraft.Wing.HAS_STRUT, val=True, units='unitless') prob = om.Problem() prob.model.add_subsystem( - "total", WingMassTotal(aviary_options=options), promotes=["*"]) + "total", WingMassTotal(), promotes=["*"]) prob.model.set_input_defaults( "isolated_wing_mass", val=15830.0, units="lbm") prob.model.set_input_defaults( @@ -415,6 +428,9 @@ def test_case1(self): Aircraft.Wing.FOLD_MASS_COEFFICIENT, val=0.2, units="unitless") prob.model.set_input_defaults( Aircraft.Strut.MASS_COEFFICIENT, val=0.5, units="unitless") + + prob.model_options['*'] = extract_options(options) + prob.setup(check=False, force_alloc_complex=True) partial_data = prob.check_partials(out_stream=None, method="cs") @@ -428,7 +444,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "group", - WingMassGroup(aviary_options=get_option_defaults()), + WingMassGroup(), promotes=["*"], ) @@ -483,7 +499,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "group", - WingMassGroup(aviary_options=options), + WingMassGroup(), promotes=["*"], ) @@ -524,6 +540,8 @@ def setUp(self): Aircraft.Wing.FOLD_MASS_COEFFICIENT, val=0.2, units="unitless" ) # not actual GASP value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -549,7 +567,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( "group", - WingMassGroup(aviary_options=options), + WingMassGroup(), promotes=["*"], ) @@ -584,6 +602,8 @@ def setUp(self): Aircraft.Strut.MASS_COEFFICIENT, val=0.5, units="unitless" ) # not actual GASP value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -609,7 +629,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( - "group", WingMassGroup(aviary_options=options), promotes=["*"] + "group", WingMassGroup(), promotes=["*"] ) self.prob.model.set_input_defaults( @@ -652,6 +672,8 @@ def setUp(self): Aircraft.Strut.MASS_COEFFICIENT, val=0.5, units="unitless" ) # not actual GASP value + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): diff --git a/aviary/subsystems/mass/gasp_based/wing.py b/aviary/subsystems/mass/gasp_based/wing.py index 1f3a75a21..c79f59f19 100644 --- a/aviary/subsystems/mass/gasp_based/wing.py +++ b/aviary/subsystems/mass/gasp_based/wing.py @@ -2,21 +2,16 @@ import openmdao.api as om from aviary.constants import GRAV_ENGLISH_LBM -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input, add_aviary_output +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission class WingMassSolve(om.ImplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) def setup(self): - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) add_aviary_input(self, Mission.Design.GROSS_MASS, val=175400) add_aviary_input(self, Aircraft.Wing.HIGH_LIFT_MASS, val=3645) @@ -288,12 +283,10 @@ def linearize(self, inputs, outputs, J): class WingMassTotal(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + def initialize(self): + add_aviary_option(self, Aircraft.Wing.HAS_FOLD) + add_aviary_option(self, Aircraft.Wing.HAS_STRUT) def setup(self): @@ -304,11 +297,10 @@ def setup(self): desc="WW: wing mass including high lift devices (but excluding struts and fold effects)", ) - if self.options["aviary_options"].get_val(Aircraft.Wing.HAS_STRUT, units='unitless'): + if self.options[Aircraft.Wing.HAS_STRUT]: add_aviary_input(self, Aircraft.Strut.MASS_COEFFICIENT, val=0.000000000001) - if self.options["aviary_options"].get_val(Aircraft.Wing.HAS_FOLD, units='unitless') == True: - + if self.options[Aircraft.Wing.HAS_FOLD]: add_aviary_input(self, Aircraft.Wing.AREA, val=100) add_aviary_input(self, Aircraft.Wing.FOLDING_AREA, val=50) add_aviary_input(self, Aircraft.Wing.FOLD_MASS_COEFFICIENT, val=0.2) @@ -318,10 +310,10 @@ def setup(self): add_aviary_output(self, Aircraft.Wing.FOLD_MASS, val=0) self.declare_partials(Aircraft.Wing.MASS, "*") - if self.options["aviary_options"].get_val(Aircraft.Wing.HAS_STRUT, units='unitless'): + if self.options[Aircraft.Wing.HAS_STRUT]: self.declare_partials(Aircraft.Strut.MASS, [ Aircraft.Strut.MASS_COEFFICIENT, "isolated_wing_mass"]) - if self.options["aviary_options"].get_val(Aircraft.Wing.HAS_FOLD, units='unitless'): + if self.options[Aircraft.Wing.HAS_FOLD]: self.declare_partials(Aircraft.Wing.FOLD_MASS, [ Aircraft.Wing.AREA, Aircraft.Wing.FOLDING_AREA, Aircraft.Wing.FOLD_MASS_COEFFICIENT, "isolated_wing_mass"]) @@ -329,7 +321,7 @@ def compute(self, inputs, outputs): isolated_wing_wt = inputs["isolated_wing_mass"] * GRAV_ENGLISH_LBM - if self.options["aviary_options"].get_val(Aircraft.Wing.HAS_STRUT, units='unitless'): + if self.options[Aircraft.Wing.HAS_STRUT]: c_strut_mass = inputs[Aircraft.Strut.MASS_COEFFICIENT] strut_wt = c_strut_mass * isolated_wing_wt @@ -338,7 +330,7 @@ def compute(self, inputs, outputs): else: outputs[Aircraft.Strut.MASS] = strut_wt = 0 - if self.options["aviary_options"].get_val(Aircraft.Wing.HAS_FOLD, units='unitless'): + if self.options[Aircraft.Wing.HAS_FOLD]: wing_area = inputs[Aircraft.Wing.AREA] folding_area = inputs[Aircraft.Wing.FOLDING_AREA] c_wing_fold = inputs[Aircraft.Wing.FOLD_MASS_COEFFICIENT] @@ -358,7 +350,7 @@ def compute_partials(self, inputs, J): isolated_wing_wt = inputs["isolated_wing_mass"] * GRAV_ENGLISH_LBM - if self.options["aviary_options"].get_val(Aircraft.Wing.HAS_STRUT, units='unitless'): + if self.options[Aircraft.Wing.HAS_STRUT]: c_strut_mass = inputs[Aircraft.Strut.MASS_COEFFICIENT] J[Aircraft.Wing.MASS, Aircraft.Strut.MASS_COEFFICIENT] = \ @@ -367,7 +359,7 @@ def compute_partials(self, inputs, J): J[Aircraft.Wing.MASS, "isolated_wing_mass"] = 1 + c_strut_mass J[Aircraft.Strut.MASS, "isolated_wing_mass"] = c_strut_mass - if self.options["aviary_options"].get_val(Aircraft.Wing.HAS_FOLD, units='unitless'): + if self.options[Aircraft.Wing.HAS_FOLD]: wing_area = inputs[Aircraft.Wing.AREA] folding_area = inputs[Aircraft.Wing.FOLDING_AREA] c_wing_fold = inputs[Aircraft.Wing.FOLD_MASS_COEFFICIENT] @@ -391,41 +383,36 @@ def compute_partials(self, inputs, J): J[Aircraft.Wing.FOLD_MASS, "isolated_wing_mass"] = c_wing_fold * \ folding_area / wing_area - if self.options["aviary_options"].get_val(Aircraft.Wing.HAS_FOLD, units='unitless') and \ - self.options["aviary_options"].get_val(Aircraft.Wing.HAS_STRUT, units='unitless'): + if self.options[Aircraft.Wing.HAS_FOLD] and \ + self.options[Aircraft.Wing.HAS_STRUT]: J[Aircraft.Wing.MASS, "isolated_wing_mass"] = ( 1 + c_wing_fold * folding_area / wing_area + c_strut_mass ) if ( - self.options["aviary_options"].get_val( - Aircraft.Wing.HAS_STRUT, units='unitless') == False - and self.options["aviary_options"].get_val(Aircraft.Wing.HAS_FOLD, units='unitless') == False + self.options[Aircraft.Wing.HAS_STRUT] == False + and self.options[Aircraft.Wing.HAS_FOLD] == False ): J[Aircraft.Wing.MASS, "isolated_wing_mass"] = 1 class WingMassGroup(om.Group): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + def initialize(self): + add_aviary_option(self, Aircraft.Wing.HAS_FOLD) + add_aviary_option(self, Aircraft.Wing.HAS_STRUT) def setup(self): - aviary_options = self.options['aviary_options'] - # variables that are calculated at a higher level higher_level_inputs_isolated = [ "c_strut_braced", "c_gear_loc", "half_sweep", ] - if self.options["aviary_options"].get_val(Aircraft.Wing.HAS_FOLD, units='unitless') or \ - self.options["aviary_options"].get_val(Aircraft.Wing.HAS_STRUT, units='unitless'): + if self.options[Aircraft.Wing.HAS_FOLD] or \ + self.options[Aircraft.Wing.HAS_STRUT]: higher_level_inputs_total = [ "aircraft:*" @@ -443,16 +430,14 @@ def setup(self): isolated_mass = self.add_subsystem( "isolated_mass", - WingMassSolve(aviary_options=aviary_options), + WingMassSolve(), promotes_inputs=higher_level_inputs_isolated + ["aircraft:*", "mission:*"], promotes_outputs=connected_outputs_isolated, ) total_mass = self.add_subsystem( "total_mass", - WingMassTotal( - aviary_options=aviary_options, - ), + WingMassTotal(), promotes_inputs=connected_inputs_total + higher_level_inputs_total, promotes_outputs=["aircraft:*"], ) diff --git a/aviary/subsystems/mass/mass_builder.py b/aviary/subsystems/mass/mass_builder.py index 362797949..a6a6d36cd 100644 --- a/aviary/subsystems/mass/mass_builder.py +++ b/aviary/subsystems/mass/mass_builder.py @@ -51,7 +51,7 @@ def build_pre_mission(self, aviary_inputs): code_origin = self.code_origin if code_origin is GASP: - mass_premission = MassPremissionGASP(aviary_options=aviary_inputs,) + mass_premission = MassPremissionGASP() elif code_origin is FLOPS: mass_premission = MassPremissionFLOPS() @@ -59,7 +59,7 @@ def build_pre_mission(self, aviary_inputs): return mass_premission def build_mission(self, num_nodes, aviary_inputs, **kwargs): - super().build_mission(num_nodes, aviary_inputs) + super().build_mission(num_nodes) def report(self, prob, reports_folder, **kwargs): """ diff --git a/aviary/subsystems/propulsion/test/test_engine_scaling.py b/aviary/subsystems/propulsion/test/test_engine_scaling.py index e045efffb..56baf2ce7 100644 --- a/aviary/subsystems/propulsion/test/test_engine_scaling.py +++ b/aviary/subsystems/propulsion/test/test_engine_scaling.py @@ -11,7 +11,6 @@ from aviary.utils.functions import get_path from aviary.variable_info.functions import extract_options from aviary.variable_info.variables import Aircraft, Dynamic, Mission -from aviary.variable_info.variable_meta_data import _MetaData as BaseMetaData from aviary.subsystems.propulsion.utils import EngineModelVariables @@ -64,7 +63,7 @@ def test_case(self): promotes=['*'], ) - self.prob.model_options['*'] = extract_options(options, BaseMetaData) + self.prob.model_options['*'] = extract_options(options) self.prob.setup(force_alloc_complex=True) diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index 56b142198..fcfbfe352 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -16,7 +16,6 @@ from aviary.variable_info.functions import extract_options from aviary.variable_info.variables import Aircraft, Mission, Settings -from aviary.variable_info.variable_meta_data import _MetaData as BaseMetaData class PreMissionGroupTest(unittest.TestCase): @@ -48,7 +47,7 @@ def test_case(self, case_name): promotes_outputs=['*'], ) - self.prob.model_options['*'] = extract_options(flops_inputs, BaseMetaData) + self.prob.model_options['*'] = extract_options(flops_inputs) prob.setup(check=False, force_alloc_complex=True) prob.set_solver_print(2) @@ -109,7 +108,7 @@ def test_diff_configuration_mass(self): promotes_outputs=['*'], ) - self.prob.model_options['*'] = extract_options(flops_inputs, BaseMetaData) + self.prob.model_options['*'] = extract_options(flops_inputs) prob.setup(check=False) diff --git a/aviary/utils/conflict_checks.py b/aviary/utils/conflict_checks.py index fd79461ed..e1a7bcc7f 100644 --- a/aviary/utils/conflict_checks.py +++ b/aviary/utils/conflict_checks.py @@ -3,13 +3,10 @@ from aviary.variable_info.variables import Aircraft -def check_fold_location_definition(inputs, options: AviaryValues): +def check_fold_location_definition(inputs, choose_fold_location, has_strut): """ If there is no strut, then CHOOSE_FOLD_LOCATION must be true. """ - choose_fold_location = options.get_val( - Aircraft.Wing.CHOOSE_FOLD_LOCATION, units='unitless') - has_strut = options.get_val(Aircraft.Wing.HAS_STRUT, units='unitless') if not choose_fold_location and not has_strut: raise RuntimeError( "The option CHOOSE_FOLD_LOCATION can only be False if the option HAS_STRUT is True.") diff --git a/aviary/validation_cases/validation_tests.py b/aviary/validation_cases/validation_tests.py index 055dbdf21..bf27ac5e5 100644 --- a/aviary/validation_cases/validation_tests.py +++ b/aviary/validation_cases/validation_tests.py @@ -14,7 +14,6 @@ FLOPS_Test_Data, FLOPS_Lacking_Test_Data from aviary.variable_info.functions import extract_options from aviary.variable_info.variables import Aircraft -from aviary.variable_info.variable_meta_data import _MetaData Version = Enum('Version', ['ALL', 'TRANSPORT', 'ALTERNATE', 'BWB']) @@ -346,9 +345,9 @@ def get_flops_options(case_name: str, keys: str = None, preprocess: bool = False engine_models=build_engine_deck(flops_inputs_copy)) if keys is None: - options = extract_options(flops_inputs_copy, _MetaData) + options = extract_options(flops_inputs_copy) else: - options = extract_options(keys, _MetaData) + options = extract_options(keys) return options diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 7b4c5393a..0c34f4276 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1994,7 +1994,7 @@ units='unitless', desc='number of fuselage mounted engines per model', option=True, - types=int, + types=(list, np.ndarray, int), default_value=0 ) @@ -2339,7 +2339,7 @@ }, option=True, default_value=GASPEngineType.TURBOJET, - types=GASPEngineType, + types=(list, GASPEngineType, str, int, np.ndarray), units="unitless", desc='specifies engine type used for engine mass calculation', ) From ba5836890867d66ec53a42ec29f06906f904b424 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Wed, 25 Sep 2024 15:52:37 -0400 Subject: [PATCH 11/58] checkpoint --- aviary/mission/energy_phase.py | 1 - .../unsteady_control_iter_group.py | 5 -- .../gasp_based/phases/taxi_component.py | 11 ++--- .../aerodynamics/flops_based/design.py | 5 -- .../aerodynamics/flops_based/induced_drag.py | 4 -- .../test/test_skinfriction_coef.py | 1 - .../aerodynamics/gasp_based/gaspaero.py | 48 ++++--------------- .../gasp_based/test/test_gaspaero.py | 8 ++-- .../geometry/flops_based/prep_geom.py | 6 --- .../subsystems/geometry/flops_based/wing.py | 6 --- .../subsystems/geometry/gasp_based/strut.py | 1 - aviary/subsystems/geometry/gasp_based/wing.py | 1 - .../subsystems/mass/flops_based/engine_pod.py | 1 - .../mass/flops_based/surface_controls.py | 1 - .../mass/flops_based/wing_detailed.py | 1 - .../subsystems/mass/gasp_based/design_load.py | 1 - .../gasp_based/equipment_and_useful_load.py | 1 - aviary/subsystems/mass/gasp_based/fixed.py | 1 - .../propulsion/propeller/hamilton_standard.py | 20 ++++---- .../test/test_throttle_allocation.py | 1 - 20 files changed, 26 insertions(+), 98 deletions(-) diff --git a/aviary/mission/energy_phase.py b/aviary/mission/energy_phase.py index 35a28c128..194b6bc98 100644 --- a/aviary/mission/energy_phase.py +++ b/aviary/mission/energy_phase.py @@ -3,7 +3,6 @@ from aviary.mission.flight_phase_builder import FlightPhaseBase, register from aviary.mission.initial_guess_builders import InitialGuessIntegrationVariable, InitialGuessState -from aviary.utils.aviary_values import AviaryValues from aviary.mission.flops_based.ode.mission_ODE import MissionODE 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 2df7762bd..095b1419b 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 @@ -3,7 +3,6 @@ from aviary.constants import RHO_SEA_LEVEL_ENGLISH -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.variables import Dynamic from aviary.mission.gasp_based.ode.unsteady_solved.unsteady_solved_eom import UnsteadySolvedEOM @@ -21,10 +20,6 @@ def initialize(self): "output and adjusts the TAS rate equation.") self.options.declare("clean", types=bool, default=False, desc="If true then no flaps or gear are included. Useful for high-speed flight phases.") - self.options.declare( - 'aviary_options', types=AviaryValues, default=None, - desc='collection of Aircraft/Mission specific options' - ) # TODO finish description self.options.declare( diff --git a/aviary/mission/gasp_based/phases/taxi_component.py b/aviary/mission/gasp_based/phases/taxi_component.py index a9d4e5e54..afe28d130 100644 --- a/aviary/mission/gasp_based/phases/taxi_component.py +++ b/aviary/mission/gasp_based/phases/taxi_component.py @@ -1,16 +1,13 @@ import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input +from aviary.variable_info.functions import add_aviary_input, add_aviary_option from aviary.variable_info.variables import Dynamic, Mission class TaxiFuelComponent(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Mission.Taxi.DURATION, units='s') def setup(self): self.add_input( @@ -44,12 +41,12 @@ def setup(self): def compute(self, inputs, outputs): fuelflow, takeoff_mass = inputs.values() - dt_taxi = self.options['aviary_options'].get_val(Mission.Taxi.DURATION, 's') + dt_taxi, _ = self.options[Mission.Taxi.DURATION] outputs["taxi_fuel_consumed"] = -fuelflow * dt_taxi outputs[Dynamic.Mission.MASS] = takeoff_mass - outputs["taxi_fuel_consumed"] def compute_partials(self, inputs, J): - dt_taxi = self.options['aviary_options'].get_val(Mission.Taxi.DURATION, 's') + dt_taxi, _ = self.options[Mission.Taxi.DURATION] J["taxi_fuel_consumed", Dynamic.Mission.FUEL_FLOW_RATE_NEGATIVE_TOTAL] = -dt_taxi diff --git a/aviary/subsystems/aerodynamics/flops_based/design.py b/aviary/subsystems/aerodynamics/flops_based/design.py index f233600ac..37d0f14e9 100644 --- a/aviary/subsystems/aerodynamics/flops_based/design.py +++ b/aviary/subsystems/aerodynamics/flops_based/design.py @@ -6,7 +6,6 @@ import openmdao.api as om from openmdao.components.interp_util.interp import InterpND -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission @@ -26,10 +25,6 @@ def __init__(self, **kwargs): self.des_mach_coeff = [0.32, 57.2958, 0.144] def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - add_aviary_option(self, Aircraft.Wing.AIRFOIL_TECHNOLOGY) add_aviary_option(self, Mission.Constraints.MAX_MACH) diff --git a/aviary/subsystems/aerodynamics/flops_based/induced_drag.py b/aviary/subsystems/aerodynamics/flops_based/induced_drag.py index 2b71a6a26..045cc25f4 100644 --- a/aviary/subsystems/aerodynamics/flops_based/induced_drag.py +++ b/aviary/subsystems/aerodynamics/flops_based/induced_drag.py @@ -2,7 +2,6 @@ import openmdao.api as om import scipy.constants as _units -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, add_aviary_option from aviary.variable_info.variables import Aircraft, Dynamic @@ -19,9 +18,6 @@ def initialize(self): self.options.declare( 'gamma', default=1.4, desc='Ratio of specific heats for air.') - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') add_aviary_option(self, Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION) diff --git a/aviary/subsystems/aerodynamics/flops_based/test/test_skinfriction_coef.py b/aviary/subsystems/aerodynamics/flops_based/test/test_skinfriction_coef.py index 57abef974..e4fd91f5d 100644 --- a/aviary/subsystems/aerodynamics/flops_based/test/test_skinfriction_coef.py +++ b/aviary/subsystems/aerodynamics/flops_based/test/test_skinfriction_coef.py @@ -5,7 +5,6 @@ from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal from aviary.subsystems.aerodynamics.flops_based.skin_friction import SkinFriction -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.variables import Aircraft diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index 2553c8174..5b5cf7e41 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py @@ -8,10 +8,8 @@ from aviary.subsystems.aerodynamics.gasp_based.common import (AeroForces, CLFromLift, TanhRampComp) -from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input +from aviary.variable_info.functions import add_aviary_input, add_aviary_option from aviary.variable_info.variables import Aircraft, Dynamic, Mission -from aviary.utils.aviary_values import AviaryValues # # data from INTERFERENCE - polynomial coefficients @@ -380,15 +378,12 @@ class AeroGeom(om.ExplicitComponent): def initialize(self): self.options.declare("num_nodes", default=1, types=int) - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) + add_aviary_option(self, Aircraft.Wing.HAS_STRUT) def setup(self): nn = self.options["num_nodes"] - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) self.add_input( Dynamic.Mission.MACH, val=0.0, units="unitless", shape=nn, desc="Current Mach number") @@ -674,8 +669,7 @@ def compute(self, inputs, outputs): fnre[good_mask] = (np.log10(reli[good_mask] * nac_len) / 7) ** -2.6 fvtre[good_mask] = (np.log10(reli[good_mask] * vtail_chord) / 7) ** -2.6 fhtre[good_mask] = (np.log10(reli[good_mask] * htail_chord) / 7) ** -2.6 - include_strut = self.options["aviary_options"].get_val( - Aircraft.Wing.HAS_STRUT, units='unitless') + include_strut = self.options[Aircraft.Wing.HAS_STRUT] if include_strut: fstrtre = (np.log10(reli[good_mask] * strut_chord) / 7) ** -2.6 @@ -783,9 +777,6 @@ class AeroSetup(om.Group): def initialize(self): self.options.declare("num_nodes", default=1, types=int) - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') self.options.declare( "input_atmos", default=False, @@ -793,14 +784,9 @@ def initialize(self): desc="Directly input speed of sound and kinematic viscosity instead of " "computing them with an atmospherics component. For testing.", ) - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) def setup(self): nn = self.options["num_nodes"] - aviary_options = self.options['aviary_options'] self.add_subsystem("ratios", WingTailRatios(), promotes=["*"]) self.add_subsystem("xlifts", Xlifts(num_nodes=nn), promotes=["*"]) @@ -846,8 +832,8 @@ def setup(self): promotes=["*", ('rho', Dynamic.Mission.DENSITY)], ) - self.add_subsystem("geom", AeroGeom( - num_nodes=nn, aviary_options=aviary_options), promotes=["*"]) + self.add_subsystem("geom", AeroGeom(num_nodes=nn), + promotes=["*"]) class DragCoef(om.ExplicitComponent): @@ -1287,9 +1273,6 @@ class CruiseAero(om.Group): def initialize(self): self.options.declare("num_nodes", default=1, types=int) - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') self.options.declare( "output_alpha", @@ -1304,17 +1287,12 @@ def initialize(self): desc="Directly input speed of sound and kinematic viscosity instead of " "computing them with an atmospherics component. For testing.", ) - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) def setup(self): nn = self.options["num_nodes"] - aviary_options = self.options["aviary_options"] self.add_subsystem( "aero_setup", - AeroSetup(num_nodes=nn, aviary_options=aviary_options, + AeroSetup(num_nodes=nn, input_atmos=self.options["input_atmos"]), promotes=["*"], ) @@ -1335,9 +1313,6 @@ class LowSpeedAero(om.Group): def initialize(self): self.options.declare("num_nodes", default=1, types=int) - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') self.options.declare( "retract_gear", default=True, @@ -1366,18 +1341,13 @@ def initialize(self): desc="Directly input speed of sound and kinematic viscosity instead of " "computing them with an atmospherics component. For testing.", ) - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) def setup(self): nn = self.options["num_nodes"] output_alpha = self.options["output_alpha"] - aviary_options = self.options["aviary_options"] self.add_subsystem( "aero_setup", - AeroSetup(num_nodes=nn, aviary_options=aviary_options, + AeroSetup(num_nodes=nn, input_atmos=self.options["input_atmos"]), promotes=["*"], ) diff --git a/aviary/subsystems/aerodynamics/gasp_based/test/test_gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/test/test_gaspaero.py index 9cfb0d9a5..e870c9155 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/test/test_gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/test/test_gaspaero.py @@ -29,7 +29,7 @@ class GASPAeroTest(unittest.TestCase): def test_cruise(self): prob = om.Problem() prob.model.add_subsystem( - "aero", CruiseAero(num_nodes=2, aviary_options=get_option_defaults(), input_atmos=True), promotes=["*"] + "aero", CruiseAero(num_nodes=2, input_atmos=True), promotes=["*"] ) prob.setup(check=False, force_alloc_complex=True) @@ -65,7 +65,7 @@ def test_cruise(self): def test_ground(self): prob = om.Problem() prob.model.add_subsystem( - "aero", LowSpeedAero(num_nodes=2, aviary_options=get_option_defaults(), input_atmos=True), promotes=["*"] + "aero", LowSpeedAero(num_nodes=2, input_atmos=True), promotes=["*"] ) prob.setup(check=False, force_alloc_complex=True) @@ -122,14 +122,14 @@ def test_ground_alpha_out(self): prob = om.Problem() prob.model.add_subsystem( "alpha_in", - LowSpeedAero(aviary_options=get_option_defaults()), + LowSpeedAero(), promotes_inputs=["*", ("alpha", "alpha_in")], promotes_outputs=[(Dynamic.Mission.LIFT, "lift_req")], ) prob.model.add_subsystem( "alpha_out", - LowSpeedAero(aviary_options=get_option_defaults(), output_alpha=True), + LowSpeedAero(output_alpha=True), promotes_inputs=["*", "lift_req"], ) diff --git a/aviary/subsystems/geometry/flops_based/prep_geom.py b/aviary/subsystems/geometry/flops_based/prep_geom.py index e5284e2ca..d90a7487a 100644 --- a/aviary/subsystems/geometry/flops_based/prep_geom.py +++ b/aviary/subsystems/geometry/flops_based/prep_geom.py @@ -19,7 +19,6 @@ d_calc_fuselage_adjustment, thickness_to_chord_scaler) from aviary.subsystems.geometry.flops_based.wetted_area_total import TotalWettedArea from aviary.subsystems.geometry.flops_based.wing import WingPrelim -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -29,11 +28,6 @@ class PrepGeom(om.Group): Prepare derived values of aircraft geometry for aerodynamics analysis. ''' - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): self.add_subsystem( diff --git a/aviary/subsystems/geometry/flops_based/wing.py b/aviary/subsystems/geometry/flops_based/wing.py index 7245f8b51..813954ef7 100644 --- a/aviary/subsystems/geometry/flops_based/wing.py +++ b/aviary/subsystems/geometry/flops_based/wing.py @@ -4,18 +4,12 @@ import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, add_aviary_output from aviary.variable_info.variables import Aircraft class WingPrelim(om.ExplicitComponent): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') - def setup(self): add_aviary_input(self, Aircraft.Wing.AREA, val=0.0) add_aviary_input(self, Aircraft.Wing.GLOVE_AND_BAT, val=0.0) diff --git a/aviary/subsystems/geometry/gasp_based/strut.py b/aviary/subsystems/geometry/gasp_based/strut.py index ad8cedb87..cadf7fc5c 100644 --- a/aviary/subsystems/geometry/gasp_based/strut.py +++ b/aviary/subsystems/geometry/gasp_based/strut.py @@ -3,7 +3,6 @@ import numpy as np import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, add_aviary_output from aviary.variable_info.variables import Aircraft diff --git a/aviary/subsystems/geometry/gasp_based/wing.py b/aviary/subsystems/geometry/gasp_based/wing.py index 1acd91773..5378dbd48 100644 --- a/aviary/subsystems/geometry/gasp_based/wing.py +++ b/aviary/subsystems/geometry/gasp_based/wing.py @@ -5,7 +5,6 @@ from aviary.subsystems.geometry.gasp_based.non_dimensional_conversion import \ DimensionalNonDimensionalInterchange from aviary.subsystems.geometry.gasp_based.strut import StrutGeom -from aviary.utils.aviary_values import AviaryValues from aviary.utils.conflict_checks import check_fold_location_definition from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission diff --git a/aviary/subsystems/mass/flops_based/engine_pod.py b/aviary/subsystems/mass/flops_based/engine_pod.py index 001825f4c..c1c262481 100644 --- a/aviary/subsystems/mass/flops_based/engine_pod.py +++ b/aviary/subsystems/mass/flops_based/engine_pod.py @@ -2,7 +2,6 @@ import openmdao.api as om from aviary.subsystems.mass.flops_based.distributed_prop import nacelle_count_factor -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft diff --git a/aviary/subsystems/mass/flops_based/surface_controls.py b/aviary/subsystems/mass/flops_based/surface_controls.py index d12692275..fb109e427 100644 --- a/aviary/subsystems/mass/flops_based/surface_controls.py +++ b/aviary/subsystems/mass/flops_based/surface_controls.py @@ -1,7 +1,6 @@ import openmdao.api as om from aviary.constants import GRAV_ENGLISH_LBM -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission diff --git a/aviary/subsystems/mass/flops_based/wing_detailed.py b/aviary/subsystems/mass/flops_based/wing_detailed.py index 2526fb85e..ea9bb185d 100644 --- a/aviary/subsystems/mass/flops_based/wing_detailed.py +++ b/aviary/subsystems/mass/flops_based/wing_detailed.py @@ -3,7 +3,6 @@ import openmdao.api as om from openmdao.components.interp_util.interp import InterpND -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission diff --git a/aviary/subsystems/mass/gasp_based/design_load.py b/aviary/subsystems/mass/gasp_based/design_load.py index 41efc0e9f..700010116 100644 --- a/aviary/subsystems/mass/gasp_based/design_load.py +++ b/aviary/subsystems/mass/gasp_based/design_load.py @@ -2,7 +2,6 @@ import openmdao.api as om from aviary.constants import RHO_SEA_LEVEL_ENGLISH -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission diff --git a/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py b/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py index 3c345ae31..204d5dc4f 100644 --- a/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py +++ b/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py @@ -2,7 +2,6 @@ import openmdao.api as om from aviary.constants import GRAV_ENGLISH_LBM -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.enums import GASPEngineType from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission diff --git a/aviary/subsystems/mass/gasp_based/fixed.py b/aviary/subsystems/mass/gasp_based/fixed.py index 9d27fd24d..e48d62491 100644 --- a/aviary/subsystems/mass/gasp_based/fixed.py +++ b/aviary/subsystems/mass/gasp_based/fixed.py @@ -3,7 +3,6 @@ from openmdao.components.ks_comp import KSfunction from aviary.constants import GRAV_ENGLISH_LBM, RHO_SEA_LEVEL_ENGLISH -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.enums import FlapType from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission diff --git a/aviary/subsystems/propulsion/propeller/hamilton_standard.py b/aviary/subsystems/propulsion/propeller/hamilton_standard.py index 67e7e0ae1..8e1539d87 100644 --- a/aviary/subsystems/propulsion/propeller/hamilton_standard.py +++ b/aviary/subsystems/propulsion/propeller/hamilton_standard.py @@ -1,11 +1,10 @@ import warnings import numpy as np import openmdao.api as om -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.enums import Verbosity from aviary.variable_info.variables import Aircraft, Dynamic, Settings from aviary.constants import RHO_SEA_LEVEL_ENGLISH, TSLS_DEGR -from aviary.utils.functions import add_aviary_input, add_aviary_output +from aviary.utils.functions import add_aviary_input, add_aviary_output, add_aviary_option def _unint(xa, ya, x): @@ -78,7 +77,7 @@ def _unint(xa, ya, x): def _biquad(T, i, xi, yi): """ - This routine interpolates over a 4 point interval using a + This routine interpolates over a 4 point interval using a variation of 2nd degree interpolation to produce a continuity of slope between adjacent intervals. @@ -579,18 +578,18 @@ def compute_partials(self, inputs, partials): class HamiltonStandard(om.ExplicitComponent): """ - This is Hamilton Standard component rewritten from Fortran code. - The original documentation is available at + This is Hamilton Standard component rewritten from Fortran code. + The original documentation is available at https://ntrs.nasa.gov/api/citations/19720010354/downloads/19720010354.pdf It computes the thrust coefficient of a propeller blade. """ def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') self.options.declare('num_nodes', default=1, types=int) + add_aviary_option(self, Aircraft.Engine.NUM_PROPELLER_BLADES) + add_aviary_option(self, Settings.VERBOSITY) + def setup(self): nn = self.options['num_nodes'] @@ -615,9 +614,8 @@ def setup(self): self.declare_partials('*', '*', method='fd', form='forward') def compute(self, inputs, outputs): - verbosity = self.options['aviary_options'].get_val(Settings.VERBOSITY) - num_blades = self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_PROPELLER_BLADES) + verbosity = self.options[Settings.VERBOSITY] + num_blades = self.options[Aircraft.Engine.NUM_PROPELLER_BLADES] for i_node in range(self.options['num_nodes']): ichck = 0 diff --git a/aviary/subsystems/propulsion/test/test_throttle_allocation.py b/aviary/subsystems/propulsion/test/test_throttle_allocation.py index a132f562e..6ec4aadbf 100644 --- a/aviary/subsystems/propulsion/test/test_throttle_allocation.py +++ b/aviary/subsystems/propulsion/test/test_throttle_allocation.py @@ -7,7 +7,6 @@ from openmdao.utils.assert_utils import assert_check_partials from aviary.subsystems.propulsion.throttle_allocation import ThrottleAllocator -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.enums import ThrottleAllocation from aviary.variable_info.variables import Aircraft From e1bc731f38e759506a354d2b8fb42a2940f72872 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Wed, 25 Sep 2024 16:29:51 -0400 Subject: [PATCH 12/58] checkpoint --- .../subsystems/geometry/combined_geometry.py | 11 ++-------- aviary/subsystems/propulsion/engine_deck.py | 4 ++-- .../propeller/propeller_performance.py | 20 +++++++------------ .../propulsion/propulsion_premission.py | 13 +++++------- 4 files changed, 16 insertions(+), 32 deletions(-) diff --git a/aviary/subsystems/geometry/combined_geometry.py b/aviary/subsystems/geometry/combined_geometry.py index 655f0ae93..ddc6f1812 100644 --- a/aviary/subsystems/geometry/combined_geometry.py +++ b/aviary/subsystems/geometry/combined_geometry.py @@ -2,7 +2,6 @@ from aviary.variable_info.variables import Aircraft -from aviary.utils.aviary_values import AviaryValues from aviary.subsystems.geometry.flops_based.prep_geom import PrepGeom from aviary.subsystems.geometry.gasp_based.size_group import SizeGroup from aviary.variable_info.enums import LegacyCode @@ -13,11 +12,6 @@ class CombinedGeometry(om.Group): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options' - ) - self.options.declare('code_origin_to_prioritize', values=[GASP, FLOPS, None], default=None, @@ -26,18 +20,17 @@ def initialize(self): ) def setup(self): - aviary_inputs = self.options['aviary_options'] self.add_subsystem( 'gasp_based_geom', - SizeGroup(aviary_options=aviary_inputs,), + SizeGroup(), promotes_inputs=["aircraft:*", "mission:*"], promotes_outputs=["aircraft:*"], ) self.add_subsystem( 'flops_based_geom', - PrepGeom(aviary_options=aviary_inputs), + PrepGeom(), promotes_inputs=['*'], promotes_outputs=['*'] ) diff --git a/aviary/subsystems/propulsion/engine_deck.py b/aviary/subsystems/propulsion/engine_deck.py index 5a1f6b5b2..895f7c324 100644 --- a/aviary/subsystems/propulsion/engine_deck.py +++ b/aviary/subsystems/propulsion/engine_deck.py @@ -958,7 +958,7 @@ def build_mission(self, num_nodes, aviary_inputs) -> om.Group: uncorrect_shp = True engine_group.add_subsystem( 'uncorrect_shaft_power', - subsys=UncorrectData(num_nodes=num_nodes, aviary_options=self.options), + subsys=UncorrectData(num_nodes=num_nodes), promotes_inputs=[ Dynamic.Mission.TEMPERATURE, Dynamic.Mission.STATIC_PRESSURE, @@ -992,7 +992,7 @@ def build_mission(self, num_nodes, aviary_inputs) -> om.Group: engine_group.add_subsystem( 'uncorrect_max_shaft_power', subsys=UncorrectData( - num_nodes=num_nodes, aviary_options=self.options + num_nodes=num_nodes, ), promotes_inputs=[ Dynamic.Mission.TEMPERATURE, diff --git a/aviary/subsystems/propulsion/propeller/propeller_performance.py b/aviary/subsystems/propulsion/propeller/propeller_performance.py index 0d86921c8..345f2dd49 100644 --- a/aviary/subsystems/propulsion/propeller/propeller_performance.py +++ b/aviary/subsystems/propulsion/propeller/propeller_performance.py @@ -6,7 +6,7 @@ from openmdao.components.ks_comp import KSfunction from aviary.utils.aviary_values import AviaryValues -from aviary.utils.functions import add_aviary_input, add_aviary_output +from aviary.utils.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.enums import OutMachType from aviary.variable_info.variables import Aircraft, Dynamic from aviary.subsystems.propulsion.propeller.hamilton_standard import HamiltonStandard, PostHamiltonStandard, PreHamiltonStandard @@ -310,9 +310,6 @@ def initialize(self): self.options.declare( 'num_nodes', types=int, default=1, desc='Number of nodes to be evaluated in the RHS') - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') def setup(self): nn = self.options['num_nodes'] @@ -418,7 +415,7 @@ class PropellerPerformance(om.Group): """ Computation of propeller thrust coefficient based on the Hamilton Standard model or a user provided propeller map. Note that a propeller map allows either the helical Mach number or - free stream Mach number as input. This infomation will be detected automatically when the + free stream Mach number as input. This infomation will be detected automatically when the propeller map is loaded into memory. The installation loss factor is either a user input or computed internally. """ @@ -431,18 +428,16 @@ def initialize(self): 'input_rpm', types=bool, default=False, desc='If True, the input is RPM, otherwise RPM is set by propeller limits') - self.options.declare('aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Engine.COMPUTE_PROPELLER_INSTALLATION_LOSS) + add_aviary_option(self, Aircraft.Engine.PROPELLER_DATA_FILE) def setup(self): options = self.options nn = options['num_nodes'] - aviary_options = options['aviary_options'] # TODO options are lists here when using full Aviary problem - need further investigation - compute_installation_loss = aviary_options.get_val( - Aircraft.Engine.COMPUTE_PROPELLER_INSTALLATION_LOSS - ) + compute_installation_loss = options[Aircraft.Engine.COMPUTE_PROPELLER_INSTALLATION_LOSS] + if isinstance(compute_installation_loss, (list, np.ndarray)): compute_installation_loss = compute_installation_loss[0] @@ -514,8 +509,7 @@ def setup(self): if use_propeller_map: prop_model = PropellerMap('prop', aviary_options) - prop_file_path = aviary_options.get_val( - Aircraft.Engine.PROPELLER_DATA_FILE) + prop_file_path = options[Aircraft.Engine.PROPELLER_DATA_FILE] mach_type = prop_model.read_and_set_mach_type(prop_file_path) if mach_type == OutMachType.HELICAL_MACH: self.add_subsystem( diff --git a/aviary/subsystems/propulsion/propulsion_premission.py b/aviary/subsystems/propulsion/propulsion_premission.py index bd5c022b5..7e47516ae 100644 --- a/aviary/subsystems/propulsion/propulsion_premission.py +++ b/aviary/subsystems/propulsion/propulsion_premission.py @@ -16,16 +16,14 @@ class PropulsionPreMission(om.Group): ''' def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') self.options.declare( 'engine_models', types=list, desc='list of EngineModels on aircraft' ) + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) + add_aviary_option(self, Settings.VERBOSITY) def setup(self): - options = self.options['aviary_options'] engine_models = self.options['engine_models'] num_engine_type = len(engine_models) @@ -35,7 +33,7 @@ def setup(self): # each component here # Promotions are handled in self.configure() for engine in engine_models: - subsys = engine.build_pre_mission(options) + subsys = engine.build_pre_mission() if subsys: if num_engine_type > 1: proms = None @@ -68,11 +66,10 @@ def configure(self): # so vectorized inputs/outputs are a problem. Slice all needed vector inputs and pass # pre_mission components only the value they need, then mux all the outputs back together - num_engine_type = len(self.options['aviary_options'].get_val( - Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) # determine if openMDAO messages and warnings should be suppressed - verbosity = self.options['aviary_options'].get_val(Settings.VERBOSITY) + verbosity = self.options[Settings.VERBOSITY] out_stream = None # DEBUG From 157703c8f5ed602f7d60995ab689029bf2dfbb8e Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Wed, 25 Sep 2024 17:57:04 -0400 Subject: [PATCH 13/58] handful of failures --- .../mission/gasp_based/phases/taxi_group.py | 3 +- .../aerodynamics/aerodynamics_builder.py | 6 +--- .../aerodynamics/flops_based/aero_report.py | 9 ++---- .../flops_based/computed_aero_group.py | 5 ---- .../flaps_model/test/test_flaps_group.py | 13 +++++++++ .../propulsion/gearbox/gearbox_builder.py | 28 +++++++++---------- .../propulsion/propeller/hamilton_standard.py | 5 ++-- .../propeller/propeller_performance.py | 12 ++++++-- .../propulsion/propulsion_builder.py | 3 +- .../propulsion/propulsion_mission.py | 2 +- .../propulsion/propulsion_premission.py | 6 +++- .../propulsion/test/test_hamilton_standard.py | 6 ++-- .../test/test_propeller_performance.py | 16 +++++++++-- .../test/test_propulsion_mission.py | 3 ++ .../test/test_propulsion_premission.py | 5 ++++ .../propulsion/test/test_turboprop_model.py | 3 ++ aviary/variable_info/variable_meta_data.py | 6 ++-- 17 files changed, 84 insertions(+), 47 deletions(-) diff --git a/aviary/mission/gasp_based/phases/taxi_group.py b/aviary/mission/gasp_based/phases/taxi_group.py index 82b49f0ab..da58afeb9 100644 --- a/aviary/mission/gasp_based/phases/taxi_group.py +++ b/aviary/mission/gasp_based/phases/taxi_group.py @@ -38,8 +38,7 @@ def setup(self): (Dynamic.Mission.MACH, Mission.Taxi.MACH)], promotes_outputs=['*']) - self.add_subsystem("taxifuel", TaxiFuelComponent( - aviary_options=options), promotes=["*"]) + self.add_subsystem("taxifuel", TaxiFuelComponent(), promotes=["*"]) ParamPort.set_default_vals(self) self.set_input_defaults(Mission.Taxi.MACH, 0) diff --git a/aviary/subsystems/aerodynamics/aerodynamics_builder.py b/aviary/subsystems/aerodynamics/aerodynamics_builder.py index e53fb72ca..4019bbeb9 100644 --- a/aviary/subsystems/aerodynamics/aerodynamics_builder.py +++ b/aviary/subsystems/aerodynamics/aerodynamics_builder.py @@ -96,12 +96,10 @@ def build_mission(self, num_nodes, aviary_inputs, **kwargs): method = None if self.code_origin is FLOPS: if method is None: - aero_group = ComputedAeroGroup(num_nodes=num_nodes, - aviary_options=aviary_inputs) + aero_group = ComputedAeroGroup(num_nodes=num_nodes) elif method == 'computed': aero_group = ComputedAeroGroup(num_nodes=num_nodes, - aviary_options=aviary_inputs, **kwargs) elif method == 'low_speed': @@ -140,7 +138,6 @@ def build_mission(self, num_nodes, aviary_inputs, **kwargs): **kwargs) else: aero_group = CruiseAero(num_nodes=num_nodes, - aviary_options=aviary_inputs, **kwargs) elif method == 'low_speed': @@ -158,7 +155,6 @@ def build_mission(self, num_nodes, aviary_inputs, **kwargs): else: aero_group = LowSpeedAero(num_nodes=num_nodes, - aviary_options=aviary_inputs, **kwargs) else: diff --git a/aviary/subsystems/aerodynamics/flops_based/aero_report.py b/aviary/subsystems/aerodynamics/flops_based/aero_report.py index ad70ff4b9..9222c5dfe 100644 --- a/aviary/subsystems/aerodynamics/flops_based/aero_report.py +++ b/aviary/subsystems/aerodynamics/flops_based/aero_report.py @@ -6,7 +6,7 @@ import openmdao.api as om from aviary.utils.aviary_values import AviaryValues -from aviary.variable_info.functions import add_aviary_input +from aviary.variable_info.functions import add_aviary_input, add_aviary_option from aviary.variable_info.variables import Aircraft, Mission @@ -18,13 +18,10 @@ class AeroReport(om.ExplicitComponent): def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) def setup(self): - aviary_options = self.options['aviary_options'] - num_engine_type = len(aviary_options.get_val(Aircraft.Engine.NUM_ENGINES)) + num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) add_aviary_input(self, Aircraft.Canard.WETTED_AREA, 0.0) add_aviary_input(self, Aircraft.Fuselage.WETTED_AREA, 0.0) diff --git a/aviary/subsystems/aerodynamics/flops_based/computed_aero_group.py b/aviary/subsystems/aerodynamics/flops_based/computed_aero_group.py index 687b8f456..f76c0e5f9 100644 --- a/aviary/subsystems/aerodynamics/flops_based/computed_aero_group.py +++ b/aviary/subsystems/aerodynamics/flops_based/computed_aero_group.py @@ -17,7 +17,6 @@ from aviary.subsystems.aerodynamics.flops_based.skin_friction import SkinFriction from aviary.subsystems.aerodynamics.flops_based.skin_friction_drag import \ SkinFrictionDrag -from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.variables import Aircraft, Dynamic, Mission @@ -30,14 +29,10 @@ def initialize(self): self.options.declare( 'gamma', default=1.4, desc='Ratio of specific heats for air.') - self.options.declare( - 'aviary_options', types=AviaryValues, - desc='collection of Aircraft/Mission specific options') def setup(self): num_nodes = self.options["num_nodes"] gamma = self.options['gamma'] - aviary_options: AviaryValues = self.options['aviary_options'] comp = MuxComponent() self.add_subsystem( diff --git a/aviary/subsystems/aerodynamics/gasp_based/flaps_model/test/test_flaps_group.py b/aviary/subsystems/aerodynamics/gasp_based/flaps_model/test/test_flaps_group.py index 3a208ae37..d7007ceb8 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/flaps_model/test/test_flaps_group.py +++ b/aviary/subsystems/aerodynamics/gasp_based/flaps_model/test/test_flaps_group.py @@ -5,6 +5,7 @@ from aviary.subsystems.aerodynamics.gasp_based.flaps_model.flaps_model import \ FlapsGroup +from aviary.variable_info.functions import extract_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.enums import FlapType from aviary.variable_info.variables import Aircraft, Dynamic @@ -25,6 +26,8 @@ def setUp(self): self.prob.model = FCC = FlapsGroup() + self.prob.model_options['*'] = extract_options(options) + self.prob.setup() self.prob.set_val(Aircraft.Wing.SWEEP, 25.0, units="deg") @@ -127,6 +130,8 @@ def setUp(self): self.prob.model = FCC = FlapsGroup() + self.prob.model_options['*'] = extract_options(options) + self.prob.setup() self.prob.set_val(Aircraft.Wing.SWEEP, 25.0, units="deg") @@ -230,6 +235,8 @@ def setUp(self): self.prob.model = FCC = FlapsGroup() + self.prob.model_options['*'] = extract_options(options) + self.prob.setup() self.prob.set_val(Aircraft.Wing.SWEEP, 25.0, units="deg") @@ -333,6 +340,8 @@ def setUp(self): self.prob.model = FCC = FlapsGroup() + self.prob.model_options['*'] = extract_options(options) + self.prob.setup() self.prob.set_val(Aircraft.Wing.SWEEP, 25.0, units="deg") @@ -435,6 +444,8 @@ def setUp(self): self.prob.model = FCC = FlapsGroup() + self.prob.model_options['*'] = extract_options(options) + self.prob.setup() self.prob.set_val(Aircraft.Wing.SWEEP, 25.0, units="deg") @@ -538,6 +549,8 @@ def setUp(self): self.prob.model = FCC = FlapsGroup() + self.prob.model_options['*'] = extract_options(options) + self.prob.setup() self.prob.set_val(Aircraft.Wing.SWEEP, 25.0, units="deg") diff --git a/aviary/subsystems/propulsion/gearbox/gearbox_builder.py b/aviary/subsystems/propulsion/gearbox/gearbox_builder.py index f62e88b24..4e375b8de 100644 --- a/aviary/subsystems/propulsion/gearbox/gearbox_builder.py +++ b/aviary/subsystems/propulsion/gearbox/gearbox_builder.py @@ -6,14 +6,14 @@ class GearboxBuilder(SubsystemBuilderBase): """ - Define the builder for a single gearbox subsystem that provides methods - to define the gearbox subsystem's states, design variables, fixed values, - initial guesses, and mass names. It also provides methods to build OpenMDAO - systems for the pre-mission and mission computations of the subsystem, + Define the builder for a single gearbox subsystem that provides methods + to define the gearbox subsystem's states, design variables, fixed values, + initial guesses, and mass names. It also provides methods to build OpenMDAO + systems for the pre-mission and mission computations of the subsystem, to get the constraints for the subsystem, and to preprocess the inputs for - the subsystem. + the subsystem. - This is meant to be computations for a single gearbox, so there is no notion + This is meant to be computations for a single gearbox, so there is no notion of "num_gearboxs" in this code. This is a reduction gearbox, so gear ratio is input_RPM/output_RPM. @@ -26,18 +26,18 @@ def __init__(self, name='gearbox', include_constraints=True): def build_pre_mission(self, aviary_inputs): """Builds an OpenMDAO system for the pre-mission computations of the subsystem.""" - return GearboxPreMission(aviary_inputs=aviary_inputs, simple_mass=True) + return GearboxPreMission(simple_mass=True) def build_mission(self, num_nodes, aviary_inputs): """Builds an OpenMDAO system for the mission computations of the subsystem.""" - return GearboxMission(num_nodes=num_nodes, aviary_inputs=aviary_inputs) + return GearboxMission(num_nodes=num_nodes) def get_design_vars(self): """ Design vars are only tested to see if they exist in pre_mission - Returns a dictionary of design variables for the gearbox subsystem, where the keys are the - names of the design variables, and the values are dictionaries that contain the units for - the design variable, the lower and upper bounds for the design variable, and any + Returns a dictionary of design variables for the gearbox subsystem, where the keys are the + names of the design variables, and the values are dictionaries that contain the units for + the design variable, the lower and upper bounds for the design variable, and any additional keyword arguments required by OpenMDAO for the design variable. """ @@ -63,9 +63,9 @@ def get_parameters(self, aviary_inputs=None, phase_info=None): """ Parameters are only tested to see if they exist in mission. A value the doesn't change throught the mission mission - Returns a dictionary of fixed values for the gearbox subsystem, where the keys are the names - of the fixed values, and the values are dictionaries that contain the fixed value for the - variable, the units for the variable, and any additional keyword arguments required by + Returns a dictionary of fixed values for the gearbox subsystem, where the keys are the names + of the fixed values, and the values are dictionaries that contain the fixed value for the + variable, the units for the variable, and any additional keyword arguments required by OpenMDAO for the variable. Returns diff --git a/aviary/subsystems/propulsion/propeller/hamilton_standard.py b/aviary/subsystems/propulsion/propeller/hamilton_standard.py index 8e1539d87..a7cde7953 100644 --- a/aviary/subsystems/propulsion/propeller/hamilton_standard.py +++ b/aviary/subsystems/propulsion/propeller/hamilton_standard.py @@ -1,10 +1,11 @@ import warnings import numpy as np import openmdao.api as om + +from aviary.constants import RHO_SEA_LEVEL_ENGLISH, TSLS_DEGR from aviary.variable_info.enums import Verbosity from aviary.variable_info.variables import Aircraft, Dynamic, Settings -from aviary.constants import RHO_SEA_LEVEL_ENGLISH, TSLS_DEGR -from aviary.utils.functions import add_aviary_input, add_aviary_output, add_aviary_option +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option def _unint(xa, ya, x): diff --git a/aviary/subsystems/propulsion/propeller/propeller_performance.py b/aviary/subsystems/propulsion/propeller/propeller_performance.py index 345f2dd49..c5fea9089 100644 --- a/aviary/subsystems/propulsion/propeller/propeller_performance.py +++ b/aviary/subsystems/propulsion/propeller/propeller_performance.py @@ -6,8 +6,9 @@ from openmdao.components.ks_comp import KSfunction from aviary.utils.aviary_values import AviaryValues -from aviary.utils.functions import add_aviary_input, add_aviary_output, add_aviary_option + from aviary.variable_info.enums import OutMachType +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft, Dynamic from aviary.subsystems.propulsion.propeller.hamilton_standard import HamiltonStandard, PostHamiltonStandard, PreHamiltonStandard from aviary.subsystems.propulsion.propeller.propeller_map import PropellerMap @@ -428,12 +429,17 @@ def initialize(self): 'input_rpm', types=bool, default=False, desc='If True, the input is RPM, otherwise RPM is set by propeller limits') + self.options.declare('aviary_options', types=AviaryValues, + desc='collection of Aircraft/Mission specific options') + add_aviary_option(self, Aircraft.Engine.COMPUTE_PROPELLER_INSTALLATION_LOSS) add_aviary_option(self, Aircraft.Engine.PROPELLER_DATA_FILE) + add_aviary_option(self, Aircraft.Engine.USE_PROPELLER_MAP) def setup(self): options = self.options nn = options['num_nodes'] + aviary_options = options['aviary_options'] # TODO options are lists here when using full Aviary problem - need further investigation compute_installation_loss = options[Aircraft.Engine.COMPUTE_PROPELLER_INSTALLATION_LOSS] @@ -441,7 +447,7 @@ def setup(self): if isinstance(compute_installation_loss, (list, np.ndarray)): compute_installation_loss = compute_installation_loss[0] - use_propeller_map = aviary_options.get_val(Aircraft.Engine.USE_PROPELLER_MAP) + use_propeller_map = options[Aircraft.Engine.USE_PROPELLER_MAP] if isinstance(use_propeller_map, (list, np.ndarray)): use_propeller_map = use_propeller_map[0] @@ -550,7 +556,7 @@ def setup(self): else: self.add_subsystem( name='hamilton_standard', - subsys=HamiltonStandard(num_nodes=nn, aviary_options=aviary_options), + subsys=HamiltonStandard(num_nodes=nn), promotes_inputs=[ Dynamic.Mission.MACH, "power_coefficient", diff --git a/aviary/subsystems/propulsion/propulsion_builder.py b/aviary/subsystems/propulsion/propulsion_builder.py index e6647726e..1026632b4 100644 --- a/aviary/subsystems/propulsion/propulsion_builder.py +++ b/aviary/subsystems/propulsion/propulsion_builder.py @@ -67,7 +67,8 @@ def build_pre_mission(self, aviary_inputs): engine_models=self.engine_models) def build_mission(self, num_nodes, aviary_inputs, **kwargs): - return PropulsionMission(num_nodes=num_nodes, aviary_options=aviary_inputs, + return PropulsionMission(num_nodes=num_nodes, + aviary_options=aviary_inputs, engine_models=self.engine_models) # NOTE untested! diff --git a/aviary/subsystems/propulsion/propulsion_mission.py b/aviary/subsystems/propulsion/propulsion_mission.py index 8208d5e10..be3004a73 100644 --- a/aviary/subsystems/propulsion/propulsion_mission.py +++ b/aviary/subsystems/propulsion/propulsion_mission.py @@ -55,7 +55,7 @@ def setup(self): for i, engine in enumerate(engine_models): self.add_subsystem( engine.name, - subsys=engine.build_mission(num_nodes=nn), + subsys=engine.build_mission(num_nodes=nn, aviary_inputs=options), promotes_inputs=['*'], ) diff --git a/aviary/subsystems/propulsion/propulsion_premission.py b/aviary/subsystems/propulsion/propulsion_premission.py index 7e47516ae..5d3049ce3 100644 --- a/aviary/subsystems/propulsion/propulsion_premission.py +++ b/aviary/subsystems/propulsion/propulsion_premission.py @@ -16,6 +16,9 @@ class PropulsionPreMission(om.Group): ''' def initialize(self): + self.options.declare( + 'aviary_options', types=AviaryValues, + desc='collection of Aircraft/Mission specific options') self.options.declare( 'engine_models', types=list, desc='list of EngineModels on aircraft' @@ -24,6 +27,7 @@ def initialize(self): add_aviary_option(self, Settings.VERBOSITY) def setup(self): + options = self.options['aviary_options'] engine_models = self.options['engine_models'] num_engine_type = len(engine_models) @@ -33,7 +37,7 @@ def setup(self): # each component here # Promotions are handled in self.configure() for engine in engine_models: - subsys = engine.build_pre_mission() + subsys = engine.build_pre_mission(options) if subsys: if num_engine_type > 1: proms = None diff --git a/aviary/subsystems/propulsion/test/test_hamilton_standard.py b/aviary/subsystems/propulsion/test/test_hamilton_standard.py index 2118982cd..6f21af456 100644 --- a/aviary/subsystems/propulsion/test/test_hamilton_standard.py +++ b/aviary/subsystems/propulsion/test/test_hamilton_standard.py @@ -9,7 +9,7 @@ from aviary.subsystems.propulsion.propeller.hamilton_standard import ( HamiltonStandard, PreHamiltonStandard, PostHamiltonStandard, ) -from aviary.variable_info.variables import Aircraft, Dynamic +from aviary.variable_info.functions import extract_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft, Dynamic @@ -78,11 +78,13 @@ def setUp(self): prob.model.add_subsystem( 'hs', - HamiltonStandard(num_nodes=num_nodes, aviary_options=options), + HamiltonStandard(num_nodes=num_nodes), promotes_inputs=['*'], promotes_outputs=["*"], ) + prob.model_options['*'] = extract_options(options) + prob.setup() self.prob = prob diff --git a/aviary/subsystems/propulsion/test/test_propeller_performance.py b/aviary/subsystems/propulsion/test/test_propeller_performance.py index a245241e1..265499039 100644 --- a/aviary/subsystems/propulsion/test/test_propeller_performance.py +++ b/aviary/subsystems/propulsion/test/test_propeller_performance.py @@ -11,7 +11,7 @@ OutMachs, PropellerPerformance, TipSpeedLimit, ) from aviary.variable_info.enums import OutMachType -from aviary.variable_info.variables import Aircraft, Dynamic +from aviary.variable_info.functions import extract_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft, Dynamic @@ -190,7 +190,8 @@ def setUp(self): pp = prob.model.add_subsystem( 'pp', - PropellerPerformance(num_nodes=num_nodes, aviary_options=options), + PropellerPerformance(num_nodes=num_nodes, + aviary_options=options), promotes_inputs=['*'], promotes_outputs=["*"], ) @@ -211,6 +212,9 @@ def setUp(self): val=True, units='unitless', ) + + prob.model_options['*'] = extract_options(options) + prob.setup() prob.set_val(Aircraft.Engine.PROPELLER_DIAMETER, 10.5, units="ft") @@ -280,6 +284,9 @@ def test_case_3_4_5(self): val=False, units='unitless', ) + + prob.model_options['*'] = extract_options(options) + prob.setup() prob.set_val('install_loss_factor', [0.0, 0.05, 0.05], units="unitless") prob.set_val(Aircraft.Engine.PROPELLER_DIAMETER, 12.0, units="ft") @@ -322,6 +329,9 @@ def test_case_6_7_8(self): val=False, units='unitless', ) + + prob.model_options['*'] = extract_options(options) + prob.setup() prob.set_val('install_loss_factor', [0.0, 0.05, 0.05], units="unitless") prob.set_val(Aircraft.Engine.PROPELLER_DIAMETER, 12.0, units="ft") @@ -430,6 +440,8 @@ def test_case_15_16_17(self): options.set_val(Aircraft.Engine.INTERPOLATION_METHOD, val='slinear', units='unitless') + prob.model_options['*'] = extract_options(options) + prob.setup(force_alloc_complex=True) prob.set_val('install_loss_factor', [0.0, 0.05, 0.05], units="unitless") prob.set_val(Aircraft.Engine.PROPELLER_DIAMETER, 12.0, units="ft") diff --git a/aviary/subsystems/propulsion/test/test_propulsion_mission.py b/aviary/subsystems/propulsion/test/test_propulsion_mission.py index 91b802e7f..4cca73bf8 100644 --- a/aviary/subsystems/propulsion/test/test_propulsion_mission.py +++ b/aviary/subsystems/propulsion/test/test_propulsion_mission.py @@ -13,6 +13,7 @@ from aviary.utils.preprocessors import preprocess_propulsion from aviary.utils.functions import get_path from aviary.validation_cases.validation_tests import get_flops_inputs +from aviary.variable_info.functions import extract_options from aviary.variable_info.variables import Aircraft, Dynamic, Mission, Settings from aviary.subsystems.propulsion.utils import build_engine_deck @@ -67,6 +68,8 @@ def test_case_1(self): units='unitless') self.prob.model.add_subsystem('IVC', IVC, promotes=['*']) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(force_alloc_complex=True) self.prob.set_val(Aircraft.Engine.SCALE_FACTOR, options.get_val( Aircraft.Engine.SCALE_FACTOR), units='unitless') diff --git a/aviary/subsystems/propulsion/test/test_propulsion_premission.py b/aviary/subsystems/propulsion/test/test_propulsion_premission.py index a2f84526c..30805bc7e 100644 --- a/aviary/subsystems/propulsion/test/test_propulsion_premission.py +++ b/aviary/subsystems/propulsion/test/test_propulsion_premission.py @@ -10,6 +10,7 @@ from aviary.subsystems.propulsion.utils import build_engine_deck from aviary.validation_cases.validation_tests import get_flops_inputs from aviary.models.multi_engine_single_aisle.multi_engine_single_aisle_data import engine_1_inputs, engine_2_inputs +from aviary.variable_info.functions import extract_options from aviary.variable_info.variables import Aircraft, Settings from aviary.utils.preprocessors import preprocess_options @@ -26,6 +27,8 @@ def test_case(self): self.prob.model = PropulsionPreMission(aviary_options=options, engine_models=build_engine_deck(options)) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(force_alloc_complex=True) self.prob.set_val(Aircraft.Engine.SCALED_SLS_THRUST, options.get_val( Aircraft.Engine.SCALED_SLS_THRUST, units='lbf')) @@ -54,6 +57,8 @@ def test_multi_engine(self): self.prob.model = PropulsionPreMission(aviary_options=options, engine_models=engine_models) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(force_alloc_complex=True) self.prob.set_val(Aircraft.Engine.SCALED_SLS_THRUST, options.get_val( Aircraft.Engine.SCALED_SLS_THRUST, units='lbf')) diff --git a/aviary/subsystems/propulsion/test/test_turboprop_model.py b/aviary/subsystems/propulsion/test/test_turboprop_model.py index eacd6595e..75c3998f3 100644 --- a/aviary/subsystems/propulsion/test/test_turboprop_model.py +++ b/aviary/subsystems/propulsion/test/test_turboprop_model.py @@ -12,6 +12,7 @@ ) from aviary.utils.preprocessors import preprocess_propulsion from aviary.utils.functions import get_path +from aviary.variable_info.functions import extract_options from aviary.variable_info.variables import Aircraft, Dynamic, Mission from aviary.variable_info.enums import SpeedType from aviary.variable_info.options import get_option_defaults @@ -87,6 +88,8 @@ def prepare_model( promotes_outputs=['*'], ) + self.prob.model_options['*'] = extract_options(options) + self.prob.setup(force_alloc_complex=False) self.prob.set_val(Aircraft.Engine.SCALE_FACTOR, 1, units='unitless') diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 0c34f4276..297c1bd61 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1736,7 +1736,7 @@ units="unitless", option=True, default_value=True, - types=bool, + types=(bool, list), desc='if true, compute installation loss factor based on blockage factor', ) @@ -2008,7 +2008,7 @@ units='unitless', desc='number of blades per propeller', option=True, - types=int, + types=(int, list, np.ndarray), default_value=0 ) @@ -2353,7 +2353,7 @@ }, option=True, default_value=False, - types=bool, + types=(bool, list), units="unitless", desc='flag whether to use propeller map or Hamilton-Standard model.' ) From 127d74f1fad46dbb3f6400061ba8deaa84c46546 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Thu, 26 Sep 2024 07:52:56 -0400 Subject: [PATCH 14/58] 5 more tests pass --- aviary/mission/gasp_based/phases/landing_group.py | 4 ++-- .../gasp_based/phases/test/test_landing_group.py | 3 +++ .../gasp_based/phases/test/test_taxi_component.py | 9 ++++++--- .../mission/gasp_based/phases/test/test_taxi_group.py | 3 +++ .../flops_based/test/test_tabular_aero_group.py | 11 ++++++++++- 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/aviary/mission/gasp_based/phases/landing_group.py b/aviary/mission/gasp_based/phases/landing_group.py index b3c3b74fe..49dfad209 100644 --- a/aviary/mission/gasp_based/phases/landing_group.py +++ b/aviary/mission/gasp_based/phases/landing_group.py @@ -5,10 +5,10 @@ from aviary.mission.gasp_based.phases.landing_components import ( GlideConditionComponent, LandingAltitudeComponent, LandingGroundRollComponent) -from aviary.variable_info.enums import SpeedType -from aviary.variable_info.variables import Aircraft, Dynamic, Mission from aviary.subsystems.aerodynamics.aerodynamics_builder import AerodynamicsBuilderBase from aviary.subsystems.propulsion.propulsion_builder import PropulsionBuilderBase +from aviary.variable_info.enums import SpeedType +from aviary.variable_info.variables import Aircraft, Dynamic, Mission class LandingSegment(BaseODE): diff --git a/aviary/mission/gasp_based/phases/test/test_landing_group.py b/aviary/mission/gasp_based/phases/test/test_landing_group.py index f12714b0f..2f5a576d0 100644 --- a/aviary/mission/gasp_based/phases/test/test_landing_group.py +++ b/aviary/mission/gasp_based/phases/test/test_landing_group.py @@ -12,6 +12,7 @@ from aviary.subsystems.propulsion.utils import build_engine_deck from aviary.utils.test_utils.default_subsystems import get_default_mission_subsystems from aviary.utils.test_utils.IO_test_util import check_prob_outputs +from aviary.variable_info.functions import extract_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Dynamic, Mission @@ -28,6 +29,8 @@ def setUp(self): self.prob.model = LandingSegment( aviary_options=options, core_subsystems=core_subsystems) + self.prob.model_options['*'] = extract_options(options) + @unittest.skipIf(version.parse(openmdao.__version__) < version.parse("3.26"), "Skipping due to OpenMDAO version being too low (<3.26)") def test_dland(self): self.prob.setup(check=False, force_alloc_complex=True) diff --git a/aviary/mission/gasp_based/phases/test/test_taxi_component.py b/aviary/mission/gasp_based/phases/test/test_taxi_component.py index e5b8187e3..77be1ade8 100644 --- a/aviary/mission/gasp_based/phases/test/test_taxi_component.py +++ b/aviary/mission/gasp_based/phases/test/test_taxi_component.py @@ -6,18 +6,21 @@ from aviary.utils.aviary_values import AviaryValues from aviary.mission.gasp_based.phases.taxi_component import TaxiFuelComponent +from aviary.variable_info.functions import extract_options from aviary.variable_info.variables import Dynamic, Mission class TaxiFuelComponentTestCase(unittest.TestCase): def setUp(self): - self.prob = om.Problem(model=om.Group()) + self.prob = om.Problem() aviary_options = AviaryValues() aviary_options.set_val(Mission.Taxi.DURATION, 0.1677, units="h") - self.prob.model.add_subsystem('taxi', TaxiFuelComponent( - aviary_options=aviary_options), promotes=['*']) + self.prob.model.add_subsystem('taxi', TaxiFuelComponent(), + promotes=['*']) + + self.prob.model_options['*'] = extract_options(aviary_options) def test_fuel_consumed(self): self.prob.setup(force_alloc_complex=True) diff --git a/aviary/mission/gasp_based/phases/test/test_taxi_group.py b/aviary/mission/gasp_based/phases/test/test_taxi_group.py index b59f6604c..28491e3f9 100644 --- a/aviary/mission/gasp_based/phases/test/test_taxi_group.py +++ b/aviary/mission/gasp_based/phases/test/test_taxi_group.py @@ -10,6 +10,7 @@ from aviary.subsystems.propulsion.utils import build_engine_deck from aviary.utils.test_utils.default_subsystems import get_default_mission_subsystems from aviary.utils.test_utils.IO_test_util import check_prob_outputs +from aviary.variable_info.functions import extract_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Dynamic, Mission @@ -31,6 +32,8 @@ def setUp(self): self.prob.model = TaxiSegment( aviary_options=options, core_subsystems=default_mission_subsystems) + self.prob.model_options['*'] = extract_options(options) + @unittest.skipIf(version.parse(openmdao.__version__) < version.parse("3.26"), "Skipping due to OpenMDAO version being too low (<3.26)") def test_taxi(self): self.prob.setup(check=False, force_alloc_complex=True) diff --git a/aviary/subsystems/aerodynamics/flops_based/test/test_tabular_aero_group.py b/aviary/subsystems/aerodynamics/flops_based/test/test_tabular_aero_group.py index 9ddf681bf..726b1bf82 100644 --- a/aviary/subsystems/aerodynamics/flops_based/test/test_tabular_aero_group.py +++ b/aviary/subsystems/aerodynamics/flops_based/test/test_tabular_aero_group.py @@ -17,8 +17,9 @@ from aviary.validation_cases.validation_tests import (get_flops_inputs, get_flops_outputs, print_case) -from aviary.variable_info.variables import Aircraft, Dynamic, Mission, Settings from aviary.variable_info.enums import LegacyCode +from aviary.variable_info.functions import extract_options +from aviary.variable_info.variables import Aircraft, Dynamic, Mission, Settings FLOPS = LegacyCode.FLOPS GASP = LegacyCode.GASP @@ -47,6 +48,8 @@ def setUp(self): promotes_outputs=['*'], ) + self.prob.model_options['*'] = extract_options(aviary_options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case(self): @@ -122,6 +125,8 @@ def setUp(self): promotes_outputs=['*'], ) + self.prob.model_options['*'] = extract_options(aviary_options) + self.prob.setup(check=False, force_alloc_complex=True) def test_case(self): @@ -243,6 +248,8 @@ def test_case(self, case_name): promotes_outputs=['*'], ) + prob.model_options['*'] = extract_options(flops_inputs) + prob.setup(check=False, force_alloc_complex=True) for (key, (val, units)) in dynamic_inputs: @@ -540,6 +547,8 @@ def _run_computed_aero_harness(flops_inputs, dynamic_inputs, num_nodes): prob = om.Problem( _ComputedAeroHarness(num_nodes=num_nodes, aviary_options=flops_inputs)) + prob.model_options['*'] = extract_options(flops_inputs) + prob.setup() set_aviary_initial_values(prob, dynamic_inputs) From 0a8d8baff1a60df98b6f5c500dc16fc6618dc5a2 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Fri, 27 Sep 2024 10:49:19 -0400 Subject: [PATCH 15/58] Where we are. --- aviary/interface/methods_for_level2.py | 4 ++-- aviary/variable_info/variable_meta_data.py | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/aviary/interface/methods_for_level2.py b/aviary/interface/methods_for_level2.py index 6c84d5bf8..e15aac461 100644 --- a/aviary/interface/methods_for_level2.py +++ b/aviary/interface/methods_for_level2.py @@ -632,8 +632,8 @@ def _add_height_energy_takeoff_systems(self): def _add_two_dof_takeoff_systems(self): # Create options to values OptionsToValues = create_opts2vals( - [Aircraft.CrewPayload.NUM_PASSENGERS, - Mission.Design.CRUISE_ALTITUDE, ]) + [Aircraft.CrewPayload.NUM_PASSENGERS] + ) add_opts2vals(self.model, OptionsToValues, self.aviary_inputs) if self.analysis_scheme is AnalysisScheme.SHOOTING: diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index cb6d9f93f..b44d33db2 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -6916,7 +6916,6 @@ "FLOPS": None, "LEAPS1": None }, - option=True, units='ft', default_value=25000, desc='design mission cruise altitude', From 3e892d45baaf6a5daa6a261d248605a87ef2b4b5 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Fri, 27 Sep 2024 11:26:54 -0400 Subject: [PATCH 16/58] testing --- aviary/validation_cases/benchmark_tests/test_bench_GwGm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/validation_cases/benchmark_tests/test_bench_GwGm.py b/aviary/validation_cases/benchmark_tests/test_bench_GwGm.py index ca18abdf1..97037a5b6 100644 --- a/aviary/validation_cases/benchmark_tests/test_bench_GwGm.py +++ b/aviary/validation_cases/benchmark_tests/test_bench_GwGm.py @@ -229,4 +229,4 @@ def test_bench_GwGm_shooting(self): # unittest.main() test = ProblemPhaseTestCase() test.setUp() - test.test_bench_GwGm_shooting() + test.test_bench_GwGm_SNOPT() From 69b6383285b64488bbd1f463066bf2b0d442c0ef Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Fri, 27 Sep 2024 13:00:45 -0400 Subject: [PATCH 17/58] Checkpoint --- aviary/interface/methods_for_level2.py | 5 +-- aviary/mission/flops_based/ode/mission_ODE.py | 1 - .../gasp_based/flaps_model/meta_model.py | 22 ++++++------- .../subsystems/mass/gasp_based/design_load.py | 12 ++----- .../gasp_based/equipment_and_useful_load.py | 12 +++---- aviary/subsystems/mass/gasp_based/fixed.py | 20 ++++++------ .../mass/gasp_based/test/test_design_load.py | 32 +++++++++---------- .../subsystems/propulsion/engine_scaling.py | 12 +++---- aviary/variable_info/enums.py | 4 +-- aviary/variable_info/variable_meta_data.py | 2 +- 10 files changed, 56 insertions(+), 66 deletions(-) diff --git a/aviary/interface/methods_for_level2.py b/aviary/interface/methods_for_level2.py index e15aac461..d84100893 100644 --- a/aviary/interface/methods_for_level2.py +++ b/aviary/interface/methods_for_level2.py @@ -632,8 +632,9 @@ def _add_height_energy_takeoff_systems(self): def _add_two_dof_takeoff_systems(self): # Create options to values OptionsToValues = create_opts2vals( - [Aircraft.CrewPayload.NUM_PASSENGERS] - ) + [Aircraft.CrewPayload.NUM_PASSENGERS, + Mission.Design.CRUISE_ALTITUDE, ]) + add_opts2vals(self.model, OptionsToValues, self.aviary_inputs) if self.analysis_scheme is AnalysisScheme.SHOOTING: diff --git a/aviary/mission/flops_based/ode/mission_ODE.py b/aviary/mission/flops_based/ode/mission_ODE.py index 4fb082d5d..f07188a8c 100644 --- a/aviary/mission/flops_based/ode/mission_ODE.py +++ b/aviary/mission/flops_based/ode/mission_ODE.py @@ -175,7 +175,6 @@ def setup(self): "throttle_allocator", ThrottleAllocator( num_nodes=nn, - aviary_options=aviary_options, throttle_allocation=self.options['throttle_allocation'] ), promotes_inputs=['*'], diff --git a/aviary/subsystems/aerodynamics/gasp_based/flaps_model/meta_model.py b/aviary/subsystems/aerodynamics/gasp_based/flaps_model/meta_model.py index 901d1def8..04871ee4d 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/flaps_model/meta_model.py +++ b/aviary/subsystems/aerodynamics/gasp_based/flaps_model/meta_model.py @@ -34,7 +34,7 @@ def setup(self): desc="ratio of flap chord to wing chord", ) - if flap_type is FlapType.PLAIN or flap_type is FlapType.SPLIT: + if flap_type == FlapType.PLAIN or flap_type == FlapType.SPLIT: VDEL1_interp.add_output( "VDEL1", @@ -369,7 +369,7 @@ def setup(self): desc="average wing thickness to chord ratio", ) - if flap_type is FlapType.PLAIN or flap_type is FlapType.SPLIT: + if flap_type == FlapType.PLAIN or flap_type == FlapType.SPLIT: VLAM4_interp.add_output( "VLAM4", @@ -441,7 +441,7 @@ def setup(self): desc="ratio of flap chord to wing chord", ) - if flap_type is FlapType.PLAIN or flap_type is FlapType.SPLIT: + if flap_type == FlapType.PLAIN or flap_type == FlapType.SPLIT: VLAM5_interp.add_output( "VLAM5", @@ -452,9 +452,9 @@ def setup(self): ) elif ( - flap_type is FlapType.SINGLE_SLOTTED - or flap_type is FlapType.DOUBLE_SLOTTED - or flap_type is FlapType.TRIPLE_SLOTTED + flap_type == FlapType.SINGLE_SLOTTED + or flap_type == FlapType.DOUBLE_SLOTTED + or flap_type == FlapType.TRIPLE_SLOTTED ): VLAM5_interp.add_output( @@ -511,7 +511,7 @@ def setup(self): desc="flap deflection", ) - if flap_type is FlapType.PLAIN or flap_type is FlapType.SPLIT: + if flap_type == FlapType.PLAIN or flap_type == FlapType.SPLIT: VLAM6_interp.add_output( "VLAM6", @@ -538,9 +538,9 @@ def setup(self): ) elif ( - flap_type is FlapType.SINGLE_SLOTTED - or flap_type is FlapType.DOUBLE_SLOTTED - or flap_type is FlapType.TRIPLE_SLOTTED + flap_type == FlapType.SINGLE_SLOTTED + or flap_type == FlapType.DOUBLE_SLOTTED + or flap_type == FlapType.TRIPLE_SLOTTED ): VLAM6_interp.add_output( @@ -567,7 +567,7 @@ def setup(self): desc="sensitivity of flap clean wing maximum lift coefficient to wing flap deflection", ) - elif (flap_type is FlapType.FOWLER or flap_type is FlapType.DOUBLE_SLOTTED_FOWLER): + elif (flap_type == FlapType.FOWLER or flap_type == FlapType.DOUBLE_SLOTTED_FOWLER): VLAM6_interp.add_output( "VLAM6", diff --git a/aviary/subsystems/mass/gasp_based/design_load.py b/aviary/subsystems/mass/gasp_based/design_load.py index 700010116..09103526f 100644 --- a/aviary/subsystems/mass/gasp_based/design_load.py +++ b/aviary/subsystems/mass/gasp_based/design_load.py @@ -365,6 +365,7 @@ class LoadParameters(om.ExplicitComponent): def initialize(self): add_aviary_option(self, Aircraft.Design.PART25_STRUCTURAL_CATEGORY) add_aviary_option(self, Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES) + add_aviary_option(self, Mission.Design.CRUISE_ALTITUDE, units='ft') def setup(self): @@ -382,12 +383,6 @@ def setup(self): desc="VM0: maximum operating equivalent airspeed", ) - add_aviary_input( - self, - Mission.Design.CRUISE_ALTITUDE, - units='ft', - ) - self.add_output( "max_mach", val=0, units="unitless", desc="EMM0: maximum operating mach number" ) @@ -410,7 +405,7 @@ def compute(self, inputs, outputs): vel_c = inputs["vel_c"] max_airspeed = inputs["max_airspeed"] - cruise_alt = inputs[Mission.Design.CRUISE_ALTITUDE] + cruise_alt, _ = self.options[Mission.Design.CRUISE_ALTITUDE] CATD = self.options[Aircraft.Design.PART25_STRUCTURAL_CATEGORY] smooth = self.options[Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES] @@ -478,7 +473,7 @@ def compute_partials(self, inputs, partials): vel_c = inputs["vel_c"] max_airspeed = inputs["max_airspeed"] - cruise_alt = inputs[Mission.Design.CRUISE_ALTITUDE] + cruise_alt, _ = self.options[Mission.Design.CRUISE_ALTITUDE] CATD = self.options[Aircraft.Design.PART25_STRUCTURAL_CATEGORY] smooth = self.options[Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES] @@ -1230,7 +1225,6 @@ def setup(self): promotes_inputs=[ "max_airspeed", "vel_c", - Mission.Design.CRUISE_ALTITUDE, ], promotes_outputs=["density_ratio", "V9", "max_mach"], ) diff --git a/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py b/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py index 204d5dc4f..904819329 100644 --- a/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py +++ b/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py @@ -114,7 +114,7 @@ def compute(self, inputs, outputs): num_pilots = 1.0 if PAX > 9.0: num_pilots = 2.0 - if engine_type is GASPEngineType.TURBOJET and PAX > 5.0: + if engine_type == GASPEngineType.TURBOJET and PAX > 5.0: num_pilots = 2.0 if PAX >= 251.0: num_pilots = 3.0 @@ -309,9 +309,9 @@ def compute(self, inputs, outputs): 20.0 * (num_flight_attendants + num_pilots) + 25.0 * num_pilots ) - if engine_type is GASPEngineType.TURBOJET: + if engine_type == GASPEngineType.TURBOJET: oil_per_eng_wt = 0.0054 * Fn_SLS + 12.0 - elif engine_type is GASPEngineType.TURBOSHAFT or engine_type is GASPEngineType.TURBOPROP: + elif engine_type == GASPEngineType.TURBOSHAFT or engine_type == GASPEngineType.TURBOPROP: oil_per_eng_wt = 0.0124 * Fn_SLS + 14 # else: # oil_per_eng_wt = 0.062 * (Fn_SLS - 100) + 11 @@ -419,7 +419,7 @@ def compute_partials(self, inputs, partials): num_pilots = 1.0 if PAX > 9.0: num_pilots = 2.0 - if engine_type is GASPEngineType.TURBOJET and PAX > 5.0: + if engine_type == GASPEngineType.TURBOJET and PAX > 5.0: num_pilots = 2.0 if PAX >= 251.0: num_pilots = 3.0 @@ -705,9 +705,9 @@ def compute_partials(self, inputs, partials): if PAX >= 251.0: num_flight_attendants = 6.0 - if engine_type is GASPEngineType.TURBOJET: + if engine_type == GASPEngineType.TURBOJET: doil_per_eng_wt_dFn_SLS = 0.0054 - elif engine_type is GASPEngineType.TURBOSHAFT or engine_type is GASPEngineType.TURBOPROP: + elif engine_type == GASPEngineType.TURBOSHAFT or engine_type == GASPEngineType.TURBOPROP: doil_per_eng_wt_dFn_SLS = 0.0124 # else: # doil_per_eng_wt_dFn_SLS = 0.062 diff --git a/aviary/subsystems/mass/gasp_based/fixed.py b/aviary/subsystems/mass/gasp_based/fixed.py index e48d62491..8a06096e6 100644 --- a/aviary/subsystems/mass/gasp_based/fixed.py +++ b/aviary/subsystems/mass/gasp_based/fixed.py @@ -1633,10 +1633,10 @@ def compute(self, inputs, outputs): outputs['slat_mass'] = WLED / GRAV_ENGLISH_LBM # Flap Mass - if flap_type is FlapType.PLAIN: + if flap_type == FlapType.PLAIN: outputs["flap_mass"] = c_mass_trend_high_lift * \ (VFLAP/100.)**2*SFLAP*num_flaps**(-.5) / GRAV_ENGLISH_LBM - elif flap_type is FlapType.SPLIT: + elif flap_type == FlapType.SPLIT: if VFLAP > 160: outputs["flap_mass"] = c_mass_trend_high_lift*SFLAP * \ (VFLAP**2.195)/45180. / GRAV_ENGLISH_LBM @@ -1645,12 +1645,12 @@ def compute(self, inputs, outputs): 0.369*VFLAP**0.2733 / GRAV_ENGLISH_LBM elif ( - flap_type is FlapType.SINGLE_SLOTTED or flap_type is FlapType.DOUBLE_SLOTTED - or flap_type is FlapType.TRIPLE_SLOTTED + flap_type == FlapType.SINGLE_SLOTTED or flap_type == FlapType.DOUBLE_SLOTTED + or flap_type == FlapType.TRIPLE_SLOTTED ): outputs["flap_mass"] = c_mass_trend_high_lift * \ (VFLAP/100.)**2*SFLAP*num_flaps**.5 / GRAV_ENGLISH_LBM - elif flap_type is FlapType.FOWLER or flap_type is FlapType.DOUBLE_SLOTTED_FOWLER: + elif flap_type == FlapType.FOWLER or flap_type == FlapType.DOUBLE_SLOTTED_FOWLER: outputs["flap_mass"] = c_mass_trend_high_lift * \ (VFLAP/100.)**2.38*SFLAP**1.19 / \ (num_flaps**.595) / GRAV_ENGLISH_LBM @@ -1757,7 +1757,7 @@ def compute_partials(self, inputs, J): 1.13*(SLE**.13)*dSLE_dBTSR*dBTSR_dCW / GRAV_ENGLISH_LBM # Flap Mass - if flap_type is FlapType.PLAIN: + if flap_type == FlapType.PLAIN: # c_wt_trend_high_lift * (VFLAP/100.)**2*SFLAP*num_flaps**(-.5) J["flap_mass", Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT] = ( VFLAP/100)**2 * SFLAP * num_flaps**(-.5) / GRAV_ENGLISH_LBM @@ -1794,7 +1794,7 @@ def compute_partials(self, inputs, J): J["flap_mass", Aircraft.Fuselage.AVG_DIAMETER] = c_mass_trend_high_lift * \ (VFLAP/100)**2 * dSFLAP_dBTSR * dBTSR_dCW * \ num_flaps**(-.5) / GRAV_ENGLISH_LBM - elif flap_type is FlapType.SPLIT: + elif flap_type == FlapType.SPLIT: if VFLAP > 160: # c_wt_trend_high_lift*SFLAP*(VFLAP**2.195)/45180. J["flap_mass", Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT] = SFLAP * \ @@ -1881,8 +1881,8 @@ def compute_partials(self, inputs, J): * VFLAP**0.2733 / GRAV_ENGLISH_LBM) elif ( - flap_type is FlapType.SINGLE_SLOTTED or flap_type is FlapType.DOUBLE_SLOTTED - or flap_type is FlapType.TRIPLE_SLOTTED + flap_type == FlapType.SINGLE_SLOTTED or flap_type == FlapType.DOUBLE_SLOTTED + or flap_type == FlapType.TRIPLE_SLOTTED ): # c_wt_trend_high_lift*(VFLAP/100.)**2*SFLAP*num_flaps**.5 J["flap_mass", Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT] = ( @@ -1918,7 +1918,7 @@ def compute_partials(self, inputs, J): J["flap_mass", Aircraft.Fuselage.AVG_DIAMETER] = c_mass_trend_high_lift * \ (VFLAP/100.)**2*dSFLAP_dBTSR*dBTSR_dCW * \ num_flaps**.5 / GRAV_ENGLISH_LBM - elif flap_type is FlapType.FOWLER or flap_type is FlapType.DOUBLE_SLOTTED_FOWLER: + elif flap_type == FlapType.FOWLER or flap_type == FlapType.DOUBLE_SLOTTED_FOWLER: # c_wt_trend_high_lift * (VFLAP/100.)**2.38*SFLAP**1.19/(num_flaps**.595) J["flap_mass", Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT] = ( VFLAP/100.)**2.38*SFLAP**1.19/(num_flaps**.595) / GRAV_ENGLISH_LBM diff --git a/aviary/subsystems/mass/gasp_based/test/test_design_load.py b/aviary/subsystems/mass/gasp_based/test/test_design_load.py index 52a9f4db8..a3fc04ff1 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_design_load.py +++ b/aviary/subsystems/mass/gasp_based/test/test_design_load.py @@ -445,6 +445,9 @@ def test_case1(self): class LoadParametersTestCase1(unittest.TestCase): def setUp(self): + options = get_option_defaults() + options.set_val(Mission.Design.CRUISE_ALTITUDE, val=37500, units='ft') + self.prob = om.Problem() self.prob.model.add_subsystem( "params", LoadParameters(), promotes=["*"] @@ -457,9 +460,9 @@ def setUp(self): "max_airspeed", val=350, units="kn" ) # bug fixed value - self.prob.setup(check=False, force_alloc_complex=True) + self.prob.model_options['*'] = extract_options(options) - self.prob.set_val(Mission.Design.CRUISE_ALTITUDE, val=37500, units='ft') + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -480,6 +483,7 @@ def setUp(self): options = get_option_defaults() options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, val=2, units='unitless') + options.set_val(Mission.Design.CRUISE_ALTITUDE, val=30000, units='ft') self.prob = om.Problem() self.prob.model.add_subsystem( @@ -497,8 +501,6 @@ def setUp(self): self.prob.setup(check=False, force_alloc_complex=True) - self.prob.set_val(Mission.Design.CRUISE_ALTITUDE, val=30000, units='ft') - def test_case1(self): self.prob.run_model() @@ -519,6 +521,7 @@ def setUp(self): options = get_option_defaults() options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, val=4, units='unitless') + options.set_val(Mission.Design.CRUISE_ALTITUDE, val=22000, units='ft') self.prob = om.Problem() self.prob.model.add_subsystem( @@ -536,8 +539,6 @@ def setUp(self): self.prob.setup(check=False, force_alloc_complex=True) - self.prob.set_val(Mission.Design.CRUISE_ALTITUDE, val=22000, units='ft') - def test_case1(self): self.prob.run_model() @@ -559,6 +560,7 @@ def setUp(self): options = get_option_defaults() options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, val=True, units='unitless') + options.set_val(Mission.Design.CRUISE_ALTITUDE, val=37500, units='ft') self.prob = om.Problem() self.prob.model.add_subsystem( @@ -578,8 +580,6 @@ def setUp(self): self.prob.setup(check=False, force_alloc_complex=True) - self.prob.set_val(Mission.Design.CRUISE_ALTITUDE, val=37500, units='ft') - def test_case1(self): self.prob.run_model() @@ -601,6 +601,7 @@ def setUp(self): val=2, units='unitless') options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, val=True, units='unitless') + options.set_val(Mission.Design.CRUISE_ALTITUDE, val=30000, units='ft') self.prob = om.Problem() self.prob.model.add_subsystem( @@ -620,8 +621,6 @@ def setUp(self): self.prob.setup(check=False, force_alloc_complex=True) - self.prob.set_val(Mission.Design.CRUISE_ALTITUDE, val=30000, units='ft') - def test_case1(self): self.prob.run_model() @@ -644,6 +643,7 @@ def setUp(self): val=4, units='unitless') options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, val=True, units='unitless') + options.set_val(Mission.Design.CRUISE_ALTITUDE, val=22000, units='ft') self.prob = om.Problem() self.prob.model.add_subsystem( @@ -663,8 +663,6 @@ def setUp(self): self.prob.setup(check=False, force_alloc_complex=True) - self.prob.set_val(Mission.Design.CRUISE_ALTITUDE, val=22000, units='ft') - def test_case1(self): self.prob.run_model() @@ -898,6 +896,9 @@ def test_case1(self): class DesignLoadGroupTestCase1(unittest.TestCase): def setUp(self): + options = get_option_defaults() + options.set_val(Mission.Design.CRUISE_ALTITUDE, val=37500, units='ft') + self.prob = om.Problem() self.prob.model.add_subsystem( @@ -917,9 +918,9 @@ def setUp(self): Aircraft.Wing.AVERAGE_CHORD, val=12.71, units="ft" ) # bug fixed value - self.prob.setup(check=False, force_alloc_complex=True) + self.prob.model_options['*'] = extract_options(options) - self.prob.set_val(Mission.Design.CRUISE_ALTITUDE, val=37500, units='ft') + self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): @@ -941,6 +942,7 @@ def setUp(self): options = get_option_defaults() options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, val=True, units='unitless') + options.set_val(Mission.Design.CRUISE_ALTITUDE, val=37500, units='ft') self.prob = om.Problem() @@ -965,8 +967,6 @@ def setUp(self): self.prob.setup(check=False, force_alloc_complex=True) - self.prob.set_val(Mission.Design.CRUISE_ALTITUDE, val=37500, units='ft') - def test_case1(self): self.prob.run_model() diff --git a/aviary/subsystems/propulsion/engine_scaling.py b/aviary/subsystems/propulsion/engine_scaling.py index 57242d45e..23629b56a 100644 --- a/aviary/subsystems/propulsion/engine_scaling.py +++ b/aviary/subsystems/propulsion/engine_scaling.py @@ -143,14 +143,10 @@ def compute(self, inputs, outputs): for variable in engine_variables: if variable not in skip_variables: if variable is FUEL_FLOW: - try: - - outputs[Dynamic.Mission.FUEL_FLOW_RATE_NEGATIVE] = -( - inputs['fuel_flow_rate_unscaled'] * fuel_flow_scale_factor - + constant_fuel_flow - ) - except: - print('z') + outputs[Dynamic.Mission.FUEL_FLOW_RATE_NEGATIVE] = -( + inputs['fuel_flow_rate_unscaled'] * fuel_flow_scale_factor + + constant_fuel_flow + ) else: outputs[variable.value] = ( inputs[variable.value + '_unscaled'] * scale_factor diff --git a/aviary/variable_info/enums.py b/aviary/variable_info/enums.py index e4583609f..071192bc3 100644 --- a/aviary/variable_info/enums.py +++ b/aviary/variable_info/enums.py @@ -64,7 +64,7 @@ class EquationsOfMotion(Enum): @unique -class GASPEngineType(Enum): +class GASPEngineType(IntEnum): """ Defines the type of engine to use in GASP-based mass calculations. Note that only the value for the first engine model will be used. @@ -109,7 +109,7 @@ class GASPEngineType(Enum): @unique -class FlapType(Enum): +class FlapType(IntEnum): """ Defines the type of flap used on the wing. Used in GASP-based aerodynamics and mass calculations. """ diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index b44d33db2..3cbe27546 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -6917,9 +6917,9 @@ "LEAPS1": None }, units='ft', + option=True, default_value=25000, desc='design mission cruise altitude', - types=[int, float] ) add_meta_data( From 8936adc6466834c7d0bb64ddaabff6efe1d6feb4 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Mon, 30 Sep 2024 11:01:54 -0400 Subject: [PATCH 18/58] Implemented option indexing for propulsion. --- aviary/interface/methods_for_level2.py | 32 ++++++++++++++++--- .../test_unsteady_alpha_thrust_iter_group.py | 1 - .../unsteady_control_iter_group.py | 6 ++++ aviary/utils/test/test_aviary_values.py | 30 +++++++++-------- 4 files changed, 50 insertions(+), 19 deletions(-) diff --git a/aviary/interface/methods_for_level2.py b/aviary/interface/methods_for_level2.py index d84100893..4e3d1b7fa 100644 --- a/aviary/interface/methods_for_level2.py +++ b/aviary/interface/methods_for_level2.py @@ -1938,6 +1938,34 @@ def setup(self, **kwargs): """ Lightly wrappd setup() method for the problem. """ + + # Use OpenMDAO's model options to pass all options through the system hierarchy. + self.model_options['*'] = extract_options(self.aviary_inputs, + self.meta_data) + + # Multi-engines need to index into their options. + num_engine_models = len(self.aviary_inputs.get_val(Aircraft.Engine.NUM_ENGINES)) + if num_engine_models > 1: + for idx in range(num_engine_models): + eng_name = self.engine_builders[idx].name + + # TODO: For future flexibility, need to tag the required engine options. + opt_names = [ + Aircraft.Engine.SCALE_PERFORMANCE + ] + opt_names_units = [ + Aircraft.Engine.REFERENCE_SLS_THRUST, + ] + opts = {} + for key in opt_names: + opts[key] = self.aviary_inputs.get_item(key)[0][idx] + for key in opt_names_units: + val, units = self.aviary_inputs.get_item(key) + opts[key] = (val[idx], units) + + pre_path = f"pre_mission.core_propulsion.{eng_name}" + self.model_options[pre_path] = opts + # suppress warnings: # "input variable '...' promoted using '*' was already promoted using 'aircraft:*' with warnings.catch_warnings(): @@ -1946,10 +1974,6 @@ def setup(self, **kwargs): self.model.options['aviary_metadata'] = self.meta_data self.model.options['phase_info'] = self.phase_info - # Use OpenMDAO's model options to pass all options through the system hierarchy. - self.model_options['*'] = extract_options(self.aviary_inputs, - self.meta_data) - warnings.simplefilter("ignore", om.OpenMDAOWarning) warnings.simplefilter("ignore", om.PromotionWarning) 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 aec538e3a..41e5529a4 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 @@ -39,7 +39,6 @@ def _test_unsteady_alpha_thrust_iter_group(self, ground_roll=False): g = UnsteadyControlIterGroup(num_nodes=nn, ground_roll=ground_roll, clean=True, - aviary_options=get_option_defaults(), core_subsystems=[aero]) ig = p.model.add_subsystem("iter_group", 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 095b1419b..b1a9919ba 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 @@ -3,6 +3,7 @@ from aviary.constants import RHO_SEA_LEVEL_ENGLISH +from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.variables import Dynamic from aviary.mission.gasp_based.ode.unsteady_solved.unsteady_solved_eom import UnsteadySolvedEOM @@ -21,6 +22,11 @@ def initialize(self): self.options.declare("clean", types=bool, default=False, desc="If true then no flaps or gear are included. Useful for high-speed flight phases.") + self.options.declare( + 'aviary_options', types=AviaryValues, default=None, + desc='collection of Aircraft/Mission specific options' + ) + # TODO finish description self.options.declare( 'core_subsystems', diff --git a/aviary/utils/test/test_aviary_values.py b/aviary/utils/test/test_aviary_values.py index 1694f5202..57dd4f480 100644 --- a/aviary/utils/test/test_aviary_values.py +++ b/aviary/utils/test/test_aviary_values.py @@ -84,24 +84,26 @@ def test_aircraft(self): except: self.fail('Expecting to be able to set the value of an Enum.') - try: - vals.set_val(Aircraft.Engine.TYPE, 'turbojet') - self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) - is GASPEngineType.TURBOJET) - except: - self.fail('Expecting to be able to set the value of an Enum from a string.') - - try: - vals.set_val(Aircraft.Engine.TYPE, 'TURBOJET') - self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) - is GASPEngineType.TURBOJET) - except: - self.fail('Expecting to be able to set the value of an Enum from a string.') + # TODO - Following the pattern of other intenums, these go away. Seems like + # we need to pick either int or string setting. + #try: + #vals.set_val(Aircraft.Engine.TYPE, 'turbojet') + #self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) + #== GASPEngineType.TURBOJET) + #except: + #self.fail('Expecting to be able to set the value of an Enum from an int.') + + #try: + #vals.set_val(Aircraft.Engine.TYPE, 'TURBOJET') + #self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) + #is GASPEngineType.TURBOJET) + #except: + #self.fail('Expecting to be able to set the value of an Enum from a string.') try: vals.set_val(Aircraft.Engine.TYPE, 7) self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) - is GASPEngineType.TURBOJET) + == GASPEngineType.TURBOJET) except: self.fail('Expecting to be able to set the value of an Enum from an int.') From 3fa38cb1aa7825993e37172592a740f7965888b5 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Mon, 30 Sep 2024 12:07:24 -0400 Subject: [PATCH 19/58] Multi engine tests pass --- aviary/interface/methods_for_level2.py | 9 ++++++++- aviary/subsystems/mass/flops_based/landing_gear.py | 5 +++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/aviary/interface/methods_for_level2.py b/aviary/interface/methods_for_level2.py index 4e3d1b7fa..f4649d8f4 100644 --- a/aviary/interface/methods_for_level2.py +++ b/aviary/interface/methods_for_level2.py @@ -1951,10 +1951,15 @@ def setup(self, **kwargs): # TODO: For future flexibility, need to tag the required engine options. opt_names = [ - Aircraft.Engine.SCALE_PERFORMANCE + Aircraft.Engine.SCALE_PERFORMANCE, + Aircraft.Engine.SUBSONIC_FUEL_FLOW_SCALER, + Aircraft.Engine.SUPERSONIC_FUEL_FLOW_SCALER, + Aircraft.Engine.FUEL_FLOW_SCALER_CONSTANT_TERM, + Aircraft.Engine.FUEL_FLOW_SCALER_LINEAR_TERM, ] opt_names_units = [ Aircraft.Engine.REFERENCE_SLS_THRUST, + Aircraft.Engine.CONSTANT_FUEL_CONSUMPTION, ] opts = {} for key in opt_names: @@ -1964,7 +1969,9 @@ def setup(self, **kwargs): opts[key] = (val[idx], units) pre_path = f"pre_mission.core_propulsion.{eng_name}" + mission_path = f"traj.phases.*.core_propulsion.{eng_name}.*" self.model_options[pre_path] = opts + self.model_options[mission_path] = opts # suppress warnings: # "input variable '...' promoted using '*' was already promoted using 'aircraft:*' diff --git a/aviary/subsystems/mass/flops_based/landing_gear.py b/aviary/subsystems/mass/flops_based/landing_gear.py index dd2a6f604..d28ecf0c3 100644 --- a/aviary/subsystems/mass/flops_based/landing_gear.py +++ b/aviary/subsystems/mass/flops_based/landing_gear.py @@ -279,9 +279,10 @@ def setup_partials(self): self.declare_partials('*', '*') def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): - # TODO temp using first engine, heterogeneous engines not supported num_eng = self.options[Aircraft.Engine.NUM_ENGINES] - num_wing_eng = self.options[Aircraft.Engine.NUM_WING_ENGINES] + + # TODO temp using first engine, heterogeneous engines not supported + num_wing_eng = self.options[Aircraft.Engine.NUM_WING_ENGINES][0] y_eng_fore = inputs[Aircraft.Engine.WING_LOCATIONS][0][0] From ff408d52984746f2e0adc7f4f205926fdbb24c9a Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Mon, 30 Sep 2024 15:05:17 -0400 Subject: [PATCH 20/58] Another fix to the proulsion preprocessor. --- aviary/interface/methods_for_level2.py | 36 +---------- .../test/test_time_integration_phases.py | 4 +- .../phases/test/test_landing_group.py | 4 +- .../phases/test/test_taxi_component.py | 4 +- .../gasp_based/phases/test/test_taxi_group.py | 4 +- .../test/test_computed_aero_group.py | 8 +-- .../test/test_tabular_aero_group.py | 10 +-- .../flaps_model/test/test_flaps_group.py | 14 ++--- .../geometry/gasp_based/test/test_electric.py | 6 +- .../gasp_based/test/test_empennage.py | 4 +- .../geometry/gasp_based/test/test_engine.py | 6 +- .../geometry/gasp_based/test/test_fuselage.py | 16 ++--- .../test/test_non_dimensional_conversion.py | 16 ++--- .../geometry/gasp_based/test/test_override.py | 10 +-- .../gasp_based/test/test_size_group.py | 10 +-- .../geometry/gasp_based/test/test_wing.py | 16 ++--- .../mass/gasp_based/test/test_design_load.py | 42 ++++++------- .../test/test_equipment_and_useful_load.py | 18 +++--- .../mass/gasp_based/test/test_fixed.py | 28 ++++----- .../gasp_based/test/test_mass_summation.py | 20 +++--- .../mass/gasp_based/test/test_wing.py | 20 +++--- .../propulsion/test/test_engine_scaling.py | 4 +- .../propulsion/test/test_hamilton_standard.py | 4 +- .../test/test_propeller_performance.py | 10 +-- .../test/test_propulsion_mission.py | 16 +++-- .../test/test_propulsion_premission.py | 16 +++-- .../propulsion/test/test_turboprop_model.py | 4 +- .../test/test_flops_based_premission.py | 6 +- aviary/utils/preprocessors.py | 5 ++ aviary/variable_info/functions.py | 61 +++++++++++++++++++ 30 files changed, 234 insertions(+), 188 deletions(-) diff --git a/aviary/interface/methods_for_level2.py b/aviary/interface/methods_for_level2.py index f4649d8f4..7b6754d89 100644 --- a/aviary/interface/methods_for_level2.py +++ b/aviary/interface/methods_for_level2.py @@ -46,7 +46,7 @@ from aviary.utils.aviary_values import AviaryValues from aviary.utils.functions import convert_strings_to_data, set_value -from aviary.variable_info.functions import setup_trajectory_params, override_aviary_vars, extract_options +from aviary.variable_info.functions import setup_trajectory_params, override_aviary_vars, setup_model_options from aviary.variable_info.variables import Aircraft, Mission, Dynamic, Settings from aviary.variable_info.enums import AnalysisScheme, ProblemType, EquationsOfMotion, LegacyCode, Verbosity from aviary.variable_info.variable_meta_data import _MetaData as BaseMetaData @@ -1938,40 +1938,8 @@ def setup(self, **kwargs): """ Lightly wrappd setup() method for the problem. """ - # Use OpenMDAO's model options to pass all options through the system hierarchy. - self.model_options['*'] = extract_options(self.aviary_inputs, - self.meta_data) - - # Multi-engines need to index into their options. - num_engine_models = len(self.aviary_inputs.get_val(Aircraft.Engine.NUM_ENGINES)) - if num_engine_models > 1: - for idx in range(num_engine_models): - eng_name = self.engine_builders[idx].name - - # TODO: For future flexibility, need to tag the required engine options. - opt_names = [ - Aircraft.Engine.SCALE_PERFORMANCE, - Aircraft.Engine.SUBSONIC_FUEL_FLOW_SCALER, - Aircraft.Engine.SUPERSONIC_FUEL_FLOW_SCALER, - Aircraft.Engine.FUEL_FLOW_SCALER_CONSTANT_TERM, - Aircraft.Engine.FUEL_FLOW_SCALER_LINEAR_TERM, - ] - opt_names_units = [ - Aircraft.Engine.REFERENCE_SLS_THRUST, - Aircraft.Engine.CONSTANT_FUEL_CONSUMPTION, - ] - opts = {} - for key in opt_names: - opts[key] = self.aviary_inputs.get_item(key)[0][idx] - for key in opt_names_units: - val, units = self.aviary_inputs.get_item(key) - opts[key] = (val[idx], units) - - pre_path = f"pre_mission.core_propulsion.{eng_name}" - mission_path = f"traj.phases.*.core_propulsion.{eng_name}.*" - self.model_options[pre_path] = opts - self.model_options[mission_path] = opts + setup_model_options(self, self.aviary_inputs, self.meta_data) # suppress warnings: # "input variable '...' promoted using '*' was already promoted using 'aircraft:*' diff --git a/aviary/mission/flops_based/phases/test/test_time_integration_phases.py b/aviary/mission/flops_based/phases/test/test_time_integration_phases.py index ffe95a6d2..b9838cd6f 100644 --- a/aviary/mission/flops_based/phases/test/test_time_integration_phases.py +++ b/aviary/mission/flops_based/phases/test/test_time_integration_phases.py @@ -18,7 +18,7 @@ from aviary.subsystems.propulsion.utils import build_engine_deck from aviary.utils.process_input_decks import create_vehicle from aviary.utils.preprocessors import preprocess_propulsion -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.variable_meta_data import _MetaData as BaseMetaData @@ -103,7 +103,7 @@ def setup_prob(self, phases) -> om.Problem: prob.model.add_objective(Mission.Objectives.FUEL, ref=1e4) - prob.model_options['*'] = extract_options(aviary_options) + setup_model_options(prob, aviary_options) with warnings.catch_warnings(): diff --git a/aviary/mission/gasp_based/phases/test/test_landing_group.py b/aviary/mission/gasp_based/phases/test/test_landing_group.py index 2f5a576d0..6ca11cb3f 100644 --- a/aviary/mission/gasp_based/phases/test/test_landing_group.py +++ b/aviary/mission/gasp_based/phases/test/test_landing_group.py @@ -12,7 +12,7 @@ from aviary.subsystems.propulsion.utils import build_engine_deck from aviary.utils.test_utils.default_subsystems import get_default_mission_subsystems from aviary.utils.test_utils.IO_test_util import check_prob_outputs -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Dynamic, Mission @@ -29,7 +29,7 @@ def setUp(self): self.prob.model = LandingSegment( aviary_options=options, core_subsystems=core_subsystems) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) @unittest.skipIf(version.parse(openmdao.__version__) < version.parse("3.26"), "Skipping due to OpenMDAO version being too low (<3.26)") def test_dland(self): diff --git a/aviary/mission/gasp_based/phases/test/test_taxi_component.py b/aviary/mission/gasp_based/phases/test/test_taxi_component.py index 77be1ade8..d90aec562 100644 --- a/aviary/mission/gasp_based/phases/test/test_taxi_component.py +++ b/aviary/mission/gasp_based/phases/test/test_taxi_component.py @@ -6,7 +6,7 @@ from aviary.utils.aviary_values import AviaryValues from aviary.mission.gasp_based.phases.taxi_component import TaxiFuelComponent -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.variables import Dynamic, Mission @@ -20,7 +20,7 @@ def setUp(self): self.prob.model.add_subsystem('taxi', TaxiFuelComponent(), promotes=['*']) - self.prob.model_options['*'] = extract_options(aviary_options) + setup_model_options(self.prob, aviary_options) def test_fuel_consumed(self): self.prob.setup(force_alloc_complex=True) diff --git a/aviary/mission/gasp_based/phases/test/test_taxi_group.py b/aviary/mission/gasp_based/phases/test/test_taxi_group.py index 28491e3f9..667d72beb 100644 --- a/aviary/mission/gasp_based/phases/test/test_taxi_group.py +++ b/aviary/mission/gasp_based/phases/test/test_taxi_group.py @@ -10,7 +10,7 @@ from aviary.subsystems.propulsion.utils import build_engine_deck from aviary.utils.test_utils.default_subsystems import get_default_mission_subsystems from aviary.utils.test_utils.IO_test_util import check_prob_outputs -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Dynamic, Mission @@ -32,7 +32,7 @@ def setUp(self): self.prob.model = TaxiSegment( aviary_options=options, core_subsystems=default_mission_subsystems) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) @unittest.skipIf(version.parse(openmdao.__version__) < version.parse("3.26"), "Skipping due to OpenMDAO version being too low (<3.26)") def test_taxi(self): diff --git a/aviary/subsystems/aerodynamics/flops_based/test/test_computed_aero_group.py b/aviary/subsystems/aerodynamics/flops_based/test/test_computed_aero_group.py index 928dcfa59..ef73b1609 100644 --- a/aviary/subsystems/aerodynamics/flops_based/test/test_computed_aero_group.py +++ b/aviary/subsystems/aerodynamics/flops_based/test/test_computed_aero_group.py @@ -10,7 +10,7 @@ from aviary.utils.test_utils.default_subsystems import get_default_premission_subsystems from aviary.utils.preprocessors import preprocess_options from aviary.validation_cases.validation_tests import get_flops_inputs, get_flops_outputs -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.variables import Aircraft, Dynamic, Settings @@ -82,7 +82,7 @@ def test_basic_large_single_aisle_1(self): ) # Set all options - prob.model_options['*'] = extract_options(flops_inputs) + setup_model_options(prob, flops_inputs) prob.setup(force_alloc_complex=True) prob.set_solver_print(level=2) @@ -195,7 +195,7 @@ def test_n3cc_drag(self): ) # Set all options - prob.model_options['*'] = extract_options(flops_inputs) + setup_model_options(prob, flops_inputs) prob.setup() @@ -307,7 +307,7 @@ def test_large_single_aisle_2_drag(self): ) # Set all options - prob.model_options['*'] = extract_options(flops_inputs) + setup_model_options(prob, flops_inputs) prob.setup() diff --git a/aviary/subsystems/aerodynamics/flops_based/test/test_tabular_aero_group.py b/aviary/subsystems/aerodynamics/flops_based/test/test_tabular_aero_group.py index 726b1bf82..9b40a7174 100644 --- a/aviary/subsystems/aerodynamics/flops_based/test/test_tabular_aero_group.py +++ b/aviary/subsystems/aerodynamics/flops_based/test/test_tabular_aero_group.py @@ -18,7 +18,7 @@ get_flops_outputs, print_case) from aviary.variable_info.enums import LegacyCode -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.variables import Aircraft, Dynamic, Mission, Settings FLOPS = LegacyCode.FLOPS @@ -48,7 +48,7 @@ def setUp(self): promotes_outputs=['*'], ) - self.prob.model_options['*'] = extract_options(aviary_options) + setup_model_options(self.prob, aviary_options) self.prob.setup(check=False, force_alloc_complex=True) @@ -125,7 +125,7 @@ def setUp(self): promotes_outputs=['*'], ) - self.prob.model_options['*'] = extract_options(aviary_options) + setup_model_options(self.prob, aviary_options) self.prob.setup(check=False, force_alloc_complex=True) @@ -248,7 +248,7 @@ def test_case(self, case_name): promotes_outputs=['*'], ) - prob.model_options['*'] = extract_options(flops_inputs) + setup_model_options(prob, flops_inputs) prob.setup(check=False, force_alloc_complex=True) @@ -547,7 +547,7 @@ def _run_computed_aero_harness(flops_inputs, dynamic_inputs, num_nodes): prob = om.Problem( _ComputedAeroHarness(num_nodes=num_nodes, aviary_options=flops_inputs)) - prob.model_options['*'] = extract_options(flops_inputs) + setup_model_options(prob, flops_inputs) prob.setup() diff --git a/aviary/subsystems/aerodynamics/gasp_based/flaps_model/test/test_flaps_group.py b/aviary/subsystems/aerodynamics/gasp_based/flaps_model/test/test_flaps_group.py index 0814abe51..28bf56bd5 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/flaps_model/test/test_flaps_group.py +++ b/aviary/subsystems/aerodynamics/gasp_based/flaps_model/test/test_flaps_group.py @@ -5,7 +5,7 @@ from aviary.subsystems.aerodynamics.gasp_based.flaps_model.flaps_model import \ FlapsGroup -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.enums import FlapType from aviary.variable_info.variables import Aircraft, Dynamic @@ -26,7 +26,7 @@ def setUp(self): self.prob.model = FCC = FlapsGroup() - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup() @@ -131,7 +131,7 @@ def setUp(self): self.prob.model = FCC = FlapsGroup() - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup() @@ -237,7 +237,7 @@ def setUp(self): self.prob.model = FCC = FlapsGroup() - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup() @@ -343,7 +343,7 @@ def setUp(self): self.prob.model = FCC = FlapsGroup() - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup() @@ -448,7 +448,7 @@ def setUp(self): self.prob.model = FCC = FlapsGroup() - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup() @@ -554,7 +554,7 @@ def setUp(self): self.prob.model = FCC = FlapsGroup() - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup() diff --git a/aviary/subsystems/geometry/gasp_based/test/test_electric.py b/aviary/subsystems/geometry/gasp_based/test/test_electric.py index 32e9a9a28..e329b4bb6 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_electric.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_electric.py @@ -5,7 +5,7 @@ from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal from aviary.subsystems.geometry.gasp_based.electric import CableSize -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.variables import Aircraft from aviary.utils.aviary_values import AviaryValues @@ -31,7 +31,7 @@ def setUp(self): Aircraft.Fuselage.AVG_DIAMETER, 10, units="ft" ) # not actual GASP value - self.prob.model_options['*'] = extract_options(aviary_options) + setup_model_options(self.prob, aviary_options) self.prob.setup(check=False, force_alloc_complex=True) @@ -69,7 +69,7 @@ def test_case_multiengine(self): Aircraft.Fuselage.AVG_DIAMETER, 10, units="ft" ) - prob.model_options['*'] = extract_options(aviary_options) + setup_model_options(prob, aviary_options) prob.setup(check=False, force_alloc_complex=True) diff --git a/aviary/subsystems/geometry/gasp_based/test/test_empennage.py b/aviary/subsystems/geometry/gasp_based/test/test_empennage.py index b778eb509..aa77dbeab 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_empennage.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_empennage.py @@ -7,7 +7,7 @@ from aviary.subsystems.geometry.gasp_based.empennage import (EmpennageSize, TailSize, TailVolCoef) -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft @@ -194,7 +194,7 @@ def test_large_sinle_aisle_1_calc_volcoefs(self): options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=True, units='unitless') - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) diff --git a/aviary/subsystems/geometry/gasp_based/test/test_engine.py b/aviary/subsystems/geometry/gasp_based/test/test_engine.py index 3c2d6e713..bef638150 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_engine.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_engine.py @@ -5,7 +5,7 @@ from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal from aviary.subsystems.geometry.gasp_based.engine import EngineSize -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.variables import Aircraft from aviary.utils.aviary_values import AviaryValues @@ -31,7 +31,7 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Nacelle.FINENESS, 2, units="unitless") - self.prob.model_options['*'] = extract_options(aviary_options) + setup_model_options(self.prob, aviary_options) self.prob.setup(check=False, force_alloc_complex=True) @@ -66,7 +66,7 @@ def test_case_multiengine(self): prob.model.set_input_defaults( Aircraft.Nacelle.FINENESS, np.array([2, 2.21]), units="unitless") - prob.model_options['*'] = extract_options(aviary_options) + setup_model_options(prob, aviary_options) prob.setup(check=False, force_alloc_complex=True) diff --git a/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py b/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py index 34935f47e..84c59d631 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py @@ -6,7 +6,7 @@ from aviary.subsystems.geometry.gasp_based.fuselage import (FuselageGroup, FuselageParameters, FuselageSize) -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft @@ -38,7 +38,7 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units="ft") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -79,7 +79,7 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units="ft") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -164,7 +164,7 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Fuselage.WETTED_AREA_SCALER, 1, units="unitless") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -218,7 +218,7 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units="ft") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -276,7 +276,7 @@ def setUp(self): Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units="ft" ) # not actual GASP value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -338,7 +338,7 @@ def setUp(self): Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units="ft" ) # not actual GASP value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -400,7 +400,7 @@ def setUp(self): Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units="ft" ) # not actual GASP value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) diff --git a/aviary/subsystems/geometry/gasp_based/test/test_non_dimensional_conversion.py b/aviary/subsystems/geometry/gasp_based/test/test_non_dimensional_conversion.py index 7b52d27f7..7aaf3a7c5 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_non_dimensional_conversion.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_non_dimensional_conversion.py @@ -8,7 +8,7 @@ from aviary.variable_info.variables import Aircraft from aviary.subsystems.geometry.gasp_based.non_dimensional_conversion import DimensionalNonDimensionalInterchange -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.options import get_option_defaults @@ -33,7 +33,7 @@ def setUp(self): Aircraft.Wing.FOLDED_SPAN, val=118.0, units="ft" ) # not actual GASP value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -69,7 +69,7 @@ def setUp(self): Aircraft.Wing.FOLDED_SPAN_DIMENSIONLESS, val=0.5, units="unitless" ) # not actual GASP value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -105,7 +105,7 @@ def setUp(self): Aircraft.Strut.ATTACHMENT_LOCATION, val=118.0, units="ft" ) # not actual GASP value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -141,7 +141,7 @@ def setUp(self): Aircraft.Strut.ATTACHMENT_LOCATION_DIMENSIONLESS, val=0.5, units="unitless" ) # not actual GASP value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -183,7 +183,7 @@ def setUp(self): Aircraft.Strut.ATTACHMENT_LOCATION_DIMENSIONLESS, val=0.5, units="unitless" ) # not actual GASP value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -228,7 +228,7 @@ def setUp(self): Aircraft.Strut.ATTACHMENT_LOCATION, val=90.0, units="ft" ) # not actual GASP value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -273,7 +273,7 @@ def setUp(self): Aircraft.Strut.ATTACHMENT_LOCATION, val=108.0, units="ft" ) # not actual GASP value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) diff --git a/aviary/subsystems/geometry/gasp_based/test/test_override.py b/aviary/subsystems/geometry/gasp_based/test/test_override.py index f7182e7c0..731f1c847 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_override.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_override.py @@ -9,7 +9,7 @@ from aviary.subsystems.propulsion.utils import build_engine_deck from aviary.utils.process_input_decks import create_vehicle from aviary.utils.preprocessors import preprocess_propulsion -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.variable_meta_data import _MetaData as BaseMetaData import warnings @@ -52,7 +52,7 @@ def test_case1(self): self.aviary_inputs.set_val( Aircraft.Fuselage.WETTED_AREA, val=4000.0, units="ft**2") - prob.model_options['*'] = extract_options(self.aviary_inputs) + setup_model_options(prob, self.aviary_inputs) with warnings.catch_warnings(): warnings.simplefilter("ignore", om.PromotionWarning) @@ -68,7 +68,7 @@ def test_case2(self): # self.aviary_inputs.set_val(Aircraft.Fuselage.WETTED_AREA, val=4000, units="ft**2") - prob.model_options['*'] = extract_options(self.aviary_inputs) + setup_model_options(prob, self.aviary_inputs) with warnings.catch_warnings(): warnings.simplefilter("ignore", om.PromotionWarning) @@ -86,7 +86,7 @@ def test_case3(self): self.aviary_inputs.set_val( Aircraft.Fuselage.WETTED_AREA_SCALER, val=0.5, units="unitless") - prob.model_options['*'] = extract_options(self.aviary_inputs) + setup_model_options(prob, self.aviary_inputs) with warnings.catch_warnings(): warnings.simplefilter("ignore", om.PromotionWarning) @@ -105,7 +105,7 @@ def test_case4(self): self.aviary_inputs.set_val( Aircraft.Fuselage.WETTED_AREA_SCALER, val=0.5, units="unitless") - prob.model_options['*'] = extract_options(self.aviary_inputs) + setup_model_options(prob, self.aviary_inputs) with warnings.catch_warnings(): warnings.simplefilter("ignore", om.PromotionWarning) diff --git a/aviary/subsystems/geometry/gasp_based/test/test_size_group.py b/aviary/subsystems/geometry/gasp_based/test/test_size_group.py index be0400e27..0ea55798e 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_size_group.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_size_group.py @@ -5,7 +5,7 @@ from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal from aviary.subsystems.geometry.gasp_based.size_group import SizeGroup -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft, Mission @@ -96,7 +96,7 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Nacelle.FINENESS, 2, units="unitless") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -251,7 +251,7 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Nacelle.FINENESS, 2, units="unitless") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -474,7 +474,7 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Nacelle.FINENESS, 2, units="unitless") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -695,7 +695,7 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Nacelle.FINENESS, 2, units="unitless") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) diff --git a/aviary/subsystems/geometry/gasp_based/test/test_wing.py b/aviary/subsystems/geometry/gasp_based/test/test_wing.py index 105f85f6f..5cb91f101 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_wing.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_wing.py @@ -6,7 +6,7 @@ from aviary.subsystems.geometry.gasp_based.wing import (WingFold, WingGroup, WingParameters, WingSize) -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft, Mission @@ -142,7 +142,7 @@ def setUp(self): Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units="unitless" ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -196,7 +196,7 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units="unitless" ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -262,7 +262,7 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units="unitless" ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -411,7 +411,7 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units="unitless" ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -509,7 +509,7 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units="unitless" ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -581,7 +581,7 @@ def setUp(self): Aircraft.Strut.ATTACHMENT_LOCATION, val=0, units="ft" ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -669,7 +669,7 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units="unitless" ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) diff --git a/aviary/subsystems/mass/gasp_based/test/test_design_load.py b/aviary/subsystems/mass/gasp_based/test/test_design_load.py index a3fc04ff1..3cdab6f41 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_design_load.py +++ b/aviary/subsystems/mass/gasp_based/test/test_design_load.py @@ -9,7 +9,7 @@ LoadParameters, LiftCurveSlopeAtCruise, LoadSpeeds) -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft, Mission @@ -66,7 +66,7 @@ def setUp(self): Aircraft.Wing.LOADING, val=128, units="lbf/ft**2" ) # not actual bug fixed value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -112,7 +112,7 @@ def setUp(self): Aircraft.Wing.LOADING, val=128, units="lbf/ft**2" ) # not actual bug fixed value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -157,7 +157,7 @@ def setUp(self): Aircraft.Wing.LOADING, val=128, units="lbf/ft**2" ) # not actual bug fixed value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -200,7 +200,7 @@ def setUp(self): Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units="mi/h" ) # not actual bug fixed value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -240,7 +240,7 @@ def setUp(self): Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units="mi/h" ) # bug fixed value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -281,7 +281,7 @@ def setUp(self): Aircraft.Wing.LOADING, val=128, units="lbf/ft**2" ) # not actual bug fixed value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -329,7 +329,7 @@ def setUp(self): Aircraft.Wing.LOADING, val=128, units="lbf/ft**2" ) # not actual bug fixed value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -376,7 +376,7 @@ def setUp(self): Aircraft.Wing.LOADING, val=128, units="lbf/ft**2" ) # not actual bug fixed value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -421,7 +421,7 @@ def setUp(self): Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units="mi/h" ) # not actual bug fixed value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -460,7 +460,7 @@ def setUp(self): "max_airspeed", val=350, units="kn" ) # bug fixed value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -497,7 +497,7 @@ def setUp(self): "max_airspeed", val=350, units="kn" ) # bug fixed value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -535,7 +535,7 @@ def setUp(self): "max_airspeed", val=350, units="kn" ) # bug fixed value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -576,7 +576,7 @@ def setUp(self): "max_airspeed", val=350, units="kn" ) # bug fixed value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -617,7 +617,7 @@ def setUp(self): "max_airspeed", val=350, units="kn" ) # bug fixed value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -659,7 +659,7 @@ def setUp(self): "max_airspeed", val=350, units="kn" ) # bug fixed value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -777,7 +777,7 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Design.LIFT_CURVE_SLOPE, val=7.1765, units="1/rad") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -828,7 +828,7 @@ def setUp(self): Aircraft.Design.LIFT_CURVE_SLOPE, val=7.1765, units="1/rad" ) # bug fixed value and original value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -876,7 +876,7 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Design.LIFT_CURVE_SLOPE, val=7.1765, units="1/rad") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -918,7 +918,7 @@ def setUp(self): Aircraft.Wing.AVERAGE_CHORD, val=12.71, units="ft" ) # bug fixed value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -963,7 +963,7 @@ def setUp(self): Aircraft.Wing.AVERAGE_CHORD, val=12.71, units="ft" ) # bug fixed value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) diff --git a/aviary/subsystems/mass/gasp_based/test/test_equipment_and_useful_load.py b/aviary/subsystems/mass/gasp_based/test/test_equipment_and_useful_load.py index 8fd10865e..97f5f37b3 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_equipment_and_useful_load.py +++ b/aviary/subsystems/mass/gasp_based/test/test_equipment_and_useful_load.py @@ -6,7 +6,7 @@ from aviary.subsystems.mass.gasp_based.equipment_and_useful_load import \ EquipAndUsefulLoadMass -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.enums import GASPEngineType from aviary.variable_info.variables import Aircraft, Mission @@ -86,7 +86,7 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, val=0.6, units="unitless" ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -177,7 +177,7 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, val=0.6, units="unitless" ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -270,7 +270,7 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, val=0.6, units="unitless" ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -366,7 +366,7 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, val=0.6, units="unitless" ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -460,7 +460,7 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, val=0.6, units="unitless" ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -556,7 +556,7 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, val=0.6, units="unitless" ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -652,7 +652,7 @@ def setUp(self): Aircraft.Fuel.WING_FUEL_FRACTION, val=0.6, units="unitless" ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -746,7 +746,7 @@ def test_case1(self): prob.model.set_input_defaults( Aircraft.Fuel.WING_FUEL_FRACTION, val=0.6, units="unitless") - prob.model_options['*'] = extract_options(options) + setup_model_options(prob, options) prob.setup(check=False, force_alloc_complex=True) diff --git a/aviary/subsystems/mass/gasp_based/test/test_fixed.py b/aviary/subsystems/mass/gasp_based/test/test_fixed.py index dbd2269c1..a6d6923b5 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_fixed.py +++ b/aviary/subsystems/mass/gasp_based/test/test_fixed.py @@ -16,7 +16,7 @@ MassParameters, PayloadMass, TailMass) from aviary.utils.aviary_values import AviaryValues, get_keys -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options, extract_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft, Mission @@ -53,7 +53,7 @@ def setUp(self): "max_mach", val=0.9, units="unitless" ) # bug fixed value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -107,7 +107,7 @@ def setUp(self): Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0 ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -162,7 +162,7 @@ def setUp(self): Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0 ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -218,7 +218,7 @@ def setUp(self): Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0 ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -274,7 +274,7 @@ def setUp(self): Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0 ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -315,7 +315,7 @@ def setUp(self): Aircraft.CrewPayload.CARGO_MASS, val=10040, units="lbm" ) # bug fixed value and original value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -462,7 +462,7 @@ def setUp(self): Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0.15, units="unitless" ) # bug fixed value and original value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -544,7 +544,7 @@ def setUp(self): Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0.15, units="unitless" ) # bug fixed value and original value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -791,7 +791,7 @@ def setUp(self): Mission.Landing.LIFT_COEFFICIENT_MAX, val=2.3648, units="unitless" ) - self.prob.model_options['*'] = extract_options(aviary_options) + setup_model_options(self.prob, aviary_options) self.prob.setup(check=False, force_alloc_complex=True) @@ -929,7 +929,7 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Wing.MOUNTING_TYPE, val=0.1, units="unitless") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -1161,7 +1161,7 @@ def setUp(self): Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0.15, units="unitless" ) # bug fixed value and original value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -1467,7 +1467,7 @@ def setUp(self): "engine.prop_mass", val=0, units="lbm" ) # bug fixed value and original value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -1559,7 +1559,7 @@ def _run_case(self, data): promotes=['*'], ) - prob.model_options['*'] = extract_options(data) + setup_model_options(prob, data) prob.setup(force_alloc_complex=True) diff --git a/aviary/subsystems/mass/gasp_based/test/test_mass_summation.py b/aviary/subsystems/mass/gasp_based/test/test_mass_summation.py index 355837413..231b39bc4 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_mass_summation.py +++ b/aviary/subsystems/mass/gasp_based/test/test_mass_summation.py @@ -7,7 +7,7 @@ from aviary.subsystems.geometry.gasp_based.size_group import SizeGroup from aviary.subsystems.mass.gasp_based.mass_premission import MassPremission from aviary.utils.aviary_values import get_items -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.options import get_option_defaults, is_option from aviary.models.large_single_aisle_1.V3_bug_fixed_IO import ( V3_bug_fixed_non_metadata, V3_bug_fixed_options) @@ -53,7 +53,7 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Fuselage.WETTED_AREA_SCALER, val=0.86215, units="unitless") - self.prob.model_options['*'] = extract_options(V3_bug_fixed_options) + setup_model_options(self.prob, V3_bug_fixed_options) self.prob.setup(check=False, force_alloc_complex=True) @@ -441,7 +441,7 @@ def setUp(self): self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units="ft") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -829,7 +829,7 @@ def setUp(self): self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units="ft") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -1208,7 +1208,7 @@ def setUp(self): self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units="ft") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -1587,7 +1587,7 @@ def setUp(self): self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units="ft") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -1965,7 +1965,7 @@ def setUp(self): self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units="ft") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -2348,7 +2348,7 @@ def setUp(self): self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units="ft") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -2745,7 +2745,7 @@ def setUp(self): self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units="ft") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -3182,7 +3182,7 @@ def setUp(self): self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units="ft") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) diff --git a/aviary/subsystems/mass/gasp_based/test/test_wing.py b/aviary/subsystems/mass/gasp_based/test/test_wing.py index 11a026000..fc038bf69 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_wing.py +++ b/aviary/subsystems/mass/gasp_based/test/test_wing.py @@ -7,7 +7,7 @@ from aviary.subsystems.mass.gasp_based.wing import (WingMassGroup, WingMassSolve, WingMassTotal) -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft, Mission @@ -187,7 +187,7 @@ def setUp(self): Aircraft.Wing.FOLD_MASS_COEFFICIENT, val=0.2, units="unitless" ) # not actual GASP value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -227,7 +227,7 @@ def setUp(self): Aircraft.Strut.MASS_COEFFICIENT, val=0.5, units="unitless" ) # not actual GASP value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -275,7 +275,7 @@ def setUp(self): Aircraft.Strut.MASS_COEFFICIENT, val=0.5, units="unitless" ) # not actual GASP value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -353,7 +353,7 @@ def test_case1(self): self.prob.model.set_input_defaults( Aircraft.Wing.FOLD_MASS_COEFFICIENT, val=0.2, units="unitless") - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -389,7 +389,7 @@ def test_case1(self): prob.model.set_input_defaults( Aircraft.Strut.MASS_COEFFICIENT, val=0.5, units="unitless") - prob.model_options['*'] = extract_options(options) + setup_model_options(prob, options) prob.setup(check=False, force_alloc_complex=True) @@ -429,7 +429,7 @@ def test_case1(self): prob.model.set_input_defaults( Aircraft.Strut.MASS_COEFFICIENT, val=0.5, units="unitless") - prob.model_options['*'] = extract_options(options) + setup_model_options(prob, options) prob.setup(check=False, force_alloc_complex=True) @@ -540,7 +540,7 @@ def setUp(self): Aircraft.Wing.FOLD_MASS_COEFFICIENT, val=0.2, units="unitless" ) # not actual GASP value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -602,7 +602,7 @@ def setUp(self): Aircraft.Strut.MASS_COEFFICIENT, val=0.5, units="unitless" ) # not actual GASP value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) @@ -672,7 +672,7 @@ def setUp(self): Aircraft.Strut.MASS_COEFFICIENT, val=0.5, units="unitless" ) # not actual GASP value - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(check=False, force_alloc_complex=True) diff --git a/aviary/subsystems/propulsion/test/test_engine_scaling.py b/aviary/subsystems/propulsion/test/test_engine_scaling.py index 56baf2ce7..29f12a1f8 100644 --- a/aviary/subsystems/propulsion/test/test_engine_scaling.py +++ b/aviary/subsystems/propulsion/test/test_engine_scaling.py @@ -9,7 +9,7 @@ from aviary.utils.aviary_values import AviaryValues from aviary.utils.preprocessors import preprocess_propulsion from aviary.utils.functions import get_path -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.variables import Aircraft, Dynamic, Mission from aviary.subsystems.propulsion.utils import EngineModelVariables @@ -63,7 +63,7 @@ def test_case(self): promotes=['*'], ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(force_alloc_complex=True) diff --git a/aviary/subsystems/propulsion/test/test_hamilton_standard.py b/aviary/subsystems/propulsion/test/test_hamilton_standard.py index 6f21af456..1856c6997 100644 --- a/aviary/subsystems/propulsion/test/test_hamilton_standard.py +++ b/aviary/subsystems/propulsion/test/test_hamilton_standard.py @@ -9,7 +9,7 @@ from aviary.subsystems.propulsion.propeller.hamilton_standard import ( HamiltonStandard, PreHamiltonStandard, PostHamiltonStandard, ) -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft, Dynamic @@ -83,7 +83,7 @@ def setUp(self): promotes_outputs=["*"], ) - prob.model_options['*'] = extract_options(options) + setup_model_options(prob, options) prob.setup() self.prob = prob diff --git a/aviary/subsystems/propulsion/test/test_propeller_performance.py b/aviary/subsystems/propulsion/test/test_propeller_performance.py index 265499039..f4183e50e 100644 --- a/aviary/subsystems/propulsion/test/test_propeller_performance.py +++ b/aviary/subsystems/propulsion/test/test_propeller_performance.py @@ -11,7 +11,7 @@ OutMachs, PropellerPerformance, TipSpeedLimit, ) from aviary.variable_info.enums import OutMachType -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft, Dynamic @@ -213,7 +213,7 @@ def setUp(self): units='unitless', ) - prob.model_options['*'] = extract_options(options) + setup_model_options(prob, options) prob.setup() @@ -285,7 +285,7 @@ def test_case_3_4_5(self): units='unitless', ) - prob.model_options['*'] = extract_options(options) + setup_model_options(prob, options) prob.setup() prob.set_val('install_loss_factor', [0.0, 0.05, 0.05], units="unitless") @@ -330,7 +330,7 @@ def test_case_6_7_8(self): units='unitless', ) - prob.model_options['*'] = extract_options(options) + setup_model_options(prob, options) prob.setup() prob.set_val('install_loss_factor', [0.0, 0.05, 0.05], units="unitless") @@ -440,7 +440,7 @@ def test_case_15_16_17(self): options.set_val(Aircraft.Engine.INTERPOLATION_METHOD, val='slinear', units='unitless') - prob.model_options['*'] = extract_options(options) + setup_model_options(prob, options) prob.setup(force_alloc_complex=True) prob.set_val('install_loss_factor', [0.0, 0.05, 0.05], units="unitless") diff --git a/aviary/subsystems/propulsion/test/test_propulsion_mission.py b/aviary/subsystems/propulsion/test/test_propulsion_mission.py index 4cca73bf8..7585416a7 100644 --- a/aviary/subsystems/propulsion/test/test_propulsion_mission.py +++ b/aviary/subsystems/propulsion/test/test_propulsion_mission.py @@ -13,7 +13,7 @@ from aviary.utils.preprocessors import preprocess_propulsion from aviary.utils.functions import get_path from aviary.validation_cases.validation_tests import get_flops_inputs -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.variables import Aircraft, Dynamic, Mission, Settings from aviary.subsystems.propulsion.utils import build_engine_deck @@ -68,7 +68,7 @@ def test_case_1(self): units='unitless') self.prob.model.add_subsystem('IVC', IVC, promotes=['*']) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(force_alloc_complex=True) self.prob.set_val(Aircraft.Engine.SCALE_FACTOR, options.get_val( @@ -164,8 +164,14 @@ def test_case_multiengine(self): engine_models = [engine, engine2] preprocess_propulsion(options, engine_models=engine_models) - self.prob.model = PropulsionMission( - num_nodes=20, aviary_options=options, engine_models=engine_models) + model = self.prob.model + prop = PropulsionMission( + num_nodes=20, + aviary_options=options, + engine_models=engine_models, + ) + model.add_subsystem('core_propulsion', prop, + promotes=['*']) self.prob.model.add_subsystem(Dynamic.Mission.MACH, om.IndepVarComp(Dynamic.Mission.MACH, @@ -184,6 +190,8 @@ def test_case_multiengine(self): self.prob.model.add_subsystem( Dynamic.Mission.THROTTLE, om.IndepVarComp(Dynamic.Mission.THROTTLE, np.vstack((throttle, throttle)).transpose(), units='unitless'), promotes=['*']) + setup_model_options(self.prob, options, engine_models=engine_models) + self.prob.setup(force_alloc_complex=True) self.prob.set_val(Aircraft.Engine.SCALE_FACTOR, [0.975], units='unitless') diff --git a/aviary/subsystems/propulsion/test/test_propulsion_premission.py b/aviary/subsystems/propulsion/test/test_propulsion_premission.py index 30805bc7e..3bb097a3c 100644 --- a/aviary/subsystems/propulsion/test/test_propulsion_premission.py +++ b/aviary/subsystems/propulsion/test/test_propulsion_premission.py @@ -10,7 +10,7 @@ from aviary.subsystems.propulsion.utils import build_engine_deck from aviary.validation_cases.validation_tests import get_flops_inputs from aviary.models.multi_engine_single_aisle.multi_engine_single_aisle_data import engine_1_inputs, engine_2_inputs -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.variables import Aircraft, Settings from aviary.utils.preprocessors import preprocess_options @@ -27,7 +27,7 @@ def test_case(self): self.prob.model = PropulsionPreMission(aviary_options=options, engine_models=build_engine_deck(options)) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(force_alloc_complex=True) self.prob.set_val(Aircraft.Engine.SCALED_SLS_THRUST, options.get_val( @@ -51,13 +51,17 @@ def test_multi_engine(self): engine1 = build_engine_deck(engine_1_inputs)[0] engine2 = build_engine_deck(engine_2_inputs)[0] engine_models = [engine1, engine2] - preprocess_options(options, engine_models=engine_models) - self.prob.model = PropulsionPreMission(aviary_options=options, - engine_models=engine_models) + setup_model_options(self.prob, options, engine_models=engine_models) + + model = self.prob.model + prop = PropulsionPreMission(aviary_options=options, + engine_models=engine_models) + model.add_subsystem('core_propulsion', prop, + promotes=['*']) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options, engine_models=engine_models) self.prob.setup(force_alloc_complex=True) self.prob.set_val(Aircraft.Engine.SCALED_SLS_THRUST, options.get_val( diff --git a/aviary/subsystems/propulsion/test/test_turboprop_model.py b/aviary/subsystems/propulsion/test/test_turboprop_model.py index 75c3998f3..3f370e543 100644 --- a/aviary/subsystems/propulsion/test/test_turboprop_model.py +++ b/aviary/subsystems/propulsion/test/test_turboprop_model.py @@ -12,7 +12,7 @@ ) from aviary.utils.preprocessors import preprocess_propulsion from aviary.utils.functions import get_path -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.variables import Aircraft, Dynamic, Mission from aviary.variable_info.enums import SpeedType from aviary.variable_info.options import get_option_defaults @@ -88,7 +88,7 @@ def prepare_model( promotes_outputs=['*'], ) - self.prob.model_options['*'] = extract_options(options) + setup_model_options(self.prob, options) self.prob.setup(force_alloc_complex=False) self.prob.set_val(Aircraft.Engine.SCALE_FACTOR, 1, units='unitless') diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index fcfbfe352..0650564f9 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -14,7 +14,7 @@ flops_validation_test, get_flops_inputs, get_flops_outputs, get_flops_case_names, print_case ) -from aviary.variable_info.functions import extract_options +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.variables import Aircraft, Mission, Settings @@ -47,7 +47,7 @@ def test_case(self, case_name): promotes_outputs=['*'], ) - self.prob.model_options['*'] = extract_options(flops_inputs) + setup_model_options(prob, flops_inputs) prob.setup(check=False, force_alloc_complex=True) prob.set_solver_print(2) @@ -108,7 +108,7 @@ def test_diff_configuration_mass(self): promotes_outputs=['*'], ) - self.prob.model_options['*'] = extract_options(flops_inputs) + setup_model_options(prob, flops_inputs) prob.setup(check=False) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index e1d2f747d..e983cb784 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -161,6 +161,8 @@ def preprocess_propulsion(aviary_options: AviaryValues, engine_models: list = No if dtype is None: if isinstance(default_value, np.ndarray): dtype = default_value.dtype + elif isinstance(default_value, np.ndarray): + dtype = default_value.dtype elif default_value is None: # With no default value, we cannot determine a dtype. dtype = None @@ -172,6 +174,8 @@ def preprocess_propulsion(aviary_options: AviaryValues, engine_models: list = No # if default value is a list/tuple, find type inside that if isinstance(default_value, (list, tuple)): dtype = type(default_value[0]) + elif isinstance(default_value, np.ndarray): + dtype = default_value.dtype elif default_value is None: # With no default value, we cannot determine a dtype. dtype = None @@ -238,6 +242,7 @@ def preprocess_propulsion(aviary_options: AviaryValues, engine_models: list = No and type(vec) is not tuple: vec = np.array(vec, dtype=dtype) aviary_options.set_val(var, vec, units) + print(var, units) ################################### # Input/Option Consistency Checks # diff --git a/aviary/variable_info/functions.py b/aviary/variable_info/functions.py index b00032bef..53548d968 100644 --- a/aviary/variable_info/functions.py +++ b/aviary/variable_info/functions.py @@ -5,6 +5,7 @@ from dymos.utils.misc import _unspecified from aviary.utils.aviary_values import AviaryValues +from aviary.variable_info.variables import Aircraft from aviary.variable_info.variable_meta_data import _MetaData # --------------------------- @@ -390,3 +391,63 @@ def extract_options(aviary_inputs: AviaryValues, metadata=_MetaData) -> dict: options[key] = (val, units) return options + +def setup_model_options(prob: om.Problem, aviary_inputs: AviaryValues, + meta_data=_MetaData, engine_models=None): + """ + Setup the correct model options for an aviary problem. + + Parameters + ---------- + prob: Problem + OpenMDAO problem prior to setup. + aviary_inputs : AviaryValues + Instance of AviaryValues containing all initial values. + meta_data : dict + (Optional) Dictionary of aircraft metadata. Uses Aviary's built-in + metadata by default. + engine_models : List of EngineModels or None + (Optional) Engine models + """ + + # Use OpenMDAO's model options to pass all options through the system hierarchy. + prob.model_options['*'] = extract_options(aviary_inputs, + meta_data) + + # Multi-engines need to index into their options. + try: + num_engine_models = len(aviary_inputs.get_val(Aircraft.Engine.NUM_ENGINES)) + except KeyError: + # No engine data. + return + + if num_engine_models > 1: + + if engine_models is None: + engine_models = prob.engine_builders + + for idx in range(num_engine_models): + eng_name = engine_models[idx].name + + # TODO: For future flexibility, need to tag the required engine options. + opt_names = [ + Aircraft.Engine.SCALE_PERFORMANCE, + Aircraft.Engine.SUBSONIC_FUEL_FLOW_SCALER, + Aircraft.Engine.SUPERSONIC_FUEL_FLOW_SCALER, + Aircraft.Engine.FUEL_FLOW_SCALER_CONSTANT_TERM, + Aircraft.Engine.FUEL_FLOW_SCALER_LINEAR_TERM, + ] + opt_names_units = [ + Aircraft.Engine.REFERENCE_SLS_THRUST, + Aircraft.Engine.CONSTANT_FUEL_CONSUMPTION, + ] + opts = {} + for key in opt_names: + opts[key] = aviary_inputs.get_item(key)[0][idx] + for key in opt_names_units: + val, units = aviary_inputs.get_item(key) + opts[key] = (val[idx], units) + + path = f"*core_propulsion.{eng_name}*" + prob.model_options[path] = opts + From 4bc91c917c7e0abc47d732c7fcdab8f52d93b385 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Mon, 30 Sep 2024 16:22:55 -0400 Subject: [PATCH 21/58] Most tests are passing. --- aviary/subsystems/geometry/gasp_based/test/test_engine.py | 4 ++-- aviary/subsystems/geometry/geometry_builder.py | 2 +- aviary/subsystems/mass/mass_builder.py | 2 +- aviary/subsystems/test/test_premission.py | 7 +++++++ .../benchmark_tests/test_FLOPS_balanced_field_length.py | 3 +++ .../benchmark_tests/test_FLOPS_based_sizing_N3CC.py | 3 +++ .../benchmark_tests/test_FLOPS_detailed_landing.py | 3 +++ .../benchmark_tests/test_FLOPS_detailed_takeoff.py | 3 +++ 8 files changed, 23 insertions(+), 4 deletions(-) diff --git a/aviary/subsystems/geometry/gasp_based/test/test_engine.py b/aviary/subsystems/geometry/gasp_based/test/test_engine.py index bef638150..09fbe365e 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_engine.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_engine.py @@ -5,7 +5,7 @@ from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal from aviary.subsystems.geometry.gasp_based.engine import EngineSize -from aviary.variable_info.functions import setup_model_options +from aviary.variable_info.functions import setup_model_options, extract_options from aviary.variable_info.variables import Aircraft from aviary.utils.aviary_values import AviaryValues @@ -66,7 +66,7 @@ def test_case_multiengine(self): prob.model.set_input_defaults( Aircraft.Nacelle.FINENESS, np.array([2, 2.21]), units="unitless") - setup_model_options(prob, aviary_options) + prob.model_options['*'] = extract_options(aviary_options) prob.setup(check=False, force_alloc_complex=True) diff --git a/aviary/subsystems/geometry/geometry_builder.py b/aviary/subsystems/geometry/geometry_builder.py index ff0cfa04e..3d14dfdb3 100644 --- a/aviary/subsystems/geometry/geometry_builder.py +++ b/aviary/subsystems/geometry/geometry_builder.py @@ -73,7 +73,7 @@ def build_pre_mission(self, aviary_inputs): return geom_group def build_mission(self, num_nodes, aviary_inputs, **kwargs): - super().build_mission(num_nodes) + super().build_mission(num_nodes, aviary_inputs) def get_parameters(self, aviary_inputs=None, phase_info=None): num_engine_type = len(aviary_inputs.get_val(Aircraft.Engine.NUM_ENGINES)) diff --git a/aviary/subsystems/mass/mass_builder.py b/aviary/subsystems/mass/mass_builder.py index a6a6d36cd..c0e1aa7bf 100644 --- a/aviary/subsystems/mass/mass_builder.py +++ b/aviary/subsystems/mass/mass_builder.py @@ -59,7 +59,7 @@ def build_pre_mission(self, aviary_inputs): return mass_premission def build_mission(self, num_nodes, aviary_inputs, **kwargs): - super().build_mission(num_nodes) + super().build_mission(num_nodes, aviary_inputs) def report(self, prob, reports_folder, **kwargs): """ diff --git a/aviary/subsystems/test/test_premission.py b/aviary/subsystems/test/test_premission.py index 4ed926b35..cd5b678f5 100644 --- a/aviary/subsystems/test/test_premission.py +++ b/aviary/subsystems/test/test_premission.py @@ -16,7 +16,9 @@ from aviary.variable_info.variable_meta_data import _MetaData as BaseMetaData from aviary.models.large_single_aisle_1.V3_bug_fixed_IO import V3_bug_fixed_options, V3_bug_fixed_non_metadata from aviary.utils.functions import set_aviary_initial_values +from aviary.utils.preprocessors import preprocess_options from aviary.variable_info.enums import LegacyCode +from aviary.variable_info.functions import setup_model_options from aviary.subsystems.propulsion.utils import build_engine_deck @@ -104,6 +106,8 @@ def setUp(self): self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=1.0, units='ft') + setup_model_options(self.prob, input_options) + self.prob.setup(check=False, force_alloc_complex=True) self.prob.set_solver_print(2) @@ -274,6 +278,7 @@ def test_manual_override(self): aviary_inputs.delete(Aircraft.Fuselage.WETTED_AREA) engine = build_engine_deck(aviary_inputs) + preprocess_options(aviary_inputs, engine_models=engine) prob = om.Problem() model = prob.model @@ -310,6 +315,8 @@ def test_manual_override(self): for (key, (val, units)) in get_items(V3_bug_fixed_non_metadata): prob.model.set_input_defaults(key, val=val, units=units) + setup_model_options(prob, aviary_inputs) + prob.setup() # Problem in setup is FLOPS prioritized, so shared inputs for FLOPS will be manually overriden. diff --git a/aviary/validation_cases/benchmark_tests/test_FLOPS_balanced_field_length.py b/aviary/validation_cases/benchmark_tests/test_FLOPS_balanced_field_length.py index ba7391199..14c09f20d 100644 --- a/aviary/validation_cases/benchmark_tests/test_FLOPS_balanced_field_length.py +++ b/aviary/validation_cases/benchmark_tests/test_FLOPS_balanced_field_length.py @@ -24,6 +24,7 @@ from aviary.subsystems.propulsion.utils import build_engine_deck from aviary.utils.test_utils.default_subsystems import get_default_mission_subsystems from aviary.subsystems.premission import CorePreMission +from aviary.variable_info.functions import setup_model_options @use_tempdirs @@ -103,6 +104,8 @@ def _do_run(self, driver: Driver, optimizer, *args): varnames = [Aircraft.Wing.ASPECT_RATIO] set_aviary_input_defaults(takeoff.model, varnames, aviary_options) + setup_model_options(takeoff, aviary_options) + # suppress warnings: # "input variable '...' promoted using '*' was already promoted using 'aircraft:*' with warnings.catch_warnings(): diff --git a/aviary/validation_cases/benchmark_tests/test_FLOPS_based_sizing_N3CC.py b/aviary/validation_cases/benchmark_tests/test_FLOPS_based_sizing_N3CC.py index b00e59201..38f979776 100644 --- a/aviary/validation_cases/benchmark_tests/test_FLOPS_based_sizing_N3CC.py +++ b/aviary/validation_cases/benchmark_tests/test_FLOPS_based_sizing_N3CC.py @@ -29,6 +29,7 @@ from aviary.variable_info.variables import Aircraft, Dynamic, Mission from aviary.variable_info.variable_meta_data import _MetaData as BaseMetaData from aviary.variable_info.enums import LegacyCode +from aviary.variable_info.functions import setup_model_options from aviary.subsystems.premission import CorePreMission from aviary.subsystems.propulsion.propulsion_builder import CorePropulsionBuilder @@ -434,6 +435,8 @@ def run_trajectory(sim=True): ] set_aviary_input_defaults(prob.model, varnames, aviary_inputs) + setup_model_options(prob, aviary_inputs) + prob.setup(force_alloc_complex=True) set_aviary_initial_values(prob, aviary_inputs) diff --git a/aviary/validation_cases/benchmark_tests/test_FLOPS_detailed_landing.py b/aviary/validation_cases/benchmark_tests/test_FLOPS_detailed_landing.py index 2ade54270..72557d16a 100644 --- a/aviary/validation_cases/benchmark_tests/test_FLOPS_detailed_landing.py +++ b/aviary/validation_cases/benchmark_tests/test_FLOPS_detailed_landing.py @@ -22,6 +22,7 @@ from aviary.subsystems.propulsion.utils import build_engine_deck from aviary.utils.test_utils.default_subsystems import get_default_mission_subsystems from aviary.utils.preprocessors import preprocess_options +from aviary.variable_info.functions import setup_model_options @use_tempdirs @@ -97,6 +98,8 @@ def _do_run(self, driver: Driver, optimizer, *args): varnames = [Aircraft.Wing.ASPECT_RATIO] set_aviary_input_defaults(landing.model, varnames, aviary_options) + setup_model_options(landing, aviary_options) + # suppress warnings: # "input variable '...' promoted using '*' was already promoted using 'aircraft:*' with warnings.catch_warnings(): diff --git a/aviary/validation_cases/benchmark_tests/test_FLOPS_detailed_takeoff.py b/aviary/validation_cases/benchmark_tests/test_FLOPS_detailed_takeoff.py index 2ed7b6e71..ef7e79408 100644 --- a/aviary/validation_cases/benchmark_tests/test_FLOPS_detailed_takeoff.py +++ b/aviary/validation_cases/benchmark_tests/test_FLOPS_detailed_takeoff.py @@ -22,6 +22,7 @@ from aviary.subsystems.propulsion.utils import build_engine_deck from aviary.utils.test_utils.default_subsystems import get_default_mission_subsystems from aviary.utils.preprocessors import preprocess_options +from aviary.variable_info.functions import setup_model_options @use_tempdirs @@ -112,6 +113,8 @@ def _do_run(self, driver: Driver, optimizer, *args): varnames = [Aircraft.Wing.ASPECT_RATIO] set_aviary_input_defaults(takeoff.model, varnames, aviary_options) + setup_model_options(takeoff, aviary_options) + # suppress warnings: # "input variable '...' promoted using '*' was already promoted using 'aircraft:*' with warnings.catch_warnings(): From b4f142bcdb53c365ebb31849a7ad33e2386a1f1a Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Tue, 1 Oct 2024 15:43:31 -0400 Subject: [PATCH 22/58] fixing some docs --- aviary/api.py | 2 +- .../getting_started/onboarding_level2.ipynb | 2 +- .../getting_started/onboarding_level3.ipynb | 5 +++- aviary/docs/user_guide/aviary_commands.ipynb | 2 +- ..._same_mission_at_different_UI_levels.ipynb | 4 ++- aviary/utils/develop_metadata.py | 18 +++++++++--- aviary/utils/test/test_aviary_values.py | 28 ++++++++++--------- aviary/variable_info/functions.py | 6 ++-- aviary/variable_info/variable_meta_data.py | 6 ++-- 9 files changed, 47 insertions(+), 26 deletions(-) diff --git a/aviary/api.py b/aviary/api.py index bf4f7f281..f5172bd51 100644 --- a/aviary/api.py +++ b/aviary/api.py @@ -23,7 +23,7 @@ from aviary.variable_info.options import get_option_defaults, is_option from aviary.utils.develop_metadata import add_meta_data, update_meta_data from aviary.variable_info.variable_meta_data import CoreMetaData -from aviary.variable_info.functions import add_aviary_input, add_aviary_output, get_units, override_aviary_vars, setup_trajectory_params +from aviary.variable_info.functions import add_aviary_input, add_aviary_output, get_units, override_aviary_vars, setup_trajectory_params, setup_model_options from aviary.utils.merge_hierarchies import merge_hierarchies from aviary.utils.merge_variable_metadata import merge_meta_data from aviary.utils.named_values import NamedValues, get_keys, get_items, get_values diff --git a/aviary/docs/getting_started/onboarding_level2.ipynb b/aviary/docs/getting_started/onboarding_level2.ipynb index 819fbe5a3..4f0a86e78 100644 --- a/aviary/docs/getting_started/onboarding_level2.ipynb +++ b/aviary/docs/getting_started/onboarding_level2.ipynb @@ -1020,7 +1020,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.13" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/aviary/docs/getting_started/onboarding_level3.ipynb b/aviary/docs/getting_started/onboarding_level3.ipynb index f235936b5..b74ad690c 100644 --- a/aviary/docs/getting_started/onboarding_level3.ipynb +++ b/aviary/docs/getting_started/onboarding_level3.ipynb @@ -95,6 +95,7 @@ "\n", "import aviary.api as av\n", "from aviary.validation_cases.validation_tests import get_flops_inputs\n", + "from aviary.variable_info.functions import setup_model_options\n", "\n", "\n", "prob = om.Problem(model=om.Group())\n", @@ -459,6 +460,8 @@ "]\n", "av.set_aviary_input_defaults(prob.model, varnames, aviary_inputs)\n", "\n", + "av.setup_model_options(prob, aviary_inputs)\n", + "\n", "prob.setup(force_alloc_complex=True)\n", "\n", "av.set_aviary_initial_values(prob, aviary_inputs)\n", @@ -709,7 +712,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.13" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/aviary/docs/user_guide/aviary_commands.ipynb b/aviary/docs/user_guide/aviary_commands.ipynb index 6fea18b3f..b9cc2e5c1 100644 --- a/aviary/docs/user_guide/aviary_commands.ipynb +++ b/aviary/docs/user_guide/aviary_commands.ipynb @@ -452,7 +452,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, diff --git a/aviary/docs/user_guide/examples_of_the_same_mission_at_different_UI_levels.ipynb b/aviary/docs/user_guide/examples_of_the_same_mission_at_different_UI_levels.ipynb index 84634708f..1f0b02e7e 100644 --- a/aviary/docs/user_guide/examples_of_the_same_mission_at_different_UI_levels.ipynb +++ b/aviary/docs/user_guide/examples_of_the_same_mission_at_different_UI_levels.ipynb @@ -434,6 +434,8 @@ "]\n", "av.set_aviary_input_defaults(prob.model, varnames, aviary_inputs)\n", "\n", + "av.setup_model_options(prob, aviary_inputs)\n", + "\n", "prob.setup(force_alloc_complex=True)\n", "\n", "av.set_aviary_initial_values(prob, aviary_inputs)\n", @@ -505,7 +507,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.13" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/aviary/utils/develop_metadata.py b/aviary/utils/develop_metadata.py index 4950a2d60..1570a19d2 100644 --- a/aviary/utils/develop_metadata.py +++ b/aviary/utils/develop_metadata.py @@ -6,6 +6,7 @@ def add_meta_data( default_value=0.0, option=False, types=None, + openmdao_types=None, historical_name=None, _check_unique=True): ''' @@ -36,7 +37,12 @@ def add_meta_data( indicates that this variable is an option, rather than a normal input types : type - gives the allowable type(s) of the variable + gives the allowable type(s) of the variable in the aviary API. + + openmdao_types : type + the types used for declaring component options can differ from the options + that are checked in the AviaryValues container. This should only be + specified in those cases. historical_name : dict or None dictionary of names that the variable held in prior codes @@ -67,7 +73,7 @@ def add_meta_data( of the provided key. This should only be set to false when update_meta_data is the calling function. Returns - ------- + ------- None No variables returned by this method. @@ -84,13 +90,17 @@ def add_meta_data( if units is None: units = 'unitless' + if openmdao_types is None: + openmdao_types = types + meta_data[key] = { 'historical_name': historical_name, 'units': units, 'desc': desc, 'option': option, 'default_value': default_value, - 'types': types + 'types': types, + 'openmdao_types': openmdao_types } @@ -158,7 +168,7 @@ def update_meta_data( represents the GWTOL variable of the ANALYS subroutine Returns - ------- + ------- None No variables returned by this method. diff --git a/aviary/utils/test/test_aviary_values.py b/aviary/utils/test/test_aviary_values.py index 57dd4f480..6ea6b5723 100644 --- a/aviary/utils/test/test_aviary_values.py +++ b/aviary/utils/test/test_aviary_values.py @@ -84,8 +84,8 @@ def test_aircraft(self): except: self.fail('Expecting to be able to set the value of an Enum.') - # TODO - Following the pattern of other intenums, these go away. Seems like - # we need to pick either int or string setting. + # TODO - When we moved the aviary_options into individual component options, + # we lost the ability to set them as strings. #try: #vals.set_val(Aircraft.Engine.TYPE, 'turbojet') #self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) @@ -107,13 +107,15 @@ def test_aircraft(self): except: self.fail('Expecting to be able to set the value of an Enum from an int.') - try: - vals.set_val(Aircraft.Engine.TYPE, FlapType.DOUBLE_SLOTTED) - except ValueError as err: - self.assertEqual(str(err), - " is not a valid GASPEngineType") - else: - self.fail("Expecting ValueError.") + # TODO: This no longer raises an error because the types field needed to be modified + # for multiple engines. + #try: + #vals.set_val(Aircraft.Engine.TYPE, FlapType.DOUBLE_SLOTTED) + #except ValueError as err: + #self.assertEqual(str(err), + #" is not a valid GASPEngineType") + #else: + #self.fail("Expecting ValueError.") try: vals.set_val(Aircraft.Engine.DATA_FILE, np.array([])) @@ -143,8 +145,8 @@ def test_mission(self): except TypeError as err: self.assertEqual( str(err), - f"{Mission.Design.CRUISE_ALTITUDE} is of type(s) [, ] but you have provided a value of type .") + f"{Mission.Design.CRUISE_ALTITUDE} is of type(s) (, ) but you have provided a value of type .") else: self.fail('Expecting TypeError.') @@ -153,8 +155,8 @@ def test_mission(self): except TypeError as err: self.assertEqual( str(err), - f"{Mission.Design.CRUISE_ALTITUDE} is of type(s) [, ] but you have provided a value of type .") + f"{Mission.Design.CRUISE_ALTITUDE} is of type(s) (, ) but you have provided a value of type .") else: self.fail('Expecting TypeError.') diff --git a/aviary/variable_info/functions.py b/aviary/variable_info/functions.py index 53548d968..9dc9cdaed 100644 --- a/aviary/variable_info/functions.py +++ b/aviary/variable_info/functions.py @@ -156,10 +156,12 @@ def add_aviary_option(comp, name, val=_unspecified, units=None, desc=None, meta_ val = meta['default_value'] if units not in [None, 'unitless']: - comp.options.declare(name, default=(val, units), types=meta['types'], desc=desc, + comp.options.declare(name, default=(val, units), + types=meta['openmdao_types'], desc=desc, set_function=units_setter) else: - comp.options.declare(name, default=val, types=meta['types'], desc=desc) + comp.options.declare(name, default=val, + types=meta['openmdao_types'], desc=desc) def override_aviary_vars(group, aviary_inputs: AviaryValues, diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 3cbe27546..17b8f2307 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -2339,7 +2339,7 @@ }, option=True, default_value=GASPEngineType.TURBOJET, - types=(list, GASPEngineType, str, int, np.ndarray), + types=(list, GASPEngineType, int, np.ndarray), units="unitless", desc='specifies engine type used for engine mass calculation', ) @@ -6918,7 +6918,9 @@ }, units='ft', option=True, - default_value=25000, + default_value=25000.0, + types=(int, float), + openmdao_types=tuple, desc='design mission cruise altitude', ) From 78f991a00bdf0ae1c3737457fc3835c67f8a1d7d Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Tue, 1 Oct 2024 16:00:55 -0400 Subject: [PATCH 23/58] one more doc --- aviary/docs/user_guide/variable_metadata.ipynb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/aviary/docs/user_guide/variable_metadata.ipynb b/aviary/docs/user_guide/variable_metadata.ipynb index efe042655..d6ed85633 100644 --- a/aviary/docs/user_guide/variable_metadata.ipynb +++ b/aviary/docs/user_guide/variable_metadata.ipynb @@ -18,6 +18,7 @@ "| Default Value | `0.0` | default_value |\n", "| Is Option? | `False` | option |\n", "| Type Restrictions | `None` | types |\n", + "| Types for Component Option | `None` | openmdao_types |\n", "| Historical Variable Name(s) | `None` | historical_name |" ] }, @@ -41,6 +42,7 @@ " 'default_value': 0.0,\n", " 'option': False,\n", " 'types': None,\n", + " 'openmdao_types': None,\n", " 'historical_name': None,\n", " }\n", "\n", @@ -447,7 +449,7 @@ "hash": "e6c7471802ed76737b16357fb02af5587f3a4cbee5ea7658f3f9a6981469039b" }, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -461,7 +463,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.13" + "version": "3.12.3" }, "orphan": true }, From 0a4d84ee8c0ceed9dafa6d54aed0a612be8560a0 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Tue, 1 Oct 2024 16:16:41 -0400 Subject: [PATCH 24/58] cleanup --- aviary/utils/preprocessors.py | 1 - 1 file changed, 1 deletion(-) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index e983cb784..90070aa83 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -242,7 +242,6 @@ def preprocess_propulsion(aviary_options: AviaryValues, engine_models: list = No and type(vec) is not tuple: vec = np.array(vec, dtype=dtype) aviary_options.set_val(var, vec, units) - print(var, units) ################################### # Input/Option Consistency Checks # From 148c45431ae6a6bacb510f50ba857638596a3a17 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Tue, 1 Oct 2024 17:42:17 -0400 Subject: [PATCH 25/58] Fix one option --- aviary/variable_info/variable_meta_data.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 17b8f2307..7f8ec55b3 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -642,7 +642,7 @@ units='lbm', desc='baggage mass per passenger', option=True, - default_value=50., + default_value=None, ) add_meta_data( @@ -1718,9 +1718,11 @@ "LEAPS1": 'aircraft.inputs.L0_propulsion.misc_weight' }, units='unitless', + option=True, desc='fraction of (scaled) engine mass used to calculate additional propulsion ' 'system mass added to engine control and starter mass, or used to ' 'calculate engine installation mass', + types=(float, list, np.ndarray), default_value=0.0, ) From 430870ce4550d7e3b0812a5233dd1a2549ca69d4 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Tue, 1 Oct 2024 18:05:13 -0400 Subject: [PATCH 26/58] All tests and benches pass --- aviary/variable_info/variable_meta_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 7f8ec55b3..286c7cb05 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1722,7 +1722,7 @@ desc='fraction of (scaled) engine mass used to calculate additional propulsion ' 'system mass added to engine control and starter mass, or used to ' 'calculate engine installation mass', - types=(float, list, np.ndarray), + types=(float, int, list, np.ndarray), default_value=0.0, ) From e25395f9bcaf3d12a9bdc2f2d4f97376093ace61 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Wed, 2 Oct 2024 10:54:37 -0400 Subject: [PATCH 27/58] Found a better way to deal with the units tuple default types. --- aviary/docs/user_guide/variable_metadata.ipynb | 2 -- aviary/utils/develop_metadata.py | 10 ---------- aviary/variable_info/functions.py | 7 ++++--- aviary/variable_info/variable_meta_data.py | 1 - 4 files changed, 4 insertions(+), 16 deletions(-) diff --git a/aviary/docs/user_guide/variable_metadata.ipynb b/aviary/docs/user_guide/variable_metadata.ipynb index d6ed85633..4ef31934d 100644 --- a/aviary/docs/user_guide/variable_metadata.ipynb +++ b/aviary/docs/user_guide/variable_metadata.ipynb @@ -18,7 +18,6 @@ "| Default Value | `0.0` | default_value |\n", "| Is Option? | `False` | option |\n", "| Type Restrictions | `None` | types |\n", - "| Types for Component Option | `None` | openmdao_types |\n", "| Historical Variable Name(s) | `None` | historical_name |" ] }, @@ -42,7 +41,6 @@ " 'default_value': 0.0,\n", " 'option': False,\n", " 'types': None,\n", - " 'openmdao_types': None,\n", " 'historical_name': None,\n", " }\n", "\n", diff --git a/aviary/utils/develop_metadata.py b/aviary/utils/develop_metadata.py index 1570a19d2..232a028b1 100644 --- a/aviary/utils/develop_metadata.py +++ b/aviary/utils/develop_metadata.py @@ -6,7 +6,6 @@ def add_meta_data( default_value=0.0, option=False, types=None, - openmdao_types=None, historical_name=None, _check_unique=True): ''' @@ -39,11 +38,6 @@ def add_meta_data( types : type gives the allowable type(s) of the variable in the aviary API. - openmdao_types : type - the types used for declaring component options can differ from the options - that are checked in the AviaryValues container. This should only be - specified in those cases. - historical_name : dict or None dictionary of names that the variable held in prior codes @@ -90,9 +84,6 @@ def add_meta_data( if units is None: units = 'unitless' - if openmdao_types is None: - openmdao_types = types - meta_data[key] = { 'historical_name': historical_name, 'units': units, @@ -100,7 +91,6 @@ def add_meta_data( 'option': option, 'default_value': default_value, 'types': types, - 'openmdao_types': openmdao_types } diff --git a/aviary/variable_info/functions.py b/aviary/variable_info/functions.py index 104aa97c8..7f2cb2c21 100644 --- a/aviary/variable_info/functions.py +++ b/aviary/variable_info/functions.py @@ -156,12 +156,13 @@ def add_aviary_option(comp, name, val=_unspecified, units=None, desc=None, meta_ val = meta['default_value'] if units not in [None, 'unitless']: + types = tuple comp.options.declare(name, default=(val, units), - types=meta['openmdao_types'], desc=desc, + types=types, desc=desc, set_function=units_setter) else: comp.options.declare(name, default=val, - types=meta['openmdao_types'], desc=desc) + types=meta['types'], desc=desc) def override_aviary_vars(group, aviary_inputs: AviaryValues, @@ -389,7 +390,7 @@ def extract_options(aviary_inputs: AviaryValues, metadata=_MetaData) -> dict: val, units = aviary_inputs.get_item(key) meta_units = meta['units'] - if meta_units is 'unitless' or meta_units is None: + if meta_units == 'unitless' or meta_units is None: options[key] = val else: diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 286c7cb05..102fa7b07 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -6922,7 +6922,6 @@ option=True, default_value=25000.0, types=(int, float), - openmdao_types=tuple, desc='design mission cruise altitude', ) From f2a28b16db6fabf9151d09fa2e47c603df8f804e Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Wed, 2 Oct 2024 14:08:11 -0400 Subject: [PATCH 28/58] PEP --- .../flops_based/characteristic_lengths.py | 78 +++++++++---------- .../flops_based/test/test_prep_geom.py | 2 +- .../geometry/gasp_based/fuselage.py | 2 +- .../subsystems/geometry/geometry_builder.py | 4 +- aviary/subsystems/mass/flops_based/cargo.py | 2 +- .../mass/flops_based/mass_premission.py | 2 +- .../flops_based/test/test_engine_controls.py | 3 +- aviary/subsystems/mass/gasp_based/fixed.py | 4 +- .../mass/gasp_based/test/test_fuel.py | 6 +- aviary/utils/test/test_aviary_values.py | 32 ++++---- aviary/variable_info/functions.py | 1 + 11 files changed, 71 insertions(+), 65 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/characteristic_lengths.py b/aviary/subsystems/geometry/flops_based/characteristic_lengths.py index 3eae168c3..e16f836f2 100644 --- a/aviary/subsystems/geometry/flops_based/characteristic_lengths.py +++ b/aviary/subsystems/geometry/flops_based/characteristic_lengths.py @@ -316,66 +316,66 @@ def _compute_nacelles( outputs[Aircraft.Nacelle.CHARACTERISTIC_LENGTH] = char_len outputs[Aircraft.Nacelle.FINENESS] = fineness - #def _compute_additional_fuselages( - #self, inputs, outputs, discrete_inputs=None, discrete_outputs=None - #): - #num_fuselages = inputs[Aircraft.Fuselage.NUM_FUSELAGES] + def _compute_additional_fuselages( + self, inputs, outputs, discrete_inputs=None, discrete_outputs=None + ): + num_fuselages = inputs[Aircraft.Fuselage.NUM_FUSELAGES] - #if num_fuselages < 2: - #return + if num_fuselages < 2: + return - #num_extra = num_fuselages - 1 + num_extra = num_fuselages - 1 - #idx = self._num_components - #self._num_components += num_extra + idx = self._num_components + self._num_components += num_extra - #lengths = outputs[Aircraft.Design.CHARACTERISTIC_LENGTHS] + lengths = outputs[Aircraft.Design.CHARACTERISTIC_LENGTHS] - #fineness = outputs[Aircraft.Design.FINENESS] + fineness = outputs[Aircraft.Design.FINENESS] - #laminar_flow_lower = outputs[Aircraft.Design.LAMINAR_FLOW_LOWER] - #laminar_flow_upper = outputs[Aircraft.Design.LAMINAR_FLOW_UPPER] + laminar_flow_lower = outputs[Aircraft.Design.LAMINAR_FLOW_LOWER] + laminar_flow_upper = outputs[Aircraft.Design.LAMINAR_FLOW_UPPER] - #for _ in range(num_extra): - #lengths[idx] = lengths[3] + for _ in range(num_extra): + lengths[idx] = lengths[3] - #fineness[idx] = fineness[3] + fineness[idx] = fineness[3] - #laminar_flow_lower[idx] = laminar_flow_lower[3] - #laminar_flow_upper[idx] = laminar_flow_upper[3] + laminar_flow_lower[idx] = laminar_flow_lower[3] + laminar_flow_upper[idx] = laminar_flow_upper[3] - #idx += 1 + idx += 1 - #def _compute_additional_vertical_tails( - #self, inputs, outputs, discrete_inputs=None, discrete_outputs=None - #): - #aviary_options: AviaryValues = self.options['aviary_options'] - #num_tails = aviary_options.get_val(Aircraft.VerticalTail.NUM_TAILS) + def _compute_additional_vertical_tails( + self, inputs, outputs, discrete_inputs=None, discrete_outputs=None + ): + aviary_options: AviaryValues = self.options['aviary_options'] + num_tails = aviary_options.get_val(Aircraft.VerticalTail.NUM_TAILS) - #if num_tails < 2: - #return + if num_tails < 2: + return - #num_extra = num_tails - 1 + num_extra = num_tails - 1 - #idx = self._num_components - #self._num_components += num_extra + idx = self._num_components + self._num_components += num_extra - #lengths = outputs[Aircraft.Design.CHARACTERISTIC_LENGTHS] + lengths = outputs[Aircraft.Design.CHARACTERISTIC_LENGTHS] - #fineness = outputs[Aircraft.Design.FINENESS] + fineness = outputs[Aircraft.Design.FINENESS] - #laminar_flow_lower = outputs[Aircraft.Design.LAMINAR_FLOW_LOWER] - #laminar_flow_upper = outputs[Aircraft.Design.LAMINAR_FLOW_UPPER] + laminar_flow_lower = outputs[Aircraft.Design.LAMINAR_FLOW_LOWER] + laminar_flow_upper = outputs[Aircraft.Design.LAMINAR_FLOW_UPPER] - #for _ in range(num_extra): - #lengths[idx] = lengths[2] + for _ in range(num_extra): + lengths[idx] = lengths[2] - #fineness[idx] = fineness[2] + fineness[idx] = fineness[2] - #laminar_flow_lower[idx] = laminar_flow_lower[2] - #laminar_flow_upper[idx] = laminar_flow_upper[2] + laminar_flow_lower[idx] = laminar_flow_lower[2] + laminar_flow_upper[idx] = laminar_flow_upper[2] - #idx += 1 + idx += 1 def _compute_canard( self, inputs, outputs, discrete_inputs=None, discrete_outputs=None diff --git a/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py b/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py index 4d62f207b..7627b42c8 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py +++ b/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py @@ -62,7 +62,7 @@ def configure(self): override_aviary_vars(self, aviary_options) - keys=[ + keys = [ Aircraft.Fuselage.NUM_FUSELAGES, Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES, Aircraft.VerticalTail.NUM_TAILS, diff --git a/aviary/subsystems/geometry/gasp_based/fuselage.py b/aviary/subsystems/geometry/gasp_based/fuselage.py index d2e98748d..e4dde772f 100644 --- a/aviary/subsystems/geometry/gasp_based/fuselage.py +++ b/aviary/subsystems/geometry/gasp_based/fuselage.py @@ -59,7 +59,7 @@ def compute(self, inputs, outputs): num_aisle = options[Aircraft.Fuselage.NUM_AISLES] aisle_width, _ = options[Aircraft.Fuselage.AISLE_WIDTH] PAX = options[Aircraft.CrewPayload.NUM_PASSENGERS] - seat_pitch, _= options[Aircraft.Fuselage.SEAT_PITCH] + seat_pitch, _ = options[Aircraft.Fuselage.SEAT_PITCH] delta_diameter = inputs[Aircraft.Fuselage.DELTA_DIAMETER] diff --git a/aviary/subsystems/geometry/geometry_builder.py b/aviary/subsystems/geometry/geometry_builder.py index 3d14dfdb3..10c944982 100644 --- a/aviary/subsystems/geometry/geometry_builder.py +++ b/aviary/subsystems/geometry/geometry_builder.py @@ -60,7 +60,9 @@ def build_pre_mission(self, aviary_inputs): geom_group = None if both_geom: - geom_group = CombinedGeometry(code_origin_to_prioritize=code_origin_to_prioritize) + geom_group = CombinedGeometry( + code_origin_to_prioritize=code_origin_to_prioritize + ) elif code_origin is GASP: geom_group = SizeGroup() diff --git a/aviary/subsystems/mass/flops_based/cargo.py b/aviary/subsystems/mass/flops_based/cargo.py index 80cdb7a92..dd388e067 100644 --- a/aviary/subsystems/mass/flops_based/cargo.py +++ b/aviary/subsystems/mass/flops_based/cargo.py @@ -56,7 +56,7 @@ def compute( ): passenger_count = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] mass_per_passenger, _ = self.options[Aircraft.CrewPayload.MASS_PER_PASSENGER] - baggage_mass_per_passenger, _ = self.options[Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER] + baggage_mass_per_passenger, _ = self.options[Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER] outputs[Aircraft.CrewPayload.PASSENGER_MASS] = \ mass_per_passenger * passenger_count diff --git a/aviary/subsystems/mass/flops_based/mass_premission.py b/aviary/subsystems/mass/flops_based/mass_premission.py index d4900581e..a0c889a3a 100644 --- a/aviary/subsystems/mass/flops_based/mass_premission.py +++ b/aviary/subsystems/mass/flops_based/mass_premission.py @@ -105,7 +105,7 @@ def setup(self): self.add_subsystem( 'furnishing_base', AltFurnishingsGroupMassBase( - ), + ), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( diff --git a/aviary/subsystems/mass/flops_based/test/test_engine_controls.py b/aviary/subsystems/mass/flops_based/test/test_engine_controls.py index e7d28489f..63cb871ed 100644 --- a/aviary/subsystems/mass/flops_based/test/test_engine_controls.py +++ b/aviary/subsystems/mass/flops_based/test/test_engine_controls.py @@ -73,7 +73,8 @@ def test_case(self): promotes_inputs=['*'] ) - prob.model_options['*'] = get_flops_options("LargeSingleAisle1FLOPS", preprocess=True) + prob.model_options['*'] = get_flops_options("LargeSingleAisle1FLOPS", + preprocess=True) prob.setup(force_alloc_complex=True) prob.set_val(Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, 50000.0, 'lbf') diff --git a/aviary/subsystems/mass/gasp_based/fixed.py b/aviary/subsystems/mass/gasp_based/fixed.py index 8a06096e6..856693544 100644 --- a/aviary/subsystems/mass/gasp_based/fixed.py +++ b/aviary/subsystems/mass/gasp_based/fixed.py @@ -238,7 +238,8 @@ def compute_partials(self, inputs, J): class PayloadMass(om.ExplicitComponent): def initialize(self): add_aviary_option(self, Aircraft.CrewPayload.NUM_PASSENGERS) - add_aviary_option(self, Aircraft.CrewPayload.PASSENGER_MASS_WITH_BAGS, units='lbm') + add_aviary_option(self, Aircraft.CrewPayload.PASSENGER_MASS_WITH_BAGS, + units='lbm') def setup(self): add_aviary_input(self, Aircraft.CrewPayload.CARGO_MASS, val=10040) @@ -722,7 +723,6 @@ def compute(self, inputs, outputs): eng_spec_wt = inputs[Aircraft.Engine.MASS_SPECIFIC] * GRAV_ENGLISH_LBM Fn_SLS = inputs[Aircraft.Engine.SCALED_SLS_THRUST] - spec_nacelle_wt = inputs[Aircraft.Nacelle.MASS_SPECIFIC] * GRAV_ENGLISH_LBM nacelle_area = inputs[Aircraft.Nacelle.SURFACE_AREA] pylon_fac = inputs[Aircraft.Engine.PYLON_FACTOR] diff --git a/aviary/subsystems/mass/gasp_based/test/test_fuel.py b/aviary/subsystems/mass/gasp_based/test/test_fuel.py index 4992431be..ccab35bb1 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_fuel.py +++ b/aviary/subsystems/mass/gasp_based/test/test_fuel.py @@ -230,8 +230,10 @@ def tearDown(self): def test_case1(self): prob = om.Problem() - prob.model.add_subsystem("wing_calcs", FuelAndOEMOutputs(), - promotes=["*"] + prob.model.add_subsystem( + "wing_calcs", + FuelAndOEMOutputs(), + promotes=["*"] ) prob.model.set_input_defaults( Aircraft.Fuel.DENSITY, val=6.687, units="lbm/galUS") diff --git a/aviary/utils/test/test_aviary_values.py b/aviary/utils/test/test_aviary_values.py index 6ea6b5723..c253caced 100644 --- a/aviary/utils/test/test_aviary_values.py +++ b/aviary/utils/test/test_aviary_values.py @@ -86,19 +86,19 @@ def test_aircraft(self): # TODO - When we moved the aviary_options into individual component options, # we lost the ability to set them as strings. - #try: - #vals.set_val(Aircraft.Engine.TYPE, 'turbojet') - #self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) + # try: + # vals.set_val(Aircraft.Engine.TYPE, 'turbojet') + # self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) #== GASPEngineType.TURBOJET) - #except: - #self.fail('Expecting to be able to set the value of an Enum from an int.') + # except: + # self.fail('Expecting to be able to set the value of an Enum from an int.') - #try: - #vals.set_val(Aircraft.Engine.TYPE, 'TURBOJET') - #self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) + # try: + # vals.set_val(Aircraft.Engine.TYPE, 'TURBOJET') + # self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) #is GASPEngineType.TURBOJET) - #except: - #self.fail('Expecting to be able to set the value of an Enum from a string.') + # except: + # self.fail('Expecting to be able to set the value of an Enum from a string.') try: vals.set_val(Aircraft.Engine.TYPE, 7) @@ -109,13 +109,13 @@ def test_aircraft(self): # TODO: This no longer raises an error because the types field needed to be modified # for multiple engines. - #try: - #vals.set_val(Aircraft.Engine.TYPE, FlapType.DOUBLE_SLOTTED) - #except ValueError as err: - #self.assertEqual(str(err), + # try: + # vals.set_val(Aircraft.Engine.TYPE, FlapType.DOUBLE_SLOTTED) + # except ValueError as err: + # self.assertEqual(str(err), #" is not a valid GASPEngineType") - #else: - #self.fail("Expecting ValueError.") + # else: + # self.fail("Expecting ValueError.") try: vals.set_val(Aircraft.Engine.DATA_FILE, np.array([])) diff --git a/aviary/variable_info/functions.py b/aviary/variable_info/functions.py index 7f2cb2c21..a372e9c0e 100644 --- a/aviary/variable_info/functions.py +++ b/aviary/variable_info/functions.py @@ -399,6 +399,7 @@ def extract_options(aviary_inputs: AviaryValues, metadata=_MetaData) -> dict: return options + def setup_model_options(prob: om.Problem, aviary_inputs: AviaryValues, meta_data=_MetaData, engine_models=None): """ From b5c4dca574382fc7a5d3c993909b4601a049e23b Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Thu, 3 Oct 2024 11:28:00 -0400 Subject: [PATCH 29/58] PEP --- aviary/utils/test/test_aviary_values.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aviary/utils/test/test_aviary_values.py b/aviary/utils/test/test_aviary_values.py index c253caced..1c104412e 100644 --- a/aviary/utils/test/test_aviary_values.py +++ b/aviary/utils/test/test_aviary_values.py @@ -89,14 +89,14 @@ def test_aircraft(self): # try: # vals.set_val(Aircraft.Engine.TYPE, 'turbojet') # self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) - #== GASPEngineType.TURBOJET) + # == GASPEngineType.TURBOJET) # except: # self.fail('Expecting to be able to set the value of an Enum from an int.') # try: # vals.set_val(Aircraft.Engine.TYPE, 'TURBOJET') # self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) - #is GASPEngineType.TURBOJET) + # is GASPEngineType.TURBOJET) # except: # self.fail('Expecting to be able to set the value of an Enum from a string.') @@ -113,7 +113,7 @@ def test_aircraft(self): # vals.set_val(Aircraft.Engine.TYPE, FlapType.DOUBLE_SLOTTED) # except ValueError as err: # self.assertEqual(str(err), - #" is not a valid GASPEngineType") + # " is not a valid GASPEngineType") # else: # self.fail("Expecting ValueError.") From 45b2115c20ad4d10e3db2d71b8ea2b20616d9bd5 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Thu, 3 Oct 2024 11:40:11 -0400 Subject: [PATCH 30/58] PEP --- aviary/utils/test/test_aviary_values.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aviary/utils/test/test_aviary_values.py b/aviary/utils/test/test_aviary_values.py index 1c104412e..831095d45 100644 --- a/aviary/utils/test/test_aviary_values.py +++ b/aviary/utils/test/test_aviary_values.py @@ -89,14 +89,14 @@ def test_aircraft(self): # try: # vals.set_val(Aircraft.Engine.TYPE, 'turbojet') # self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) - # == GASPEngineType.TURBOJET) + # == GASPEngineType.TURBOJET) # except: # self.fail('Expecting to be able to set the value of an Enum from an int.') # try: # vals.set_val(Aircraft.Engine.TYPE, 'TURBOJET') # self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) - # is GASPEngineType.TURBOJET) + # is GASPEngineType.TURBOJET) # except: # self.fail('Expecting to be able to set the value of an Enum from a string.') @@ -113,7 +113,7 @@ def test_aircraft(self): # vals.set_val(Aircraft.Engine.TYPE, FlapType.DOUBLE_SLOTTED) # except ValueError as err: # self.assertEqual(str(err), - # " is not a valid GASPEngineType") + # " is not a valid GASPEngineType") # else: # self.fail("Expecting ValueError.") From 65bf4ab271ef1d86b78084df58d5e7694125f2f6 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Thu, 3 Oct 2024 11:43:01 -0400 Subject: [PATCH 31/58] PEP --- aviary/variable_info/functions.py | 1 - 1 file changed, 1 deletion(-) diff --git a/aviary/variable_info/functions.py b/aviary/variable_info/functions.py index a372e9c0e..be07f2bbd 100644 --- a/aviary/variable_info/functions.py +++ b/aviary/variable_info/functions.py @@ -458,4 +458,3 @@ def setup_model_options(prob: om.Problem, aviary_inputs: AviaryValues, path = f"*core_propulsion.{eng_name}*" prob.model_options[path] = opts - From 78c9a31752ad3bd670fde53de89a954a6507f630 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Thu, 3 Oct 2024 12:12:09 -0400 Subject: [PATCH 32/58] PEP --- aviary/variable_info/functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/variable_info/functions.py b/aviary/variable_info/functions.py index be07f2bbd..fb4903e7a 100644 --- a/aviary/variable_info/functions.py +++ b/aviary/variable_info/functions.py @@ -457,4 +457,4 @@ def setup_model_options(prob: om.Problem, aviary_inputs: AviaryValues, opts[key] = (val[idx], units) path = f"*core_propulsion.{eng_name}*" - prob.model_options[path] = opts + prob.model_options[path] = opts \ No newline at end of file From c7f4e8eb5d71a5a081eee8f4716426b8a2ef5484 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Thu, 3 Oct 2024 12:15:06 -0400 Subject: [PATCH 33/58] PEP --- aviary/variable_info/functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/variable_info/functions.py b/aviary/variable_info/functions.py index fb4903e7a..be07f2bbd 100644 --- a/aviary/variable_info/functions.py +++ b/aviary/variable_info/functions.py @@ -457,4 +457,4 @@ def setup_model_options(prob: om.Problem, aviary_inputs: AviaryValues, opts[key] = (val[idx], units) path = f"*core_propulsion.{eng_name}*" - prob.model_options[path] = opts \ No newline at end of file + prob.model_options[path] = opts From 32f7c0c593099b14120f07f7612d4feff338a22a Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Thu, 17 Oct 2024 09:45:55 -0400 Subject: [PATCH 34/58] New setter function for enums --- .../gasp_based/equipment_and_useful_load.py | 12 ++-- aviary/utils/test/test_aviary_values.py | 28 ++++----- aviary/variable_info/functions.py | 60 +++++++++++++++++++ aviary/variable_info/variable_meta_data.py | 2 +- 4 files changed, 80 insertions(+), 22 deletions(-) diff --git a/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py b/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py index 29bc99841..c43fea40f 100644 --- a/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py +++ b/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py @@ -117,7 +117,7 @@ def compute(self, inputs, outputs): num_pilots = 1.0 if PAX > 9.0: num_pilots = 2.0 - if engine_type == GASPEngineType.TURBOJET and PAX > 5.0: + if engine_type is GASPEngineType.TURBOJET and PAX > 5.0: num_pilots = 2.0 if PAX >= 251.0: num_pilots = 3.0 @@ -312,9 +312,9 @@ def compute(self, inputs, outputs): 20.0 * (num_flight_attendants + num_pilots) + 25.0 * num_pilots ) - if engine_type == GASPEngineType.TURBOJET: + if engine_type is GASPEngineType.TURBOJET: oil_per_eng_wt = 0.0054 * Fn_SLS + 12.0 - elif engine_type == GASPEngineType.TURBOSHAFT or engine_type == GASPEngineType.TURBOPROP: + elif engine_type is GASPEngineType.TURBOSHAFT or engine_type is GASPEngineType.TURBOPROP: oil_per_eng_wt = 0.0124 * Fn_SLS + 14 # else: # oil_per_eng_wt = 0.062 * (Fn_SLS - 100) + 11 @@ -422,7 +422,7 @@ def compute_partials(self, inputs, partials): num_pilots = 1.0 if PAX > 9.0: num_pilots = 2.0 - if engine_type == GASPEngineType.TURBOJET and PAX > 5.0: + if engine_type is GASPEngineType.TURBOJET and PAX > 5.0: num_pilots = 2.0 if PAX >= 251.0: num_pilots = 3.0 @@ -708,9 +708,9 @@ def compute_partials(self, inputs, partials): if PAX >= 251.0: num_flight_attendants = 6.0 - if engine_type == GASPEngineType.TURBOJET: + if engine_type is GASPEngineType.TURBOJET: doil_per_eng_wt_dFn_SLS = 0.0054 - elif engine_type == GASPEngineType.TURBOSHAFT or engine_type == GASPEngineType.TURBOPROP: + elif engine_type is GASPEngineType.TURBOSHAFT or engine_type is GASPEngineType.TURBOPROP: doil_per_eng_wt_dFn_SLS = 0.0124 # else: # doil_per_eng_wt_dFn_SLS = 0.062 diff --git a/aviary/utils/test/test_aviary_values.py b/aviary/utils/test/test_aviary_values.py index fd1444202..633a795af 100644 --- a/aviary/utils/test/test_aviary_values.py +++ b/aviary/utils/test/test_aviary_values.py @@ -87,26 +87,24 @@ def test_aircraft(self): except: self.fail('Expecting to be able to set the value of an Enum.') - # TODO - When we moved the aviary_options into individual component options, - # we lost the ability to set them as strings. - # try: - # vals.set_val(Aircraft.Engine.TYPE, 'turbojet') - # self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) - #== GASPEngineType.TURBOJET) - # except: - # self.fail('Expecting to be able to set the value of an Enum from an int.') + try: + vals.set_val(Aircraft.Engine.TYPE, 'turbojet') + self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) + == GASPEngineType.TURBOJET) + except: + self.fail('Expecting to be able to set the value of an Enum from an int.') - # try: - # vals.set_val(Aircraft.Engine.TYPE, 'TURBOJET') - # self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) - #is GASPEngineType.TURBOJET) - # except: - # self.fail('Expecting to be able to set the value of an Enum from a string.') + try: + vals.set_val(Aircraft.Engine.TYPE, 'TURBOJET') + self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) + is GASPEngineType.TURBOJET) + except: + self.fail('Expecting to be able to set the value of an Enum from a string.') try: vals.set_val(Aircraft.Engine.TYPE, 7) self.assertTrue(vals.get_val(Aircraft.Engine.TYPE) - == GASPEngineType.TURBOJET) + is GASPEngineType.TURBOJET) except: self.fail('Expecting to be able to set the value of an Enum from an int.') diff --git a/aviary/variable_info/functions.py b/aviary/variable_info/functions.py index 4a146adcb..1c4a297ba 100644 --- a/aviary/variable_info/functions.py +++ b/aviary/variable_info/functions.py @@ -1,3 +1,7 @@ +from enum import IntEnum + +import numpy as np + import openmdao.api as om from openmdao.core.component import Component from openmdao.utils.units import convert_units @@ -127,6 +131,56 @@ def units_setter(opt_meta, value): return (converted_val, units) +def int_enum_setter(opt_meta, value): + """ + Support setting the option with a string or int and converting it to the + proper intenum object. + + Parameters + ---------- + opt_meta : dict + Dictionary of entries for the option. + value : any + New value for the option. + + Returns + ------- + any + Post processed value to set into the option. + """ + types = opt_meta['types'] + for type_ in types: + if type_ not in (list, np.ndarray): + enum_class = type_ + break + + if isinstance(value, IntEnum): + return value + + elif isinstance(value, int): + return enum_class(value) + + elif isinstance(value, str): + return getattr(enum_class, value) + + elif isinstance(value, list): + values = [] + for val in value: + if isinstance(value, IntEnum): + values.append(val) + elif isinstance(val, int): + values.append(enum_class(val)) + elif isinstance(value, str): + values.append(getattr(enum_class, value)) + else: + break + + return values + + msg = f"Value '{value}' not valid for option with types {enum_class}" + raise TypeError(msg) + + def add_aviary_option(comp, name, val=_unspecified, units=None, desc=None, meta_data=_MetaData): """ Adds an option to an Aviary component. Default values from the metadata are used @@ -160,6 +214,12 @@ def add_aviary_option(comp, name, val=_unspecified, units=None, desc=None, meta_ comp.options.declare(name, default=(val, units), types=types, desc=desc, set_function=units_setter) + + elif isinstance(val, IntEnum): + comp.options.declare(name, default=val, + types=meta['types'], desc=desc, + set_function=int_enum_setter) + else: comp.options.declare(name, default=val, types=meta['types'], desc=desc) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index f25419450..1045bdf47 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -2341,7 +2341,7 @@ }, option=True, default_value=GASPEngineType.TURBOJET, - types=(list, GASPEngineType, int, np.ndarray), + types=(GASPEngineType, list), units="unitless", desc='specifies engine type used for engine mass calculation', ) From 4b4d46bcb63041b7e9bcd1faeed8d7f60ef2795f Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Fri, 18 Oct 2024 16:34:52 -0400 Subject: [PATCH 35/58] Some adjustments to processing enums in aviaryvalues --- aviary/utils/aviary_values.py | 124 ++++++++++-------- aviary/utils/process_input_decks.py | 11 +- .../benchmark_tests/test_bench_FwFm.py | 10 +- aviary/variable_info/variable_meta_data.py | 4 +- 4 files changed, 82 insertions(+), 67 deletions(-) diff --git a/aviary/utils/aviary_values.py b/aviary/utils/aviary_values.py index 23736a4ca..e0d559592 100644 --- a/aviary/utils/aviary_values.py +++ b/aviary/utils/aviary_values.py @@ -58,16 +58,21 @@ def set_val(self, key, val, units='unitless', meta_data=_MetaData): # Special handling to access an Enum member from either the member name or its value. my_val = val if key in _MetaData.keys(): + expected_types = _MetaData[key]['types'] - if type(expected_types) is EnumMeta: - if self._is_iterable(val): - my_val = [self._convert_to_enum( - item, expected_types) for item in val] - else: - my_val = self._convert_to_enum(val, expected_types) - - # Special handling if the variable is supposed to be an array - if key in _MetaData.keys(): + if not isinstance(expected_types, tuple): + expected_types = (expected_types, ) + + for _type in expected_types: + if type(_type) is EnumMeta: + if self._is_iterable(val): + my_val = [self._convert_to_enum( + item, _type) for item in val] + else: + my_val = self._convert_to_enum(val, _type) + break + + # Special handling if the variable is supposed to be an array default_value = _MetaData[key]['default_value'] # if the item is supposed to be an iterable... if self._is_iterable(default_value): @@ -79,61 +84,64 @@ def set_val(self, key, val, units='unitless', meta_data=_MetaData): else: my_val = np.array([my_val], dtype=type(default_value[0])) - self._check_type(key, my_val, meta_data=meta_data) - self._check_units_compatability(key, my_val, units, meta_data=meta_data) + self._check_type(key, my_val, meta_data=meta_data) + self._check_units_compatability(key, my_val, units, meta_data=meta_data) super().set_val(key=key, val=my_val, units=units) def _check_type(self, key, val, meta_data=_MetaData): - if key in meta_data.keys(): - expected_types = meta_data[key]['types'] - if expected_types is not None: - if self._is_iterable(expected_types): - expected_types = tuple(expected_types) - # if val is not iterable, add it to a list (length 1), checks assume - # val is iterable - if not self._is_iterable(val): - val = [val] - # numpy arrays have special typings. Extract item of equivalent built-in python type - # numpy arrays do not allow mixed types, only have to check first entry - # empty arrays do not need this check - if isinstance(val, np.ndarray) and len(val) > 0: - # NoneType numpy arrays do not need to be "converted" to built-in python types - if val.dtype == type(None): - val = [val[0]] - else: - # item() gets us native Python equivalent object (i.e. int vs. numpy.int64) - # wrap first index in np array to ensures works on any dtype - val = [np.array(val[0]).item()] - for item in val: - has_bool = False # needs some fancy shenanigans because bools will register as ints - if (isinstance(expected_types, type)): - if expected_types is bool: - has_bool = True - elif bool in expected_types: - has_bool = True - if (not isinstance(item, expected_types)) or ( - (has_bool == False) and (isinstance(item, bool))): - raise TypeError( - f'{key} is of type(s) {meta_data[key]["types"]} but you ' - f'have provided a value of type {type(item)}.') - def _check_units_compatability(self, key, val, units, meta_data=_MetaData): - if key in meta_data.keys(): - expected_units = meta_data[key]['units'] - - try: - # NOTE the value here is unimportant, we only care if OpenMDAO will - # convert the units - _convert_units(10, expected_units, units) - except ValueError: - raise ValueError( - f'The units {units} which you have provided for {key} are invalid.') - except TypeError: + expected_types = meta_data[key]['types'] + if expected_types is None: + # MetaData item has no type requirement. + return + + if self._is_iterable(expected_types): + expected_types = tuple(expected_types) + + # if val is not iterable, add it to a list (length 1), checks assume + # val is iterable + if not self._is_iterable(val): + val = [val] + # numpy arrays have special typings. Extract item of equivalent built-in python type + # numpy arrays do not allow mixed types, only have to check first entry + # empty arrays do not need this check + if isinstance(val, np.ndarray) and len(val) > 0: + # NoneType numpy arrays do not need to be "converted" to built-in python types + if val.dtype == type(None): + val = [val[0]] + else: + # item() gets us native Python equivalent object (i.e. int vs. numpy.int64) + # wrap first index in np array to ensures works on any dtype + val = [np.array(val[0]).item()] + for item in val: + has_bool = False # needs some fancy shenanigans because bools will register as ints + if (isinstance(expected_types, type)): + if expected_types is bool: + has_bool = True + elif bool in expected_types: + has_bool = True + if (not isinstance(item, expected_types)) or ( + (has_bool == False) and (isinstance(item, bool))): raise TypeError( - f'The base units of {key} are {expected_units}, and you have tried to set {key} with units of {units}, which are not compatible.') - except BaseException: - raise KeyError('There is an unknown error with your units.') + f'{key} is of type(s) {meta_data[key]["types"]} but you ' + f'have provided a value of type {type(item)}.') + + def _check_units_compatability(self, key, val, units, meta_data=_MetaData): + expected_units = meta_data[key]['units'] + + try: + # NOTE the value here is unimportant, we only care if OpenMDAO will + # convert the units + _convert_units(10, expected_units, units) + except ValueError: + raise ValueError( + f'The units {units} which you have provided for {key} are invalid.') + except TypeError: + raise TypeError( + f'The base units of {key} are {expected_units}, and you have tried to set {key} with units of {units}, which are not compatible.') + except BaseException: + raise KeyError('There is an unknown error with your units.') def _is_iterable(self, val): return isinstance(val, _valid_iterables) diff --git a/aviary/utils/process_input_decks.py b/aviary/utils/process_input_decks.py index 6057925fe..221e44469 100644 --- a/aviary/utils/process_input_decks.py +++ b/aviary/utils/process_input_decks.py @@ -368,8 +368,15 @@ def initialization_guessing(aircraft_values: AviaryValues, initialization_guesse (60 * 60) try: - total_thrust = aircraft_values.get_val( - Aircraft.Engine.SCALED_SLS_THRUST, 'lbf') * aircraft_values.get_val(Aircraft.Engine.NUM_ENGINES) + num_engines = aircraft_values.get_val(Aircraft.Engine.NUM_ENGINES) + scaled_sls_thrust = aircraft_values.get_val(Aircraft.Engine.SCALED_SLS_THRUST, 'lbf') + + # This happens before preprocessing, and we end up with the default when unspecified. + if isinstance(num_engines, list): + num_engines = num_engines[0] + + total_thrust = scaled_sls_thrust * num_engines + except KeyError: # heterogeneous engine-model case. Get thrust from the engine decks instead. total_thrust = 0 diff --git a/aviary/validation_cases/benchmark_tests/test_bench_FwFm.py b/aviary/validation_cases/benchmark_tests/test_bench_FwFm.py index 1a07bb967..3e1160ae9 100644 --- a/aviary/validation_cases/benchmark_tests/test_bench_FwFm.py +++ b/aviary/validation_cases/benchmark_tests/test_bench_FwFm.py @@ -20,7 +20,7 @@ class ProblemPhaseTestCase(unittest.TestCase): """ - Setup of a large single aisle commercial transport aircraft using + Setup of a large single aisle commercial transport aircraft using FLOPS mass method and HEIGHT_ENERGY mission method. Expected outputs based on 'models/test_aircraft/aircraft_for_bench_FwFm.csv' model. """ @@ -426,7 +426,7 @@ def test_bench_FwFm_SNOPT_MPI(self): if __name__ == '__main__': - unittest.main() - # test = TestBenchFwFmSerial() - # test.setUp() - # test.test_bench_FwFm_SNOPT() + # unittest.main() + test = TestBenchFwFmSerial() + test.setUp() + test.test_bench_FwFm_SNOPT() diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index e06ceda65..e7ff373ff 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1981,7 +1981,7 @@ '(fuselage, wing, or otherwise)', types=(list, np.ndarray, int), option=True, - default_value=np.array([2]) + default_value=[2] ) add_meta_data( @@ -2339,7 +2339,7 @@ }, option=True, default_value=GASPEngineType.TURBOJET, - types=(GASPEngineType, list), + types=(GASPEngineType, list, int, str), units="unitless", desc='specifies engine type used for engine mass calculation', ) From 37eda5e2d59447b491c4b90e261d7465254aab23 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Fri, 18 Oct 2024 16:59:40 -0400 Subject: [PATCH 36/58] changing flaps over to use the new setter --- .../gasp_based/flaps_model/meta_model.py | 22 +++++++++---------- aviary/subsystems/mass/gasp_based/fixed.py | 20 ++++++++--------- aviary/utils/test/test_aviary_values.py | 16 ++++++-------- aviary/variable_info/variable_meta_data.py | 2 +- 4 files changed, 29 insertions(+), 31 deletions(-) diff --git a/aviary/subsystems/aerodynamics/gasp_based/flaps_model/meta_model.py b/aviary/subsystems/aerodynamics/gasp_based/flaps_model/meta_model.py index 654f707c3..03a90dabf 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/flaps_model/meta_model.py +++ b/aviary/subsystems/aerodynamics/gasp_based/flaps_model/meta_model.py @@ -39,7 +39,7 @@ def setup(self): desc="ratio of flap chord to wing chord", ) - if flap_type == FlapType.PLAIN or flap_type == FlapType.SPLIT: + if flap_type is FlapType.PLAIN or flap_type is FlapType.SPLIT: VDEL1_interp.add_output( "VDEL1", @@ -374,7 +374,7 @@ def setup(self): desc="average wing thickness to chord ratio", ) - if flap_type == FlapType.PLAIN or flap_type == FlapType.SPLIT: + if flap_type is FlapType.PLAIN or flap_type is FlapType.SPLIT: VLAM4_interp.add_output( "VLAM4", @@ -446,7 +446,7 @@ def setup(self): desc="ratio of flap chord to wing chord", ) - if flap_type == FlapType.PLAIN or flap_type == FlapType.SPLIT: + if flap_type is FlapType.PLAIN or flap_type is FlapType.SPLIT: VLAM5_interp.add_output( "VLAM5", @@ -457,9 +457,9 @@ def setup(self): ) elif ( - flap_type == FlapType.SINGLE_SLOTTED - or flap_type == FlapType.DOUBLE_SLOTTED - or flap_type == FlapType.TRIPLE_SLOTTED + flap_type is FlapType.SINGLE_SLOTTED + or flap_type is FlapType.DOUBLE_SLOTTED + or flap_type is FlapType.TRIPLE_SLOTTED ): VLAM5_interp.add_output( @@ -516,7 +516,7 @@ def setup(self): desc="flap deflection", ) - if flap_type == FlapType.PLAIN or flap_type == FlapType.SPLIT: + if flap_type is FlapType.PLAIN or flap_type is FlapType.SPLIT: VLAM6_interp.add_output( "VLAM6", @@ -543,9 +543,9 @@ def setup(self): ) elif ( - flap_type == FlapType.SINGLE_SLOTTED - or flap_type == FlapType.DOUBLE_SLOTTED - or flap_type == FlapType.TRIPLE_SLOTTED + flap_type is FlapType.SINGLE_SLOTTED + or flap_type is FlapType.DOUBLE_SLOTTED + or flap_type is FlapType.TRIPLE_SLOTTED ): VLAM6_interp.add_output( @@ -572,7 +572,7 @@ def setup(self): desc="sensitivity of flap clean wing maximum lift coefficient to wing flap deflection", ) - elif (flap_type == FlapType.FOWLER or flap_type == FlapType.DOUBLE_SLOTTED_FOWLER): + elif (flap_type is FlapType.FOWLER or flap_type is FlapType.DOUBLE_SLOTTED_FOWLER): VLAM6_interp.add_output( "VLAM6", diff --git a/aviary/subsystems/mass/gasp_based/fixed.py b/aviary/subsystems/mass/gasp_based/fixed.py index c42afb6fb..1ada00ce8 100644 --- a/aviary/subsystems/mass/gasp_based/fixed.py +++ b/aviary/subsystems/mass/gasp_based/fixed.py @@ -1661,10 +1661,10 @@ def compute(self, inputs, outputs): outputs['slat_mass'] = WLED / GRAV_ENGLISH_LBM # Flap Mass - if flap_type == FlapType.PLAIN: + if flap_type is FlapType.PLAIN: outputs["flap_mass"] = c_mass_trend_high_lift * \ (VFLAP/100.)**2*SFLAP*num_flaps**(-.5) / GRAV_ENGLISH_LBM - elif flap_type == FlapType.SPLIT: + elif flap_type is FlapType.SPLIT: if VFLAP > 160: outputs["flap_mass"] = c_mass_trend_high_lift*SFLAP * \ (VFLAP**2.195)/45180. / GRAV_ENGLISH_LBM @@ -1673,12 +1673,12 @@ def compute(self, inputs, outputs): 0.369*VFLAP**0.2733 / GRAV_ENGLISH_LBM elif ( - flap_type == FlapType.SINGLE_SLOTTED or flap_type == FlapType.DOUBLE_SLOTTED - or flap_type == FlapType.TRIPLE_SLOTTED + flap_type is FlapType.SINGLE_SLOTTED or flap_type is FlapType.DOUBLE_SLOTTED + or flap_type is FlapType.TRIPLE_SLOTTED ): outputs["flap_mass"] = c_mass_trend_high_lift * \ (VFLAP/100.)**2*SFLAP*num_flaps**.5 / GRAV_ENGLISH_LBM - elif flap_type == FlapType.FOWLER or flap_type == FlapType.DOUBLE_SLOTTED_FOWLER: + elif flap_type is FlapType.FOWLER or flap_type is FlapType.DOUBLE_SLOTTED_FOWLER: outputs["flap_mass"] = c_mass_trend_high_lift * \ (VFLAP/100.)**2.38*SFLAP**1.19 / \ (num_flaps**.595) / GRAV_ENGLISH_LBM @@ -1785,7 +1785,7 @@ def compute_partials(self, inputs, J): 1.13*(SLE**.13)*dSLE_dBTSR*dBTSR_dCW / GRAV_ENGLISH_LBM # Flap Mass - if flap_type == FlapType.PLAIN: + if flap_type is FlapType.PLAIN: # c_wt_trend_high_lift * (VFLAP/100.)**2*SFLAP*num_flaps**(-.5) J["flap_mass", Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT] = ( VFLAP/100)**2 * SFLAP * num_flaps**(-.5) / GRAV_ENGLISH_LBM @@ -1822,7 +1822,7 @@ def compute_partials(self, inputs, J): J["flap_mass", Aircraft.Fuselage.AVG_DIAMETER] = c_mass_trend_high_lift * \ (VFLAP/100)**2 * dSFLAP_dBTSR * dBTSR_dCW * \ num_flaps**(-.5) / GRAV_ENGLISH_LBM - elif flap_type == FlapType.SPLIT: + elif flap_type is FlapType.SPLIT: if VFLAP > 160: # c_wt_trend_high_lift*SFLAP*(VFLAP**2.195)/45180. J["flap_mass", Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT] = SFLAP * \ @@ -1909,8 +1909,8 @@ def compute_partials(self, inputs, J): * VFLAP**0.2733 / GRAV_ENGLISH_LBM) elif ( - flap_type == FlapType.SINGLE_SLOTTED or flap_type == FlapType.DOUBLE_SLOTTED - or flap_type == FlapType.TRIPLE_SLOTTED + flap_type is FlapType.SINGLE_SLOTTED or flap_type is FlapType.DOUBLE_SLOTTED + or flap_type is FlapType.TRIPLE_SLOTTED ): # c_wt_trend_high_lift*(VFLAP/100.)**2*SFLAP*num_flaps**.5 J["flap_mass", Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT] = ( @@ -1946,7 +1946,7 @@ def compute_partials(self, inputs, J): J["flap_mass", Aircraft.Fuselage.AVG_DIAMETER] = c_mass_trend_high_lift * \ (VFLAP/100.)**2*dSFLAP_dBTSR*dBTSR_dCW * \ num_flaps**.5 / GRAV_ENGLISH_LBM - elif flap_type == FlapType.FOWLER or flap_type == FlapType.DOUBLE_SLOTTED_FOWLER: + elif flap_type is FlapType.FOWLER or flap_type is FlapType.DOUBLE_SLOTTED_FOWLER: # c_wt_trend_high_lift * (VFLAP/100.)**2.38*SFLAP**1.19/(num_flaps**.595) J["flap_mass", Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT] = ( VFLAP/100.)**2.38*SFLAP**1.19/(num_flaps**.595) / GRAV_ENGLISH_LBM diff --git a/aviary/utils/test/test_aviary_values.py b/aviary/utils/test/test_aviary_values.py index c1b6475e0..050e17392 100644 --- a/aviary/utils/test/test_aviary_values.py +++ b/aviary/utils/test/test_aviary_values.py @@ -108,15 +108,13 @@ def test_aircraft(self): except: self.fail('Expecting to be able to set the value of an Enum from an int.') - # TODO: This no longer raises an error because the types field needed to be modified - # for multiple engines. - # try: - # vals.set_val(Aircraft.Engine.TYPE, FlapType.DOUBLE_SLOTTED) - # except ValueError as err: - # self.assertEqual(str(err), - # " is not a valid GASPEngineType") - # else: - # self.fail("Expecting ValueError.") + try: + vals.set_val(Aircraft.Engine.TYPE, FlapType.DOUBLE_SLOTTED) + except ValueError as err: + self.assertEqual(str(err), + " is not a valid GASPEngineType") + else: + self.fail("Expecting ValueError.") try: vals.set_val(Aircraft.Engine.DATA_FILE, np.array([])) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index e7ff373ff..8fe9a3c78 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -5316,7 +5316,7 @@ }, units="unitless", default_value=FlapType.DOUBLE_SLOTTED, - types=FlapType, + types=(FlapType, list, int, str), option=True, desc='Set the flap type. Available choices are: plain, split, single_slotted, ' 'double_slotted, triple_slotted, fowler, and double_slotted_fowler. ' From d498640e1bc0525e18d0182645f443aaff585f3f Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Fri, 18 Oct 2024 17:22:59 -0400 Subject: [PATCH 37/58] Some review fixes, more to go. --- aviary/interface/methods_for_level2.py | 4 ---- .../aerodynamics/flops_based/mux_component.py | 3 +-- aviary/subsystems/aerodynamics/gasp_based/gaspaero.py | 6 ++---- aviary/variable_info/enums.py | 4 ++-- aviary/variable_info/functions.py | 10 +++++----- 5 files changed, 10 insertions(+), 17 deletions(-) diff --git a/aviary/interface/methods_for_level2.py b/aviary/interface/methods_for_level2.py index 39aa2f4c1..524f61aac 100644 --- a/aviary/interface/methods_for_level2.py +++ b/aviary/interface/methods_for_level2.py @@ -1988,10 +1988,6 @@ def setup(self, **kwargs): warnings.simplefilter("ignore", om.OpenMDAOWarning) warnings.simplefilter("ignore", om.PromotionWarning) - # OpenMDAO currently warns that ":" won't be supported in option names, but - # removing support has been reconsidered. - warnings.simplefilter("ignore", om.OMDeprecationWarning) - super().setup(**kwargs) def set_initial_guesses(self): diff --git a/aviary/subsystems/aerodynamics/flops_based/mux_component.py b/aviary/subsystems/aerodynamics/flops_based/mux_component.py index 8473f26a6..a1560a477 100644 --- a/aviary/subsystems/aerodynamics/flops_based/mux_component.py +++ b/aviary/subsystems/aerodynamics/flops_based/mux_component.py @@ -66,9 +66,8 @@ def setup(self): nc += num num_engines = self.options[Aircraft.Engine.NUM_ENGINES] - num_nacelles = int(sum(num_engines)) num_engine_models = len(num_engines) - self.num_nacelles = num_nacelles + self.num_nacelles = int(sum(num_engines)) if self.num_nacelles > 0: add_aviary_input(self, Aircraft.Nacelle.WETTED_AREA, diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index 435d69112..887962bd9 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py @@ -795,8 +795,7 @@ def setup(self): ('nu', Dynamic.Mission.KINEMATIC_VISCOSITY)], ) - self.add_subsystem("geom", AeroGeom(num_nodes=nn), - promotes=["*"]) + self.add_subsystem("geom", AeroGeom(num_nodes=nn), promotes=["*"]) class DragCoef(om.ExplicitComponent): @@ -1255,8 +1254,7 @@ def setup(self): nn = self.options["num_nodes"] self.add_subsystem( "aero_setup", - AeroSetup(num_nodes=nn, - input_atmos=self.options["input_atmos"]), + AeroSetup(num_nodes=nn, input_atmos=self.options["input_atmos"]), promotes=["*"], ) if self.options["output_alpha"]: diff --git a/aviary/variable_info/enums.py b/aviary/variable_info/enums.py index 071192bc3..e4583609f 100644 --- a/aviary/variable_info/enums.py +++ b/aviary/variable_info/enums.py @@ -64,7 +64,7 @@ class EquationsOfMotion(Enum): @unique -class GASPEngineType(IntEnum): +class GASPEngineType(Enum): """ Defines the type of engine to use in GASP-based mass calculations. Note that only the value for the first engine model will be used. @@ -109,7 +109,7 @@ class GASPEngineType(IntEnum): @unique -class FlapType(IntEnum): +class FlapType(Enum): """ Defines the type of flap used on the wing. Used in GASP-based aerodynamics and mass calculations. """ diff --git a/aviary/variable_info/functions.py b/aviary/variable_info/functions.py index 67f83e051..193059cd0 100644 --- a/aviary/variable_info/functions.py +++ b/aviary/variable_info/functions.py @@ -1,4 +1,4 @@ -from enum import IntEnum +from enum import Enum import numpy as np @@ -134,7 +134,7 @@ def units_setter(opt_meta, value): def int_enum_setter(opt_meta, value): """ Support setting the option with a string or int and converting it to the - proper intenum object. + proper enum object. Parameters ---------- @@ -154,7 +154,7 @@ def int_enum_setter(opt_meta, value): enum_class = type_ break - if isinstance(value, IntEnum): + if isinstance(value, Enum): return value elif isinstance(value, int): @@ -166,7 +166,7 @@ def int_enum_setter(opt_meta, value): elif isinstance(value, list): values = [] for val in value: - if isinstance(value, IntEnum): + if isinstance(value, Enum): values.append(val) elif isinstance(val, int): values.append(enum_class(val)) @@ -215,7 +215,7 @@ def add_aviary_option(comp, name, val=_unspecified, units=None, desc=None, meta_ types=types, desc=desc, set_function=units_setter) - elif isinstance(val, IntEnum): + elif isinstance(val, Enum): comp.options.declare(name, default=val, types=meta['types'], desc=desc, set_function=int_enum_setter) From cbe9863683870f7a148995c4c9e4f306df0b94db Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Mon, 21 Oct 2024 11:37:55 -0400 Subject: [PATCH 38/58] Reviews. Only failures come from regression. --- aviary/subsystems/geometry/flops_based/nacelle.py | 3 +++ .../geometry/flops_based/test/test_nacelle.py | 1 - .../geometry/gasp_based/test/test_electric.py | 6 ++---- .../geometry/gasp_based/test/test_fuselage.py | 4 +--- aviary/subsystems/mass/flops_based/crew.py | 2 +- aviary/subsystems/mass/flops_based/engine.py | 1 - .../subsystems/mass/flops_based/landing_gear.py | 6 +++--- .../mass/flops_based/mass_premission.py | 3 +-- .../mass/flops_based/test/test_cargo.py | 1 - .../mass/flops_based/test/test_wing_common.py | 6 +----- .../mass/gasp_based/equipment_and_useful_load.py | 15 ++------------- .../subsystems/mass/gasp_based/test/test_fixed.py | 3 +-- .../propulsion/test/test_engine_sizing.py | 4 ++-- aviary/utils/preprocessors.py | 2 -- aviary/variable_info/functions.py | 10 +++++----- 15 files changed, 22 insertions(+), 45 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/nacelle.py b/aviary/subsystems/geometry/flops_based/nacelle.py index 048946c26..c8c9adf97 100644 --- a/aviary/subsystems/geometry/flops_based/nacelle.py +++ b/aviary/subsystems/geometry/flops_based/nacelle.py @@ -54,7 +54,10 @@ def setup_partials(self): def compute( self, inputs, outputs, discrete_inputs=None, discrete_outputs=None ): + # how many of each unique engine type are on the aircraft (array) num_engines = self.options[Aircraft.Engine.NUM_ENGINES] + + # how many unique engine types are there (int) num_engine_type = len(num_engines) avg_diam = inputs[Aircraft.Nacelle.AVG_DIAMETER] diff --git a/aviary/subsystems/geometry/flops_based/test/test_nacelle.py b/aviary/subsystems/geometry/flops_based/test/test_nacelle.py index cd1d0f5d2..1ca18d748 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_nacelle.py +++ b/aviary/subsystems/geometry/flops_based/test/test_nacelle.py @@ -6,7 +6,6 @@ from aviary.subsystems.geometry.flops_based.nacelle import Nacelles from aviary.utils.test_utils.variable_test import assert_match_varnames -from aviary.validation_cases.validation_tests import get_flops_inputs from aviary.variable_info.variables import Aircraft diff --git a/aviary/subsystems/geometry/gasp_based/test/test_electric.py b/aviary/subsystems/geometry/gasp_based/test/test_electric.py index e329b4bb6..9116a4dc7 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_electric.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_electric.py @@ -18,8 +18,7 @@ def setUp(self): aviary_options = AviaryValues() aviary_options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 2) - self.prob.model.add_subsystem("cable", CableSize(), - promotes=["*"]) + self.prob.model.add_subsystem("cable", CableSize(), promotes=["*"]) self.prob.model.set_input_defaults( Aircraft.Engine.WING_LOCATIONS, 0.35, units="unitless" @@ -56,8 +55,7 @@ def test_case_multiengine(self): # aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([2, 4])) aviary_options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 6) - prob.model.add_subsystem("cable", CableSize(), - promotes=["*"]) + prob.model.add_subsystem("cable", CableSize(), promotes=["*"]) prob.model.set_input_defaults( Aircraft.Engine.WING_LOCATIONS, np.array([0.35, 0.2, 0.6]), units="unitless" diff --git a/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py b/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py index 84c59d631..cc08d361f 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py @@ -105,9 +105,7 @@ class FuselageSizeTestCase1(unittest.TestCase): def setUp(self): self.prob = om.Problem() - self.prob.model.add_subsystem( - "size", FuselageSize(), promotes=["*"] - ) + self.prob.model.add_subsystem("size", FuselageSize(), promotes=["*"]) self.prob.model.set_input_defaults( Aircraft.Fuselage.NOSE_FINENESS, 1, units="unitless") diff --git a/aviary/subsystems/mass/flops_based/crew.py b/aviary/subsystems/mass/flops_based/crew.py index d592829e7..924840101 100644 --- a/aviary/subsystems/mass/flops_based/crew.py +++ b/aviary/subsystems/mass/flops_based/crew.py @@ -116,7 +116,7 @@ def _mass_per_flight_crew(self, inputs): mass_per_flight_crew = 225.0 # lbm # account for machine precision error - if 0.9 <= self.options[Aircraft.LandingGear.CARRIER_BASED]: + if self.options[Aircraft.LandingGear.CARRIER_BASED]: mass_per_flight_crew -= 35.0 # lbm return mass_per_flight_crew diff --git a/aviary/subsystems/mass/flops_based/engine.py b/aviary/subsystems/mass/flops_based/engine.py index 022853616..f1b043945 100644 --- a/aviary/subsystems/mass/flops_based/engine.py +++ b/aviary/subsystems/mass/flops_based/engine.py @@ -37,7 +37,6 @@ def setup(self): def compute(self, inputs, outputs): options = self.options - # cast to numpy arrays to ensure values are always correct type num_engines = options[Aircraft.Engine.NUM_ENGINES] scale_mass = options[Aircraft.Engine.SCALE_MASS] addtl_mass_fraction = options[Aircraft.Engine.ADDITIONAL_MASS_FRACTION] diff --git a/aviary/subsystems/mass/flops_based/landing_gear.py b/aviary/subsystems/mass/flops_based/landing_gear.py index 5a1beb9e0..0304be4f2 100644 --- a/aviary/subsystems/mass/flops_based/landing_gear.py +++ b/aviary/subsystems/mass/flops_based/landing_gear.py @@ -286,7 +286,7 @@ 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] + 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] @@ -327,8 +327,8 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): 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] - num_wing_eng = self.options[Aircraft.Engine.NUM_WING_ENGINES] + num_eng = self.options[Aircraft.Engine.NUM_ENGINES][0] + num_wing_eng = self.options[Aircraft.Engine.NUM_WING_ENGINES][0] y_eng_fore = inputs[Aircraft.Engine.WING_LOCATIONS][0][0] y_eng_aft = 0 diff --git a/aviary/subsystems/mass/flops_based/mass_premission.py b/aviary/subsystems/mass/flops_based/mass_premission.py index aafa9f063..c477b562c 100644 --- a/aviary/subsystems/mass/flops_based/mass_premission.py +++ b/aviary/subsystems/mass/flops_based/mass_premission.py @@ -110,8 +110,7 @@ def setup(self): self.add_subsystem( 'furnishing_base', - AltFurnishingsGroupMassBase( - ), + AltFurnishingsGroupMassBase(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem( diff --git a/aviary/subsystems/mass/flops_based/test/test_cargo.py b/aviary/subsystems/mass/flops_based/test/test_cargo.py index c7e9c289c..7b6ea15b3 100644 --- a/aviary/subsystems/mass/flops_based/test/test_cargo.py +++ b/aviary/subsystems/mass/flops_based/test/test_cargo.py @@ -14,7 +14,6 @@ Aircraft.CrewPayload.MISC_CARGO: (2000., 'lbm'), # custom Aircraft.CrewPayload.WING_CARGO: (1000., 'lbm'), # custom Aircraft.CrewPayload.BAGGAGE_MASS: (9200., 'lbm'), # custom - Aircraft.CrewPayload.NUM_PASSENGERS: (184, 'unitless'), # custom Aircraft.CrewPayload.PASSENGER_MASS: (33120., 'lbm'), # custom Aircraft.CrewPayload.CARGO_MASS: (3000., 'lbm'), # custom Aircraft.CrewPayload.TOTAL_PAYLOAD_MASS: (45320., 'lbm') # custom diff --git a/aviary/subsystems/mass/flops_based/test/test_wing_common.py b/aviary/subsystems/mass/flops_based/test/test_wing_common.py index 97e5e81cc..69487dd30 100644 --- a/aviary/subsystems/mass/flops_based/test/test_wing_common.py +++ b/aviary/subsystems/mass/flops_based/test/test_wing_common.py @@ -203,13 +203,9 @@ def test_case(self): prob = om.Problem() - opts = { - Aircraft.Fuselage.NUM_FUSELAGES: 1, - } - prob.model.add_subsystem( "wing", - WingBendingMass(**opts), + WingBendingMass(), promotes_inputs=['*'], promotes_outputs=['*'], ) diff --git a/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py b/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py index c43fea40f..36c9f1a8d 100644 --- a/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py +++ b/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py @@ -87,11 +87,6 @@ def compute(self, inputs, outputs): fus_len = inputs[Aircraft.Fuselage.LENGTH] wingspan = inputs[Aircraft.Wing.SPAN] - if self.options[Aircraft.LandingGear.FIXED_GEAR]: - gear_type = 1 - else: - gear_type = 0 - landing_gear_wt = inputs[Aircraft.LandingGear.TOTAL_MASS] * \ GRAV_ENGLISH_LBM control_wt = inputs[Aircraft.Controls.TOTAL_MASS] * GRAV_ENGLISH_LBM @@ -130,11 +125,10 @@ def compute(self, inputs, outputs): * fus_len**0.05 * wingspan**0.696 ) - gear_val = 1 - gear_type hydraulic_wt = ( inputs[Aircraft.Hydraulics.FLIGHT_CONTROL_MASS_COEFFICIENT] * control_wt + inputs[Aircraft.Hydraulics.GEAR_MASS_COEFFICIENT] * - landing_gear_wt * gear_val + landing_gear_wt * (not self.options[Aircraft.LandingGear.FIXED_GEAR]) ) electrical_wt = 16.0 * PAX + 170.0 @@ -396,11 +390,6 @@ def compute_partials(self, inputs, partials): fus_len = inputs[Aircraft.Fuselage.LENGTH] wingspan = inputs[Aircraft.Wing.SPAN] - if self.options[Aircraft.LandingGear.FIXED_GEAR]: - gear_type = 1 - else: - gear_type = 0 - landing_gear_wt = inputs[Aircraft.LandingGear.TOTAL_MASS] * \ GRAV_ENGLISH_LBM control_wt = inputs[Aircraft.Controls.TOTAL_MASS] * GRAV_ENGLISH_LBM @@ -462,7 +451,7 @@ def compute_partials(self, inputs, partials): * wingspan ** (0.696 - 1) ) - gear_val = 1 - gear_type + gear_val = not self.options[Aircraft.LandingGear.FIXED_GEAR] dhydraulic_wt_dmass_coeff_2 = control_wt dhydraulic_wt_dcontrol_wt = inputs[Aircraft.Hydraulics.FLIGHT_CONTROL_MASS_COEFFICIENT] diff --git a/aviary/subsystems/mass/gasp_based/test/test_fixed.py b/aviary/subsystems/mass/gasp_based/test/test_fixed.py index 21399c54c..1af3573d5 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_fixed.py +++ b/aviary/subsystems/mass/gasp_based/test/test_fixed.py @@ -310,8 +310,7 @@ def setUp(self): val=200, units="lbm") # bug fixed value and original value self.prob = om.Problem() - self.prob.model.add_subsystem("payload", PayloadMass(), - promotes=["*"]) + self.prob.model.add_subsystem("payload", PayloadMass(), promotes=["*"]) self.prob.model.set_input_defaults( Aircraft.CrewPayload.CARGO_MASS, val=10040, units="lbm" ) # bug fixed value and original value diff --git a/aviary/subsystems/propulsion/test/test_engine_sizing.py b/aviary/subsystems/propulsion/test/test_engine_sizing.py index 7c5497d07..9605e3ac4 100644 --- a/aviary/subsystems/propulsion/test/test_engine_sizing.py +++ b/aviary/subsystems/propulsion/test/test_engine_sizing.py @@ -35,11 +35,11 @@ def test_case_multiengine(self): # engine2 = EngineDeck(name='engine2', options=options) # preprocess_propulsion(options, [engine, engine2]) - ref_thrust = engine.get_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 'lbf') + ref_thrust = engine.get_item(Aircraft.Engine.REFERENCE_SLS_THRUST) options = { Aircraft.Engine.SCALE_PERFORMANCE: True, - Aircraft.Engine.REFERENCE_SLS_THRUST: (ref_thrust, 'lbf'), + Aircraft.Engine.REFERENCE_SLS_THRUST: ref_thrust, } self.prob.model.add_subsystem('engine', SizeEngine(**options), diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index 90070aa83..c1f786cb9 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -161,8 +161,6 @@ def preprocess_propulsion(aviary_options: AviaryValues, engine_models: list = No if dtype is None: if isinstance(default_value, np.ndarray): dtype = default_value.dtype - elif isinstance(default_value, np.ndarray): - dtype = default_value.dtype elif default_value is None: # With no default value, we cannot determine a dtype. dtype = None diff --git a/aviary/variable_info/functions.py b/aviary/variable_info/functions.py index 193059cd0..412d6f46f 100644 --- a/aviary/variable_info/functions.py +++ b/aviary/variable_info/functions.py @@ -166,16 +166,16 @@ def int_enum_setter(opt_meta, value): elif isinstance(value, list): values = [] for val in value: - if isinstance(value, Enum): + if isinstance(val, Enum): values.append(val) elif isinstance(val, int): values.append(enum_class(val)) - elif isinstance(value, str): - values.append(getattr(enum_class, value)) + elif isinstance(val, str): + values.append(getattr(enum_class, val)) else: break - - return values + else: + return values msg = f"Value '{value}' not valid for option with types {enum_class}" raise TypeError(msg) From a8af1148922085a95ff5287e41647dab5857f329 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Mon, 21 Oct 2024 13:45:04 -0400 Subject: [PATCH 39/58] PEP cleanup --- .../gasp_based/flaps_model/meta_model.py | 22 +++++++++---------- aviary/subsystems/mass/gasp_based/fixed.py | 20 ++++++++--------- aviary/utils/process_input_decks.py | 3 ++- aviary/utils/test/test_aviary_values.py | 2 +- 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/aviary/subsystems/aerodynamics/gasp_based/flaps_model/meta_model.py b/aviary/subsystems/aerodynamics/gasp_based/flaps_model/meta_model.py index 03a90dabf..0acc2d9df 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/flaps_model/meta_model.py +++ b/aviary/subsystems/aerodynamics/gasp_based/flaps_model/meta_model.py @@ -39,7 +39,7 @@ def setup(self): desc="ratio of flap chord to wing chord", ) - if flap_type is FlapType.PLAIN or flap_type is FlapType.SPLIT: + if flap_type is FlapType.PLAIN or flap_type is FlapType.SPLIT: VDEL1_interp.add_output( "VDEL1", @@ -374,7 +374,7 @@ def setup(self): desc="average wing thickness to chord ratio", ) - if flap_type is FlapType.PLAIN or flap_type is FlapType.SPLIT: + if flap_type is FlapType.PLAIN or flap_type is FlapType.SPLIT: VLAM4_interp.add_output( "VLAM4", @@ -446,7 +446,7 @@ def setup(self): desc="ratio of flap chord to wing chord", ) - if flap_type is FlapType.PLAIN or flap_type is FlapType.SPLIT: + if flap_type is FlapType.PLAIN or flap_type is FlapType.SPLIT: VLAM5_interp.add_output( "VLAM5", @@ -457,9 +457,9 @@ def setup(self): ) elif ( - flap_type is FlapType.SINGLE_SLOTTED - or flap_type is FlapType.DOUBLE_SLOTTED - or flap_type is FlapType.TRIPLE_SLOTTED + flap_type is FlapType.SINGLE_SLOTTED + or flap_type is FlapType.DOUBLE_SLOTTED + or flap_type is FlapType.TRIPLE_SLOTTED ): VLAM5_interp.add_output( @@ -516,7 +516,7 @@ def setup(self): desc="flap deflection", ) - if flap_type is FlapType.PLAIN or flap_type is FlapType.SPLIT: + if flap_type is FlapType.PLAIN or flap_type is FlapType.SPLIT: VLAM6_interp.add_output( "VLAM6", @@ -543,9 +543,9 @@ def setup(self): ) elif ( - flap_type is FlapType.SINGLE_SLOTTED - or flap_type is FlapType.DOUBLE_SLOTTED - or flap_type is FlapType.TRIPLE_SLOTTED + flap_type is FlapType.SINGLE_SLOTTED + or flap_type is FlapType.DOUBLE_SLOTTED + or flap_type is FlapType.TRIPLE_SLOTTED ): VLAM6_interp.add_output( @@ -572,7 +572,7 @@ def setup(self): desc="sensitivity of flap clean wing maximum lift coefficient to wing flap deflection", ) - elif (flap_type is FlapType.FOWLER or flap_type is FlapType.DOUBLE_SLOTTED_FOWLER): + elif (flap_type is FlapType.FOWLER or flap_type is FlapType.DOUBLE_SLOTTED_FOWLER): VLAM6_interp.add_output( "VLAM6", diff --git a/aviary/subsystems/mass/gasp_based/fixed.py b/aviary/subsystems/mass/gasp_based/fixed.py index 1ada00ce8..01ef00b92 100644 --- a/aviary/subsystems/mass/gasp_based/fixed.py +++ b/aviary/subsystems/mass/gasp_based/fixed.py @@ -1661,10 +1661,10 @@ def compute(self, inputs, outputs): outputs['slat_mass'] = WLED / GRAV_ENGLISH_LBM # Flap Mass - if flap_type is FlapType.PLAIN: + if flap_type is FlapType.PLAIN: outputs["flap_mass"] = c_mass_trend_high_lift * \ (VFLAP/100.)**2*SFLAP*num_flaps**(-.5) / GRAV_ENGLISH_LBM - elif flap_type is FlapType.SPLIT: + elif flap_type is FlapType.SPLIT: if VFLAP > 160: outputs["flap_mass"] = c_mass_trend_high_lift*SFLAP * \ (VFLAP**2.195)/45180. / GRAV_ENGLISH_LBM @@ -1673,12 +1673,12 @@ def compute(self, inputs, outputs): 0.369*VFLAP**0.2733 / GRAV_ENGLISH_LBM elif ( - flap_type is FlapType.SINGLE_SLOTTED or flap_type is FlapType.DOUBLE_SLOTTED - or flap_type is FlapType.TRIPLE_SLOTTED + flap_type is FlapType.SINGLE_SLOTTED or flap_type is FlapType.DOUBLE_SLOTTED + or flap_type is FlapType.TRIPLE_SLOTTED ): outputs["flap_mass"] = c_mass_trend_high_lift * \ (VFLAP/100.)**2*SFLAP*num_flaps**.5 / GRAV_ENGLISH_LBM - elif flap_type is FlapType.FOWLER or flap_type is FlapType.DOUBLE_SLOTTED_FOWLER: + elif flap_type is FlapType.FOWLER or flap_type is FlapType.DOUBLE_SLOTTED_FOWLER: outputs["flap_mass"] = c_mass_trend_high_lift * \ (VFLAP/100.)**2.38*SFLAP**1.19 / \ (num_flaps**.595) / GRAV_ENGLISH_LBM @@ -1785,7 +1785,7 @@ def compute_partials(self, inputs, J): 1.13*(SLE**.13)*dSLE_dBTSR*dBTSR_dCW / GRAV_ENGLISH_LBM # Flap Mass - if flap_type is FlapType.PLAIN: + if flap_type is FlapType.PLAIN: # c_wt_trend_high_lift * (VFLAP/100.)**2*SFLAP*num_flaps**(-.5) J["flap_mass", Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT] = ( VFLAP/100)**2 * SFLAP * num_flaps**(-.5) / GRAV_ENGLISH_LBM @@ -1822,7 +1822,7 @@ def compute_partials(self, inputs, J): J["flap_mass", Aircraft.Fuselage.AVG_DIAMETER] = c_mass_trend_high_lift * \ (VFLAP/100)**2 * dSFLAP_dBTSR * dBTSR_dCW * \ num_flaps**(-.5) / GRAV_ENGLISH_LBM - elif flap_type is FlapType.SPLIT: + elif flap_type is FlapType.SPLIT: if VFLAP > 160: # c_wt_trend_high_lift*SFLAP*(VFLAP**2.195)/45180. J["flap_mass", Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT] = SFLAP * \ @@ -1909,8 +1909,8 @@ def compute_partials(self, inputs, J): * VFLAP**0.2733 / GRAV_ENGLISH_LBM) elif ( - flap_type is FlapType.SINGLE_SLOTTED or flap_type is FlapType.DOUBLE_SLOTTED - or flap_type is FlapType.TRIPLE_SLOTTED + flap_type is FlapType.SINGLE_SLOTTED or flap_type is FlapType.DOUBLE_SLOTTED + or flap_type is FlapType.TRIPLE_SLOTTED ): # c_wt_trend_high_lift*(VFLAP/100.)**2*SFLAP*num_flaps**.5 J["flap_mass", Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT] = ( @@ -1946,7 +1946,7 @@ def compute_partials(self, inputs, J): J["flap_mass", Aircraft.Fuselage.AVG_DIAMETER] = c_mass_trend_high_lift * \ (VFLAP/100.)**2*dSFLAP_dBTSR*dBTSR_dCW * \ num_flaps**.5 / GRAV_ENGLISH_LBM - elif flap_type is FlapType.FOWLER or flap_type is FlapType.DOUBLE_SLOTTED_FOWLER: + elif flap_type is FlapType.FOWLER or flap_type is FlapType.DOUBLE_SLOTTED_FOWLER: # c_wt_trend_high_lift * (VFLAP/100.)**2.38*SFLAP**1.19/(num_flaps**.595) J["flap_mass", Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT] = ( VFLAP/100.)**2.38*SFLAP**1.19/(num_flaps**.595) / GRAV_ENGLISH_LBM diff --git a/aviary/utils/process_input_decks.py b/aviary/utils/process_input_decks.py index 221e44469..84373b1f2 100644 --- a/aviary/utils/process_input_decks.py +++ b/aviary/utils/process_input_decks.py @@ -369,7 +369,8 @@ def initialization_guessing(aircraft_values: AviaryValues, initialization_guesse try: num_engines = aircraft_values.get_val(Aircraft.Engine.NUM_ENGINES) - scaled_sls_thrust = aircraft_values.get_val(Aircraft.Engine.SCALED_SLS_THRUST, 'lbf') + scaled_sls_thrust = aircraft_values.get_val(Aircraft.Engine.SCALED_SLS_THRUST, + 'lbf') # This happens before preprocessing, and we end up with the default when unspecified. if isinstance(num_engines, list): diff --git a/aviary/utils/test/test_aviary_values.py b/aviary/utils/test/test_aviary_values.py index 050e17392..9d6fc4883 100644 --- a/aviary/utils/test/test_aviary_values.py +++ b/aviary/utils/test/test_aviary_values.py @@ -112,7 +112,7 @@ def test_aircraft(self): vals.set_val(Aircraft.Engine.TYPE, FlapType.DOUBLE_SLOTTED) except ValueError as err: self.assertEqual(str(err), - " is not a valid GASPEngineType") + " is not a valid GASPEngineType") else: self.fail("Expecting ValueError.") From 46c1fe053f079ca1772dc0eeb5c8d27b1a6ca6d1 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Mon, 21 Oct 2024 14:55:16 -0400 Subject: [PATCH 40/58] PEP cleanup --- aviary/subsystems/propulsion/test/test_engine_sizing.py | 1 - 1 file changed, 1 deletion(-) diff --git a/aviary/subsystems/propulsion/test/test_engine_sizing.py b/aviary/subsystems/propulsion/test/test_engine_sizing.py index 9605e3ac4..9cb778f07 100644 --- a/aviary/subsystems/propulsion/test/test_engine_sizing.py +++ b/aviary/subsystems/propulsion/test/test_engine_sizing.py @@ -35,7 +35,6 @@ def test_case_multiengine(self): # engine2 = EngineDeck(name='engine2', options=options) # preprocess_propulsion(options, [engine, engine2]) - ref_thrust = engine.get_item(Aircraft.Engine.REFERENCE_SLS_THRUST) options = { Aircraft.Engine.SCALE_PERFORMANCE: True, From 6ae52a327f56c0f0129ccc7e9bc965b12c54560d Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Tue, 12 Nov 2024 16:37:44 -0500 Subject: [PATCH 41/58] Review --- aviary/subsystems/geometry/gasp_based/wing.py | 2 +- aviary/utils/conflict_checks.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aviary/subsystems/geometry/gasp_based/wing.py b/aviary/subsystems/geometry/gasp_based/wing.py index c425da783..85ce6cf1b 100644 --- a/aviary/subsystems/geometry/gasp_based/wing.py +++ b/aviary/subsystems/geometry/gasp_based/wing.py @@ -1005,7 +1005,7 @@ def setup(self): choose_fold_location = self.options[Aircraft.Wing.CHOOSE_FOLD_LOCATION] if not choose_fold_location: - check_fold_location_definition(None, choose_fold_location, has_strut) + check_fold_location_definition(choose_fold_location, has_strut) self.promotes("strut", outputs=["strut_y"]) self.promotes("fold", inputs=["strut_y"]) diff --git a/aviary/utils/conflict_checks.py b/aviary/utils/conflict_checks.py index e1a7bcc7f..0fafa70a2 100644 --- a/aviary/utils/conflict_checks.py +++ b/aviary/utils/conflict_checks.py @@ -3,7 +3,7 @@ from aviary.variable_info.variables import Aircraft -def check_fold_location_definition(inputs, choose_fold_location, has_strut): +def check_fold_location_definition(choose_fold_location, has_strut): """ If there is no strut, then CHOOSE_FOLD_LOCATION must be true. """ From 159920b3521f8405a10eb16aa2e33366ffb844ca Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Tue, 19 Nov 2024 17:17:35 -0500 Subject: [PATCH 42/58] Fixed the nacelle laminar flow sizing in the multi engine case. --- aviary/utils/preprocessors.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index e1d2f747d..8f58b740e 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -295,6 +295,22 @@ def preprocess_propulsion(aviary_options: AviaryValues, engine_models: list = No aviary_options.set_val(Aircraft.Engine.NUM_WING_ENGINES, num_wing_engines_all) aviary_options.set_val(Aircraft.Engine.NUM_FUSELAGE_ENGINES, num_fuse_engines_all) + # Update nacelle-related variables in aero to be sized to the number of + # engine types. + if num_engine_type > 1: + + keys = [ + Aircraft.Nacelle.LAMINAR_FLOW_LOWER, + Aircraft.Nacelle.LAMINAR_FLOW_UPPER + ] + + for var in keys: + try: + aviary_options.get_val(var) + except KeyError: + aviary_options.set_val(var, np.zeros(num_engine_type)) + + if Mission.Summary.FUEL_FLOW_SCALER not in aviary_options: aviary_options.set_val(Mission.Summary.FUEL_FLOW_SCALER, 1.0) From a4bd17982b4a6d8dc350fd45a7d96599541d77a9 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Wed, 20 Nov 2024 15:36:44 -0500 Subject: [PATCH 43/58] Merged in a fix for the laminar flow dimension issue, and tweaked the multiengine test a bit. --- .../benchmark_tests/test_bench_multiengine.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aviary/validation_cases/benchmark_tests/test_bench_multiengine.py b/aviary/validation_cases/benchmark_tests/test_bench_multiengine.py index 05093fc0b..4be6268fb 100644 --- a/aviary/validation_cases/benchmark_tests/test_bench_multiengine.py +++ b/aviary/validation_cases/benchmark_tests/test_bench_multiengine.py @@ -124,8 +124,8 @@ def test_multiengine_static(self): alloc_cruise = prob.get_val('traj.cruise.parameter_vals:throttle_allocations') alloc_descent = prob.get_val('traj.descent.parameter_vals:throttle_allocations') - assert_near_equal(alloc_climb[0], 0.5, tolerance=1e-2) - assert_near_equal(alloc_cruise[0], 0.64, tolerance=1e-2) + assert_near_equal(alloc_climb[0], 0.51, tolerance=1e-2) + assert_near_equal(alloc_cruise[0], 0.747, tolerance=1e-2) assert_near_equal(alloc_descent[0], 0.999, tolerance=1e-2) @require_pyoptsparse(optimizer="SNOPT") @@ -166,7 +166,7 @@ def test_multiengine_dynamic(self): alloc_descent = prob.get_val('traj.descent.controls:throttle_allocations') # Cruise is pretty constant, check exact value. - assert_near_equal(alloc_cruise[0], 0.646, tolerance=1e-2) + assert_near_equal(alloc_cruise[0], 0.75, tolerance=1e-2) # Check general trend: favors engine 1. self.assertGreater(alloc_climb[2], 0.55) From 8dbf4d747fb06a0696ee01e809df2964fea6d2c6 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Fri, 22 Nov 2024 10:40:34 -0500 Subject: [PATCH 44/58] Doc linting --- aviary/docs/examples/outputted_phase_info.py | 3 +-- aviary/docs/user_guide/aviary_commands.ipynb | 4 ---- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/aviary/docs/examples/outputted_phase_info.py b/aviary/docs/examples/outputted_phase_info.py index daf97400c..925c677c9 100644 --- a/aviary/docs/examples/outputted_phase_info.py +++ b/aviary/docs/examples/outputted_phase_info.py @@ -1,2 +1 @@ -phase_info = {'pre_mission': {'include_takeoff': True, 'optimize_mass': True}, 'climb_1': {'subsystem_options': {'core_aerodynamics': {'method': 'computed'}}, 'user_options': {'optimize_mach': True, 'optimize_altitude': True, 'polynomial_control_order': [1, 2], 'use_polynomial_control': True, 'num_segments': [1], 'order': 1, 'solve_for_distance': True, 'initial_mach': (1, None), 'final_mach': (2, None), 'mach_bounds': ( - (0.98, 2.02), None), 'initial_altitude': (1, None), 'final_altitude': (2, None), 'altitude_bounds': ((0.0, 502), None), 'throttle_enforcement': 'path_constraint', 'fix_initial': True, 'constrain_final': True, 'fix_duration': False, 'initial_bounds': ((0.0, 0.0), None), 'duration_bounds': ((0.5, 1.5), None)}, 'initial_guesses': {'time': ([1, 1], None)}}, 'post_mission': {'include_landing': True, 'constrain_range': True, 'target_range': (514.5, None)}} +phase_info = {'pre_mission': {'include_takeoff': True, 'optimize_mass': True}, 'climb_1': {'subsystem_options': {'core_aerodynamics': {'method': 'computed'}}, 'user_options': {'optimize_mach': True, 'optimize_altitude': True, 'polynomial_control_order': [1, 2], 'use_polynomial_control': True, 'num_segments': [1], 'order': 1, 'solve_for_distance': True, 'initial_mach': (1, None), 'final_mach': (2, None), 'mach_bounds': ((0.98, 2.02), None), 'initial_altitude': (1, None), 'final_altitude': (2, None), 'altitude_bounds': ((0.0, 502), None), 'throttle_enforcement': 'path_constraint', 'fix_initial': True, 'constrain_final': True, 'fix_duration': False, 'initial_bounds': ((0.0, 0.0), None), 'duration_bounds': ((0.5, 1.5), None)}, 'initial_guesses': {'time': ([1, 1], None)}}, 'post_mission': {'include_landing': True, 'constrain_range': True, 'target_range': (514.5, None)}} diff --git a/aviary/docs/user_guide/aviary_commands.ipynb b/aviary/docs/user_guide/aviary_commands.ipynb index 11537512f..853d6ec5e 100644 --- a/aviary/docs/user_guide/aviary_commands.ipynb +++ b/aviary/docs/user_guide/aviary_commands.ipynb @@ -558,11 +558,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { -<<<<<<< HEAD - "display_name": "Python 3 (ipykernel)", -======= "display_name": "latest_env", ->>>>>>> 8fc550d1cf9b2dd65b2049226d5a050e4b51e2bf "language": "python", "name": "python3" }, From a38e214a6838e10338f27cf27a07e9ea6ca5f7a7 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Fri, 22 Nov 2024 12:41:09 -0500 Subject: [PATCH 45/58] copy doc file from pre_commit lint --- aviary/docs/examples/outputted_phase_info.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aviary/docs/examples/outputted_phase_info.py b/aviary/docs/examples/outputted_phase_info.py index 925c677c9..e02fdcdd3 100644 --- a/aviary/docs/examples/outputted_phase_info.py +++ b/aviary/docs/examples/outputted_phase_info.py @@ -1 +1,2 @@ -phase_info = {'pre_mission': {'include_takeoff': True, 'optimize_mass': True}, 'climb_1': {'subsystem_options': {'core_aerodynamics': {'method': 'computed'}}, 'user_options': {'optimize_mach': True, 'optimize_altitude': True, 'polynomial_control_order': [1, 2], 'use_polynomial_control': True, 'num_segments': [1], 'order': 1, 'solve_for_distance': True, 'initial_mach': (1, None), 'final_mach': (2, None), 'mach_bounds': ((0.98, 2.02), None), 'initial_altitude': (1, None), 'final_altitude': (2, None), 'altitude_bounds': ((0.0, 502), None), 'throttle_enforcement': 'path_constraint', 'fix_initial': True, 'constrain_final': True, 'fix_duration': False, 'initial_bounds': ((0.0, 0.0), None), 'duration_bounds': ((0.5, 1.5), None)}, 'initial_guesses': {'time': ([1, 1], None)}}, 'post_mission': {'include_landing': True, 'constrain_range': True, 'target_range': (514.5, None)}} +phase_info = {'pre_mission': {'include_takeoff': True, 'optimize_mass': True}, 'climb_1': {'subsystem_options': {'core_aerodynamics': {'method': 'computed'}}, 'user_options': {'optimize_mach': True, 'optimize_altitude': True, 'polynomial_control_order': [1, 2], 'use_polynomial_control': True, 'num_segments': [1], 'order': 1, 'solve_for_distance': True, 'initial_mach': (1, None), 'final_mach': (2, None), 'mach_bounds': ( + (0.98, 2.02), None), 'initial_altitude': (1, None), 'final_altitude': (2, None), 'altitude_bounds': ((0.0, 502), None), 'throttle_enforcement': 'path_constraint', 'fix_initial': True, 'constrain_final': True, 'fix_duration': False, 'initial_bounds': ((0.0, 0.0), None), 'duration_bounds': ((0.5, 1.5), None)}, 'initial_guesses': {'time': ([1, 1], None)}}, 'post_mission': {'include_landing': True, 'constrain_range': True, 'target_range': (514.5, None)}} \ No newline at end of file From f7c76cf809c6004d6a2bd5c16d1886c1aa2eb515 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Fri, 22 Nov 2024 14:00:24 -0500 Subject: [PATCH 46/58] copy doc file from pre_commit lint --- aviary/docs/examples/outputted_phase_info.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/docs/examples/outputted_phase_info.py b/aviary/docs/examples/outputted_phase_info.py index e02fdcdd3..daf97400c 100644 --- a/aviary/docs/examples/outputted_phase_info.py +++ b/aviary/docs/examples/outputted_phase_info.py @@ -1,2 +1,2 @@ phase_info = {'pre_mission': {'include_takeoff': True, 'optimize_mass': True}, 'climb_1': {'subsystem_options': {'core_aerodynamics': {'method': 'computed'}}, 'user_options': {'optimize_mach': True, 'optimize_altitude': True, 'polynomial_control_order': [1, 2], 'use_polynomial_control': True, 'num_segments': [1], 'order': 1, 'solve_for_distance': True, 'initial_mach': (1, None), 'final_mach': (2, None), 'mach_bounds': ( - (0.98, 2.02), None), 'initial_altitude': (1, None), 'final_altitude': (2, None), 'altitude_bounds': ((0.0, 502), None), 'throttle_enforcement': 'path_constraint', 'fix_initial': True, 'constrain_final': True, 'fix_duration': False, 'initial_bounds': ((0.0, 0.0), None), 'duration_bounds': ((0.5, 1.5), None)}, 'initial_guesses': {'time': ([1, 1], None)}}, 'post_mission': {'include_landing': True, 'constrain_range': True, 'target_range': (514.5, None)}} \ No newline at end of file + (0.98, 2.02), None), 'initial_altitude': (1, None), 'final_altitude': (2, None), 'altitude_bounds': ((0.0, 502), None), 'throttle_enforcement': 'path_constraint', 'fix_initial': True, 'constrain_final': True, 'fix_duration': False, 'initial_bounds': ((0.0, 0.0), None), 'duration_bounds': ((0.5, 1.5), None)}, 'initial_guesses': {'time': ([1, 1], None)}}, 'post_mission': {'include_landing': True, 'constrain_range': True, 'target_range': (514.5, None)}} From 483fa76c42f699814fe39f79c1d1fa30a60f43bd Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Tue, 3 Dec 2024 12:26:48 -0500 Subject: [PATCH 47/58] Working on multivariable flag for metadata dict --- aviary/docs/examples/outputted_phase_info.py | 3 +-- aviary/utils/develop_metadata.py | 15 ++++++++++++++- aviary/variable_info/variable_meta_data.py | 1 + 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/aviary/docs/examples/outputted_phase_info.py b/aviary/docs/examples/outputted_phase_info.py index daf97400c..3c0af1366 100644 --- a/aviary/docs/examples/outputted_phase_info.py +++ b/aviary/docs/examples/outputted_phase_info.py @@ -1,2 +1 @@ -phase_info = {'pre_mission': {'include_takeoff': True, 'optimize_mass': True}, 'climb_1': {'subsystem_options': {'core_aerodynamics': {'method': 'computed'}}, 'user_options': {'optimize_mach': True, 'optimize_altitude': True, 'polynomial_control_order': [1, 2], 'use_polynomial_control': True, 'num_segments': [1], 'order': 1, 'solve_for_distance': True, 'initial_mach': (1, None), 'final_mach': (2, None), 'mach_bounds': ( - (0.98, 2.02), None), 'initial_altitude': (1, None), 'final_altitude': (2, None), 'altitude_bounds': ((0.0, 502), None), 'throttle_enforcement': 'path_constraint', 'fix_initial': True, 'constrain_final': True, 'fix_duration': False, 'initial_bounds': ((0.0, 0.0), None), 'duration_bounds': ((0.5, 1.5), None)}, 'initial_guesses': {'time': ([1, 1], None)}}, 'post_mission': {'include_landing': True, 'constrain_range': True, 'target_range': (514.5, None)}} +phase_info = {'pre_mission': {'include_takeoff': True, 'optimize_mass': True}, 'climb_1': {'subsystem_options': {'core_aerodynamics': {'method': 'computed'}}, 'user_options': {'optimize_mach': True, 'optimize_altitude': True, 'polynomial_control_order': [1, 2], 'use_polynomial_control': True, 'num_segments': [1], 'order': 1, 'solve_for_distance': True, 'initial_mach': (1, None), 'final_mach': (2, None), 'mach_bounds': ((0.98, 2.02), None), 'initial_altitude': (1, None), 'final_altitude': (2, None), 'altitude_bounds': ((0.0, 502), None), 'throttle_enforcement': 'path_constraint', 'fix_initial': True, 'constrain_final': True, 'fix_duration': False, 'initial_bounds': ((0.0, 0.0), None), 'duration_bounds': ((0.5, 1.5), None)}, 'initial_guesses': {'time': ([1, 1], None)}}, 'post_mission': {'include_landing': True, 'constrain_range': True, 'target_range': (514.5, None)}} \ No newline at end of file diff --git a/aviary/utils/develop_metadata.py b/aviary/utils/develop_metadata.py index 232a028b1..c7f2e0e45 100644 --- a/aviary/utils/develop_metadata.py +++ b/aviary/utils/develop_metadata.py @@ -6,6 +6,7 @@ def add_meta_data( default_value=0.0, option=False, types=None, + multivalue=False, historical_name=None, _check_unique=True): ''' @@ -38,6 +39,10 @@ def add_meta_data( types : type gives the allowable type(s) of the variable in the aviary API. + multivalue : bool + when True, the variable can become a list of elements whose type is in types. + This is mainly used when there are multiple engine types. + historical_name : dict or None dictionary of names that the variable held in prior codes @@ -91,6 +96,7 @@ def add_meta_data( 'option': option, 'default_value': default_value, 'types': types, + 'multivalue': multivalue, } @@ -102,6 +108,7 @@ def update_meta_data( default_value=0.0, option=False, types=None, + multivalue=False, historical_name=None): ''' Update existing meta data associated with variables in the Aviary data hierarchy. @@ -133,6 +140,10 @@ def update_meta_data( types : type gives the allowable type(s) of the variable + multivalue : bool + when True, the variable can become a list of elements whose type is in types. + This is mainly used when there are multiple engine types. + historical_name : dict or None dictionary of names that the variable held in prior codes @@ -173,4 +184,6 @@ def update_meta_data( f'You provided the variable {key} to a variable metadata dictionary via the update_meta_data function, but {key} does not exist in the dictionary. If you are sure you want to add this variable to the dictionary, call the add_meta_data function instead.') add_meta_data(key=key, meta_data=meta_data, units=units, desc=desc, - default_value=default_value, option=option, types=types, historical_name=historical_name, _check_unique=False) + default_value=default_value, option=option, types=types, + multivalue=multivalue, historical_name=historical_name, + _check_unique=False) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 0298cc085..f4ae753d3 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -2214,6 +2214,7 @@ desc='Toggle for enabling scaling of engine mass', option=True, types=(bool, list), + multivalue=True, default_value=True, ) From 075655e7646e7496d21a6822af24d1e0cb3d533d Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Tue, 3 Dec 2024 13:17:41 -0500 Subject: [PATCH 48/58] some test cleanup --- .../mass/flops_based/test/test_engine_oil.py | 4 ++-- .../mass/flops_based/test/test_furnishings.py | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/aviary/subsystems/mass/flops_based/test/test_engine_oil.py b/aviary/subsystems/mass/flops_based/test/test_engine_oil.py index 00c9af05f..6b3157175 100644 --- a/aviary/subsystems/mass/flops_based/test/test_engine_oil.py +++ b/aviary/subsystems/mass/flops_based/test/test_engine_oil.py @@ -108,7 +108,7 @@ def test_case(self, case_name): inputs = get_flops_inputs(case_name, preprocess=True) options = { - Aircraft.CrewPayload.NUM_PASSENGERS: inputs.get_val(Aircraft.CrewPayload.NUM_PASSENGERS), + Aircraft.CrewPayload.Design.NUM_PASSENGERS: inputs.get_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS), } prob.model.add_subsystem( @@ -152,7 +152,7 @@ def test_case(self): inputs = get_flops_inputs("N3CC", preprocess=True) options = { - Aircraft.CrewPayload.NUM_PASSENGERS: inputs.get_val(Aircraft.CrewPayload.NUM_PASSENGERS), + Aircraft.CrewPayload.Design.NUM_PASSENGERS: inputs.get_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS), } prob.model.add_subsystem( diff --git a/aviary/subsystems/mass/flops_based/test/test_furnishings.py b/aviary/subsystems/mass/flops_based/test/test_furnishings.py index 11c403610..7dab4cc72 100644 --- a/aviary/subsystems/mass/flops_based/test/test_furnishings.py +++ b/aviary/subsystems/mass/flops_based/test/test_furnishings.py @@ -73,10 +73,10 @@ def test_case(self, case_name): opts = { Aircraft.BWB.NUM_BAYS: 5, - Aircraft.CrewPayload.NUM_BUSINESS_CLASS: flops_inputs.get_val(Aircraft.CrewPayload.NUM_BUSINESS_CLASS), + Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS: flops_inputs.get_val(Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS), Aircraft.CrewPayload.NUM_FLIGHT_CREW: flops_inputs.get_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW), - Aircraft.CrewPayload.NUM_FIRST_CLASS: flops_inputs.get_val(Aircraft.CrewPayload.NUM_FIRST_CLASS), - Aircraft.CrewPayload.NUM_TOURIST_CLASS: flops_inputs.get_val(Aircraft.CrewPayload.NUM_TOURIST_CLASS), + Aircraft.CrewPayload.Design.NUM_FIRST_CLASS: flops_inputs.get_val(Aircraft.CrewPayload.Design.NUM_FIRST_CLASS), + Aircraft.CrewPayload.Design.NUM_TOURIST_CLASS: flops_inputs.get_val(Aircraft.CrewPayload.Design.NUM_TOURIST_CLASS), Aircraft.Fuselage.MILITARY_CARGO_FLOOR: False, } @@ -138,10 +138,10 @@ def test_case(self): opts = { Aircraft.BWB.NUM_BAYS: 5, - Aircraft.CrewPayload.NUM_BUSINESS_CLASS: flops_inputs.get_val(Aircraft.CrewPayload.NUM_BUSINESS_CLASS), + Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS: flops_inputs.get_val(Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS), Aircraft.CrewPayload.NUM_FLIGHT_CREW: flops_inputs.get_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW), - Aircraft.CrewPayload.NUM_FIRST_CLASS: flops_inputs.get_val(Aircraft.CrewPayload.NUM_FIRST_CLASS), - Aircraft.CrewPayload.NUM_TOURIST_CLASS: flops_inputs.get_val(Aircraft.CrewPayload.NUM_TOURIST_CLASS), + Aircraft.CrewPayload.Design.NUM_FIRST_CLASS: flops_inputs.get_val(Aircraft.CrewPayload.Design.NUM_FIRST_CLASS), + Aircraft.CrewPayload.Design.NUM_TOURIST_CLASS: flops_inputs.get_val(Aircraft.CrewPayload.Design.NUM_TOURIST_CLASS), Aircraft.Fuselage.MILITARY_CARGO_FLOOR: False, } From d09790efa243537252457d4c124ccaca9a7f2b28 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Tue, 3 Dec 2024 13:50:58 -0500 Subject: [PATCH 49/58] pep --- aviary/utils/preprocessors.py | 1 - 1 file changed, 1 deletion(-) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index 0daccfb4c..54f22bcee 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -412,7 +412,6 @@ def preprocess_propulsion(aviary_options: AviaryValues, engine_models: list = No except KeyError: aviary_options.set_val(var, np.zeros(num_engine_type)) - if Mission.Summary.FUEL_FLOW_SCALER not in aviary_options: aviary_options.set_val(Mission.Summary.FUEL_FLOW_SCALER, 1.0) From b1409384a31647a8deb1bdd9056419895302068d Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Tue, 3 Dec 2024 17:03:14 -0500 Subject: [PATCH 50/58] propagate model options into multi mission --- ...multimission_example_large_single_aisle.py | 20 ++++++++---- .../mass/flops_based/landing_gear.py | 3 +- aviary/variable_info/functions.py | 21 ++++++++---- aviary/variable_info/variable_meta_data.py | 32 ++++++++++++------- 4 files changed, 51 insertions(+), 25 deletions(-) diff --git a/aviary/examples/multi_mission/run_multimission_example_large_single_aisle.py b/aviary/examples/multi_mission/run_multimission_example_large_single_aisle.py index 2dab1dfb1..4e8d11d6c 100644 --- a/aviary/examples/multi_mission/run_multimission_example_large_single_aisle.py +++ b/aviary/examples/multi_mission/run_multimission_example_large_single_aisle.py @@ -2,17 +2,18 @@ authors: Jatin Soni, Eliot Aretskin Multi Mission Optimization Example using Aviary -In this example, a monolithic optimization is created by instantiating two aviary problems -using typical AviaryProblem calls like load_inputs(), check_and_preprocess_payload(), -etc. Once those problems are setup and all of their phases are linked together, we copy -those problems as group into a super_problem. We then promote GROSS_MASS, RANGE, and -wing SWEEP from each of those sub-groups (group1 and group2) up to the super_probem so -the optimizer can control them. The fuel_burn results from each of the group1 and group2 +In this example, a monolithic optimization is created by instantiating two aviary problems +using typical AviaryProblem calls like load_inputs(), check_and_preprocess_payload(), +etc. Once those problems are setup and all of their phases are linked together, we copy +those problems as group into a super_problem. We then promote GROSS_MASS, RANGE, and +wing SWEEP from each of those sub-groups (group1 and group2) up to the super_probem so +the optimizer can control them. The fuel_burn results from each of the group1 and group2 dymos missions are summed and weighted to create the objective function the optimizer sees. """ import copy as copy from aviary.examples.example_phase_info import phase_info +from aviary.variable_info.functions import setup_model_options from aviary.variable_info.variables import Mission, Aircraft, Settings from aviary.variable_info.enums import ProblemType import aviary.api as av @@ -146,11 +147,16 @@ def add_objective(self): def setup_wrapper(self): """Wrapper for om.Problem setup with warning ignoring and setting options""" - for prob in self.probs: + for i, prob in enumerate(self.probs): prob.model.options['aviary_options'] = prob.aviary_inputs prob.model.options['aviary_metadata'] = prob.meta_data prob.model.options['phase_info'] = prob.phase_info + # Use OpenMDAO's model options to pass all options through the system hierarchy. + prefix = self.group_prefix + f'_{i}' + setup_model_options(prob, prob.aviary_inputs, prob.meta_data, + prefix=f'{prefix}.') + # Aviary's problem setup wrapper uses these ignored warnings to suppress # some warnings related to variable promotion. Replicating that here with # setup for the super problem diff --git a/aviary/subsystems/mass/flops_based/landing_gear.py b/aviary/subsystems/mass/flops_based/landing_gear.py index 0304be4f2..6362efeb8 100644 --- a/aviary/subsystems/mass/flops_based/landing_gear.py +++ b/aviary/subsystems/mass/flops_based/landing_gear.py @@ -276,7 +276,8 @@ def setup(self): add_aviary_input(self, Aircraft.Nacelle.AVG_DIAMETER, val=np.zeros(num_engine_type)) add_aviary_input(self, Aircraft.Engine.WING_LOCATIONS, - val=np.zeros((num_engine_type, int(num_wing_engines[0]/2)))) + val=np.zeros((num_engine_type, + max(1, int(num_wing_engines[0]/2))))) add_aviary_input(self, Aircraft.Wing.DIHEDRAL, val=0.0) add_aviary_input(self, Aircraft.Wing.SPAN, val=0.0) diff --git a/aviary/variable_info/functions.py b/aviary/variable_info/functions.py index 412d6f46f..9961ae891 100644 --- a/aviary/variable_info/functions.py +++ b/aviary/variable_info/functions.py @@ -209,6 +209,13 @@ def add_aviary_option(comp, name, val=_unspecified, units=None, desc=None, meta_ if val is _unspecified: val = meta['default_value'] + types = meta['types'] + if meta['multivalue']: + if isinstance(types, tuple): + types = (list, *types) + else: + types = (list, types) + if units not in [None, 'unitless']: types = tuple comp.options.declare(name, default=(val, units), @@ -217,12 +224,12 @@ def add_aviary_option(comp, name, val=_unspecified, units=None, desc=None, meta_ elif isinstance(val, Enum): comp.options.declare(name, default=val, - types=meta['types'], desc=desc, + types=types, desc=desc, set_function=int_enum_setter) else: comp.options.declare(name, default=val, - types=meta['types'], desc=desc) + types=types, desc=desc) def override_aviary_vars(group: om.Group, aviary_inputs: AviaryValues, @@ -461,7 +468,7 @@ def extract_options(aviary_inputs: AviaryValues, metadata=_MetaData) -> dict: def setup_model_options(prob: om.Problem, aviary_inputs: AviaryValues, - meta_data=_MetaData, engine_models=None): + meta_data=_MetaData, engine_models=None, prefix=''): """ Setup the correct model options for an aviary problem. @@ -476,11 +483,13 @@ def setup_model_options(prob: om.Problem, aviary_inputs: AviaryValues, metadata by default. engine_models : List of EngineModels or None (Optional) Engine models + prefix : str + Prefix for model options. Used for multi-mission. """ # Use OpenMDAO's model options to pass all options through the system hierarchy. - prob.model_options['*'] = extract_options(aviary_inputs, - meta_data) + prob.model_options[f'{prefix}*'] = extract_options(aviary_inputs, + meta_data) # Multi-engines need to index into their options. try: @@ -516,5 +525,5 @@ def setup_model_options(prob: om.Problem, aviary_inputs: AviaryValues, val, units = aviary_inputs.get_item(key) opts[key] = (val[idx], units) - path = f"*core_propulsion.{eng_name}*" + path = f"{prefix}*core_propulsion.{eng_name}*" prob.model_options[path] = opts diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 50d2c135a..742e86d79 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1773,7 +1773,8 @@ desc='fraction of (scaled) engine mass used to calculate additional propulsion ' 'system mass added to engine control and starter mass, or used to ' 'calculate engine installation mass', - types=(float, int, list, np.ndarray), + types=(float, int, np.ndarray), + multivalue=True, default_value=0.0, ) @@ -1789,7 +1790,8 @@ units="unitless", option=True, default_value=True, - types=(bool, list), + types=bool, + multivalue=True, desc='if true, compute installation loss factor based on blockage factor', ) @@ -2028,7 +2030,8 @@ units='unitless', desc='total number of engines per model on the aircraft ' '(fuselage, wing, or otherwise)', - types=(list, np.ndarray, int), + types=(np.ndarray, int), + multivalue=True, option=True, default_value=[2] ) @@ -2043,7 +2046,8 @@ units='unitless', desc='number of fuselage mounted engines per model', option=True, - types=(list, np.ndarray, int), + types=(np.ndarray, int), + multivalue=True, default_value=0 ) @@ -2057,7 +2061,8 @@ units='unitless', desc='number of blades per propeller', option=True, - types=(int, list, np.ndarray), + types=(int, np.ndarray), + multivalue=True, default_value=0 ) @@ -2072,7 +2077,8 @@ units='unitless', desc='number of wing mounted engines per model', option=True, - types=(list, np.ndarray, int), + types=(np.ndarray, int), + multivalue=True, default_value=[0] ) @@ -2276,7 +2282,7 @@ }, desc='Toggle for enabling scaling of engine mass', option=True, - types=(bool, list), + types=bool, multivalue=True, default_value=True, ) @@ -2293,7 +2299,8 @@ desc='Toggle for enabling scaling of engine performance including thrust, fuel flow, ' 'and electric power', option=True, - types=(bool, list), + types=bool, + multivalue=True, default_value=True, ) @@ -2390,7 +2397,8 @@ }, option=True, default_value=GASPEngineType.TURBOJET, - types=(GASPEngineType, list, int, str), + types=(GASPEngineType, int, str), + multivalue=True, units="unitless", desc='specifies engine type used for engine mass calculation', ) @@ -2404,7 +2412,8 @@ }, option=True, default_value=False, - types=(bool, list), + types=bool, + multivalue=True, units="unitless", desc='flag whether to use propeller map or Hamilton-Standard model.' ) @@ -5352,7 +5361,8 @@ }, units="unitless", default_value=FlapType.DOUBLE_SLOTTED, - types=(FlapType, list, int, str), + types=(FlapType, int, str), + multivalue=True, option=True, desc='Set the flap type. Available choices are: plain, split, single_slotted, ' 'double_slotted, triple_slotted, fowler, and double_slotted_fowler. ' From 2aa55211e89a81eece0db26c39079cceea3cf160 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Tue, 3 Dec 2024 17:22:48 -0500 Subject: [PATCH 51/58] small fix so options work in multi mission --- .../run_multimission_example_large_single_aisle.py | 2 +- aviary/subsystems/mass/flops_based/landing_gear.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/aviary/examples/multi_mission/run_multimission_example_large_single_aisle.py b/aviary/examples/multi_mission/run_multimission_example_large_single_aisle.py index 4e8d11d6c..135952441 100644 --- a/aviary/examples/multi_mission/run_multimission_example_large_single_aisle.py +++ b/aviary/examples/multi_mission/run_multimission_example_large_single_aisle.py @@ -154,7 +154,7 @@ def setup_wrapper(self): # Use OpenMDAO's model options to pass all options through the system hierarchy. prefix = self.group_prefix + f'_{i}' - setup_model_options(prob, prob.aviary_inputs, prob.meta_data, + setup_model_options(self, prob.aviary_inputs, prob.meta_data, prefix=f'{prefix}.') # Aviary's problem setup wrapper uses these ignored warnings to suppress diff --git a/aviary/subsystems/mass/flops_based/landing_gear.py b/aviary/subsystems/mass/flops_based/landing_gear.py index 6362efeb8..0304be4f2 100644 --- a/aviary/subsystems/mass/flops_based/landing_gear.py +++ b/aviary/subsystems/mass/flops_based/landing_gear.py @@ -276,8 +276,7 @@ def setup(self): add_aviary_input(self, Aircraft.Nacelle.AVG_DIAMETER, val=np.zeros(num_engine_type)) add_aviary_input(self, Aircraft.Engine.WING_LOCATIONS, - val=np.zeros((num_engine_type, - max(1, int(num_wing_engines[0]/2))))) + val=np.zeros((num_engine_type, int(num_wing_engines[0]/2)))) add_aviary_input(self, Aircraft.Wing.DIHEDRAL, val=0.0) add_aviary_input(self, Aircraft.Wing.SPAN, val=0.0) From 39072419166433065a85091582d39ad4d312f482 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Mon, 16 Dec 2024 10:03:24 -0500 Subject: [PATCH 52/58] conflict --- aviary/interface/methods_for_level1.py | 9 +++++++++ .../geometry/test/test_flops_geom_builder.py | 3 +-- .../geometry/test/test_gasp_geom_builder.py | 3 +-- aviary/utils/doctape.py | 11 ++++++++--- .../benchmark_tests/test_bench_multiengine.py | 9 +++++++-- 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/aviary/interface/methods_for_level1.py b/aviary/interface/methods_for_level1.py index b93d39c47..35b59dc61 100644 --- a/aviary/interface/methods_for_level1.py +++ b/aviary/interface/methods_for_level1.py @@ -114,6 +114,7 @@ def run_level_1( optimizer='SNOPT', phase_info=None, max_iter=50, + verbosity=1, analysis_scheme=AnalysisScheme.COLLOCATION, ): ''' @@ -131,6 +132,7 @@ def run_level_1( # kwargs['optimizer'] = 'IPOPT' # else: kwargs['optimizer'] = optimizer + kwargs['verbosity'] = Verbosity(verbosity) if isinstance(phase_info, str): phase_info_path = get_path(phase_info) @@ -185,6 +187,12 @@ def _setup_level1_parser(parser): action="store_true", help="Use shooting instead of collocation", ) + parser.add_argument( + "--verbosity", + type=int, + default=1, + help="verbosity settings: 0=quiet, 1=brief, 2=verbose, 3=debug", + choices=(0, 1, 2, 3)) def _exec_level1(args, user_args): @@ -211,5 +219,6 @@ def _exec_level1(args, user_args): optimizer=args.optimizer, phase_info=args.phase_info, max_iter=args.max_iter, + verbosity=args.verbosity, analysis_scheme=analysis_scheme, ) diff --git a/aviary/subsystems/geometry/test/test_flops_geom_builder.py b/aviary/subsystems/geometry/test/test_flops_geom_builder.py index fb8e44cde..fa2fd4bb4 100644 --- a/aviary/subsystems/geometry/test/test_flops_geom_builder.py +++ b/aviary/subsystems/geometry/test/test_flops_geom_builder.py @@ -59,8 +59,7 @@ def setUp(self): self.subsystem_builder = CoreGeometryBuilder( 'core_geometry', BaseMetaData, - use_both_geometries=False, - code_origin=FLOPS, + use_both_geometries=True, code_origin_to_prioritize=FLOPS) self.aviary_values = av.AviaryValues() self.aviary_values.set_val(Aircraft.Engine.NUM_ENGINES, [1], units='unitless') diff --git a/aviary/subsystems/geometry/test/test_gasp_geom_builder.py b/aviary/subsystems/geometry/test/test_gasp_geom_builder.py index 9443845bd..bc0e33c0c 100644 --- a/aviary/subsystems/geometry/test/test_gasp_geom_builder.py +++ b/aviary/subsystems/geometry/test/test_gasp_geom_builder.py @@ -59,8 +59,7 @@ def setUp(self): self.subsystem_builder = CoreGeometryBuilder( 'core_geometry', BaseMetaData, - use_both_geometries=False, - code_origin=GASP, + use_both_geometries=True, code_origin_to_prioritize=GASP) self.aviary_values = av.AviaryValues() self.aviary_values.set_val(Aircraft.Engine.NUM_ENGINES, [1], units='unitless') diff --git a/aviary/utils/doctape.py b/aviary/utils/doctape.py index 13f129410..149469570 100644 --- a/aviary/utils/doctape.py +++ b/aviary/utils/doctape.py @@ -222,7 +222,7 @@ def check_args(func, expected_args: tuple[list, dict, str], args_to_ignore: tupl f"the default value of {arg} is {available_args[arg]}, not {expected_args[arg]}") -def run_command_no_file_error(command: str): +def run_command_no_file_error(command: str, verbose=False): """ Executes a CLI command and handles FileNotFoundError separately. @@ -235,6 +235,8 @@ def run_command_no_file_error(command: str): ---------- command : str The CLI command to be executed. + verbose : bool + Whether or not to include the error message if FileNotFoundError is raised Raises ------ @@ -244,9 +246,12 @@ def run_command_no_file_error(command: str): with tempfile.TemporaryDirectory() as tempdir: rc = subprocess.run(command.split(), cwd=tempdir, capture_output=True, text=True) if rc.returncode: - err = rc.stderr.split('\n')[-2].split(':')[0] + err, info = rc.stderr.split('\n')[-2].split(':', 1) if err == 'FileNotFoundError': - print(err) + if verbose: + print(info) + print( + f"A file required by {command} couldn't be found, continuing anyway") else: print(rc.stderr) rc.check_returncode() diff --git a/aviary/validation_cases/benchmark_tests/test_bench_multiengine.py b/aviary/validation_cases/benchmark_tests/test_bench_multiengine.py index 4be6268fb..1302e1b2b 100644 --- a/aviary/validation_cases/benchmark_tests/test_bench_multiengine.py +++ b/aviary/validation_cases/benchmark_tests/test_bench_multiengine.py @@ -1,5 +1,6 @@ from copy import deepcopy import unittest +import numpy as np import openmdao.api as om from openmdao.core.problem import _clear_problem_names @@ -11,6 +12,7 @@ from aviary.models.multi_engine_single_aisle.multi_engine_single_aisle_data import inputs, engine_1_inputs, engine_2_inputs from aviary.subsystems.propulsion.utils import build_engine_deck from aviary.variable_info.enums import ThrottleAllocation +from aviary.variable_info.variables import Aircraft # Build problem @@ -33,6 +35,9 @@ local_phase_info['descent']['user_options']['no_climb'] = True local_phase_info['descent']['user_options']['use_polynomial_control'] = True +inputs.set_val(Aircraft.Nacelle.LAMINAR_FLOW_LOWER, np.zeros(2)) +inputs.set_val(Aircraft.Nacelle.LAMINAR_FLOW_UPPER, np.zeros(2)) + @use_tempdirs class MultiengineTestcase(unittest.TestCase): @@ -124,7 +129,7 @@ def test_multiengine_static(self): alloc_cruise = prob.get_val('traj.cruise.parameter_vals:throttle_allocations') alloc_descent = prob.get_val('traj.descent.parameter_vals:throttle_allocations') - assert_near_equal(alloc_climb[0], 0.51, tolerance=1e-2) + assert_near_equal(alloc_climb[0], 0.512, tolerance=1e-2) assert_near_equal(alloc_cruise[0], 0.747, tolerance=1e-2) assert_near_equal(alloc_descent[0], 0.999, tolerance=1e-2) @@ -166,7 +171,7 @@ def test_multiengine_dynamic(self): alloc_descent = prob.get_val('traj.descent.controls:throttle_allocations') # Cruise is pretty constant, check exact value. - assert_near_equal(alloc_cruise[0], 0.75, tolerance=1e-2) + assert_near_equal(alloc_cruise[0], 0.751, tolerance=1e-2) # Check general trend: favors engine 1. self.assertGreater(alloc_climb[2], 0.55) From 091afa0162a2233b54ce8a1b74a811f6c7180649 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Mon, 16 Dec 2024 10:04:55 -0500 Subject: [PATCH 53/58] conflict --- aviary/utils/preprocessors.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index 54f22bcee..deec2fb94 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -397,21 +397,6 @@ def preprocess_propulsion(aviary_options: AviaryValues, engine_models: list = No aviary_options.set_val(Aircraft.Engine.NUM_WING_ENGINES, num_wing_engines_all) aviary_options.set_val(Aircraft.Engine.NUM_FUSELAGE_ENGINES, num_fuse_engines_all) - # Update nacelle-related variables in aero to be sized to the number of - # engine types. - if num_engine_type > 1: - - keys = [ - Aircraft.Nacelle.LAMINAR_FLOW_LOWER, - Aircraft.Nacelle.LAMINAR_FLOW_UPPER - ] - - for var in keys: - try: - aviary_options.get_val(var) - except KeyError: - aviary_options.set_val(var, np.zeros(num_engine_type)) - if Mission.Summary.FUEL_FLOW_SCALER not in aviary_options: aviary_options.set_val(Mission.Summary.FUEL_FLOW_SCALER, 1.0) From 3d9f67c76b42ac20c1a5aed5076010e862b59b6b Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Thu, 2 Jan 2025 15:15:26 -0500 Subject: [PATCH 54/58] last tests pass --- .../benchmark_tests/test_bench_multiengine.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aviary/validation_cases/benchmark_tests/test_bench_multiengine.py b/aviary/validation_cases/benchmark_tests/test_bench_multiengine.py index 146a1f1be..5fd0ac36a 100644 --- a/aviary/validation_cases/benchmark_tests/test_bench_multiengine.py +++ b/aviary/validation_cases/benchmark_tests/test_bench_multiengine.py @@ -130,8 +130,8 @@ def test_multiengine_static(self): alloc_descent = prob.get_val('traj.descent.parameter_vals:throttle_allocations') assert_near_equal(alloc_climb[0], 0.5, tolerance=1e-2) - assert_near_equal(alloc_cruise[0], 0.574, tolerance=1e-2) - assert_near_equal(alloc_descent[0], 0.75, tolerance=1e-2) + assert_near_equal(alloc_cruise[0], 0.593, tolerance=1e-2) + assert_near_equal(alloc_descent[0], 0.408, tolerance=1e-2) @require_pyoptsparse(optimizer="SNOPT") def test_multiengine_dynamic(self): @@ -171,7 +171,7 @@ def test_multiengine_dynamic(self): alloc_descent = prob.get_val('traj.descent.controls:throttle_allocations') # Cruise is pretty constant, check exact value. - assert_near_equal(alloc_cruise[0], 0.576, tolerance=1e-2) + assert_near_equal(alloc_cruise[0], 0.595, tolerance=1e-2) # Check general trend: favors engine 1. self.assertGreater(alloc_climb[2], 0.55) From 2300004b0195466b25bd738120a165803fdf0848 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Thu, 2 Jan 2025 16:31:25 -0500 Subject: [PATCH 55/58] Doc and pre_commit tests --- aviary/docs/examples/modified_aircraft.csv | 10 +++++----- aviary/docs/examples/outputted_phase_info.py | 3 ++- aviary/docs/user_guide/variable_metadata.ipynb | 1 + 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/aviary/docs/examples/modified_aircraft.csv b/aviary/docs/examples/modified_aircraft.csv index 278803444..445c8e328 100644 --- a/aviary/docs/examples/modified_aircraft.csv +++ b/aviary/docs/examples/modified_aircraft.csv @@ -7,17 +7,17 @@ aircraft:canard:aspect_ratio,0.0,unitless aircraft:canard:thickness_to_chord,0.0,unitless aircraft:crew_and_payload:baggage_mass_per_passenger,45.0,lbm aircraft:crew_and_payload:cargo_container_mass_scaler,1.0,unitless +aircraft:crew_and_payload:design:num_business_class,0,unitless +aircraft:crew_and_payload:design:num_first_class,11,unitless +aircraft:crew_and_payload:design:num_passengers,169,unitless +aircraft:crew_and_payload:design:num_tourist_class,158,unitless aircraft:crew_and_payload:flight_crew_mass_scaler,1.0,unitless aircraft:crew_and_payload:mass_per_passenger,180.0,lbm aircraft:crew_and_payload:misc_cargo,0.0,lbm aircraft:crew_and_payload:non_flight_crew_mass_scaler,1.0,unitless -aircraft:crew_and_payload:num_business_class,0,unitless -aircraft:crew_and_payload:num_first_class,11,unitless aircraft:crew_and_payload:num_flight_attendants,3,unitless aircraft:crew_and_payload:num_flight_crew,2,unitless aircraft:crew_and_payload:num_galley_crew,0,unitless -aircraft:crew_and_payload:num_passengers,169,unitless -aircraft:crew_and_payload:num_tourist_class,158,unitless aircraft:crew_and_payload:passenger_service_mass_scaler,1.0,unitless aircraft:crew_and_payload:wing_cargo,0.0,lbm aircraft:design:base_area,0.0,ft**2 @@ -114,7 +114,7 @@ aircraft:wing:aeroelastic_tailoring_factor,0.0,unitless aircraft:wing:airfoil_technology,1.92669766647637,unitless aircraft:wing:area,1370.0,ft**2 aircraft:wing:aspect_ratio,11.02091,unitless -aircraft:wing:bending_material_mass_scaler,1.0,unitless +aircraft:wing:BENDING_MATERIAL_MASS_SCALER,1.0,unitless aircraft:wing:chord_per_semispan,0.31,0.23,0.084,unitless aircraft:wing:composite_fraction,0.2,unitless aircraft:wing:control_surface_area,137,ft**2 diff --git a/aviary/docs/examples/outputted_phase_info.py b/aviary/docs/examples/outputted_phase_info.py index 3c0af1366..e02fdcdd3 100644 --- a/aviary/docs/examples/outputted_phase_info.py +++ b/aviary/docs/examples/outputted_phase_info.py @@ -1 +1,2 @@ -phase_info = {'pre_mission': {'include_takeoff': True, 'optimize_mass': True}, 'climb_1': {'subsystem_options': {'core_aerodynamics': {'method': 'computed'}}, 'user_options': {'optimize_mach': True, 'optimize_altitude': True, 'polynomial_control_order': [1, 2], 'use_polynomial_control': True, 'num_segments': [1], 'order': 1, 'solve_for_distance': True, 'initial_mach': (1, None), 'final_mach': (2, None), 'mach_bounds': ((0.98, 2.02), None), 'initial_altitude': (1, None), 'final_altitude': (2, None), 'altitude_bounds': ((0.0, 502), None), 'throttle_enforcement': 'path_constraint', 'fix_initial': True, 'constrain_final': True, 'fix_duration': False, 'initial_bounds': ((0.0, 0.0), None), 'duration_bounds': ((0.5, 1.5), None)}, 'initial_guesses': {'time': ([1, 1], None)}}, 'post_mission': {'include_landing': True, 'constrain_range': True, 'target_range': (514.5, None)}} \ No newline at end of file +phase_info = {'pre_mission': {'include_takeoff': True, 'optimize_mass': True}, 'climb_1': {'subsystem_options': {'core_aerodynamics': {'method': 'computed'}}, 'user_options': {'optimize_mach': True, 'optimize_altitude': True, 'polynomial_control_order': [1, 2], 'use_polynomial_control': True, 'num_segments': [1], 'order': 1, 'solve_for_distance': True, 'initial_mach': (1, None), 'final_mach': (2, None), 'mach_bounds': ( + (0.98, 2.02), None), 'initial_altitude': (1, None), 'final_altitude': (2, None), 'altitude_bounds': ((0.0, 502), None), 'throttle_enforcement': 'path_constraint', 'fix_initial': True, 'constrain_final': True, 'fix_duration': False, 'initial_bounds': ((0.0, 0.0), None), 'duration_bounds': ((0.5, 1.5), None)}, 'initial_guesses': {'time': ([1, 1], None)}}, 'post_mission': {'include_landing': True, 'constrain_range': True, 'target_range': (514.5, None)}} \ No newline at end of file diff --git a/aviary/docs/user_guide/variable_metadata.ipynb b/aviary/docs/user_guide/variable_metadata.ipynb index 3f00fb347..a8bf93016 100644 --- a/aviary/docs/user_guide/variable_metadata.ipynb +++ b/aviary/docs/user_guide/variable_metadata.ipynb @@ -42,6 +42,7 @@ " 'option': False,\n", " 'types': None,\n", " 'historical_name': None,\n", + " 'multivalue': False,\n", " }\n", "\n", "meta_data = {}\n", From 35de4dd200119ee0820d7017f50d8159b24ff3a4 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Thu, 2 Jan 2025 16:43:06 -0500 Subject: [PATCH 56/58] Doc and pre_commit tests --- aviary/docs/examples/outputted_phase_info.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/docs/examples/outputted_phase_info.py b/aviary/docs/examples/outputted_phase_info.py index e02fdcdd3..daf97400c 100644 --- a/aviary/docs/examples/outputted_phase_info.py +++ b/aviary/docs/examples/outputted_phase_info.py @@ -1,2 +1,2 @@ phase_info = {'pre_mission': {'include_takeoff': True, 'optimize_mass': True}, 'climb_1': {'subsystem_options': {'core_aerodynamics': {'method': 'computed'}}, 'user_options': {'optimize_mach': True, 'optimize_altitude': True, 'polynomial_control_order': [1, 2], 'use_polynomial_control': True, 'num_segments': [1], 'order': 1, 'solve_for_distance': True, 'initial_mach': (1, None), 'final_mach': (2, None), 'mach_bounds': ( - (0.98, 2.02), None), 'initial_altitude': (1, None), 'final_altitude': (2, None), 'altitude_bounds': ((0.0, 502), None), 'throttle_enforcement': 'path_constraint', 'fix_initial': True, 'constrain_final': True, 'fix_duration': False, 'initial_bounds': ((0.0, 0.0), None), 'duration_bounds': ((0.5, 1.5), None)}, 'initial_guesses': {'time': ([1, 1], None)}}, 'post_mission': {'include_landing': True, 'constrain_range': True, 'target_range': (514.5, None)}} \ No newline at end of file + (0.98, 2.02), None), 'initial_altitude': (1, None), 'final_altitude': (2, None), 'altitude_bounds': ((0.0, 502), None), 'throttle_enforcement': 'path_constraint', 'fix_initial': True, 'constrain_final': True, 'fix_duration': False, 'initial_bounds': ((0.0, 0.0), None), 'duration_bounds': ((0.5, 1.5), None)}, 'initial_guesses': {'time': ([1, 1], None)}}, 'post_mission': {'include_landing': True, 'constrain_range': True, 'target_range': (514.5, None)}} From 949bc74c1651262fedd0a764ebb86c74d9372ba8 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Thu, 2 Jan 2025 16:49:51 -0500 Subject: [PATCH 57/58] Doc and pre_commit tests --- aviary/validation_cases/benchmark_tests/test_bench_GwGm.py | 1 - 1 file changed, 1 deletion(-) diff --git a/aviary/validation_cases/benchmark_tests/test_bench_GwGm.py b/aviary/validation_cases/benchmark_tests/test_bench_GwGm.py index 13b09b9e2..59d823bb7 100644 --- a/aviary/validation_cases/benchmark_tests/test_bench_GwGm.py +++ b/aviary/validation_cases/benchmark_tests/test_bench_GwGm.py @@ -235,4 +235,3 @@ def test_bench_GwGm_shooting(self): # test = ProblemPhaseTestCase() # test.setUp() # test.test_bench_GwGm_SNOPT() - From 670b50ad076f37479ed4e29a05cf9329edc8f6f7 Mon Sep 17 00:00:00 2001 From: Kenneth-T-Moore Date: Wed, 8 Jan 2025 11:57:18 -0500 Subject: [PATCH 58/58] Point CI at older Ubuntu due to some incompatibility in 24. --- .github/workflows/test_benchmarks.yml | 2 +- .github/workflows/test_docs.yml | 2 +- .github/workflows/test_workflow.yml | 4 ++-- .github/workflows/test_workflow_dev_deps.yml | 2 +- .github/workflows/test_workflow_no_dev_install.yml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test_benchmarks.yml b/.github/workflows/test_benchmarks.yml index bc2a5dce3..5b18b2c2c 100644 --- a/.github/workflows/test_benchmarks.yml +++ b/.github/workflows/test_benchmarks.yml @@ -18,7 +18,7 @@ on: jobs: latest_benchmarks: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 90 steps: diff --git a/.github/workflows/test_docs.yml b/.github/workflows/test_docs.yml index 31977627d..287fc9510 100644 --- a/.github/workflows/test_docs.yml +++ b/.github/workflows/test_docs.yml @@ -18,7 +18,7 @@ on: jobs: latest_docs: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 90 steps: diff --git a/.github/workflows/test_workflow.yml b/.github/workflows/test_workflow.yml index 7f028d92d..ce705719b 100644 --- a/.github/workflows/test_workflow.yml +++ b/.github/workflows/test_workflow.yml @@ -18,7 +18,7 @@ jobs: pre_commit: # run pre-commit checks - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 @@ -28,7 +28,7 @@ jobs: - uses: pre-commit/action@v3.0.1 test_ubuntu: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 strategy: fail-fast: false matrix: diff --git a/.github/workflows/test_workflow_dev_deps.yml b/.github/workflows/test_workflow_dev_deps.yml index 92daf1528..fed5ad912 100644 --- a/.github/workflows/test_workflow_dev_deps.yml +++ b/.github/workflows/test_workflow_dev_deps.yml @@ -14,7 +14,7 @@ on: jobs: test_ubuntu: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 strategy: fail-fast: false matrix: diff --git a/.github/workflows/test_workflow_no_dev_install.yml b/.github/workflows/test_workflow_no_dev_install.yml index dd8f1f67e..d58ffea15 100644 --- a/.github/workflows/test_workflow_no_dev_install.yml +++ b/.github/workflows/test_workflow_no_dev_install.yml @@ -17,7 +17,7 @@ on: jobs: test_ubuntu_no_dev_install: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 90