diff --git a/aviary/docs/theory_guide/gasp_based_bwb.ipynb b/aviary/docs/theory_guide/gasp_based_bwb.ipynb index edc3b22942..3d11f2a243 100644 --- a/aviary/docs/theory_guide/gasp_based_bwb.ipynb +++ b/aviary/docs/theory_guide/gasp_based_bwb.ipynb @@ -15,8 +15,8 @@ "\n", "from aviary.api import Aircraft\n", "from aviary.subsystems.geometry.gasp_based.engine import (\n", - " BWBEngineSizeGroup,\n", - " EngineSize,\n", + " GASPEngineSizeGroup,\n", + " GASPEngineSize,\n", " PercentNotInFuselage,\n", ")\n", "from aviary.subsystems.geometry.gasp_based.fuselage import (\n", @@ -33,8 +33,8 @@ "glue_variable(get_variable_name(BWBFuselageParameters2), md_code=True)\n", "glue_variable(get_variable_name(BWBFuselageSize), md_code=True)\n", "glue_variable(get_variable_name(BWBFuselageGroup), md_code=True)\n", - "glue_variable(get_variable_name(EngineSize), md_code=True)\n", - "glue_variable(get_variable_name(BWBEngineSizeGroup), md_code=True)\n", + "glue_variable(get_variable_name(GASPEngineSize), md_code=True)\n", + "glue_variable(get_variable_name(GASPEngineSizeGroup), md_code=True)\n", "glue_variable(get_variable_name(PercentNotInFuselage), md_code=True)\n", "\n", "glue_variable(get_variable_name(Aircraft.Wing.VERTICAL_MOUNT_LOCATION), md_code=True)" @@ -57,8 +57,8 @@ "- {glue:md}`BWBFuselageParameters2`: This component computes several fuselage geometric parameters based on both the user inputs and cabin layout.\n", "- {glue:md}`BWBFuselageSize`: It carries out the computation of fuselage length and wetted area of BWB model.\n", "- {glue:md}`BWBFuselageGroup`: {glue:md}`BWBFuselageParameters1` + {glue:md}`BWBCabinLayout` + {glue:md}`BWBFuselageParameters2` + {glue:md}`BWBFuselageSize`\n", - "- {glue:md}`PercentNotInFuselage`: For BWB, engines may be partially buried into fuselage. This component computes the percentage of corresponding surface area of nacelles not buried in fuselage. This parameter is passed to {glue:md}`EngineSize` component which computes the wetted area of nacelle. This function has infinity derivatives at the two ends. We use two cubic polynomials to smooth it.\n", - "- {glue:md}`BWBEngineSizeGroup`: {glue:md}`PercentNotInFuselage` + {glue:md}`EngineSize`. For Tube+Wing aircraft, we assume that engines are not buried into fuselage and hence {glue:md}`EngineSize` is good enough. But this feature can be extended to conventional aircraft.\n", + "- {glue:md}`PercentNotInFuselage`: For BWB, engines may be partially buried into fuselage. This component computes the percentage of corresponding surface area of nacelles not buried in fuselage. This parameter is passed to {glue:md}`GASPEngineSize` component which computes the wetted area of nacelle. This function has infinity derivatives at the two ends. We use two cubic polynomials to smooth it.\n", + "- {glue:md}`GASPEngineSizeGroup`: {glue:md}`PercentNotInFuselage` + {glue:md}`GASPEngineSize`. For Tube+Wing aircraft, we assume that engines are not buried into fuselage and hence {glue:md}`GASPEngineSize` is good enough. But this feature can be extended to conventional aircraft.\n", "- {glue:md}`ExposedWing`: Computation of exposed wing area. This is useful for BWB, but is available to tube+wing model too. For {glue:md}`Aircraft.Wing.VERTICAL_MOUNT_LOCATION` in the range (0, 1), the function has infinity derivatives at the two ends. We use two cubic polynomials to smooth it." ] }, diff --git a/aviary/models/aircraft/large_single_aisle_1/V3_bug_fixed_IO.py b/aviary/models/aircraft/large_single_aisle_1/V3_bug_fixed_IO.py index c04065ad7f..14f8fee1b6 100644 --- a/aviary/models/aircraft/large_single_aisle_1/V3_bug_fixed_IO.py +++ b/aviary/models/aircraft/large_single_aisle_1/V3_bug_fixed_IO.py @@ -72,7 +72,7 @@ V3_bug_fixed_options.set_val(Aircraft.Fuselage.WETTED_AREA, 4000, units='ft**2') V3_bug_fixed_options.set_val(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') V3_bug_fixed_options.set_val(Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless') -V3_bug_fixed_options.set_val(Aircraft.Engine.REFERENCE_DIAMETER, 5.8, units='ft') +V3_bug_fixed_options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.00030975, units='unitless') V3_bug_fixed_options.set_val(Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless') V3_bug_fixed_options.set_val(Aircraft.Nacelle.FINENESS, 2, units='unitless') diff --git a/aviary/models/aircraft/large_single_aisle_1/large_single_aisle_1_GASP.csv b/aviary/models/aircraft/large_single_aisle_1/large_single_aisle_1_GASP.csv index db896b49a6..32549ed094 100644 --- a/aviary/models/aircraft/large_single_aisle_1/large_single_aisle_1_GASP.csv +++ b/aviary/models/aircraft/large_single_aisle_1/large_single_aisle_1_GASP.csv @@ -29,12 +29,12 @@ aircraft:design:type,transport,unitless aircraft:engine:additional_mass_fraction,0.14,unitless aircraft:engine:data_file,models/engines/turbofan_23k_1.csv,unitless aircraft:engine:global_throttle, True, unitless +aircraft:engine:inlet_area_coefficient,0.000301265,unitless aircraft:engine:mass_scaler,1,unitless aircraft:engine:mass_specific,0.21366,lbm/lbf aircraft:engine:num_engines,2,unitless aircraft:engine:pod_mass_scaler,1,unitless aircraft:engine:pylon_factor,1.25,unitless -aircraft:engine:reference_diameter,5.8,ft aircraft:engine:reference_sls_thrust,28690,lbf aircraft:engine:scale_factor,1.0,unitless aircraft:engine:scaled_sls_thrust,28690,lbf diff --git a/aviary/models/aircraft/large_turboprop_freighter/large_turboprop_freighter_GASP.csv b/aviary/models/aircraft/large_turboprop_freighter/large_turboprop_freighter_GASP.csv index 97d850cfef..135caafe02 100644 --- a/aviary/models/aircraft/large_turboprop_freighter/large_turboprop_freighter_GASP.csv +++ b/aviary/models/aircraft/large_turboprop_freighter/large_turboprop_freighter_GASP.csv @@ -64,7 +64,6 @@ aircraft:engine:propeller:diameter, 13.5, ft aircraft:engine:propeller:integrated_lift_coefficient, 0.5, unitless aircraft:engine:propeller:tip_speed_max, 720, ft/s aircraft:engine:pylon_factor, 0.7, unitless -aircraft:engine:reference_diameter, 5.8, ft aircraft:engine:reference_sls_thrust, 5000, lbf aircraft:engine:rpm_design, 13820, rpm aircraft:engine:fixed_rpm, 13820, rpm diff --git a/aviary/models/aircraft/small_single_aisle/small_single_aisle_GASP.csv b/aviary/models/aircraft/small_single_aisle/small_single_aisle_GASP.csv index 44bec6363d..ca672d8961 100644 --- a/aviary/models/aircraft/small_single_aisle/small_single_aisle_GASP.csv +++ b/aviary/models/aircraft/small_single_aisle/small_single_aisle_GASP.csv @@ -35,7 +35,6 @@ aircraft:engine:mass_specific,0.2153,lbm/lbf aircraft:engine:num_engines,2,unitless aircraft:engine:pod_mass_scaler,1,unitless aircraft:engine:pylon_factor,0.6,unitless -aircraft:engine:reference_diameter,6.04,ft aircraft:engine:reference_sls_thrust,28690,lbf aircraft:engine:scale_factor,0.8295573370512374,unitless aircraft:engine:scaled_sls_thrust,23800,lbf diff --git a/aviary/models/aircraft/test_aircraft/aircraft_for_bench_FwGm.csv b/aviary/models/aircraft/test_aircraft/aircraft_for_bench_FwGm.csv index 5f92590f8f..bb0df4541f 100644 --- a/aviary/models/aircraft/test_aircraft/aircraft_for_bench_FwGm.csv +++ b/aviary/models/aircraft/test_aircraft/aircraft_for_bench_FwGm.csv @@ -23,6 +23,7 @@ aircraft:engine:fuel_flow_scaler_constant_term,0.,unitless aircraft:engine:fuel_flow_scaler_linear_term,0.,unitless aircraft:engine:geopotential_alt,False,unitless aircraft:engine:ignore_negative_thrust,False,unitless +aircraft:engine:inlet_area_coefficient,0.00030975,unitless aircraft:engine:interpolation_method,slinear,unitless aircraft:engine:mass_scaler,1.15,unitless aircraft:engine:mass,7400,lbm @@ -32,7 +33,6 @@ aircraft:engine:num_fuselage_engines,0,unitless aircraft:engine:num_wing_engines,2,unitless aircraft:engine:pod_mass_scaler,1,unitless aircraft:engine:pylon_factor,1.25,unitless -aircraft:engine:reference_diameter,5.8,ft aircraft:engine:reference_mass,7400,lbm aircraft:engine:reference_sls_thrust,28928.1,lbf aircraft:engine:scale_factor,1.0,unitless diff --git a/aviary/models/aircraft/test_aircraft/aircraft_for_bench_GwFm.csv b/aviary/models/aircraft/test_aircraft/aircraft_for_bench_GwFm.csv index 673e5ca0af..196b812dc8 100644 --- a/aviary/models/aircraft/test_aircraft/aircraft_for_bench_GwFm.csv +++ b/aviary/models/aircraft/test_aircraft/aircraft_for_bench_GwFm.csv @@ -38,7 +38,6 @@ aircraft:engine:mass_scaler,1,unitless aircraft:engine:num_engines,2,unitless aircraft:engine:pod_mass_scaler,1,unitless aircraft:engine:pylon_factor,1.25,unitless -aircraft:engine:reference_diameter,5.8,ft aircraft:engine:reference_sls_thrust,28690,lbf aircraft:engine:scale_factor,1.0,unitless aircraft:engine:scaled_sls_thrust,28690,lbf diff --git a/aviary/models/aircraft/test_aircraft/aircraft_for_bench_GwGm.csv b/aviary/models/aircraft/test_aircraft/aircraft_for_bench_GwGm.csv index 1514e3c9fd..8968bdc179 100644 --- a/aviary/models/aircraft/test_aircraft/aircraft_for_bench_GwGm.csv +++ b/aviary/models/aircraft/test_aircraft/aircraft_for_bench_GwGm.csv @@ -31,6 +31,7 @@ aircraft:electrical:system_mass_per_passenger,16.0,lbm aircraft:engine:additional_mass_fraction,0.135,unitless aircraft:engine:data_file,models/engines/turbofan_23k_1.csv,unitless aircraft:engine:global_throttle, True, unitless +aircraft:engine:inlet_area_coefficient,0.000301265,unitless aircraft:engine:mass_scaler,1,unitless aircraft:engine:mass_specific,0.21366,lbm/lbf aircraft:engine:mass_scaler,1,unitless @@ -38,7 +39,6 @@ aircraft:engine:num_engines,2,unitless aircraft:engine:num_wing_engines,2,unitless aircraft:engine:pod_mass_scaler,1,unitless aircraft:engine:pylon_factor,1.25,unitless -aircraft:engine:reference_diameter,5.8,ft aircraft:engine:reference_sls_thrust,28690,lbf aircraft:engine:scale_factor,1.0,unitless aircraft:engine:scaled_sls_thrust,28690,lbf diff --git a/aviary/models/aircraft/test_aircraft/configuration_test_GASP.csv b/aviary/models/aircraft/test_aircraft/configuration_test_GASP.csv index a9694d6724..1d24187c7b 100644 --- a/aviary/models/aircraft/test_aircraft/configuration_test_GASP.csv +++ b/aviary/models/aircraft/test_aircraft/configuration_test_GASP.csv @@ -35,7 +35,6 @@ aircraft:engine:mass_specific,0.21366,lbm/lbf aircraft:engine:num_engines,2,unitless aircraft:engine:pod_mass_scaler,1,unitless aircraft:engine:pylon_factor,1.25,unitless -aircraft:engine:reference_diameter,6.15,ft aircraft:engine:reference_sls_thrust,28690,lbf aircraft:engine:scale_factor,0.7376089229696758,unitless aircraft:engine:scaled_sls_thrust,21162,lbf diff --git a/aviary/subsystems/geometry/gasp_based/engine.py b/aviary/subsystems/geometry/gasp_based/engine.py index 40e0248622..d116e74b9b 100644 --- a/aviary/subsystems/geometry/gasp_based/engine.py +++ b/aviary/subsystems/geometry/gasp_based/engine.py @@ -159,26 +159,21 @@ def compute_partials(self, inputs, J): J['percent_exposed', Aircraft.Nacelle.PERCENT_DIAM_BURIED_IN_FUSELAGE] = d_pct_swn -class EngineSize(om.ExplicitComponent): +class GASPEngineSize(om.ExplicitComponent): """ - GASP engine geometry calculation. It returns Aircraft.Nacelle.AVG_DIAMETER, - Nacelle.AVG_LENGTH, and Aircraft.Nacelle.SURFACE_AREA. This does not follow GASP - algorithm exactly. + Engine geometry calculation based on engine diameter. It returns Aircraft.Nacelle.AVG_DIAMETER, + Nacelle.AVG_LENGTH, and Aircraft.Nacelle.SURFACE_AREA. It follows the algorithm in GASP. """ def initialize(self): add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) + add_aviary_option(self, Aircraft.Engine.INLET_AREA_COEFFICIENT) add_aviary_option(self, Settings.VERBOSITY) def setup(self): num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) - add_aviary_input( - self, Aircraft.Engine.REFERENCE_DIAMETER, shape=num_engine_type, units='ft' - ) - add_aviary_input( - self, Aircraft.Engine.SCALE_FACTOR, shape=num_engine_type, units='unitless' - ) + add_aviary_input(self, Aircraft.Design.GROSS_MASS, units='lbm') add_aviary_input( self, Aircraft.Nacelle.CORE_DIAMETER_RATIO, shape=num_engine_type, units='unitless' ) @@ -190,125 +185,38 @@ def setup(self): add_aviary_output(self, Aircraft.Nacelle.SURFACE_AREA, shape=num_engine_type, units='ft**2') def setup_partials(self): - # derivatives w.r.t vectorized engine inputs have known sparsity pattern num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) shape = np.arange(num_engine_type) - - innames = [ - Aircraft.Engine.REFERENCE_DIAMETER, - Aircraft.Engine.SCALE_FACTOR, - Aircraft.Nacelle.CORE_DIAMETER_RATIO, - Aircraft.Nacelle.FINENESS, - ] + nn = np.zeros(num_engine_type, dtype=int) self.declare_partials( - Aircraft.Nacelle.AVG_DIAMETER, innames[:-1], rows=shape, cols=shape, val=1.0 + Aircraft.Nacelle.AVG_DIAMETER, + [ + Aircraft.Design.GROSS_MASS, + ], + rows=shape, + cols=nn, ) - self.declare_partials(Aircraft.Nacelle.AVG_LENGTH, innames, rows=shape, cols=shape, val=1.0) self.declare_partials( - Aircraft.Nacelle.SURFACE_AREA, - innames + ['percent_exposed'], + Aircraft.Nacelle.AVG_LENGTH, + [ + Aircraft.Design.GROSS_MASS, + ], rows=shape, - cols=shape, - val=1.0, - ) - - def compute(self, inputs, outputs): - verbosity = self.options[Settings.VERBOSITY] - d_ref = inputs[Aircraft.Engine.REFERENCE_DIAMETER] - scale_fac = inputs[Aircraft.Engine.SCALE_FACTOR] - d_nac_eng = inputs[Aircraft.Nacelle.CORE_DIAMETER_RATIO] - ld_nac = inputs[Aircraft.Nacelle.FINENESS] - if any(x <= 0.0 for x in scale_fac): - if verbosity > Verbosity.BRIEF: - print('Aircraft.Engine.SCALE_FACTOR must be positive.') - - d_eng = d_ref * np.sqrt(scale_fac) - outputs[Aircraft.Nacelle.AVG_DIAMETER] = d_eng * d_nac_eng - outputs[Aircraft.Nacelle.AVG_LENGTH] = ld_nac * outputs[Aircraft.Nacelle.AVG_DIAMETER] - outputs[Aircraft.Nacelle.SURFACE_AREA] = ( - np.pi - * outputs[Aircraft.Nacelle.AVG_DIAMETER] - * outputs[Aircraft.Nacelle.AVG_LENGTH] - * inputs['percent_exposed'] - ) - - def compute_partials(self, inputs, J): - d_ref = inputs[Aircraft.Engine.REFERENCE_DIAMETER] - scale_fac = inputs[Aircraft.Engine.SCALE_FACTOR] - d_nac_eng = inputs[Aircraft.Nacelle.CORE_DIAMETER_RATIO] - ld_nac = inputs[Aircraft.Nacelle.FINENESS] - - tr = np.sqrt(scale_fac) - d_eng = d_ref * tr - d_nac = d_eng * d_nac_eng - l_nac = d_nac * ld_nac - - J[Aircraft.Nacelle.AVG_DIAMETER, Aircraft.Engine.REFERENCE_DIAMETER] = tr * d_nac_eng - J[Aircraft.Nacelle.AVG_DIAMETER, Aircraft.Engine.SCALE_FACTOR] = ( - d_nac_eng * d_ref / (2 * tr) + cols=nn, ) - J[Aircraft.Nacelle.AVG_DIAMETER, Aircraft.Nacelle.CORE_DIAMETER_RATIO] = d_eng - - for wrt in [ - Aircraft.Engine.REFERENCE_DIAMETER, - Aircraft.Engine.SCALE_FACTOR, - Aircraft.Nacelle.CORE_DIAMETER_RATIO, - ]: - J[Aircraft.Nacelle.AVG_LENGTH, wrt] = J[Aircraft.Nacelle.AVG_DIAMETER, wrt] * ld_nac - J[Aircraft.Nacelle.SURFACE_AREA, wrt] = ( - np.pi - * ( - J[Aircraft.Nacelle.AVG_DIAMETER, wrt] * l_nac - + J[Aircraft.Nacelle.AVG_LENGTH, wrt] * d_nac - ) - * inputs['percent_exposed'] - ) - - J[Aircraft.Nacelle.AVG_LENGTH, Aircraft.Nacelle.FINENESS] = d_nac - J[Aircraft.Nacelle.SURFACE_AREA, Aircraft.Nacelle.FINENESS] = ( - np.pi - * J[Aircraft.Nacelle.AVG_LENGTH, Aircraft.Nacelle.FINENESS] - * d_nac - * inputs['percent_exposed'] - ) - J[Aircraft.Nacelle.SURFACE_AREA, 'percent_exposed'] = ( - np.pi * d_eng * d_nac_eng * ld_nac * d_eng * d_nac_eng - ) - - -class BWBEngineSize(om.ExplicitComponent): - """ - Engine geometry calculation for BWB. It returns Aircraft.Nacelle.AVG_DIAMETER, - Nacelle.AVG_LENGTH, and Aircraft.Nacelle.SURFACE_AREA. It follows the algorithm in GASP. - Users can use this component instead of EngineSize. - """ - - def initialize(self): - add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) - add_aviary_option(self, Settings.VERBOSITY) - - def setup(self): - num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) - - add_aviary_input(self, Aircraft.Design.GROSS_MASS, units='lbm') - add_aviary_input( - self, Aircraft.Nacelle.CORE_DIAMETER_RATIO, shape=num_engine_type, units='unitless' + self.declare_partials( + Aircraft.Nacelle.SURFACE_AREA, + [ + Aircraft.Design.GROSS_MASS, + ], + rows=shape, + cols=nn, ) - add_aviary_input(self, Aircraft.Nacelle.FINENESS, shape=num_engine_type, units='unitless') - self.add_input('percent_exposed', val=np.ones(num_engine_type), units='unitless') - - add_aviary_output(self, Aircraft.Nacelle.AVG_DIAMETER, shape=num_engine_type, units='ft') - add_aviary_output(self, Aircraft.Nacelle.AVG_LENGTH, shape=num_engine_type, units='ft') - add_aviary_output(self, Aircraft.Nacelle.SURFACE_AREA, shape=num_engine_type, units='ft**2') - def setup_partials(self): - num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES]) - shape = np.arange(num_engine_type) self.declare_partials( Aircraft.Nacelle.AVG_DIAMETER, [ - Aircraft.Design.GROSS_MASS, Aircraft.Nacelle.CORE_DIAMETER_RATIO, ], rows=shape, @@ -317,7 +225,6 @@ def setup_partials(self): self.declare_partials( Aircraft.Nacelle.AVG_LENGTH, [ - Aircraft.Design.GROSS_MASS, Aircraft.Nacelle.CORE_DIAMETER_RATIO, Aircraft.Nacelle.FINENESS, ], @@ -327,7 +234,6 @@ def setup_partials(self): self.declare_partials( Aircraft.Nacelle.SURFACE_AREA, [ - Aircraft.Design.GROSS_MASS, Aircraft.Nacelle.CORE_DIAMETER_RATIO, Aircraft.Nacelle.FINENESS, 'percent_exposed', @@ -337,15 +243,15 @@ def setup_partials(self): ) def compute(self, inputs, outputs): - verbosity = self.options[Settings.VERBOSITY] num_engine = self.options[Aircraft.Engine.NUM_ENGINES] + coeff_inlet = self.options[Aircraft.Engine.INLET_AREA_COEFFICIENT] gross_mass = inputs[Aircraft.Design.GROSS_MASS] core_diam_ratio = inputs[Aircraft.Nacelle.CORE_DIAMETER_RATIO] fineness_nac = inputs[Aircraft.Nacelle.FINENESS] pct_exposed = inputs['percent_exposed'] - area_engine = 0.3 * gross_mass / 1500.0 / num_engine + area_engine = coeff_inlet * gross_mass / num_engine diam_engine = np.sqrt(4.0 * area_engine / np.pi) diam_nacelle = core_diam_ratio * diam_engine len_nacelle = fineness_nac * diam_nacelle @@ -357,19 +263,20 @@ def compute(self, inputs, outputs): def compute_partials(self, inputs, J): num_engine = self.options[Aircraft.Engine.NUM_ENGINES] + coeff_inlet = self.options[Aircraft.Engine.INLET_AREA_COEFFICIENT] gross_mass = inputs[Aircraft.Design.GROSS_MASS] + gross_mass = np.full(len(num_engine), gross_mass) core_diam_ratio = inputs[Aircraft.Nacelle.CORE_DIAMETER_RATIO] fineness_nac = inputs[Aircraft.Nacelle.FINENESS] pct_exposed = inputs['percent_exposed'] - area_engine = 0.3 * gross_mass / 1500.0 / num_engine + area_engine = coeff_inlet * gross_mass / num_engine diam_engine = np.sqrt(4.0 * area_engine / np.pi) diam_nacelle = core_diam_ratio * diam_engine len_nacelle = fineness_nac * diam_nacelle - wet_area_nacelle = np.pi * diam_nacelle * len_nacelle * pct_exposed - darea_engine_dgross_mass = 0.3 * np.ones(1) / 1500.0 / num_engine + darea_engine_dgross_mass = coeff_inlet * np.ones(1) / num_engine ddiam_engine_dgross_mass = 2 / np.pi / diam_engine * darea_engine_dgross_mass ddiam_nacelle_dgross_mass = core_diam_ratio * ddiam_engine_dgross_mass ddiam_nacelle_dcore_diam_ratio = diam_engine @@ -412,7 +319,7 @@ def compute_partials(self, inputs, J): J[Aircraft.Nacelle.SURFACE_AREA, 'percent_exposed'] = dwet_area_nacelle_dpct_exposed -class BWBEngineSizeGroup(om.Group): +class GASPEngineSizeGroup(om.Group): def setup(self): self.add_subsystem( 'perc', @@ -423,7 +330,7 @@ def setup(self): self.add_subsystem( 'eng_size', - BWBEngineSize(), + GASPEngineSize(), promotes_inputs=['*'] + ['percent_exposed'], promotes_outputs=['*'], ) diff --git a/aviary/subsystems/geometry/gasp_based/size_group.py b/aviary/subsystems/geometry/gasp_based/size_group.py index 469af82850..72b1c74e8b 100644 --- a/aviary/subsystems/geometry/gasp_based/size_group.py +++ b/aviary/subsystems/geometry/gasp_based/size_group.py @@ -2,7 +2,7 @@ from aviary.subsystems.geometry.gasp_based.electric import CableSize from aviary.subsystems.geometry.gasp_based.empennage import EmpennageSize -from aviary.subsystems.geometry.gasp_based.engine import EngineSize, BWBEngineSizeGroup +from aviary.subsystems.geometry.gasp_based.engine import GASPEngineSize, GASPEngineSizeGroup from aviary.subsystems.geometry.gasp_based.fuselage import FuselageGroup, BWBFuselageGroup from aviary.subsystems.geometry.gasp_based.wing import WingGroup, BWBWingGroup from aviary.variable_info.enums import AircraftTypes @@ -54,20 +54,12 @@ def setup(self): promotes=['*'], ) - if design_type is AircraftTypes.BLENDED_WING_BODY: - self.add_subsystem( - 'engine', - BWBEngineSizeGroup(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - elif design_type is AircraftTypes.TRANSPORT: - self.add_subsystem( - 'engine', - EngineSize(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) + self.add_subsystem( + 'engine', + GASPEngineSizeGroup(), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) if self.options[Aircraft.Electrical.HAS_HYBRID_SYSTEM]: self.add_subsystem( diff --git a/aviary/subsystems/geometry/gasp_based/test/test_engine.py b/aviary/subsystems/geometry/gasp_based/test/test_engine.py index 0968459be9..7c9341a6d4 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_engine.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_engine.py @@ -6,9 +6,8 @@ from openmdao.utils.testing_utils import use_tempdirs from aviary.subsystems.geometry.gasp_based.engine import ( - BWBEngineSize, - BWBEngineSizeGroup, - EngineSize, + GASPEngineSize, + GASPEngineSizeGroup, PercentNotInFuselage, ) from aviary.utils.aviary_values import AviaryValues @@ -86,11 +85,12 @@ def setUp(self): aviary_options = AviaryValues() aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([2])) + aviary_options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.000301265) - self.prob.model.add_subsystem('engsz', EngineSize(), promotes=['*']) + self.prob.model.add_subsystem('engsz', GASPEngineSize(), promotes=['*']) - self.prob.model.set_input_defaults(Aircraft.Engine.REFERENCE_DIAMETER, 5.8, units='ft') - self.prob.model.set_input_defaults(Aircraft.Engine.SCALE_FACTOR, val=1.028233) + self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, 175400.0, units='lbm') + self.prob.model.set_input_defaults('percent_exposed', 1.0) self.prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless' ) @@ -100,53 +100,20 @@ def setUp(self): self.prob.setup(check=False, force_alloc_complex=True) - def test_large_sinle_aisle_1_defaults(self): + def test_large_single_aisle_1_defaults(self): self.prob.run_model() tol = 1e-4 - assert_near_equal(self.prob[Aircraft.Nacelle.AVG_DIAMETER], 7.35163, tol) - assert_near_equal(self.prob[Aircraft.Nacelle.AVG_LENGTH], 14.70326, tol) - assert_near_equal(self.prob[Aircraft.Nacelle.SURFACE_AREA], 339.58389, tol) + assert_near_equal(self.prob[Aircraft.Nacelle.AVG_DIAMETER], 7.25002007, tol) + assert_near_equal(self.prob[Aircraft.Nacelle.AVG_LENGTH], 14.50004014, tol) + assert_near_equal(self.prob[Aircraft.Nacelle.SURFACE_AREA], 330.26175625, tol) def test_partials(self): partial_data = self.prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, atol=1e-8, rtol=1e-8) -class TestEngineBWB(unittest.TestCase): - """Test engine size using EngineSize class and BWB data""" - - def setUp(self): - self.prob = om.Problem() - - aviary_options = AviaryValues() - aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([2])) - - self.prob.model.add_subsystem('engsz', EngineSize(), promotes=['*']) - - self.prob.model.set_input_defaults(Aircraft.Engine.REFERENCE_DIAMETER, 5.8, units='ft') - self.prob.model.set_input_defaults(Aircraft.Engine.SCALE_FACTOR, val=1.3053677239456256) - self.prob.model.set_input_defaults( - Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.2205, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 1.3588, units='unitless') - - setup_model_options(self.prob, aviary_options) - - self.prob.setup(check=False, force_alloc_complex=True) - - def test_case1(self): - self.prob.run_model() - tol = 1e-4 - assert_near_equal(self.prob[Aircraft.Nacelle.AVG_DIAMETER], 8.08783369, tol) - assert_near_equal(self.prob[Aircraft.Nacelle.AVG_LENGTH], 10.98974842, tol) - assert_near_equal(self.prob[Aircraft.Nacelle.SURFACE_AREA], 279.23498901, tol) - - partial_data = self.prob.check_partials(out_stream=None, method='cs') - assert_check_partials(partial_data, atol=1e-8, rtol=1e-8) - - class BWBTestEngine(unittest.TestCase): - """Test engine size using BWBEngineSize class and BWB data""" + """Test engine size using GASPEngineSize class and BWB data""" def setUp(self): self.prob = om.Problem() @@ -154,7 +121,7 @@ def setUp(self): aviary_options = AviaryValues() aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([2])) - self.prob.model.add_subsystem('engsz', BWBEngineSize(), promotes=['*']) + self.prob.model.add_subsystem('engsz', GASPEngineSize(), promotes=['*']) self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, 150000.0, units='lbm') self.prob.model.set_input_defaults('percent_exposed', 1.0) @@ -184,13 +151,12 @@ def test_case_multiengine(self): aviary_options = AviaryValues() aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([2, 4])) + aviary_options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, [0.0003, 0.0002]) - prob.model.add_subsystem('cable', EngineSize(), promotes=['*']) + prob.model.add_subsystem('cable', GASPEngineSize(), promotes=['*']) - prob.model.set_input_defaults( - Aircraft.Engine.REFERENCE_DIAMETER, np.array([5.8, 8.2]), units='ft' - ) - prob.model.set_input_defaults(Aircraft.Engine.SCALE_FACTOR, val=np.array([1.028233, 0.9])) + prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, 175400.0, units='lbm') + prob.model.set_input_defaults('percent_exposed', [1.0, 1.0]) prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, np.array([1.25, 1.02]), units='unitless' ) @@ -206,16 +172,16 @@ def test_case_multiengine(self): tol = 1e-5 - assert_near_equal(prob[Aircraft.Nacelle.AVG_DIAMETER], [7.35163, 7.9347871], tol) - assert_near_equal(prob[Aircraft.Nacelle.AVG_LENGTH], [14.70326, 17.5358795], tol) - assert_near_equal(prob[Aircraft.Nacelle.SURFACE_AREA], [339.58389, 437.13210486], tol) + assert_near_equal(prob[Aircraft.Nacelle.AVG_DIAMETER], [7.23478278, 3.40843509], tol) + assert_near_equal(prob[Aircraft.Nacelle.AVG_LENGTH], [14.46956556, 7.53264155], tol) + assert_near_equal(prob[Aircraft.Nacelle.SURFACE_AREA], [328.875, 80.65888272], tol) partial_data = prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, atol=1e-8, rtol=1e-8) @use_tempdirs -class BWBEngineSizeGroupTestCase(unittest.TestCase): +class GASPEngineSizeGroupTestCase(unittest.TestCase): """this is the GASP BWB test case""" def setUp(self): @@ -225,7 +191,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( 'group', - BWBEngineSizeGroup(), + GASPEngineSizeGroup(), promotes=['*'], ) 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 8c9c0428da..598b11b3d4 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_size_group.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_size_group.py @@ -23,6 +23,7 @@ def setUp(self): options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') + options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, val=0.0003097, units='unitless') self.prob = om.Problem() self.prob.model.add_subsystem( @@ -48,7 +49,7 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.SCALE_FACTOR, val=1.028233) + self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, 175400.0, units='lbm') self.prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units='unitless') self.prob.model.set_input_defaults( @@ -75,7 +76,6 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.REFERENCE_DIAMETER, 5.8, units='ft') self.prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless' ) @@ -145,6 +145,7 @@ def setUp(self): options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') + options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, val=0.00030975, units='unitless') self.prob = om.Problem() self.prob.model.add_subsystem( @@ -174,7 +175,7 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.SCALE_FACTOR, val=1.028233) + self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, 175400.0, units='lbm') self.prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units='unitless') self.prob.model.set_input_defaults( @@ -204,7 +205,6 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.REFERENCE_DIAMETER, 5.8, units='ft') self.prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless' ) @@ -281,6 +281,7 @@ def setUp(self): options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=True, units='unitless') + options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, val=0.00030975, units='unitless') self.prob = om.Problem() self.prob.model.add_subsystem( @@ -310,7 +311,7 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.SCALE_FACTOR, val=1.028233) + self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, 175400.0, units='lbm') self.prob.model.set_input_defaults( Aircraft.Engine.WING_LOCATIONS, val=0.35, units='unitless' ) @@ -340,7 +341,6 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.REFERENCE_DIAMETER, 5.8, units='ft') self.prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless' ) @@ -413,6 +413,7 @@ def setUp(self): options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 1) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') + options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, val=0.00030975, units='unitless') self.prob = om.Problem() self.prob.model.add_subsystem( @@ -447,7 +448,7 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.SCALE_FACTOR, val=1.028233) + self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, 175400.0, units='lbm') self.prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units='unitless') self.prob.model.set_input_defaults( @@ -474,7 +475,6 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.REFERENCE_DIAMETER, 5.8, units='ft') self.prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless' ) 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 df16a00c37..69b91be678 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_mass_summation.py +++ b/aviary/subsystems/mass/gasp_based/test/test_mass_summation.py @@ -16,6 +16,7 @@ from aviary.variable_info.variables import Aircraft, Mission +@use_tempdirs class MassSummationTestCase1(unittest.TestCase): """ This is the large single aisle 1 V3 bug fixed test case. @@ -45,6 +46,7 @@ def setUp(self): input_options.delete(Aircraft.Avionics.MASS) input_options.delete(Aircraft.Design.EMERGENCY_EQUIPMENT_MASS) input_options.delete(Aircraft.Furnishings.MASS) + input_options.delete(Aircraft.Engine.SCALE_FACTOR) for key, (val, units) in get_items(input_options): if not is_option(key): @@ -53,6 +55,8 @@ def setUp(self): for key, (val, units) in get_items(V3_bug_fixed_non_metadata): self.prob.model.set_input_defaults(key, val=val, units=units) + input_options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.00030975, units='unitless') + self.prob.model.set_input_defaults( Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h' ) @@ -116,6 +120,7 @@ def test_case1(self): assert_check_partials(partial_data, atol=3e-10, rtol=1e-12) +@use_tempdirs class MassSummationTestCase2(unittest.TestCase): """ This is the large single aisle 1 V3.5 test case. @@ -143,6 +148,8 @@ def setUp(self): options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') + options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.00030975, units='unitless') + self.prob = om.Problem() self.prob.model.add_subsystem( 'size', @@ -217,11 +224,9 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.REFERENCE_DIAMETER, 5.8, units='ft') # self.prob.model.set_input_defaults( # Aircraft.Engine.REFERENCE_SLS_THRUST, 28690, units='lbf' # ) - self.prob.model.set_input_defaults(Aircraft.Engine.SCALE_FACTOR, 1.02823, units='unitless') self.prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless' ) @@ -467,6 +472,7 @@ def test_case1(self): assert_near_equal(self.prob[Mission.ZERO_FUEL_MASS], zero_fuel, tol) +@use_tempdirs class MassSummationTestCase3(unittest.TestCase): """ This is thelarge single aisle 1V3.6 test case with a fuel margin of 0%, a wing loading of 128 psf, and a SLS thrust of 29500 lbf @@ -493,6 +499,8 @@ def setUp(self): options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') + options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.00030975, units='unitless') + self.prob = om.Problem() self.prob.model.add_subsystem( 'size', @@ -567,11 +575,9 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.REFERENCE_DIAMETER, 5.8, units='ft') # self.prob.model.set_input_defaults( # Aircraft.Engine.REFERENCE_SLS_THRUST, 28690, units='lbf' # ) - self.prob.model.set_input_defaults(Aircraft.Engine.SCALE_FACTOR, 1.02823, units='unitless') self.prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless' ) @@ -809,6 +815,7 @@ def test_case1(self): assert_check_partials(partial_data, atol=2e-10, rtol=1e-12) +@use_tempdirs class MassSummationTestCase4(unittest.TestCase): """ This is the large single aisle 1V3.6 test case with a fuel margin of 10%, a wing loading of 128 psf, and a SLS thrust of 29500 lbf @@ -835,6 +842,8 @@ def setUp(self): options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') + options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.00030975, units='unitless') + self.prob = om.Problem() self.prob.model.add_subsystem( 'size', @@ -909,11 +918,9 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.REFERENCE_DIAMETER, 5.8, units='ft') # self.prob.model.set_input_defaults( # Aircraft.Engine.REFERENCE_SLS_THRUST, 28690, units='lbf' # ) - self.prob.model.set_input_defaults(Aircraft.Engine.SCALE_FACTOR, 1.02823, units='unitless') self.prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless' ) @@ -1159,6 +1166,7 @@ def test_case1(self): assert_check_partials(partial_data, atol=2e-10, rtol=1e-12) +@use_tempdirs class MassSummationTestCase5(unittest.TestCase): """ This is thelarge single aisle 1V3.6 test case with a fuel margin of 0%, a wing loading of 150 psf, and a SLS thrust of 29500 lbf @@ -1185,6 +1193,8 @@ def setUp(self): options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') + options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.00030975, units='unitless') + self.prob = om.Problem() self.prob.model.add_subsystem( 'size', @@ -1259,11 +1269,9 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.REFERENCE_DIAMETER, 5.8, units='ft') # self.prob.model.set_input_defaults( # Aircraft.Engine.REFERENCE_SLS_THRUST, 28690, units='lbf' # ) - self.prob.model.set_input_defaults(Aircraft.Engine.SCALE_FACTOR, 1.02823, units='unitless') self.prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless' ) @@ -1504,6 +1512,7 @@ def test_case1(self): assert_check_partials(partial_data, atol=3e-10, rtol=1e-12) +@use_tempdirs class MassSummationTestCase6(unittest.TestCase): """ This is thelarge single aisle 1V3.6 test case with a fuel margin of 10%, a wing loading of 150 psf, and a SLS thrust of 29500 lbf @@ -1530,6 +1539,8 @@ def setUp(self): options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') + options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.00030975, units='unitless') + self.prob = om.Problem() self.prob.model.add_subsystem( 'size', @@ -1604,11 +1615,9 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.REFERENCE_DIAMETER, 5.8, units='ft') # self.prob.model.set_input_defaults( # Aircraft.Engine.REFERENCE_SLS_THRUST, 28690, units='lbf' # ) - self.prob.model.set_input_defaults(Aircraft.Engine.SCALE_FACTOR, 1.02823, units='unitless') self.prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless' ) @@ -1849,6 +1858,7 @@ def test_case1(self): assert_check_partials(partial_data, atol=3e-10, rtol=1e-12) +@use_tempdirs class MassSummationTestCase7(unittest.TestCase): """ This is the Advanced Tube and Wing V3.6 test case. @@ -1876,6 +1886,8 @@ def setUp(self): options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.165, units='unitless') + options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.0003482075, units='unitless') + self.prob = om.Problem() self.prob.model.add_subsystem( 'size', @@ -1953,11 +1965,9 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.REFERENCE_DIAMETER, 7.36, units='ft') # self.prob.model.set_input_defaults( # Aircraft.Engine.REFERENCE_SLS_THRUST, 28620.0, units='lbf' # ) - self.prob.model.set_input_defaults(Aircraft.Engine.SCALE_FACTOR, 0.594, units='unitless') self.prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.2095, units='unitless' ) @@ -2205,10 +2215,10 @@ def test_case1(self): assert_near_equal(self.prob['max_wingfuel_mass'], 33892.8, tol) assert_near_equal(self.prob[Aircraft.Fuel.AUXILIARY_FUEL_CAPACITY], 0, tol) assert_near_equal( - self.prob['extra_fuel_volume'], 24.96997827, tol + self.prob['extra_fuel_volume'], 24.8957623, tol ) # note: higher tol because slightly different from GASP value, likely numerical issues, #modified from GASP value to account for updated crew mass. GASP value is 17.9 assert_near_equal( - self.prob['max_extra_fuel_mass'], 1249.05434887, tol + self.prob['max_extra_fuel_mass'], 1245.34189936, tol ) # note: higher tol because slightly different from GASP value, likely numerical issues, #modified from GASP value to account for updated crew mass. GASP value is 897.2 assert_near_equal(self.prob[Aircraft.Fuel.WING_VOLUME_STRUCTURAL_MAX], 677.554, tol) assert_near_equal(self.prob[Aircraft.Fuel.WING_VOLUME_GEOMETRIC_MAX], 677.554, tol) @@ -2217,6 +2227,7 @@ def test_case1(self): assert_check_partials(partial_data, atol=3e-9, rtol=6e-11) +@use_tempdirs class MassSummationTestCase8(unittest.TestCase): """ This is the Trans-sonic Truss-Braced Wing V3.6 test case @@ -2247,6 +2258,8 @@ def setUp(self): options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.163, units='unitless') + options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.000474, units='unitless') + self.prob = om.Problem() self.prob.model.add_subsystem( 'size', @@ -2277,11 +2290,9 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.REFERENCE_DIAMETER, 7.642, units='ft') # self.prob.model.set_input_defaults( # Aircraft.Engine.REFERENCE_SLS_THRUST, 28620.0, units='lbf' # ) - self.prob.model.set_input_defaults(Aircraft.Engine.SCALE_FACTOR, 1.35255, units='unitless') self.prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.2095, units='unitless' ) @@ -2343,7 +2354,6 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Engine.SCALED_SLS_THRUST, val=21160.0, units='lbf' ) - self.prob.model.set_input_defaults(Aircraft.Engine.SCALE_FACTOR, 0.73934, units='unitless') self.prob.model.set_input_defaults( Aircraft.Fuel.WING_FUEL_FRACTION, 0.5625, units='unitless' ) @@ -2588,6 +2598,7 @@ def test_case1(self): assert_check_partials(partial_data, atol=3e-9, rtol=6e-11) +@use_tempdirs class MassSummationTestCase9(unittest.TestCase): """ This is the electrified Trans-sonic Truss-Braced Wing V3.6 test case @@ -2618,6 +2629,8 @@ def setUp(self): options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.163, units='unitless') options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=True, units='unitless') + options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.000557, units='unitless') + self.prob = om.Problem() self.prob.model.add_subsystem( 'size', @@ -2648,11 +2661,9 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.REFERENCE_DIAMETER, 8.425, units='ft') # self.prob.model.set_input_defaults( # Aircraft.Engine.REFERENCE_SLS_THRUST, 28620, units='lbf' # ) - self.prob.model.set_input_defaults(Aircraft.Engine.SCALE_FACTOR, 0.73934, units='unitless') self.prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.2095, units='unitless' ) @@ -2714,7 +2725,6 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Engine.SCALED_SLS_THRUST, val=23750.0, units='lbf' ) - self.prob.model.set_input_defaults(Aircraft.Engine.SCALE_FACTOR, 0.82984, units='unitless') self.prob.model.set_input_defaults( Aircraft.Fuel.WING_FUEL_FRACTION, 0.5936, units='unitless' ) diff --git a/aviary/subsystems/test/test_premission.py b/aviary/subsystems/test/test_premission.py index 76f7bb77d3..251a1066c0 100644 --- a/aviary/subsystems/test/test_premission.py +++ b/aviary/subsystems/test/test_premission.py @@ -2,6 +2,7 @@ import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal +from openmdao.utils.testing_utils import use_tempdirs from aviary.models.aircraft.large_single_aisle_1.V3_bug_fixed_IO import ( V3_bug_fixed_non_metadata, @@ -41,6 +42,7 @@ def setup_options(priority_data, backfill_data): return full_data +@use_tempdirs class PreMissionTestCase(unittest.TestCase): def setUp(self): # set up inputs such that GASP inputs take priority diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 9803ffd784..8728360caf 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -771,8 +771,6 @@ def update_gasp_options(vehicle_data, verbosity=Verbosity.BRIEF): input_values.set_val( Aircraft.Engine.NUM_FUSELAGE_ENGINES, [num_fuselage_engines], 'unitless' ) - # BWB engine sizing algorithm does not use reference diameter - input_values.delete(Aircraft.Engine.REFERENCE_DIAMETER) else: input_values.set_val(Aircraft.Design.TYPE, 'transport') if Aircraft.Engine.TYPE in input_values: diff --git a/aviary/utils/legacy_code_data/gasp_defaults.py b/aviary/utils/legacy_code_data/gasp_defaults.py index b51e26da82..2ee86634bb 100644 --- a/aviary/utils/legacy_code_data/gasp_defaults.py +++ b/aviary/utils/legacy_code_data/gasp_defaults.py @@ -65,7 +65,6 @@ 'INGASP.DELWST': (0.0, 'lbm'), 'INGASP.DFLPLD': (40, 'deg'), 'INGASP.DFLPTO': (10, 'deg'), - 'INGASP.DIAM_REF': (5.8, 'ft'), # no DIAM_REF in GASP 'INGASP.DNQDE': (1.0, 'unitless'), 'INGASP.DV1': (5.0, 'kn'), 'INGASP.DVR': (5.0, 'kn'), diff --git a/aviary/utils/test/data/converter_test_configuration_GASP.csv b/aviary/utils/test/data/converter_test_configuration_GASP.csv index 4701d87b6d..e2ac815563 100644 --- a/aviary/utils/test/data/converter_test_configuration_GASP.csv +++ b/aviary/utils/test/data/converter_test_configuration_GASP.csv @@ -43,7 +43,6 @@ aircraft:engine:mass_specific,0.21366,lbm/lbf aircraft:engine:num_engines,2,unitless aircraft:engine:pod_mass_scaler,1.0,unitless aircraft:engine:pylon_factor,1.25,unitless -aircraft:engine:reference_diameter,5.8,ft aircraft:engine:reference_sls_thrust,28690.0,lbf aircraft:engine:scaled_sls_thrust,21162.0,lbf aircraft:engine:type,7,unitless diff --git a/aviary/utils/test/data/converter_test_large_single_aisle_1_GASP.csv b/aviary/utils/test/data/converter_test_large_single_aisle_1_GASP.csv index c1432b7ab3..d27bc01222 100644 --- a/aviary/utils/test/data/converter_test_large_single_aisle_1_GASP.csv +++ b/aviary/utils/test/data/converter_test_large_single_aisle_1_GASP.csv @@ -43,7 +43,6 @@ aircraft:engine:mass_specific,0.21366,lbm/lbf aircraft:engine:num_engines,2,unitless aircraft:engine:pod_mass_scaler,1.0,unitless aircraft:engine:pylon_factor,1.25,unitless -aircraft:engine:reference_diameter,5.8,ft aircraft:engine:reference_sls_thrust,28690.0,lbf aircraft:engine:scaled_sls_thrust,28690.0,lbf aircraft:engine:type,7,unitless diff --git a/aviary/utils/test/data/converter_test_small_single_aisle_GASP.csv b/aviary/utils/test/data/converter_test_small_single_aisle_GASP.csv index f81e55c7d9..9141613e25 100644 --- a/aviary/utils/test/data/converter_test_small_single_aisle_GASP.csv +++ b/aviary/utils/test/data/converter_test_small_single_aisle_GASP.csv @@ -43,7 +43,6 @@ aircraft:engine:mass_specific,0.2153,lbm/lbf aircraft:engine:num_engines,2,unitless aircraft:engine:pod_mass_scaler,1.0,unitless aircraft:engine:pylon_factor,0.6,unitless -aircraft:engine:reference_diameter,5.8,ft aircraft:engine:reference_sls_thrust,28690.0,lbf aircraft:engine:scaled_sls_thrust,23800.0,lbf aircraft:engine:type,7,unitless diff --git a/aviary/validation_cases/benchmark_tests/test_bench_GwGm.py b/aviary/validation_cases/benchmark_tests/test_bench_GwGm.py index edb38872ce..5a45008bdf 100644 --- a/aviary/validation_cases/benchmark_tests/test_bench_GwGm.py +++ b/aviary/validation_cases/benchmark_tests/test_bench_GwGm.py @@ -29,9 +29,9 @@ def check_values(self, prob): # There are no truth values for these. expected_values = { - (Aircraft.Design.GROSS_MASS, 'lbm'): 171595.06049335, - (Mission.OPERATING_MASS, 'lbm'): 95089.98897716, - (Mission.TOTAL_FUEL, 'lbm'): 40505.07151619, + (Mission.GROSS_MASS, 'lbm'): 171414.17171104, + (Mission.OPERATING_MASS, 'lbm'): 94986.583699, + (Mission.TOTAL_FUEL, 'lbm'): 40451.68735078, (Mission.Landing.GROUND_DISTANCE, 'ft'): 2657.88663983, (Mission.RANGE, 'NM'): 3675.0, (Mission.FINAL_MASS, 'lbm'): 136087.98897716, diff --git a/aviary/validation_cases/benchmark_tests/test_bench_off_design.py b/aviary/validation_cases/benchmark_tests/test_bench_off_design.py index 48ce28a227..993444c002 100644 --- a/aviary/validation_cases/benchmark_tests/test_bench_off_design.py +++ b/aviary/validation_cases/benchmark_tests/test_bench_off_design.py @@ -353,13 +353,21 @@ def test_fallout_mission_changed(self): ) assert_near_equal(prob_fallout.get_val(Mission.RANGE), 3994.25223046, tolerance=1e-4) assert_near_equal( - prob_fallout.get_val(Mission.TOTAL_FUEL, 'lbm'), - 39909.74193096, + prob_fallout.get_val(Mission.Summary.RANGE), 4013.45589713, tolerance=1e-4 + ) + assert_near_equal( + prob_fallout.get_val(Mission.Summary.FUEL_MASS, 'lbm'), + 40505.91552026, tolerance=1e-5, ) assert_near_equal( - prob_fallout.get_val(Mission.OPERATING_MASS, 'lbm'), - 95090.25806904, + prob_fallout.get_val(Mission.Summary.TOTAL_FUEL_MASS, 'lbm'), + 40019.62660076, + tolerance=1e-5, + ) + assert_near_equal( + prob_fallout.get_val(Mission.Summary.OPERATING_MASS, 'lbm'), + 94980.37339924, tolerance=1e-5, ) assert_near_equal( @@ -427,13 +435,18 @@ def test_alternate_mission_changed(self): ) assert_near_equal(prob_alternate.get_val(Mission.RANGE), 1800, tolerance=1e-6) assert_near_equal( - prob_alternate.get_val(Mission.TOTAL_FUEL, 'lbm'), - 21484.97566914, + prob_alternate.get_val(Mission.Summary.FUEL_MASS, 'lbm'), + 40505.91552026, tolerance=1e-6, ) assert_near_equal( - prob_alternate.get_val(Mission.OPERATING_MASS, 'lbm'), - 95090.25806904, + prob_alternate.get_val(Mission.Summary.TOTAL_FUEL_MASS, 'lbm'), + 21452.85145652, + tolerance=1e-6, + ) + assert_near_equal( + prob_alternate.get_val(Mission.Summary.OPERATING_MASS, 'lbm'), + 94980.37339924, tolerance=1e-6, ) assert_near_equal( @@ -463,8 +476,8 @@ def test_alternate_mission_changed(self): tolerance=1e-12, ) assert_near_equal( - prob_alternate.get_val(Mission.GROSS_MASS, 'lbm'), - 148675.23373818, + prob_alternate.get_val(Mission.Summary.GROSS_MASS, 'lbm'), + 148533.22485577, tolerance=1e-6, ) assert_near_equal( diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 69158dadb6..cbdaf87071 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -2276,6 +2276,18 @@ multivalue=True, ) +add_meta_data( + Aircraft.Engine.INLET_AREA_COEFFICIENT, + meta_data=_MetaData, + historical_name={'GASP': None, 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=0.0002, # default in GASP + types=float, + desc='engine inlet area coefficient. suggested values: 0.000375.', + multivalue=True, +) + add_meta_data( Aircraft.Engine.INTERPOLATION_METHOD, meta_data=_MetaData, @@ -2447,20 +2459,6 @@ multivalue=True, ) -add_meta_data( - Aircraft.Engine.REFERENCE_DIAMETER, - meta_data=_MetaData, - historical_name={ - 'GASP': 'INGASP.DIAM_REF', - 'FLOPS': None, - 'LEAPS1': None, - }, # no DIAM_REF in GASP - units='ft', - desc='engine reference diameter', - default_value=0.0, - multivalue=True, -) - # NOTE This unscaled turbine (engine) weight is an input provided by the user, and is not # an override. It is scaled by Aircraft.Engine.SCALE_FACTOR (a calculated value) to # produce Aircraft.Engine.MASS diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index aaadf2ef60..4e99419c90 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -198,6 +198,7 @@ class Engine: GLOBAL_HYBRID_THROTTLE = 'aircraft:engine:global_hybrid_throttle' GLOBAL_THROTTLE = 'aircraft:engine:global_throttle' IGNORE_NEGATIVE_THRUST = 'aircraft:engine:ignore_negative_thrust' + INLET_AREA_COEFFICIENT = 'aircraft:engine:inlet_area_coefficient' INTERPOLATION_METHOD = 'aircraft:engine:interpolation_method' INTERPOLATION_SORT = 'aircraft:engine:interpolation_sort' MASS = 'aircraft:engine:mass' @@ -210,7 +211,6 @@ class Engine: POD_MASS_SCALER = 'aircraft:engine:pod_mass_scaler' POSITION_FACTOR = 'aircraft:engine:position_factor' PYLON_FACTOR = 'aircraft:engine:pylon_factor' - REFERENCE_DIAMETER = 'aircraft:engine:reference_diameter' REFERENCE_MASS = 'aircraft:engine:reference_mass' REFERENCE_SLS_THRUST = 'aircraft:engine:reference_sls_thrust' RPM_DESIGN = 'aircraft:engine:rpm_design'