From f426b62404adc71250ccf9e33e2cf85decdd655b Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 27 Aug 2026 19:29:17 -0400 Subject: [PATCH 01/21] work in progress: removed V3_bug_fixed_IO from onboarding_level2.ipynb --- aviary/docs/user_guide_unreviewed/onboarding_level2.ipynb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/aviary/docs/user_guide_unreviewed/onboarding_level2.ipynb b/aviary/docs/user_guide_unreviewed/onboarding_level2.ipynb index fde051be78..45ca90c891 100644 --- a/aviary/docs/user_guide_unreviewed/onboarding_level2.ipynb +++ b/aviary/docs/user_guide_unreviewed/onboarding_level2.ipynb @@ -690,7 +690,6 @@ "from aviary.models.missions.two_dof_default import phase_info\n", "\n", "prob = AviaryProblem()\n", - "from aviary.validation_cases.validation_data.test_data.V3_bug_fixed_IO import V3_bug_fixed_options\n", "from aviary.utils.doctape import check_contains\n", "from aviary.validation_cases.validation_tests import get_flops_inputs\n", "\n", @@ -1014,7 +1013,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "base", "language": "python", "name": "python3" }, @@ -1028,7 +1027,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.11" + "version": "3.12.9" } }, "nbformat": 4, From b89f3233e72004e85b2c8542f37573b086b64468 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 28 Aug 2026 14:29:38 -0400 Subject: [PATCH 02/21] work in progress: added a temp class MassPremissionTestCase2a --- .../gasp_based/test/test_mass_premission.py | 429 +++++++++++++++++- 1 file changed, 426 insertions(+), 3 deletions(-) diff --git a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py index 26c27a2627..8be4f8e057 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py +++ b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py @@ -1,3 +1,4 @@ +import numpy as np import unittest import openmdao.api as om @@ -13,7 +14,7 @@ V3_bug_fixed_options, ) from aviary.variable_info.enums import AircraftTypes, GASPEngineType -from aviary.variable_info.functions import setup_model_options +from aviary.variable_info.functions import override_aviary_vars, setup_model_options from aviary.variable_info.variable_meta_data import CoreMetaData from aviary.variable_info.variables import Aircraft, Mission @@ -125,7 +126,6 @@ def test_case1(self): assert_check_partials(partial_data, atol=3e-10, rtol=1e-12) -@use_tempdirs class MassPremissionTestCase2(unittest.TestCase): """ This is the large single aisle 1 V3.5 test case. @@ -595,6 +595,427 @@ def test_case1(self): assert_near_equal(self.prob[Mission.ZERO_FUEL_MASS], zero_fuel, tol) +@use_tempdirs +class MassPremissionTestCase2a(unittest.TestCase): + def test_case(self): + class PreMission(om.Group): + def initialize(self): + self.options.declare( + 'aviary_options', types=AviaryValues, desc='Aircraft options dictionary' + ) + + def setup(self): + self.add_subsystem( + 'size', + SizeGroup(), + promotes_inputs=['aircraft:*'], + promotes_outputs=[ + 'aircraft:*', + ], + ) + self.add_subsystem( + 'GASP_mass', + MassPremission(), + promotes=['*'], + ) + + def configure(self): + aviary_options = self.options['aviary_options'] + + # Overrides + override_aviary_vars(self, aviary_options) + + options = AviaryValues() + options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') + options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=180, units='unitless') + options.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, val=180, units='unitless') + options.set_val(Aircraft.Design.CRUISE_ALTITUDE, val=37500, units='ft') + options.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, val=False, units='unitless') + options.set_val( + Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless' + ) + options.set_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless') + options.set_val(Aircraft.LandingGear.FIXED_GEAR, val=False, units='unitless') + options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) + options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) + options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') + options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') + options.set_val(Aircraft.Engine.NUM_ENGINES, [2], units='unitless') + options.set_val(Aircraft.Engine.TYPE, [GASPEngineType.TURBOJET], units='unitless') + options.set_val(Aircraft.Wing.HAS_FOLD, val=False, units='unitless') + options.set_val(Aircraft.Wing.HAS_STRUT, val=False, units='unitless') + options.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val=True, units='unitless') + options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=True, units='unitless') + options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') + options.set_val(Aircraft.Design.TYPE, AircraftTypes.TRANSPORT, units='unitless') + options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, 3, units='unitless') + options.set_val(Aircraft.Wing.LOADING_ABOVE_20, True, units='unitless') + options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 2, units='unitless') + options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2, units='unitless') + options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, False, units='unitless') + + prob = om.Problem() + prob.model.add_subsystem( + 'premission', + PreMission(aviary_options=options), + promotes_outputs=['*'], + promotes_inputs=['*'], + ) + + prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') + prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + prob.model.set_input_defaults( + Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS, val=200, units='lbm' + ) + prob.model.set_input_defaults( + Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.00030975, units='unitless' + ) + prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=10.13, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.33, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=25, units='deg') + prob.model.set_input_defaults( + Aircraft.Wing.THICKNESS_TO_CHORD_ROOT, val=0.15, units='unitless' + ) + prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=175400, units='lbm') + prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=128, units='lbf/ft**2') + prob.model.set_input_defaults( + Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, val=0, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.VerticalTail.ASPECT_RATIO, val=1.67, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' + ) + prob.model.set_input_defaults(Aircraft.Engine.SCALED_SLS_THRUST, val=29500.0, units='lbf') + prob.model.set_input_defaults(Aircraft.Engine.WING_LOCATIONS, val=0.35, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.PRESSURE_DIFFERENTIAL, val=7.5, units='psi') + prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units='unitless') + prob.model.set_input_defaults( + Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless' + ) + prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') + # Adjust WETTED_AREA_SCALER such that WETTED_AREA = 4000.0 + prob.model.set_input_defaults( + Aircraft.Fuselage.WETTED_AREA_SCALER, val=0.86215, units='unitless' + ) + prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless') + prob.model.set_input_defaults( + Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' + ) + prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') + prob.model.set_input_defaults( + Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' + ) + prob.model.set_input_defaults(Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless') + prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') + + prob.model.set_input_defaults(Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h') + prob.model.set_input_defaults(Aircraft.CrewPayload.CARGO_MASS, val=0, units='lbm') + prob.model.set_input_defaults( + Aircraft.CrewPayload.Design.MAX_CARGO_MASS, val=10040, units='lbm' + ) + prob.model.set_input_defaults(Aircraft.VerticalTail.SWEEP, val=0, units='deg') + prob.model.set_input_defaults( + Aircraft.HorizontalTail.MASS_COEFFICIENT, val=0.232, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.LandingGear.TAIL_HOOK_MASS_SCALER, val=1, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.VerticalTail.MASS_COEFFICIENT, val=0.289, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.HorizontalTail.THICKNESS_TO_CHORD, val=0.12, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.VerticalTail.THICKNESS_TO_CHORD, val=0.12, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT, val=1.9, units='unitless' + ) # Based onlarge single aisle 1for updated flaps mass model + prob.model.set_input_defaults( + Mission.Landing.LIFT_COEFFICIENT_MAX, val=2.817, units='unitless' + ) # Based onlarge single aisle 1for updated flaps mass model + prob.model.set_input_defaults( + Aircraft.Wing.SURFACE_CONTROL_MASS_COEFFICIENT, val=0.95, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.Design.COCKPIT_CONTROL_MASS_COEFFICIENT, val=16.5, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.Controls.STABILITY_AUGMENTATION_SYSTEM_REFERENCE_MASS, val=0, units='lbm' + ) # note: not actually defined in program, likely an error + prob.model.set_input_defaults( + Aircraft.Controls.COCKPIT_CONTROL_MASS_SCALER, val=1, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.Wing.SURFACE_CONTROL_MASS_SCALER, val=1, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.Controls.STABILITY_AUGMENTATION_SYSTEM_MASS_SCALER, val=1, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.Controls.MASS, val=0, units='lbm' + ) # note: not actually defined in program, likely an error + prob.model.set_input_defaults( + Aircraft.LandingGear.MASS_COEFFICIENT, val=0.04, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.LandingGear.MAIN_GEAR_MASS_FRACTION, val=0.85, units='unitless' + ) + prob.model.set_input_defaults(Aircraft.Nacelle.CLEARANCE_RATIO, val=0.2, units='unitless') + prob.model.set_input_defaults(Aircraft.Engine.MASS_SPECIFIC, val=0.21366, units='lbm/lbf') + prob.model.set_input_defaults(Aircraft.Nacelle.MASS_SPECIFIC, val=3, units='lbm/ft**2') + prob.model.set_input_defaults(Aircraft.Engine.PYLON_FACTOR, val=1.25, units='unitless') + prob.model.set_input_defaults(Aircraft.Engine.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Propulsion.MISC_MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults( + Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0.15, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.Instruments.MASS_COEFFICIENT, val=0.0736, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.Hydraulics.FLIGHT_CONTROL_MASS_COEFFICIENT, val=0.112, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.Hydraulics.GEAR_MASS_COEFFICIENT, val=0.14, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.AirConditioning.MASS_COEFFICIENT, val=1.65, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_PER_PASSENGER, val=5.0, units='lbm' + ) + prob.model.set_input_defaults( + Aircraft.CrewPayload.WATER_MASS_PER_OCCUPANT, val=3.0, units='lbm' + ) + prob.model.set_input_defaults( + Aircraft.CrewPayload.CATERING_ITEMS_MASS_PER_PASSENGER, val=7.6, units='lbm' + ) + prob.model.set_input_defaults( + Aircraft.Fuel.UNUSABLE_FUEL_MASS_COEFFICIENT, val=12.0, units='unitless' + ) + prob.model.set_input_defaults(Aircraft.Wing.MASS_COEFFICIENT, val=102.5, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.MASS_COEFFICIENT, val=128, units='unitless') + prob.model.set_input_defaults('pylon_len', val=0, units='ft') + prob.model.set_input_defaults( + 'MAT', val=0, units='lbm' + ) # note: not actually defined in program, likely an error + prob.model.set_input_defaults(Aircraft.Wing.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.HorizontalTail.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.VerticalTail.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults( + Aircraft.LandingGear.TOTAL_MASS_SCALER, val=1, units='unitless' + ) + prob.model.set_input_defaults(Aircraft.Engine.POD_MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Design.STRUCTURAL_MASS_INCREMENT, val=0, units='lbm') + prob.model.set_input_defaults( + Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER, val=1, units='unitless' + ) + prob.model.set_input_defaults( + Aircraft.Fuel.FUEL_SYSTEM_MASS_COEFFICIENT, val=0.041, units='unitless' + ) + prob.model.set_input_defaults(Aircraft.Fuel.DENSITY, val=6.687, units='lbm/galUS') + prob.model.set_input_defaults(Aircraft.Fuel.VOLUME_MARGIN, val=0, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units='ft') + prob.model.set_input_defaults(Aircraft.Wing.SLAT_CHORD_RATIO, val=0.15) + prob.model.set_input_defaults(Aircraft.Wing.FLAP_CHORD_RATIO, val=0.3) + prob.model.set_input_defaults(Aircraft.Wing.SLAT_SPAN_RATIO, val=0.9) + prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') + + setup_model_options(prob, options) + prob.setup(check=False, force_alloc_complex=True) + prob.run_model() + + tol = 5e-4 + assert_near_equal(prob[Aircraft.HorizontalTail.VOLUME_COEFFICIENT], 1.189, tol) + assert_near_equal(prob[Aircraft.VerticalTail.VOLUME_COEFFICIENT], 0.145, tol) + # size values: + # FuselageParameters + assert_near_equal(prob['size.cabin_height'], 13.1, tol) + assert_near_equal(prob['size.cabin_len'], 72.1, tol) + assert_near_equal(prob['size.nose_height'], 8.6, tol) + # FuselageSize + assert_near_equal(prob[Aircraft.Fuselage.LENGTH], 129.49722222, tol) + assert_near_equal(prob[Aircraft.Fuselage.WETTED_AREA], 4000.00108449, tol) + assert_near_equal(prob[Aircraft.TailBoom.LENGTH], 129.49722222, tol) + assert_near_equal(prob[Aircraft.Fuselage.CABIN_AREA], 1068.92361111, tol) + # WingSize + assert_near_equal(prob[Aircraft.Wing.AREA], 1370.3125, tol) + assert_near_equal(prob[Aircraft.Wing.SPAN], 117.81878299, tol) + # WingParameters + assert_near_equal(prob[Aircraft.Wing.CENTER_CHORD], 17.48974356, tol) + assert_near_equal(prob[Aircraft.Wing.AVERAGE_CHORD], 12.61453233, tol) + assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 16.40711451, tol) + assert_near_equal(prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.13965584, tol) + assert_near_equal(prob[Aircraft.Wing.LEADING_EDGE_SWEEP], 0.47639483, tol) + # WingVolume + assert_near_equal(prob[Aircraft.Fuel.WING_VOLUME_GEOMETRIC_MAX], 1114.00563103, tol) + # GASPEngineDiameter + assert_near_equal(prob[Aircraft.Nacelle.AVG_DIAMETER], 7.351408, tol) + # GASPEngineLength + assert_near_equal(prob[Aircraft.Nacelle.AVG_LENGTH], 14.702816, tol) + # GASPEngineSurfaceArea + assert_near_equal(prob[Aircraft.Nacelle.SURFACE_AREA], 339.5634375, tol) + # LoadSpeeds + assert_near_equal(prob['max_airspeed'], 350.0, tol) + assert_near_equal(prob['vel_c'], 350.0, tol) + assert_near_equal(prob['max_maneuver_factor'], 2.5, tol) + assert_near_equal(prob['min_dive_vel'], 420.0, tol) + # MassParameters + assert_near_equal(prob[Aircraft.Wing.MATERIAL_FACTOR], 1.22128833, tol) + assert_near_equal(prob['c_strut_braced'], 1, tol) + assert_near_equal(prob['c_gear_loc'], 1, tol) + assert_near_equal(prob[Aircraft.Propulsion.ENGINE_POSITION_FACTOR], 0.95, tol) + assert_near_equal(prob['half_sweep'], 0.39471574, tol) + # PayloadGroup + assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS], 36000.0, tol) + assert_near_equal(prob[Aircraft.CrewPayload.TOTAL_PAYLOAD_MASS], 36000.0, tol) + assert_near_equal(prob['payload_mass_des'], 36000.0, tol) + assert_near_equal(prob['payload_mass_max'], 46040.0, tol) + # ACMass + assert_near_equal(prob[Aircraft.AirConditioning.MASS], 1324.55345246, tol) + # FurnishingMass + assert_near_equal(prob[Aircraft.Furnishings.MASS], 13268.77210825, tol) + # AntiIcingMass + assert_near_equal(prob[Aircraft.AntiIcing.MASS], 683.47110765, tol) + # APUMass + assert_near_equal(prob[Aircraft.APU.MASS], 1077.969377, tol) + # AvionicsMass + assert_near_equal(prob[Aircraft.Avionics.MASS], 1514.0, tol) + # ElectricalMass + assert_near_equal(prob[Aircraft.Electrical.MASS], 170.0, tol) + # HydraulicsMass + assert_near_equal(prob[Aircraft.Hydraulics.MASS], 1479.33343636, tol) + # InstrumentMass + assert_near_equal(prob[Aircraft.Instruments.MASS], 547.49288363, tol) + # OxygenSystemMass + assert_near_equal(prob[Aircraft.OxygenSystem.MASS], 50.0, tol) + # WingMassSolve + assert_near_equal(prob['isolated_wing_mass'], 15652.61578394, tol) + # StrutAndFoldMass + assert_near_equal(prob[Aircraft.Strut.MASS], 0.0, tol) + assert_near_equal(prob[Aircraft.Wing.FOLD_MASS], 0, tol) + # WingMassTotal + assert_near_equal(prob[Aircraft.Wing.MASS], 15652.61578394, tol) + # FuelSysAndFullFuselageMass + assert_near_equal(prob['fus_mass_full'], 101584.83829383, tol) + # FuselageMass + assert_near_equal(prob[Aircraft.Fuselage.MASS], 18614.6407651, tol) + # FuelMass + assert_near_equal(prob['fuel_mass'], 43756.89535681, tol) + assert_near_equal(prob['fuel_mass_required'], 43756.89535681, tol) + assert_near_equal(prob['fuel_mass_min'], 33716.89535681, tol) + # FuelComponents + assert_near_equal(prob[Aircraft.Fuel.UNUSABLE_FUEL_MASS], 619.8317956, tol) + # BodyTankCalculations + assert_near_equal(prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 0, tol) + assert_near_equal(prob['extra_fuel_volume'], 0, tol) + assert_near_equal(prob['max_extra_fuel_mass'], 0, tol) + assert_near_equal(prob['wingfuel_mass_min'], 33716.89535681, tol) + assert_near_equal(prob[Aircraft.Fuel.MAX_CAPACITY_MASS], 44376.72715242, tol) + # EmpennageMass + assert_near_equal(prob[Aircraft.Design.EMPENNAGE_MASS], 4574.10130526, tol) + # StructureMass + assert_near_equal(prob[Aircraft.Design.STRUCTURE_MASS], 50136.9197232, tol) + # PropulsionMass + assert_near_equal(prob[Aircraft.Propulsion.MASS], 16164.80430963, tol) + # SystemsEquipmentMass + assert_near_equal(prob[Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS], 23934.94881476, tol) + # EmptyMass + assert_near_equal(prob[Aircraft.Design.EMPTY_MASS], 90236.67284758, tol) + # OperatingItemsMass + assert_near_equal(prob[Mission.OPERATING_ITEMS_MASS], 5406.4317956, tol) + # OperatingMass + assert_near_equal(prob[Mission.OPERATING_MASS], 95643.10464319, tol) + # ZeroFuelMass + assert_near_equal(prob[Mission.ZERO_FUEL_MASS], 131643.10464319, tol) + # UsefulLoadMass + assert_near_equal(prob[Aircraft.Design.USEFUL_LOAD_MASS], 85163.32715242, tol) + assert_near_equal(prob[Aircraft.Wing.CENTER_CHORD], 17.49, tol) + assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 16.41, tol) + assert_near_equal( + prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.1397, tol + ) # not exact GASP value from the output file, likely due to rounding error + # note: this is not the value in the GASP output, because the output calculates + # them differently. This was calculated by hand. + assert_near_equal(prob[Aircraft.HorizontalTail.AVERAGE_CHORD], 9.578314120156815, tol) + # note: this is not the value in the GASP output, because the output calculates + # them differently. This was calculated by hand. + assert_near_equal(prob[Aircraft.VerticalTail.AVERAGE_CHORD], 16.828924591320984, tol) + assert_near_equal(prob[Aircraft.Nacelle.AVG_LENGTH], 14.7, tol) + # fixed mass values: + assert_near_equal( + prob[Aircraft.LandingGear.MAIN_GEAR_MASS], 6384.35, tol + ) # calculated by hand + # note: tail.loc_MAC_vtail not included in v3.5 + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 12606, tol) + assert_near_equal(prob[Aircraft.Engine.ADDITIONAL_MASS], 1765 / 2, tol) + # wing values: + assert_near_equal(prob['isolated_wing_mass'], 15653, tol) + # fuel values: + # modified from GASP value to account for updated crew mass. GASP value is + # 79147.2 + assert_near_equal( + prob['OEM_wingfuel_mass'], 79756.73086076, tol + ) # modified from GASP value to account for updated crew mass. GASP value is 79147.2 + # calculated by hand, #modified from GASP value to account for updated crew + # mass. GASP value is 102321.45695930265 + assert_near_equal(prob['fus_mass_full'], 101584.84568819, tol) + # modified from GASP value to account for updated crew mass. GASP value is + # 1769 + assert_near_equal( + prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 1794.02596529, tol + ) # modified from GASP value to account for updated crew mass. GASP value is 1769 + assert_near_equal(prob[Aircraft.Design.STRUCTURE_MASS], 50132.58, tol) + assert_near_equal( + prob[Aircraft.Fuselage.MASS], 18621.15351242, tol + ) # modified from GASP value to account for updated crew mass. GASP value is 18787 + assert_near_equal( + prob[Aircraft.Propulsion.MASS], 16167.631, tol + ) # modified from GASP value to account for updated crew mass. GASP value is 16140 + assert_near_equal( + prob['fuel_mass_min'], 33716.73086076, tol + ) # modified from GASP value to account for updated crew mass. GASP value is 33107.2 + assert_near_equal( + prob[Aircraft.Fuel.WING_VOLUME_DESIGN], 874.74545824, tol + ) # calculated by hand, #modified from GASP value to account for updated crew mass. GASP value is 862.5603807559726 + assert_near_equal( + prob['OEM_fuel_vol'], 1594.42528526, tol + ) # calculated by hand, #modified from GASP value to account for updated crew mass. GASP value is 1582.2403068511774 + assert_near_equal( + prob[Mission.OPERATING_MASS], 95643.26913924, tol + ) # modified from GASP value to account for updated crew mass. GASP value is 96253.0 + # extra_fuel_mass calculated differently in this version, so payload_mass_max_fuel test not included + assert_near_equal(prob['volume_wingfuel_mass'], 55725.1, tol) + assert_near_equal(prob['max_wingfuel_mass'], 55725.1, tol) + assert_near_equal( + prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 0, tol + ) # always zero when no body tank + assert_near_equal(prob['extra_fuel_volume'], 0, tol) # always zero when no body tank + assert_near_equal(prob['max_extra_fuel_mass'], 0, tol) # always zero when no body tank + assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS], 36000.0, tol) + # operating mass + pax mass + cargo_mass) + zero_fuel = 95643.26913924 + 36000.0 + 0.0 + assert_near_equal(prob[Mission.ZERO_FUEL_MASS], zero_fuel, tol) + + partial_data = prob.check_partials(out_stream=None, method='cs') + assert_check_partials(partial_data, atol=2e-10, rtol=1e-12) + + @use_tempdirs class MassPremissionTestCase3(unittest.TestCase): """ @@ -3705,4 +4126,6 @@ def test_case1(self): if __name__ == '__main__': - unittest.main() + # unittest.main() + test = MassPremissionTestCase2a() + test.test_case() From c2ff1d1f90b247cd4846fedad1c8e5157df4c9cb Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 28 Aug 2026 15:34:44 -0400 Subject: [PATCH 03/21] work in progress: testing overriding in GASP based test_mass_premission.py --- .../gasp_based/test/test_mass_premission.py | 84 ++++++++++++------- 1 file changed, 56 insertions(+), 28 deletions(-) diff --git a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py index 8be4f8e057..bcc1e503de 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py +++ b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py @@ -626,33 +626,33 @@ def configure(self): override_aviary_vars(self, aviary_options) options = AviaryValues() - options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=180, units='unitless') - options.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, val=180, units='unitless') - options.set_val(Aircraft.Design.CRUISE_ALTITUDE, val=37500, units='ft') - options.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, val=False, units='unitless') - options.set_val( - Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless' - ) - options.set_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless') - options.set_val(Aircraft.LandingGear.FIXED_GEAR, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) - options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) - options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') - options.set_val(Aircraft.Engine.NUM_ENGINES, [2], units='unitless') - options.set_val(Aircraft.Engine.TYPE, [GASPEngineType.TURBOJET], units='unitless') - options.set_val(Aircraft.Wing.HAS_FOLD, val=False, units='unitless') - options.set_val(Aircraft.Wing.HAS_STRUT, val=False, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val=True, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=True, units='unitless') - options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') - options.set_val(Aircraft.Design.TYPE, AircraftTypes.TRANSPORT, units='unitless') - options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, 3, units='unitless') - options.set_val(Aircraft.Wing.LOADING_ABOVE_20, True, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 2, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2, units='unitless') - options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, False, units='unitless') + # options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') + # options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=180, units='unitless') + # options.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, val=180, units='unitless') + # options.set_val(Aircraft.Design.CRUISE_ALTITUDE, val=37500, units='ft') + # options.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, val=False, units='unitless') + # options.set_val( + # Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless' + # ) + # options.set_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless') + # options.set_val(Aircraft.LandingGear.FIXED_GEAR, val=False, units='unitless') + # options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) + # options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) + # options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') + # options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') + # options.set_val(Aircraft.Engine.NUM_ENGINES, [2], units='unitless') + # options.set_val(Aircraft.Engine.TYPE, [GASPEngineType.TURBOJET], units='unitless') + # options.set_val(Aircraft.Wing.HAS_FOLD, val=False, units='unitless') + # options.set_val(Aircraft.Wing.HAS_STRUT, val=False, units='unitless') + # options.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val=False, units='unitless') + # options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=False, units='unitless') + # options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') + # options.set_val(Aircraft.Design.TYPE, AircraftTypes.TRANSPORT, units='unitless') + # options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, 3, units='unitless') + # options.set_val(Aircraft.Wing.LOADING_ABOVE_20, True, units='unitless') + # options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 2, units='unitless') + # options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2, units='unitless') + # options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, False, units='unitless') prob = om.Problem() prob.model.add_subsystem( @@ -836,9 +836,37 @@ def configure(self): prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') - setup_model_options(prob, options) + # setup_model_options(prob, options) + prob.model_options['*'] = { + Aircraft.Electrical.HAS_HYBRID_SYSTEM: False, + Aircraft.CrewPayload.Design.NUM_PASSENGERS: 180, + Aircraft.CrewPayload.NUM_PASSENGERS: 180, + Aircraft.Design.CRUISE_ALTITUDE: (37500, 'ft'), + Aircraft.Wing.CHOOSE_FOLD_LOCATION: False, + Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.LandingGear.FIXED_GEAR: False, + Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 6, + Aircraft.Fuselage.NUM_AISLES: 1, + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (29, 'inch'), + Aircraft.Engine.ADDITIONAL_MASS_FRACTION: 0.14, + Aircraft.Engine.NUM_ENGINES: [2], + Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], + Aircraft.Wing.HAS_FOLD: False, + Aircraft.Wing.HAS_STRUT: False, + Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, + Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, + Aircraft.Electrical.HAS_HYBRID_SYSTEM: False, + Aircraft.Design.TYPE: AircraftTypes.TRANSPORT, + Aircraft.Design.PART25_STRUCTURAL_CATEGORY: 3, + Aircraft.Wing.LOADING_ABOVE_20: True, + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: 2, + Aircraft.Propulsion.TOTAL_NUM_ENGINES: 2, + Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES: False, + } prob.setup(check=False, force_alloc_complex=True) prob.run_model() + prob.model.list_vars(units=True) tol = 5e-4 assert_near_equal(prob[Aircraft.HorizontalTail.VOLUME_COEFFICIENT], 1.189, tol) From 2b78c279f405618d0e701f2e5ee6e5cf1a5da028 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 31 Aug 2026 11:13:08 -0400 Subject: [PATCH 04/21] temp added aircraft:design:compute_htail_volume_coeff and aircraft:design:compute_vtail_volume_coeff --- aviary/models/aircraft/blended_wing_body/generic_BWB_GASP.csv | 2 ++ 1 file changed, 2 insertions(+) diff --git a/aviary/models/aircraft/blended_wing_body/generic_BWB_GASP.csv b/aviary/models/aircraft/blended_wing_body/generic_BWB_GASP.csv index 87d14a05b2..6cfc981278 100644 --- a/aviary/models/aircraft/blended_wing_body/generic_BWB_GASP.csv +++ b/aviary/models/aircraft/blended_wing_body/generic_BWB_GASP.csv @@ -27,6 +27,8 @@ aircraft:crew_and_payload:uld_mass_per_passenger,0.0667,lbm aircraft:crew_and_payload:water_mass_per_occupant,3,lbm aircraft:design:cg_delta,0.25,unitless aircraft:design:cockpit_control_mass_coefficient,16.5,unitless +aircraft:design:compute_htail_volume_coeff,True,unitless +aircraft:design:compute_vtail_volume_coeff,True,unitless aircraft:design:drag_coefficient_increment,0.00025,unitless aircraft:design:emergency_equipment_mass,100,lbm aircraft:design:max_structural_speed,402.5,mi/h From 8190b8ae28bdff13df97e0b4576c6c254679c00d Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 31 Aug 2026 11:20:11 -0400 Subject: [PATCH 05/21] work in progress: adding MomentRatio class --- .../geometry/gasp_based/empennage.py | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/aviary/subsystems/geometry/gasp_based/empennage.py b/aviary/subsystems/geometry/gasp_based/empennage.py index 0c6183f237..53838cf9c0 100644 --- a/aviary/subsystems/geometry/gasp_based/empennage.py +++ b/aviary/subsystems/geometry/gasp_based/empennage.py @@ -5,6 +5,55 @@ from aviary.variable_info.variables import Aircraft +class MomentRatio(om.ExplicitComponent): + """GASP tail moment ratio""" + + def initialize(self): + self.options.declare( + 'orientation', + values=['horizontal', 'vertical'], + desc='Tail orientation, can be horizontal or vertical.', + ) + + def setup(self): + veritcal = self.options['orientation'] == 'vertical' + if veritcal: + self.io_names = { + 'moment_ratio': Aircraft.VerticalTail.MOMENT_RATIO, + } + else: + self.io_names = { + 'moment_ratio': Aircraft.HorizontalTail.MOMENT_RATIO, + } + + # coefficients used in the empirical equation + if veritcal: + self.k = [1.862, 0.338] + else: + self.k = [0.271, 0.0955] + + add_aviary_input( + self, Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, units='unitless' + ) + + add_aviary_output(self, self.io_names['moment_ratio'], units='unitless') + + def setup_partials(self): + self.declare_partials(self.io_names['moment_ratio'], '*') + + def compute(self, inputs, outputs): + htail_loc = inputs[Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION] + k1, k2 = self.k + ch2 = k1 + k2 * htail_loc + outputs[self.io_names['moment_ratio']] = ch2 + + def compute_partials(self, inputs, J): + str_moment_ratio = self.io_names['moment_ratio'] + + k1, k2 = self.k + J[str_moment_ratio, Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION] = k2 + + class TailVolCoef(om.ExplicitComponent): """GASP tail volume coefficient fallback calculation. @@ -246,6 +295,19 @@ def initialize(self): def setup(self): # For cruciform/T-tail configurations, see issue #1089 + # self.add_subsystem( + # 'htail_mr', + # MomentRatio(orientation='horizontal'), + # promotes_inputs=['*'], + # promotes_outputs=['*'], + # ) + # self.add_subsystem( + # 'vtail_mr', + # MomentRatio(orientation='vertical'), + # promotes_inputs=['*'], + # promotes_outputs=['*'], + # ) + if self.options[Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF]: self.add_subsystem( 'htail_vc', From 347345ca59b0ad1c610e008776c1ede7911b1837 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 31 Aug 2026 11:29:53 -0400 Subject: [PATCH 06/21] work in progress: added TestMomentRatio. used override feature in BWBTestEmpennageGroup. --- .../gasp_based/test/test_empennage.py | 143 ++++++++++++++---- 1 file changed, 114 insertions(+), 29 deletions(-) diff --git a/aviary/subsystems/geometry/gasp_based/test/test_empennage.py b/aviary/subsystems/geometry/gasp_based/test/test_empennage.py index a688b51e2a..e3c9e649b7 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_empennage.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_empennage.py @@ -4,15 +4,74 @@ from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal from openmdao.utils.testing_utils import use_tempdirs -from aviary.subsystems.geometry.gasp_based.empennage import EmpennageSize, TailSize, TailVolCoef -from aviary.variable_info.functions import setup_model_options +from aviary.subsystems.geometry.gasp_based.empennage import ( + EmpennageSize, + MomentRatio, + TailSize, + TailVolCoef, +) +from aviary.utils.aviary_values import AviaryValues +from aviary.variable_info.functions import override_aviary_vars, setup_model_options from aviary.variable_info.options import get_option_defaults -from aviary.variable_info.variables import Aircraft +from aviary.variable_info.variables import Aircraft, Settings tol = 5e-4 partial_tols = {'atol': 1e-8, 'rtol': 1e-8} +class TestMomentRatio(unittest.TestCase): + def setUp(self): + self.prob = om.Problem() + self.prob.model.add_subsystem( + 'hmr', + MomentRatio(orientation='horizontal'), + promotes=['aircraft:*'], + ) + self.prob.model.add_subsystem( + 'vmr', + MomentRatio(orientation='vertical'), + promotes=['aircraft:*'], + ) + self.prob.model.set_input_defaults( + Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, val=0, units='unitless' + ) + self.prob.setup(check=False, force_alloc_complex=True) + + def test_case_1(self): + self.prob.run_model() + + # These are not actual GASP values. + expected_values = { + Aircraft.HorizontalTail.MOMENT_RATIO: 0.271, + Aircraft.VerticalTail.MOMENT_RATIO: 1.862, + } + + for var_name, expected in expected_values.items(): + with self.subTest(var=var_name): + assert_near_equal(self.prob[var_name], expected, tol) + + def test_case_2(self): + self.prob.setup(check=False, force_alloc_complex=True) + self.prob.set_val( + Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, val=1, units='unitless' + ) + self.prob.run_model() + + # These are not actual GASP values. + expected_values = { + Aircraft.HorizontalTail.MOMENT_RATIO: 0.3665, + Aircraft.VerticalTail.MOMENT_RATIO: 2.2, + } + + for var_name, expected in expected_values.items(): + with self.subTest(var=var_name): + assert_near_equal(self.prob[var_name], expected, tol) + + def test_partials(self): + partial_data = self.prob.check_partials(out_stream=None, method='cs') + assert_check_partials(partial_data, **partial_tols) + + class TestTailVolCoef( unittest.TestCase ): # note, this component is not used in the large single aisle @@ -224,45 +283,71 @@ def test_large_sinle_aisle_1_calc_volcoefs(self): @use_tempdirs class BWBTestEmpennageGroup(unittest.TestCase): - """BWB model""" - - def setUp(self): - self.prob = om.Problem() - self.prob.model.add_subsystem('emp', EmpennageSize(), promotes=['*']) - - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=0.000001, units='unitless' + """GASP model does not compute volume coeffiients. So, override.""" + + def test_case(self): + class PreMission(om.Group): + def initialize(self): + self.options.declare( + 'aviary_options', types=AviaryValues, desc='Aircraft options dictionary' + ) + + def setup(self): + self.add_subsystem( + 'emp', + EmpennageSize(), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) + + def configure(self): + aviary_options = self.options['aviary_options'] + + # Overrides + override_aviary_vars(self, aviary_options) + + options = AviaryValues() + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=0.000001, units='unitless') + options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.015, units='unitless') + options.set_val(Settings.VERBOSITY, 0) + + prob = om.Problem() + prob.model.add_subsystem( + 'premission', + PreMission(aviary_options=options), + promotes_outputs=['*'], + promotes_inputs=['*'], ) - self.prob.model.set_input_defaults(Aircraft.Wing.AREA, val=2142.85714286, units='ft**2') - self.prob.model.set_input_defaults( + + prob.model.set_input_defaults(Aircraft.Wing.AREA, val=2142.85714286, units='ft**2') + prob.model.set_input_defaults( Aircraft.HorizontalTail.MOMENT_RATIO, val=0.5463, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.AVERAGE_CHORD, val=16.2200522, units='ft') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.AVERAGE_CHORD, val=16.2200522, units='ft') + prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=1.705, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.TAPER_RATIO, val=0.366, units='unitless' ) - - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.VOLUME_COEFFICIENT, val=0.0150, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.MOMENT_RATIO, val=5.2615, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=146.38501094, units='ft') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=146.38501094, units='ft') + prob.model.set_input_defaults( Aircraft.VerticalTail.ASPECT_RATIO, val=1.705, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.366, units='unitless' ) - def test_case1(self): - self.prob.setup(check=False, force_alloc_complex=True) + prob.model_options['*'] = { + Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, + Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, + } + prob.setup(check=False, force_alloc_complex=True) - self.prob.run_model() + prob.run_model() expected_values = { Aircraft.HorizontalTail.AREA: 0.00117064, @@ -279,9 +364,9 @@ def test_case1(self): for var_name, expected in expected_values.items(): with self.subTest(var=var_name): - assert_near_equal(self.prob[var_name], expected, tol) + assert_near_equal(prob[var_name], expected, tol) - partial_data = self.prob.check_partials(out_stream=None, method='cs') + partial_data = prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, **partial_tols) From 139ba043af3d5d64539f29851e9cf8da515eff79 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 31 Aug 2026 11:36:42 -0400 Subject: [PATCH 07/21] work in progress: used override feature in BWBSizeGroupTestCase1. --- .../gasp_based/test/test_size_group.py | 186 +++++++++--------- 1 file changed, 95 insertions(+), 91 deletions(-) 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 7927d02d81..13dabb24b7 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_size_group.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_size_group.py @@ -5,9 +5,11 @@ from openmdao.utils.testing_utils import use_tempdirs from aviary.subsystems.geometry.gasp_based.size_group import SizeGroup -from aviary.variable_info.functions import setup_model_options +from aviary.utils.aviary_values import AviaryValues +from aviary.variable_info.enums import AircraftTypes +from aviary.variable_info.functions import override_aviary_vars, setup_model_options from aviary.variable_info.options import get_option_defaults -from aviary.variable_info.variables import Aircraft +from aviary.variable_info.variables import Aircraft, Settings # this is the GASP test case, input and output values based on large single aisle 1 v3 without bug fix @@ -539,113 +541,116 @@ def test_case1(self): assert_check_partials(partial_data, atol=2e-12, rtol=1e-12) -@use_tempdirs class BWBSizeGroupTestCase1(unittest.TestCase): - def setUp(self): - options = get_option_defaults() - options.set_val(Aircraft.Design.TYPE, val='BWB', units='unitless') - options.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Wing.HAS_STRUT, val=False, units='unitless') - options.set_val(Aircraft.Wing.HAS_FOLD, val=True, units='unitless') - options.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, val=True, units='unitless') - options.set_val( - Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless' - ) - options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=150, units='unitless') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH_FIRST, 28, units='inch') - options.set_val(Aircraft.Fuselage.NUM_AISLES, 3) - options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 18) - options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST, 36, units='inch') - options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 32, units='inch') - options.set_val(Aircraft.CrewPayload.Design.NUM_FIRST_CLASS, 11) - - self.prob = om.Problem() - self.prob.model.add_subsystem( - 'size', - SizeGroup(), - promotes=['*'], - ) - - self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_FIRST, 22, units='inch') - self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 21, units='inch') - self.prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 22, units='inch') - self.prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, 10.0, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, 0.27444, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.SWEEP, 30.0, units='deg') - self.prob.model.set_input_defaults( + """GASP BWB model does not compute volume coeffiients. So, override.""" + + def test_case(self): + class PreMission(om.Group): + def initialize(self): + self.options.declare( + 'aviary_options', types=AviaryValues, desc='Aircraft options dictionary' + ) + + def setup(self): + self.add_subsystem( + 'size', + SizeGroup(), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) + + def configure(self): + aviary_options = self.options['aviary_options'] + + # Overrides + override_aviary_vars(self, aviary_options) + + options = AviaryValues() + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=0.000001, units='unitless') + options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.015, units='unitless') + options.set_val(Settings.VERBOSITY, 0) + + prob = om.Problem() + prob.model.add_subsystem( + 'premission', + PreMission(aviary_options=options), + promotes_outputs=['*'], + promotes_inputs=['*'], + ) + + prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_FIRST, 22, units='inch') + prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 21, units='inch') + prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 22, units='inch') + prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, 10.0, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, 0.27444, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.SWEEP, 30.0, units='deg') + prob.model.set_input_defaults( Aircraft.Wing.THICKNESS_TO_CHORD_ROOT, 0.165, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, 150000, units='lbm') - self.prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, 70.0, units='lbf/ft**2') - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.ASPECT_RATIO, 1.705, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.TAPER_RATIO, 0.366, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.TAPER_RATIO, 0.366, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.45, units='unitless') + prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, 150000, units='lbm') + prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, 70.0, units='lbf/ft**2') + prob.model.set_input_defaults(Aircraft.VerticalTail.ASPECT_RATIO, 1.705, units='unitless') + prob.model.set_input_defaults(Aircraft.HorizontalTail.TAPER_RATIO, 0.366, units='unitless') + prob.model.set_input_defaults(Aircraft.VerticalTail.TAPER_RATIO, 0.366, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.45, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.VOLUME_COEFFICIENT, 0.000001, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.015, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 5.0, units='ft') - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 7.5, units='ft' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 0.6, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 1.75, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.1, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 5.0, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 7.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 0.6, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 1.75, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.1, units='unitless') + prob.model.set_input_defaults( Aircraft.HorizontalTail.MOMENT_RATIO, 0.5463, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MOMENT_RATIO, 5.2615, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.ASPECT_RATIO, 1.705, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 5.2615, units='unitless') + prob.model.set_input_defaults(Aircraft.HorizontalTail.ASPECT_RATIO, 1.705, units='unitless') + 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') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 1.3588, units='unitless') + prob.model.set_input_defaults( Aircraft.LandingGear.MAIN_GEAR_LOCATION, 0.0, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.FOLDED_SPAN, 118, units='ft') - self.prob.model.set_input_defaults( - Aircraft.Wing.VERTICAL_MOUNT_LOCATION, 0.5, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.FOLDED_SPAN, 118, units='ft') + prob.model.set_input_defaults(Aircraft.Wing.VERTICAL_MOUNT_LOCATION, 0.5, units='unitless') + prob.model.set_input_defaults( Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, 0.25970, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Fuselage.WETTED_AREA_SCALER, 1.0, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, 65.0, units='deg' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.WETTED_AREA_SCALER, 1.0, units='unitless') + prob.model.set_input_defaults(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, 65.0, units='deg') + prob.model.set_input_defaults( Aircraft.Fuselage.PRESSURIZED_WIDTH_ADDITIONAL, 0.0, units='ft' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Nacelle.PERCENT_DIAM_BURIED_IN_FUSELAGE, 0.0, units='unitless' ) - setup_model_options(self.prob, options) - - self.prob.setup(check=False, force_alloc_complex=True) + prob.model_options['*'] = { + Aircraft.Design.TYPE: AircraftTypes.BLENDED_WING_BODY, + Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, + Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, + Aircraft.Wing.HAS_STRUT: False, + Aircraft.Wing.HAS_FOLD: True, + Aircraft.Wing.CHOOSE_FOLD_LOCATION: True, + Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.Electrical.HAS_HYBRID_SYSTEM: False, + Aircraft.CrewPayload.Design.NUM_PASSENGERS: 150, + Aircraft.Fuselage.SEAT_WIDTH_FIRST: (28, 'inch'), + Aircraft.Fuselage.NUM_AISLES: 3, + Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 18, + Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST: (36, 'inch'), + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (32, 'inch'), + Aircraft.CrewPayload.Design.NUM_FIRST_CLASS: 11, + Aircraft.Engine.NUM_ENGINES: [2], + } + prob.setup(check=False, force_alloc_complex=True) - def test_case1(self): """ Testing GASP data case: Aircraft.Fuselage.AVG_DIAMETER -- SWF = 38.00 @@ -678,10 +683,9 @@ def test_case1(self): Aircraft.Nacelle.AVG_LENGTH -- ELN = 9.44 Aircraft.Nacelle.SURFACE_AREA -- SN = 205.965 (for one engine) """ - self.prob.run_model() + prob.run_model() tol = 1e-4 - # BWBFuselageGroup expected_values = { Aircraft.Fuselage.AVG_DIAMETER: 38, @@ -716,9 +720,9 @@ def test_case1(self): for var_name, expected_val in expected_values.items(): with self.subTest(var=var_name): - assert_near_equal(self.prob[var_name], expected_val, tol) + assert_near_equal(prob[var_name], expected_val, tol) - partial_data = self.prob.check_partials(out_stream=None, method='cs') + partial_data = prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, atol=3e-9, rtol=3e-9) From fa37ee4eed7b423e466afd15e5b4340d5c4c385b Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 31 Aug 2026 11:41:21 -0400 Subject: [PATCH 08/21] added Aircraft.HorizontalTail.VOLUME_COEFFICIENT and Aircraft.VerticalTail.VOLUME_COEFFICIENT to BWBPreMissionGroupTest --- aviary/subsystems/test/test_gasp_based_premission.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/aviary/subsystems/test/test_gasp_based_premission.py b/aviary/subsystems/test/test_gasp_based_premission.py index 680e269446..9b5f7ed64b 100644 --- a/aviary/subsystems/test/test_gasp_based_premission.py +++ b/aviary/subsystems/test/test_gasp_based_premission.py @@ -294,11 +294,13 @@ def test_case1(self): Aircraft.Wing.ROOT_CHORD: 20.3337, Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED: 0.135966, Aircraft.Fuel.WING_VOLUME_GEOMETRIC_MAX: 605.9078, + Aircraft.HorizontalTail.VOLUME_COEFFICIENT: 1.0e-06, Aircraft.HorizontalTail.AREA: 0.00117064, Aircraft.HorizontalTail.SPAN: 0.04467601, Aircraft.HorizontalTail.ROOT_CHORD: 0.0383645, Aircraft.HorizontalTail.AVERAGE_CHORD: 0.0280845, Aircraft.HorizontalTail.MOMENT_ARM: 29.6907, + Aircraft.VerticalTail.VOLUME_COEFFICIENT: 0.015, Aircraft.VerticalTail.AREA: 169.1196, Aircraft.VerticalTail.SPAN: 16.98084, Aircraft.VerticalTail.ROOT_CHORD: 14.5819, From cdc1559e74197a4cee46114cee7cad503d18ed00 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 31 Aug 2026 12:51:53 -0400 Subject: [PATCH 09/21] added a helper class for overriding --- .../gasp_based/test/test_mass_premission.py | 3493 ++++++----------- 1 file changed, 1301 insertions(+), 2192 deletions(-) diff --git a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py index bcc1e503de..8b2859aa08 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py +++ b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py @@ -1,4 +1,3 @@ -import numpy as np import unittest import openmdao.api as om @@ -16,7 +15,37 @@ from aviary.variable_info.enums import AircraftTypes, GASPEngineType from aviary.variable_info.functions import override_aviary_vars, setup_model_options from aviary.variable_info.variable_meta_data import CoreMetaData -from aviary.variable_info.variables import Aircraft, Mission +from aviary.variable_info.variables import Aircraft, Mission, Settings + + +class PreMission(om.Group): + "a helper class for overridings" + + def initialize(self): + self.options.declare( + 'aviary_options', types=AviaryValues, desc='Aircraft options dictionary' + ) + + def setup(self): + self.add_subsystem( + 'size', + SizeGroup(), + promotes_inputs=['aircraft:*'], + promotes_outputs=[ + 'aircraft:*', + ], + ) + self.add_subsystem( + 'GASP_mass', + MassPremission(), + promotes=['*'], + ) + + def configure(self): + aviary_options = self.options['aviary_options'] + + # Overrides + override_aviary_vars(self, aviary_options) @use_tempdirs @@ -126,6 +155,7 @@ def test_case1(self): assert_check_partials(partial_data, atol=3e-10, rtol=1e-12) +@use_tempdirs class MassPremissionTestCase2(unittest.TestCase): """ This is the large single aisle 1 V3.5 test case. @@ -135,276 +165,217 @@ class MassPremissionTestCase2(unittest.TestCase): def setUp(self): options = AviaryValues() - options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=180, units='unitless') - options.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, val=180, units='unitless') - options.set_val(Aircraft.Design.CRUISE_ALTITUDE, val=37500, units='ft') - options.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, val=False, units='unitless') - options.set_val( - Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless' - ) - options.set_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless') - options.set_val(Aircraft.LandingGear.FIXED_GEAR, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) - options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) - options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') - - options.set_val(Aircraft.Engine.NUM_ENGINES, [2], units='unitless') - options.set_val(Aircraft.Engine.TYPE, [GASPEngineType.TURBOJET], units='unitless') - options.set_val(Aircraft.Wing.HAS_FOLD, val=False, units='unitless') - options.set_val(Aircraft.Wing.HAS_STRUT, val=False, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') - options.set_val(Aircraft.Design.TYPE, AircraftTypes.TRANSPORT, units='unitless') - options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, 3, units='unitless') - options.set_val(Aircraft.Wing.LOADING_ABOVE_20, True, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 2, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2, units='unitless') - options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, False, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless') + options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless') + options.set_val(Settings.VERBOSITY, 0) - self.prob = om.Problem() - self.prob.model.add_subsystem( - 'size', - SizeGroup(), - promotes_inputs=['aircraft:*'], - promotes_outputs=[ - 'aircraft:*', - ], - ) - self.prob.model.add_subsystem( - 'GASP_mass', - MassPremission(), - promotes=['*'], + prob = self.prob = om.Problem() + prob.model.add_subsystem( + 'premission', + PreMission(aviary_options=options), + promotes_outputs=['*'], + promotes_inputs=['*'], ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') - self.prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') + prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + prob.model.set_input_defaults( Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS, val=200, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.00030975, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=10.13, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.33, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=25, units='deg') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=10.13, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.33, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=25, units='deg') + prob.model.set_input_defaults( Aircraft.Wing.THICKNESS_TO_CHORD_ROOT, val=0.15, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=175400, units='lbm') - self.prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=128, units='lbf/ft**2') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=175400, units='lbm') + prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=128, units='lbf/ft**2') + prob.model.set_input_defaults( Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, val=0, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.ASPECT_RATIO, val=1.67, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Engine.SCALED_SLS_THRUST, val=29500.0, units='lbf' - ) - self.prob.model.set_input_defaults( - Aircraft.Engine.WING_LOCATIONS, val=0.35, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PRESSURE_DIFFERENTIAL, val=7.5, units='psi' - ) - self.prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Engine.SCALED_SLS_THRUST, val=29500.0, units='lbf') + prob.model.set_input_defaults(Aircraft.Engine.WING_LOCATIONS, val=0.35, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.PRESSURE_DIFFERENTIAL, val=7.5, units='psi') + prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units='unitless') + prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) - - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') # Adjust WETTED_AREA_SCALER such that WETTED_AREA = 4000.0 - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuselage.WETTED_AREA_SCALER, val=0.86215, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless') + prob.model.set_input_defaults( Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') + prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - # self.prob.model.set_input_defaults( - # Aircraft.Engine.REFERENCE_SLS_THRUST, 28690, units='lbf' - # ) - self.prob.model.set_input_defaults( - Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') + prob.model.set_input_defaults(Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless') + prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h' - ) - self.prob.model.set_input_defaults(Aircraft.CrewPayload.CARGO_MASS, val=0, units='lbm') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h') + prob.model.set_input_defaults(Aircraft.CrewPayload.CARGO_MASS, val=0, units='lbm') + prob.model.set_input_defaults( Aircraft.CrewPayload.Design.MAX_CARGO_MASS, val=10040, units='lbm' ) - self.prob.model.set_input_defaults(Aircraft.VerticalTail.SWEEP, val=0, units='deg') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.VerticalTail.SWEEP, val=0, units='deg') + prob.model.set_input_defaults( Aircraft.HorizontalTail.MASS_COEFFICIENT, val=0.232, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.TAIL_HOOK_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.MASS_COEFFICIENT, val=0.289, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.THICKNESS_TO_CHORD, val=0.12, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.THICKNESS_TO_CHORD, val=0.12, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT, val=1.9, units='unitless' ) # Based onlarge single aisle 1for updated flaps mass model - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Mission.Landing.LIFT_COEFFICIENT_MAX, val=2.817, units='unitless' ) # Based onlarge single aisle 1for updated flaps mass model - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.SURFACE_CONTROL_MASS_COEFFICIENT, val=0.95, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Design.COCKPIT_CONTROL_MASS_COEFFICIENT, val=16.5, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.STABILITY_AUGMENTATION_SYSTEM_REFERENCE_MASS, val=0, units='lbm' ) # note: not actually defined in program, likely an error - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.COCKPIT_CONTROL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.SURFACE_CONTROL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.STABILITY_AUGMENTATION_SYSTEM_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.MASS, val=0, units='lbm' ) # note: not actually defined in program, likely an error - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.MASS_COEFFICIENT, val=0.04, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.MAIN_GEAR_MASS_FRACTION, val=0.85, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Nacelle.CLEARANCE_RATIO, val=0.2, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Engine.MASS_SPECIFIC, val=0.21366, units='lbm/lbf' - ) - self.prob.model.set_input_defaults(Aircraft.Nacelle.MASS_SPECIFIC, val=3, units='lbm/ft**2') - self.prob.model.set_input_defaults(Aircraft.Engine.PYLON_FACTOR, val=1.25, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Engine.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Propulsion.MISC_MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Nacelle.CLEARANCE_RATIO, val=0.2, units='unitless') + prob.model.set_input_defaults(Aircraft.Engine.MASS_SPECIFIC, val=0.21366, units='lbm/lbf') + prob.model.set_input_defaults(Aircraft.Nacelle.MASS_SPECIFIC, val=3, units='lbm/ft**2') + prob.model.set_input_defaults(Aircraft.Engine.PYLON_FACTOR, val=1.25, units='unitless') + prob.model.set_input_defaults(Aircraft.Engine.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Propulsion.MISC_MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults( Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0.15, units='unitless' ) - - # self.prob.model.set_input_defaults(Aircraft.APU.MASS, val=928.0, units='lbm') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Instruments.MASS_COEFFICIENT, val=0.0736, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Hydraulics.FLIGHT_CONTROL_MASS_COEFFICIENT, val=0.112, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Hydraulics.GEAR_MASS_COEFFICIENT, val=0.14, units='unitless' ) - # self.prob.model.set_input_defaults(Aircraft.Avionics.MASS, val=1959.0, units='lbm') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.AirConditioning.MASS_COEFFICIENT, val=1.65, units='unitless' ) - # self.prob.model.set_input_defaults(Aircraft.AntiIcing.MASS, val=551.0, units='lbm') - # self.prob.model.set_input_defaults(Aircraft.Furnishings.MASS, val=11192.0, units='lbm') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_PER_PASSENGER, val=5.0, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.WATER_MASS_PER_OCCUPANT, val=3.0, units='lbm' ) - # self.prob.model.set_input_defaults( - # Aircraft.Design.EMERGENCY_EQUIPMENT_MASS, val=50.0, units='lbm' - # ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.CATERING_ITEMS_MASS_PER_PASSENGER, val=7.6, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuel.UNUSABLE_FUEL_MASS_COEFFICIENT, val=12.0, units='unitless' ) - - self.prob.model.set_input_defaults( - Aircraft.Wing.MASS_COEFFICIENT, val=102.5, units='unitless' - ) - - self.prob.model.set_input_defaults( - Aircraft.Fuselage.MASS_COEFFICIENT, val=128, units='unitless' - ) - self.prob.model.set_input_defaults('pylon_len', val=0, units='ft') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.MASS_COEFFICIENT, val=102.5, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.MASS_COEFFICIENT, val=128, units='unitless') + prob.model.set_input_defaults('pylon_len', val=0, units='ft') + prob.model.set_input_defaults( 'MAT', val=0, units='lbm' ) # note: not actually defined in program, likely an error - self.prob.model.set_input_defaults(Aircraft.Wing.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.HorizontalTail.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.VerticalTail.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults( Aircraft.LandingGear.TOTAL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.POD_MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Design.STRUCTURAL_MASS_INCREMENT, val=0, units='lbm' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Engine.POD_MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Design.STRUCTURAL_MASS_INCREMENT, val=0, units='lbm') + prob.model.set_input_defaults( Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuel.FUEL_SYSTEM_MASS_COEFFICIENT, val=0.041, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Fuel.DENSITY, val=6.687, units='lbm/galUS') - self.prob.model.set_input_defaults(Aircraft.Fuel.VOLUME_MARGIN, val=0, units='unitless') - - self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units='ft') - self.prob.model.set_input_defaults(Aircraft.Wing.SLAT_CHORD_RATIO, val=0.15) - self.prob.model.set_input_defaults(Aircraft.Wing.FLAP_CHORD_RATIO, val=0.3) - self.prob.model.set_input_defaults(Aircraft.Wing.SLAT_SPAN_RATIO, val=0.9) - self.prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') - - setup_model_options(self.prob, options) + prob.model.set_input_defaults(Aircraft.Fuel.DENSITY, val=6.687, units='lbm/galUS') + prob.model.set_input_defaults(Aircraft.Fuel.VOLUME_MARGIN, val=0, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units='ft') + prob.model.set_input_defaults(Aircraft.Wing.SLAT_CHORD_RATIO, val=0.15) + prob.model.set_input_defaults(Aircraft.Wing.FLAP_CHORD_RATIO, val=0.3) + prob.model.set_input_defaults(Aircraft.Wing.SLAT_SPAN_RATIO, val=0.9) + prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') - self.prob.setup(check=False, force_alloc_complex=True) + # setup_model_options(prob, options) + prob.model_options['*'] = { + Aircraft.Electrical.HAS_HYBRID_SYSTEM: False, + Aircraft.CrewPayload.Design.NUM_PASSENGERS: 180, + Aircraft.CrewPayload.NUM_PASSENGERS: 180, + Aircraft.Design.CRUISE_ALTITUDE: (37500, 'ft'), + Aircraft.Wing.CHOOSE_FOLD_LOCATION: False, + Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.LandingGear.FIXED_GEAR: False, + Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 6, + Aircraft.Fuselage.NUM_AISLES: 1, + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (29, 'inch'), + Aircraft.Engine.ADDITIONAL_MASS_FRACTION: 0.14, + Aircraft.Engine.NUM_ENGINES: [2], + Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], + Aircraft.Wing.HAS_FOLD: False, + Aircraft.Wing.HAS_STRUT: False, + Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, + Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, + Aircraft.Electrical.HAS_HYBRID_SYSTEM: False, + Aircraft.Design.TYPE: AircraftTypes.TRANSPORT, + Aircraft.Design.PART25_STRUCTURAL_CATEGORY: 3, + Aircraft.Wing.LOADING_ABOVE_20: True, + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: 2, + Aircraft.Propulsion.TOTAL_NUM_ENGINES: 2, + Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES: False, + } + prob.setup(check=False, force_alloc_complex=True) - def test_case1(self): + def test_case(self): prob = self.prob prob.run_model() @@ -511,150 +482,92 @@ def test_case1(self): assert_near_equal(prob[Mission.ZERO_FUEL_MASS], 131643.10464319, tol) # UsefulLoadMass assert_near_equal(prob[Aircraft.Design.USEFUL_LOAD_MASS], 85163.32715242, tol) - - # assert_near_equal(prob[Aircraft], 14, tol) - assert_near_equal(prob[Aircraft.Wing.CENTER_CHORD], 17.49, tol) assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 16.41, tol) assert_near_equal( prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.1397, tol ) # not exact GASP value from the output file, likely due to rounding error - # note: this is not the value in the GASP output, because the output calculates # them differently. This was calculated by hand. - assert_near_equal(self.prob[Aircraft.HorizontalTail.AVERAGE_CHORD], 9.578314120156815, tol) + assert_near_equal(prob[Aircraft.HorizontalTail.AVERAGE_CHORD], 9.578314120156815, tol) # note: this is not the value in the GASP output, because the output calculates # them differently. This was calculated by hand. - assert_near_equal(self.prob[Aircraft.VerticalTail.AVERAGE_CHORD], 16.828924591320984, tol) - assert_near_equal(self.prob[Aircraft.Nacelle.AVG_LENGTH], 14.7, tol) - + assert_near_equal(prob[Aircraft.VerticalTail.AVERAGE_CHORD], 16.828924591320984, tol) + assert_near_equal(prob[Aircraft.Nacelle.AVG_LENGTH], 14.7, tol) # fixed mass values: assert_near_equal( - self.prob[Aircraft.LandingGear.MAIN_GEAR_MASS], 6384.35, tol + prob[Aircraft.LandingGear.MAIN_GEAR_MASS], 6384.35, tol ) # calculated by hand - # note: tail.loc_MAC_vtail not included in v3.5 - - assert_near_equal(self.prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 12606, tol) - assert_near_equal(self.prob[Aircraft.Engine.ADDITIONAL_MASS], 1765 / 2, tol) - + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 12606, tol) + assert_near_equal(prob[Aircraft.Engine.ADDITIONAL_MASS], 1765 / 2, tol) # wing values: - assert_near_equal(self.prob['isolated_wing_mass'], 15653, tol) - + assert_near_equal(prob['isolated_wing_mass'], 15653, tol) # fuel values: # modified from GASP value to account for updated crew mass. GASP value is # 79147.2 assert_near_equal( - self.prob['OEM_wingfuel_mass'], 79756.73086076, tol + prob['OEM_wingfuel_mass'], 79756.73086076, tol ) # modified from GASP value to account for updated crew mass. GASP value is 79147.2 - # calculated by hand, #modified from GASP value to account for updated crew # mass. GASP value is 102321.45695930265 - assert_near_equal(self.prob['fus_mass_full'], 101584.84568819, tol) + assert_near_equal(prob['fus_mass_full'], 101584.84568819, tol) # modified from GASP value to account for updated crew mass. GASP value is # 1769 assert_near_equal( - self.prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 1794.02596529, tol + prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 1794.02596529, tol ) # modified from GASP value to account for updated crew mass. GASP value is 1769 - - assert_near_equal(self.prob[Aircraft.Design.STRUCTURE_MASS], 50132.58, tol) + assert_near_equal(prob[Aircraft.Design.STRUCTURE_MASS], 50132.58, tol) assert_near_equal( - self.prob[Aircraft.Fuselage.MASS], 18621.15351242, tol + prob[Aircraft.Fuselage.MASS], 18621.15351242, tol ) # modified from GASP value to account for updated crew mass. GASP value is 18787 - assert_near_equal( - self.prob[Aircraft.Propulsion.MASS], 16167.631, tol + prob[Aircraft.Propulsion.MASS], 16167.631, tol ) # modified from GASP value to account for updated crew mass. GASP value is 16140 assert_near_equal( - self.prob['fuel_mass_min'], 33716.73086076, tol + prob['fuel_mass_min'], 33716.73086076, tol ) # modified from GASP value to account for updated crew mass. GASP value is 33107.2 assert_near_equal( - self.prob[Aircraft.Fuel.WING_VOLUME_DESIGN], 874.74545824, tol + prob[Aircraft.Fuel.WING_VOLUME_DESIGN], 874.74545824, tol ) # calculated by hand, #modified from GASP value to account for updated crew mass. GASP value is 862.5603807559726 assert_near_equal( - self.prob['OEM_fuel_vol'], 1594.42528526, tol + prob['OEM_fuel_vol'], 1594.42528526, tol ) # calculated by hand, #modified from GASP value to account for updated crew mass. GASP value is 1582.2403068511774 assert_near_equal( - self.prob[Mission.OPERATING_MASS], 95643.26913924, tol + prob[Mission.OPERATING_MASS], 95643.26913924, tol ) # modified from GASP value to account for updated crew mass. GASP value is 96253.0 # extra_fuel_mass calculated differently in this version, so payload_mass_max_fuel test not included - assert_near_equal(self.prob['volume_wingfuel_mass'], 55725.1, tol) - assert_near_equal(self.prob['max_wingfuel_mass'], 55725.1, tol) + assert_near_equal(prob['volume_wingfuel_mass'], 55725.1, tol) + assert_near_equal(prob['max_wingfuel_mass'], 55725.1, tol) assert_near_equal( - self.prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 0, tol + prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 0, tol ) # always zero when no body tank - assert_near_equal(self.prob['extra_fuel_volume'], 0, tol) # always zero when no body tank - assert_near_equal(self.prob['max_extra_fuel_mass'], 0, tol) # always zero when no body tank - - partial_data = self.prob.check_partials(out_stream=None, method='cs') - assert_check_partials(partial_data, atol=2e-10, rtol=1e-12) - - assert_near_equal(self.prob[Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS], 36000.0, tol) + assert_near_equal(prob['extra_fuel_volume'], 0, tol) # always zero when no body tank + assert_near_equal(prob['max_extra_fuel_mass'], 0, tol) # always zero when no body tank + assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS], 36000.0, tol) # operating mass + pax mass + cargo_mass) zero_fuel = 95643.26913924 + 36000.0 + 0.0 - assert_near_equal(self.prob[Mission.ZERO_FUEL_MASS], zero_fuel, tol) + assert_near_equal(prob[Mission.ZERO_FUEL_MASS], zero_fuel, tol) + + partial_data = prob.check_partials(out_stream=None, method='cs') + assert_check_partials(partial_data, atol=2e-10, rtol=1e-12) @use_tempdirs -class MassPremissionTestCase2a(unittest.TestCase): - def test_case(self): - class PreMission(om.Group): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, desc='Aircraft options dictionary' - ) - - def setup(self): - self.add_subsystem( - 'size', - SizeGroup(), - promotes_inputs=['aircraft:*'], - promotes_outputs=[ - 'aircraft:*', - ], - ) - self.add_subsystem( - 'GASP_mass', - MassPremission(), - promotes=['*'], - ) - - def configure(self): - aviary_options = self.options['aviary_options'] - - # Overrides - override_aviary_vars(self, aviary_options) +class MassPremissionTestCase3(unittest.TestCase): + """ + This is the large 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. All values are from V3.6 output (or hand calculated from the + output, and these cases are specified). + """ + def setUp(self): options = AviaryValues() - # options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') - # options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=180, units='unitless') - # options.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, val=180, units='unitless') - # options.set_val(Aircraft.Design.CRUISE_ALTITUDE, val=37500, units='ft') - # options.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, val=False, units='unitless') - # options.set_val( - # Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless' - # ) - # options.set_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless') - # options.set_val(Aircraft.LandingGear.FIXED_GEAR, val=False, units='unitless') - # options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) - # options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) - # options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - # options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') - # options.set_val(Aircraft.Engine.NUM_ENGINES, [2], units='unitless') - # options.set_val(Aircraft.Engine.TYPE, [GASPEngineType.TURBOJET], units='unitless') - # options.set_val(Aircraft.Wing.HAS_FOLD, val=False, units='unitless') - # options.set_val(Aircraft.Wing.HAS_STRUT, val=False, units='unitless') - # options.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val=False, units='unitless') - # options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=False, units='unitless') - # options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') - # options.set_val(Aircraft.Design.TYPE, AircraftTypes.TRANSPORT, units='unitless') - # options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, 3, units='unitless') - # options.set_val(Aircraft.Wing.LOADING_ABOVE_20, True, units='unitless') - # options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 2, units='unitless') - # options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2, units='unitless') - # options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, False, units='unitless') - - prob = om.Problem() + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless') + options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless') + options.set_val(Settings.VERBOSITY, 0) + + prob = self.prob = om.Problem() prob.model.add_subsystem( 'premission', PreMission(aviary_options=options), @@ -694,12 +607,6 @@ def configure(self): prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) - prob.model.set_input_defaults( - Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless' - ) - prob.model.set_input_defaults( - Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless' - ) prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') prob.model.set_input_defaults(Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft') prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') @@ -720,6 +627,7 @@ def configure(self): prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') prob.model.set_input_defaults(Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h') + prob.model.set_input_defaults(Aircraft.CrewPayload.CARGO_MASS, val=0, units='lbm') prob.model.set_input_defaults( Aircraft.CrewPayload.Design.MAX_CARGO_MASS, val=10040, units='lbm' @@ -745,7 +653,7 @@ def configure(self): ) # Based onlarge single aisle 1for updated flaps mass model prob.model.set_input_defaults( Mission.Landing.LIFT_COEFFICIENT_MAX, val=2.817, units='unitless' - ) # Based onlarge single aisle 1for updated flaps mass model + ) # Based on large single aisle 1 for updated flaps mass model prob.model.set_input_defaults( Aircraft.Wing.SURFACE_CONTROL_MASS_COEFFICIENT, val=0.95, units='unitless' ) @@ -807,8 +715,10 @@ def configure(self): Aircraft.Fuel.UNUSABLE_FUEL_MASS_COEFFICIENT, val=12.0, units='unitless' ) prob.model.set_input_defaults(Aircraft.Wing.MASS_COEFFICIENT, val=102.5, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.MASS_COEFFICIENT, val=128, units='unitless') prob.model.set_input_defaults('pylon_len', val=0, units='ft') + prob.model.set_input_defaults('pylon_len', val=0, units='ft') prob.model.set_input_defaults( 'MAT', val=0, units='lbm' ) # note: not actually defined in program, likely an error @@ -856,7 +766,6 @@ def configure(self): Aircraft.Wing.HAS_STRUT: False, Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, - Aircraft.Electrical.HAS_HYBRID_SYSTEM: False, Aircraft.Design.TYPE: AircraftTypes.TRANSPORT, Aircraft.Design.PART25_STRUCTURAL_CATEGORY: 3, Aircraft.Wing.LOADING_ABOVE_20: True, @@ -865,149 +774,46 @@ def configure(self): Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES: False, } prob.setup(check=False, force_alloc_complex=True) + + def test_case(self): + prob = self.prob prob.run_model() - prob.model.list_vars(units=True) tol = 5e-4 - assert_near_equal(prob[Aircraft.HorizontalTail.VOLUME_COEFFICIENT], 1.189, tol) - assert_near_equal(prob[Aircraft.VerticalTail.VOLUME_COEFFICIENT], 0.145, tol) # size values: - # FuselageParameters assert_near_equal(prob['size.cabin_height'], 13.1, tol) assert_near_equal(prob['size.cabin_len'], 72.1, tol) assert_near_equal(prob['size.nose_height'], 8.6, tol) - # FuselageSize - assert_near_equal(prob[Aircraft.Fuselage.LENGTH], 129.49722222, tol) - assert_near_equal(prob[Aircraft.Fuselage.WETTED_AREA], 4000.00108449, tol) - assert_near_equal(prob[Aircraft.TailBoom.LENGTH], 129.49722222, tol) - assert_near_equal(prob[Aircraft.Fuselage.CABIN_AREA], 1068.92361111, tol) - # WingSize - assert_near_equal(prob[Aircraft.Wing.AREA], 1370.3125, tol) - assert_near_equal(prob[Aircraft.Wing.SPAN], 117.81878299, tol) - # WingParameters - assert_near_equal(prob[Aircraft.Wing.CENTER_CHORD], 17.48974356, tol) - assert_near_equal(prob[Aircraft.Wing.AVERAGE_CHORD], 12.61453233, tol) - assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 16.40711451, tol) - assert_near_equal(prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.13965584, tol) - assert_near_equal(prob[Aircraft.Wing.LEADING_EDGE_SWEEP], 0.47639483, tol) - # WingVolume - assert_near_equal(prob[Aircraft.Fuel.WING_VOLUME_GEOMETRIC_MAX], 1114.00563103, tol) - # GASPEngineDiameter - assert_near_equal(prob[Aircraft.Nacelle.AVG_DIAMETER], 7.351408, tol) - # GASPEngineLength - assert_near_equal(prob[Aircraft.Nacelle.AVG_LENGTH], 14.702816, tol) - # GASPEngineSurfaceArea - assert_near_equal(prob[Aircraft.Nacelle.SURFACE_AREA], 339.5634375, tol) - # LoadSpeeds - assert_near_equal(prob['max_airspeed'], 350.0, tol) - assert_near_equal(prob['vel_c'], 350.0, tol) - assert_near_equal(prob['max_maneuver_factor'], 2.5, tol) - assert_near_equal(prob['min_dive_vel'], 420.0, tol) - # MassParameters - assert_near_equal(prob[Aircraft.Wing.MATERIAL_FACTOR], 1.22128833, tol) - assert_near_equal(prob['c_strut_braced'], 1, tol) - assert_near_equal(prob['c_gear_loc'], 1, tol) - assert_near_equal(prob[Aircraft.Propulsion.ENGINE_POSITION_FACTOR], 0.95, tol) - assert_near_equal(prob['half_sweep'], 0.39471574, tol) - # PayloadGroup - assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS], 36000.0, tol) - assert_near_equal(prob[Aircraft.CrewPayload.TOTAL_PAYLOAD_MASS], 36000.0, tol) - assert_near_equal(prob['payload_mass_des'], 36000.0, tol) - assert_near_equal(prob['payload_mass_max'], 46040.0, tol) - # ACMass - assert_near_equal(prob[Aircraft.AirConditioning.MASS], 1324.55345246, tol) - # FurnishingMass - assert_near_equal(prob[Aircraft.Furnishings.MASS], 13268.77210825, tol) - # AntiIcingMass - assert_near_equal(prob[Aircraft.AntiIcing.MASS], 683.47110765, tol) - # APUMass - assert_near_equal(prob[Aircraft.APU.MASS], 1077.969377, tol) - # AvionicsMass - assert_near_equal(prob[Aircraft.Avionics.MASS], 1514.0, tol) - # ElectricalMass - assert_near_equal(prob[Aircraft.Electrical.MASS], 170.0, tol) - # HydraulicsMass - assert_near_equal(prob[Aircraft.Hydraulics.MASS], 1479.33343636, tol) - # InstrumentMass - assert_near_equal(prob[Aircraft.Instruments.MASS], 547.49288363, tol) - # OxygenSystemMass - assert_near_equal(prob[Aircraft.OxygenSystem.MASS], 50.0, tol) - # WingMassSolve - assert_near_equal(prob['isolated_wing_mass'], 15652.61578394, tol) - # StrutAndFoldMass - assert_near_equal(prob[Aircraft.Strut.MASS], 0.0, tol) - assert_near_equal(prob[Aircraft.Wing.FOLD_MASS], 0, tol) - # WingMassTotal - assert_near_equal(prob[Aircraft.Wing.MASS], 15652.61578394, tol) - # FuelSysAndFullFuselageMass - assert_near_equal(prob['fus_mass_full'], 101584.83829383, tol) - # FuselageMass - assert_near_equal(prob[Aircraft.Fuselage.MASS], 18614.6407651, tol) - # FuelMass - assert_near_equal(prob['fuel_mass'], 43756.89535681, tol) - assert_near_equal(prob['fuel_mass_required'], 43756.89535681, tol) - assert_near_equal(prob['fuel_mass_min'], 33716.89535681, tol) - # FuelComponents - assert_near_equal(prob[Aircraft.Fuel.UNUSABLE_FUEL_MASS], 619.8317956, tol) - # BodyTankCalculations - assert_near_equal(prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 0, tol) - assert_near_equal(prob['extra_fuel_volume'], 0, tol) - assert_near_equal(prob['max_extra_fuel_mass'], 0, tol) - assert_near_equal(prob['wingfuel_mass_min'], 33716.89535681, tol) - assert_near_equal(prob[Aircraft.Fuel.MAX_CAPACITY_MASS], 44376.72715242, tol) - # EmpennageMass - assert_near_equal(prob[Aircraft.Design.EMPENNAGE_MASS], 4574.10130526, tol) - # StructureMass - assert_near_equal(prob[Aircraft.Design.STRUCTURE_MASS], 50136.9197232, tol) - # PropulsionMass - assert_near_equal(prob[Aircraft.Propulsion.MASS], 16164.80430963, tol) - # SystemsEquipmentMass - assert_near_equal(prob[Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS], 23934.94881476, tol) - # EmptyMass - assert_near_equal(prob[Aircraft.Design.EMPTY_MASS], 90236.67284758, tol) - # OperatingItemsMass - assert_near_equal(prob[Mission.OPERATING_ITEMS_MASS], 5406.4317956, tol) - # OperatingMass - assert_near_equal(prob[Mission.OPERATING_MASS], 95643.10464319, tol) - # ZeroFuelMass - assert_near_equal(prob[Mission.ZERO_FUEL_MASS], 131643.10464319, tol) - # UsefulLoadMass - assert_near_equal(prob[Aircraft.Design.USEFUL_LOAD_MASS], 85163.32715242, tol) assert_near_equal(prob[Aircraft.Wing.CENTER_CHORD], 17.49, tol) assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 16.41, tol) assert_near_equal( prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.1397, tol - ) # not exact GASP value from the output file, likely due to rounding error - # note: this is not the value in the GASP output, because the output calculates - # them differently. This was calculated by hand. - assert_near_equal(prob[Aircraft.HorizontalTail.AVERAGE_CHORD], 9.578314120156815, tol) - # note: this is not the value in the GASP output, because the output calculates - # them differently. This was calculated by hand. - assert_near_equal(prob[Aircraft.VerticalTail.AVERAGE_CHORD], 16.828924591320984, tol) + ) # not exact value, likely due to rounding error + assert_near_equal( + prob[Aircraft.HorizontalTail.AVERAGE_CHORD], 9.578314120156815, tol + ) # note: this is not the value in the GASP output, because the output calculates them differently. This was calculated by hand. + assert_near_equal( + prob[Aircraft.VerticalTail.AVERAGE_CHORD], 16.828924591320984, tol + ) # note: this is not the value in the GASP output, because the output calculates them differently. This was calculated by hand. assert_near_equal(prob[Aircraft.Nacelle.AVG_LENGTH], 14.7, tol) # fixed mass values: assert_near_equal( - prob[Aircraft.LandingGear.MAIN_GEAR_MASS], 6384.35, tol + prob[Aircraft.LandingGear.MAIN_GEAR_MASS], 6384.349999999999, tol ) # calculated by hand - # note: tail.loc_MAC_vtail not included in v3.5 assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 12606, tol) assert_near_equal(prob[Aircraft.Engine.ADDITIONAL_MASS], 1765 / 2, tol) # wing values: assert_near_equal(prob['isolated_wing_mass'], 15653, tol) # fuel values: - # modified from GASP value to account for updated crew mass. GASP value is - # 79147.2 assert_near_equal( prob['OEM_wingfuel_mass'], 79756.73086076, tol ) # modified from GASP value to account for updated crew mass. GASP value is 79147.2 - # calculated by hand, #modified from GASP value to account for updated crew - # mass. GASP value is 102321.45695930265 - assert_near_equal(prob['fus_mass_full'], 101584.84568819, tol) - # modified from GASP value to account for updated crew mass. GASP value is - # 1769 + assert_near_equal( + prob['fus_mass_full'], 101584.84568819, tol + ) # calculated by hand, #modified from GASP value to account for updated crew mass. GASP value is 102321.45695930265 assert_near_equal( prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 1794.02596529, tol - ) # modified from GASP value to account for updated crew mass. GASP value is 1769 + ) # modified from GASP value to account for updated crew mass. GASP value is 102321.45695930265 (is it correct?) assert_near_equal(prob[Aircraft.Design.STRUCTURE_MASS], 50132.58, tol) assert_near_equal( prob[Aircraft.Fuselage.MASS], 18621.15351242, tol @@ -1020,14 +826,16 @@ def configure(self): ) # modified from GASP value to account for updated crew mass. GASP value is 33107.2 assert_near_equal( prob[Aircraft.Fuel.WING_VOLUME_DESIGN], 874.74545824, tol - ) # calculated by hand, #modified from GASP value to account for updated crew mass. GASP value is 862.5603807559726 + ) # modified from GASP value to account for updated crew mass. GASP value is 862.6 assert_near_equal( prob['OEM_fuel_vol'], 1594.42528526, tol - ) # calculated by hand, #modified from GASP value to account for updated crew mass. GASP value is 1582.2403068511774 + ) # modified from GASP value to account for updated crew mass. GASP value is 1582.2 assert_near_equal( prob[Mission.OPERATING_MASS], 95643.26913924, tol ) # modified from GASP value to account for updated crew mass. GASP value is 96253.0 - # extra_fuel_mass calculated differently in this version, so payload_mass_max_fuel test not included + assert_near_equal( + prob['payload_mass_max_fuel'], 36000, tol + ) # note: value came from running the GASP code on my own and printing it out assert_near_equal(prob['volume_wingfuel_mass'], 55725.1, tol) assert_near_equal(prob['max_wingfuel_mass'], 55725.1, tol) assert_near_equal( @@ -1035,745 +843,325 @@ def configure(self): ) # always zero when no body tank assert_near_equal(prob['extra_fuel_volume'], 0, tol) # always zero when no body tank assert_near_equal(prob['max_extra_fuel_mass'], 0, tol) # always zero when no body tank - assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS], 36000.0, tol) - # operating mass + pax mass + cargo_mass) - zero_fuel = 95643.26913924 + 36000.0 + 0.0 - assert_near_equal(prob[Mission.ZERO_FUEL_MASS], zero_fuel, tol) partial_data = prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, atol=2e-10, rtol=1e-12) @use_tempdirs -class MassPremissionTestCase3(unittest.TestCase): +class MassPremissionTestCase4(unittest.TestCase): """ - This is the large 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. All values are from V3.6 output (or hand calculated from the - output, and these cases are specified). + 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 + All values are from V3.6 output (or hand calculated from the output, and these cases are specified). """ def setUp(self): options = AviaryValues() + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless') + options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless') + options.set_val(Settings.VERBOSITY, 0) - options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=180, units='unitless') - options.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, val=180, units='unitless') - options.set_val(Aircraft.Design.CRUISE_ALTITUDE, val=37500, units='ft') - options.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, val=False, units='unitless') - options.set_val( - Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless' - ) - options.set_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless') - options.set_val(Aircraft.LandingGear.FIXED_GEAR, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) - options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) - options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') - - options.set_val(Aircraft.Engine.NUM_ENGINES, [2], units='unitless') - options.set_val(Aircraft.Engine.TYPE, [GASPEngineType.TURBOJET], units='unitless') - options.set_val(Aircraft.Wing.HAS_FOLD, val=False, units='unitless') - options.set_val(Aircraft.Wing.HAS_STRUT, val=False, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Design.TYPE, AircraftTypes.TRANSPORT, units='unitless') - options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, 3, units='unitless') - options.set_val(Aircraft.Wing.LOADING_ABOVE_20, True, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 2, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2, units='unitless') - options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, False, units='unitless') - - self.prob = om.Problem() - self.prob.model.add_subsystem( - 'size', - SizeGroup(), - promotes_inputs=['aircraft:*'], - promotes_outputs=[ - 'aircraft:*', - ], - ) - self.prob.model.add_subsystem( - 'GASP_mass', - MassPremission(), - promotes=['*'], + prob = self.prob = om.Problem() + prob.model.add_subsystem( + 'premission', + PreMission(aviary_options=options), + promotes_outputs=['*'], + promotes_inputs=['*'], ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') - self.prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') + prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + prob.model.set_input_defaults( Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS, val=200, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.00030975, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=10.13, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.33, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=25, units='deg') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=10.13, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.33, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=25, units='deg') + prob.model.set_input_defaults( Aircraft.Wing.THICKNESS_TO_CHORD_ROOT, val=0.15, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=175400, units='lbm') - self.prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=128, units='lbf/ft**2') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=175400, units='lbm') + prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=128, units='lbf/ft**2') + prob.model.set_input_defaults( Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, val=0, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.ASPECT_RATIO, val=1.67, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Engine.SCALED_SLS_THRUST, val=29500.0, units='lbf' - ) - self.prob.model.set_input_defaults( - Aircraft.Engine.WING_LOCATIONS, val=0.35, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PRESSURE_DIFFERENTIAL, val=7.5, units='psi' - ) - self.prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Engine.SCALED_SLS_THRUST, val=29500.0, units='lbf') + prob.model.set_input_defaults(Aircraft.Engine.WING_LOCATIONS, val=0.35, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.PRESSURE_DIFFERENTIAL, val=7.5, units='psi') + prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units='unitless') + prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) - - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') - # Adjust WETTED_AREA_SCALER such that WETTED_AREA = 4000.0 - self.prob.model.set_input_defaults( - Aircraft.Fuselage.WETTED_AREA_SCALER, val=0.86215, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' - ) - # self.prob.model.set_input_defaults( - # Aircraft.Engine.REFERENCE_SLS_THRUST, 28690, units='lbf' - # ) - self.prob.model.set_input_defaults( - Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') - - self.prob.model.set_input_defaults( - Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h' - ) - - self.prob.model.set_input_defaults(Aircraft.CrewPayload.CARGO_MASS, val=0, units='lbm') - self.prob.model.set_input_defaults( - Aircraft.CrewPayload.Design.MAX_CARGO_MASS, val=10040, units='lbm' - ) - self.prob.model.set_input_defaults(Aircraft.VerticalTail.SWEEP, val=0, units='deg') - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.MASS_COEFFICIENT, val=0.232, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.LandingGear.TAIL_HOOK_MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MASS_COEFFICIENT, val=0.289, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.THICKNESS_TO_CHORD, val=0.12, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.THICKNESS_TO_CHORD, val=0.12, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT, val=1.9, units='unitless' - ) # Based onlarge single aisle 1for updated flaps mass model - self.prob.model.set_input_defaults( - Mission.Landing.LIFT_COEFFICIENT_MAX, val=2.817, units='unitless' - ) # Based on large single aisle 1 for updated flaps mass model - self.prob.model.set_input_defaults( - Aircraft.Wing.SURFACE_CONTROL_MASS_COEFFICIENT, val=0.95, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Design.COCKPIT_CONTROL_MASS_COEFFICIENT, val=16.5, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Controls.STABILITY_AUGMENTATION_SYSTEM_REFERENCE_MASS, val=0, units='lbm' - ) # note: not actually defined in program, likely an error - self.prob.model.set_input_defaults( - Aircraft.Controls.COCKPIT_CONTROL_MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Wing.SURFACE_CONTROL_MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Controls.STABILITY_AUGMENTATION_SYSTEM_MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Controls.MASS, val=0, units='lbm' - ) # note: not actually defined in program, likely an error - self.prob.model.set_input_defaults( - Aircraft.LandingGear.MASS_COEFFICIENT, val=0.04, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.LandingGear.MAIN_GEAR_MASS_FRACTION, val=0.85, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Nacelle.CLEARANCE_RATIO, val=0.2, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Engine.MASS_SPECIFIC, val=0.21366, units='lbm/lbf' - ) - self.prob.model.set_input_defaults(Aircraft.Nacelle.MASS_SPECIFIC, val=3, units='lbm/ft**2') - self.prob.model.set_input_defaults(Aircraft.Engine.PYLON_FACTOR, val=1.25, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Engine.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Propulsion.MISC_MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0.15, units='unitless' - ) - - # self.prob.model.set_input_defaults(Aircraft.APU.MASS, val=928.0, units='lbm') - self.prob.model.set_input_defaults( - Aircraft.Instruments.MASS_COEFFICIENT, val=0.0736, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Hydraulics.FLIGHT_CONTROL_MASS_COEFFICIENT, val=0.112, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Hydraulics.GEAR_MASS_COEFFICIENT, val=0.14, units='unitless' - ) - # self.prob.model.set_input_defaults(Aircraft.Avionics.MASS, val=1959.0, units='lbm') - self.prob.model.set_input_defaults( - Aircraft.AirConditioning.MASS_COEFFICIENT, val=1.65, units='unitless' - ) - # self.prob.model.set_input_defaults(Aircraft.AntiIcing.MASS, val=551.0, units='lbm') - # self.prob.model.set_input_defaults(Aircraft.Furnishings.MASS, val=11192.0, units='lbm') - self.prob.model.set_input_defaults( - Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_PER_PASSENGER, val=5.0, units='lbm' - ) - self.prob.model.set_input_defaults( - Aircraft.CrewPayload.WATER_MASS_PER_OCCUPANT, val=3.0, units='lbm' - ) - # self.prob.model.set_input_defaults( - # Aircraft.Design.EMERGENCY_EQUIPMENT_MASS, val=50.0, units='lbm' - # ) - self.prob.model.set_input_defaults( - Aircraft.CrewPayload.CATERING_ITEMS_MASS_PER_PASSENGER, val=7.6, units='lbm' - ) - self.prob.model.set_input_defaults( - Aircraft.Fuel.UNUSABLE_FUEL_MASS_COEFFICIENT, val=12.0, units='unitless' - ) - - self.prob.model.set_input_defaults( - Aircraft.Wing.MASS_COEFFICIENT, val=102.5, units='unitless' - ) - - self.prob.model.set_input_defaults( - Aircraft.Fuselage.MASS_COEFFICIENT, val=128, units='unitless' - ) - self.prob.model.set_input_defaults('pylon_len', val=0, units='ft') - self.prob.model.set_input_defaults('pylon_len', val=0, units='ft') - self.prob.model.set_input_defaults( - 'MAT', val=0, units='lbm' - ) # note: not actually defined in program, likely an error - self.prob.model.set_input_defaults(Aircraft.Wing.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.LandingGear.TOTAL_MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Engine.POD_MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Design.STRUCTURAL_MASS_INCREMENT, val=0, units='lbm' - ) - self.prob.model.set_input_defaults( - Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Fuel.FUEL_SYSTEM_MASS_COEFFICIENT, val=0.041, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Fuel.DENSITY, val=6.687, units='lbm/galUS') - self.prob.model.set_input_defaults(Aircraft.Fuel.VOLUME_MARGIN, val=0, units='unitless') - - self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units='ft') - self.prob.model.set_input_defaults(Aircraft.Wing.SLAT_CHORD_RATIO, val=0.15) - self.prob.model.set_input_defaults(Aircraft.Wing.FLAP_CHORD_RATIO, val=0.3) - self.prob.model.set_input_defaults(Aircraft.Wing.SLAT_SPAN_RATIO, val=0.9) - self.prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') - - setup_model_options(self.prob, options) - - self.prob.setup(check=False, force_alloc_complex=True) - - def test_case1(self): - self.prob.run_model() - - tol = 5e-4 - # size values: - assert_near_equal(self.prob['size.cabin_height'], 13.1, tol) - assert_near_equal(self.prob['size.cabin_len'], 72.1, tol) - assert_near_equal(self.prob['size.nose_height'], 8.6, tol) - - assert_near_equal(self.prob[Aircraft.Wing.CENTER_CHORD], 17.49, tol) - assert_near_equal(self.prob[Aircraft.Wing.ROOT_CHORD], 16.41, tol) - assert_near_equal( - self.prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.1397, tol - ) # not exact value, likely due to rounding error - - assert_near_equal( - self.prob[Aircraft.HorizontalTail.AVERAGE_CHORD], 9.578314120156815, tol - ) # note: this is not the value in the GASP output, because the output calculates them differently. This was calculated by hand. - assert_near_equal( - self.prob[Aircraft.VerticalTail.AVERAGE_CHORD], 16.828924591320984, tol - ) # note: this is not the value in the GASP output, because the output calculates them differently. This was calculated by hand. - assert_near_equal(self.prob[Aircraft.Nacelle.AVG_LENGTH], 14.7, tol) - - # fixed mass values: - assert_near_equal( - self.prob[Aircraft.LandingGear.MAIN_GEAR_MASS], 6384.349999999999, tol - ) # calculated by hand - - assert_near_equal(self.prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 12606, tol) - assert_near_equal(self.prob[Aircraft.Engine.ADDITIONAL_MASS], 1765 / 2, tol) - - # wing values: - assert_near_equal(self.prob['isolated_wing_mass'], 15653, tol) - - # fuel values: - assert_near_equal( - self.prob['OEM_wingfuel_mass'], 79756.73086076, tol - ) # modified from GASP value to account for updated crew mass. GASP value is 79147.2 - - assert_near_equal( - self.prob['fus_mass_full'], 101584.84568819, tol - ) # calculated by hand, #modified from GASP value to account for updated crew mass. GASP value is 102321.45695930265 - assert_near_equal( - self.prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 1794.02596529, tol - ) # modified from GASP value to account for updated crew mass. GASP value is 102321.45695930265 (is it correct?) - - assert_near_equal(self.prob[Aircraft.Design.STRUCTURE_MASS], 50132.58, tol) - assert_near_equal( - self.prob[Aircraft.Fuselage.MASS], 18621.15351242, tol - ) # modified from GASP value to account for updated crew mass. GASP value is 18787 - assert_near_equal( - self.prob[Aircraft.Propulsion.MASS], 16167.631, tol - ) # modified from GASP value to account for updated crew mass. GASP value is 16140 - assert_near_equal( - self.prob['fuel_mass_min'], 33716.73086076, tol - ) # modified from GASP value to account for updated crew mass. GASP value is 33107.2 - assert_near_equal( - self.prob[Aircraft.Fuel.WING_VOLUME_DESIGN], 874.74545824, tol - ) # modified from GASP value to account for updated crew mass. GASP value is 862.6 - assert_near_equal( - self.prob['OEM_fuel_vol'], 1594.42528526, tol - ) # modified from GASP value to account for updated crew mass. GASP value is 1582.2 - assert_near_equal( - self.prob[Mission.OPERATING_MASS], 95643.26913924, tol - ) # modified from GASP value to account for updated crew mass. GASP value is 96253.0 - assert_near_equal( - self.prob['payload_mass_max_fuel'], 36000, tol - ) # note: value came from running the GASP code on my own and printing it out - assert_near_equal(self.prob['volume_wingfuel_mass'], 55725.1, tol) - assert_near_equal(self.prob['max_wingfuel_mass'], 55725.1, tol) - assert_near_equal( - self.prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 0, tol - ) # always zero when no body tank - assert_near_equal(self.prob['extra_fuel_volume'], 0, tol) # always zero when no body tank - assert_near_equal(self.prob['max_extra_fuel_mass'], 0, tol) # always zero when no body tank - - partial_data = self.prob.check_partials(out_stream=None, method='cs') - assert_check_partials(partial_data, atol=2e-10, rtol=1e-12) - - -@use_tempdirs -class MassPremissionTestCase4(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 - All values are from V3.6 output (or hand calculated from the output, and these cases are specified). - """ - - def setUp(self): - options = AviaryValues() - options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=180, units='unitless') - options.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, val=180, units='unitless') - options.set_val(Aircraft.Design.CRUISE_ALTITUDE, val=37500, units='ft') - options.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, val=False, units='unitless') - options.set_val( - Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless' - ) - options.set_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless') - options.set_val(Aircraft.LandingGear.FIXED_GEAR, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) - options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) - options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') - - options.set_val(Aircraft.Engine.NUM_ENGINES, [2], units='unitless') - options.set_val(Aircraft.Engine.TYPE, [GASPEngineType.TURBOJET], units='unitless') - options.set_val(Aircraft.Wing.HAS_FOLD, val=False, units='unitless') - options.set_val(Aircraft.Wing.HAS_STRUT, val=False, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Design.TYPE, AircraftTypes.TRANSPORT, units='unitless') - options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, 3, units='unitless') - options.set_val(Aircraft.Wing.LOADING_ABOVE_20, True, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 2, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2, units='unitless') - options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, False, units='unitless') - - self.prob = om.Problem() - self.prob.model.add_subsystem( - 'size', - SizeGroup(), - promotes_inputs=['aircraft:*'], - promotes_outputs=[ - 'aircraft:*', - ], - ) - self.prob.model.add_subsystem( - 'GASP_mass', - MassPremission(), - promotes=['*'], - ) - - self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') - self.prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( - Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS, val=200, units='lbm' - ) - self.prob.model.set_input_defaults( - Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.00030975, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=10.13, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.33, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=25, units='deg') - self.prob.model.set_input_defaults( - Aircraft.Wing.THICKNESS_TO_CHORD_ROOT, val=0.15, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=175400, units='lbm') - self.prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=128, units='lbf/ft**2') - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, val=0, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.ASPECT_RATIO, val=1.67, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Engine.SCALED_SLS_THRUST, val=29500.0, units='lbf' - ) - self.prob.model.set_input_defaults( - Aircraft.Engine.WING_LOCATIONS, val=0.35, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PRESSURE_DIFFERENTIAL, val=7.5, units='psi' - ) - self.prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' - ) - - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') # Adjust WETTED_AREA_SCALER such that WETTED_AREA = 4000.0 - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuselage.WETTED_AREA_SCALER, val=0.86215, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless') + prob.model.set_input_defaults( Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') + prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - # self.prob.model.set_input_defaults( - # Aircraft.Engine.REFERENCE_SLS_THRUST, 28690, units='lbf' - # ) - self.prob.model.set_input_defaults( - Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') - - self.prob.model.set_input_defaults( - Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h' - ) + prob.model.set_input_defaults(Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless') + prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') - self.prob.model.set_input_defaults(Aircraft.CrewPayload.CARGO_MASS, val=0, units='lbm') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h') + prob.model.set_input_defaults(Aircraft.CrewPayload.CARGO_MASS, val=0, units='lbm') + prob.model.set_input_defaults( Aircraft.CrewPayload.Design.MAX_CARGO_MASS, val=10040, units='lbm' ) - self.prob.model.set_input_defaults(Aircraft.VerticalTail.SWEEP, val=0, units='deg') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.VerticalTail.SWEEP, val=0, units='deg') + prob.model.set_input_defaults( Aircraft.HorizontalTail.MASS_COEFFICIENT, val=0.232, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.TAIL_HOOK_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.MASS_COEFFICIENT, val=0.289, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.THICKNESS_TO_CHORD, val=0.12, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.THICKNESS_TO_CHORD, val=0.12, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT, val=1.9, units='unitless' ) # Based onlarge single aisle 1for updated flaps mass model - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Mission.Landing.LIFT_COEFFICIENT_MAX, val=2.817, units='unitless' ) # Based on large single aisle 1 for updated flaps mass model - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.SURFACE_CONTROL_MASS_COEFFICIENT, val=0.95, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Design.COCKPIT_CONTROL_MASS_COEFFICIENT, val=16.5, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.STABILITY_AUGMENTATION_SYSTEM_REFERENCE_MASS, val=0, units='lbm' ) # note: not actually defined in program, likely an error - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.COCKPIT_CONTROL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.SURFACE_CONTROL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.STABILITY_AUGMENTATION_SYSTEM_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.MASS, val=0, units='lbm' ) # note: not actually defined in program, likely an error - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.MASS_COEFFICIENT, val=0.04, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.MAIN_GEAR_MASS_FRACTION, val=0.85, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Nacelle.CLEARANCE_RATIO, val=0.2, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Engine.MASS_SPECIFIC, val=0.21366, units='lbm/lbf' - ) - self.prob.model.set_input_defaults(Aircraft.Nacelle.MASS_SPECIFIC, val=3, units='lbm/ft**2') - self.prob.model.set_input_defaults(Aircraft.Engine.PYLON_FACTOR, val=1.25, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Engine.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Propulsion.MISC_MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Nacelle.CLEARANCE_RATIO, val=0.2, units='unitless') + prob.model.set_input_defaults(Aircraft.Engine.MASS_SPECIFIC, val=0.21366, units='lbm/lbf') + prob.model.set_input_defaults(Aircraft.Nacelle.MASS_SPECIFIC, val=3, units='lbm/ft**2') + prob.model.set_input_defaults(Aircraft.Engine.PYLON_FACTOR, val=1.25, units='unitless') + prob.model.set_input_defaults(Aircraft.Engine.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Propulsion.MISC_MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults( Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0.15, units='unitless' ) - # self.prob.model.set_input_defaults(Aircraft.APU.MASS, val=928.0, units='lbm') - self.prob.model.set_input_defaults( + # prob.model.set_input_defaults(Aircraft.APU.MASS, val=928.0, units='lbm') + prob.model.set_input_defaults( Aircraft.Instruments.MASS_COEFFICIENT, val=0.0736, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Hydraulics.FLIGHT_CONTROL_MASS_COEFFICIENT, val=0.112, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Hydraulics.GEAR_MASS_COEFFICIENT, val=0.14, units='unitless' ) - # self.prob.model.set_input_defaults(Aircraft.Avionics.MASS, val=1959.0, units='lbm') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.AirConditioning.MASS_COEFFICIENT, val=1.65, units='unitless' ) - # self.prob.model.set_input_defaults(Aircraft.AntiIcing.MASS, val=551.0, units='lbm') - # self.prob.model.set_input_defaults(Aircraft.Furnishings.MASS, val=11192.0, units='lbm') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_PER_PASSENGER, val=5.0, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.WATER_MASS_PER_OCCUPANT, val=3.0, units='lbm' ) - # self.prob.model.set_input_defaults( - # Aircraft.Design.EMERGENCY_EQUIPMENT_MASS, val=50.0, units='lbm' - # ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.CATERING_ITEMS_MASS_PER_PASSENGER, val=7.6, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuel.UNUSABLE_FUEL_MASS_COEFFICIENT, val=12.0, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Wing.MASS_COEFFICIENT, val=102.5, units='unitless' - ) + prob.model.set_input_defaults(Aircraft.Wing.MASS_COEFFICIENT, val=102.5, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Fuselage.MASS_COEFFICIENT, val=128, units='unitless' - ) - self.prob.model.set_input_defaults('pylon_len', val=0, units='ft') - self.prob.model.set_input_defaults('pylon_len', val=0, units='ft') - self.prob.model.set_input_defaults( - 'MAT', val=0, units='lbm' - ) # note: not actually defined in program, likely an error - self.prob.model.set_input_defaults(Aircraft.Wing.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.MASS_COEFFICIENT, val=128, units='unitless') + prob.model.set_input_defaults('pylon_len', val=0, units='ft') + prob.model.set_input_defaults('pylon_len', val=0, units='ft') + prob.model.set_input_defaults( + 'MAT', val=0, units='lbm' + ) # note: not actually defined in program, likely an error + prob.model.set_input_defaults(Aircraft.Wing.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.HorizontalTail.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.VerticalTail.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults( Aircraft.LandingGear.TOTAL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.POD_MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Design.STRUCTURAL_MASS_INCREMENT, val=0, units='lbm' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Engine.POD_MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Design.STRUCTURAL_MASS_INCREMENT, val=0, units='lbm') + prob.model.set_input_defaults( Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuel.FUEL_SYSTEM_MASS_COEFFICIENT, val=0.041, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Fuel.DENSITY, val=6.687, units='lbm/galUS') - self.prob.model.set_input_defaults(Aircraft.Fuel.VOLUME_MARGIN, val=10, units='unitless') - - self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units='ft') - self.prob.model.set_input_defaults(Aircraft.Wing.SLAT_CHORD_RATIO, val=0.15) - self.prob.model.set_input_defaults(Aircraft.Wing.FLAP_CHORD_RATIO, val=0.3) - self.prob.model.set_input_defaults(Aircraft.Wing.SLAT_SPAN_RATIO, val=0.9) - self.prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') - - setup_model_options(self.prob, options) + prob.model.set_input_defaults(Aircraft.Fuel.DENSITY, val=6.687, units='lbm/galUS') + prob.model.set_input_defaults(Aircraft.Fuel.VOLUME_MARGIN, val=10, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units='ft') + prob.model.set_input_defaults(Aircraft.Wing.SLAT_CHORD_RATIO, val=0.15) + prob.model.set_input_defaults(Aircraft.Wing.FLAP_CHORD_RATIO, val=0.3) + prob.model.set_input_defaults(Aircraft.Wing.SLAT_SPAN_RATIO, val=0.9) + prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') - self.prob.setup(check=False, force_alloc_complex=True) + # setup_model_options(prob, options) + prob.model_options['*'] = { + Aircraft.Electrical.HAS_HYBRID_SYSTEM: False, + Aircraft.CrewPayload.Design.NUM_PASSENGERS: 180, + Aircraft.CrewPayload.NUM_PASSENGERS: 180, + Aircraft.Design.CRUISE_ALTITUDE: (37500, 'ft'), + Aircraft.Wing.CHOOSE_FOLD_LOCATION: False, + Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.LandingGear.FIXED_GEAR: False, + Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 6, + Aircraft.Fuselage.NUM_AISLES: 1, + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (29, 'inch'), + Aircraft.Engine.ADDITIONAL_MASS_FRACTION: 0.14, + Aircraft.Engine.NUM_ENGINES: [2], + Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], + Aircraft.Wing.HAS_FOLD: False, + Aircraft.Wing.HAS_STRUT: False, + Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, + Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, + Aircraft.Design.TYPE: AircraftTypes.TRANSPORT, + Aircraft.Design.PART25_STRUCTURAL_CATEGORY: 3, + Aircraft.Wing.LOADING_ABOVE_20: True, + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: 2, + Aircraft.Propulsion.TOTAL_NUM_ENGINES: 2, + Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES: False, + } + prob.setup(check=False, force_alloc_complex=True) - def test_case1(self): - self.prob.run_model() + def test_case(self): + prob = self.prob + prob.run_model() tol = 5e-4 # size values: - assert_near_equal(self.prob['size.cabin_height'], 13.1, tol) - assert_near_equal(self.prob['size.cabin_len'], 72.1, tol) - assert_near_equal(self.prob['size.nose_height'], 8.6, tol) + assert_near_equal(prob['size.cabin_height'], 13.1, tol) + assert_near_equal(prob['size.cabin_len'], 72.1, tol) + assert_near_equal(prob['size.nose_height'], 8.6, tol) - assert_near_equal(self.prob[Aircraft.Wing.CENTER_CHORD], 17.49, tol) - assert_near_equal(self.prob[Aircraft.Wing.ROOT_CHORD], 16.41, tol) + assert_near_equal(prob[Aircraft.Wing.CENTER_CHORD], 17.49, tol) + assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 16.41, tol) assert_near_equal( - self.prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.1397, tol + prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.1397, tol ) # slightly different from GASP value, likely numerical error assert_near_equal( - self.prob[Aircraft.HorizontalTail.AVERAGE_CHORD], 9.578314120156815, tol + prob[Aircraft.HorizontalTail.AVERAGE_CHORD], 9.578314120156815, tol ) # note: this is not the value in the GASP output, because the output calculates them differently. This was calculated by hand. assert_near_equal( - self.prob[Aircraft.VerticalTail.AVERAGE_CHORD], 16.828924591320984, tol + prob[Aircraft.VerticalTail.AVERAGE_CHORD], 16.828924591320984, tol ) # note: this is not the value in the GASP output, because the output calculates them differently. This was calculated by hand. - assert_near_equal(self.prob[Aircraft.Nacelle.AVG_LENGTH], 14.7, tol) + assert_near_equal(prob[Aircraft.Nacelle.AVG_LENGTH], 14.7, tol) # fixed mass values: assert_near_equal( - self.prob[Aircraft.LandingGear.MAIN_GEAR_MASS], 6384.349999999999, tol + prob[Aircraft.LandingGear.MAIN_GEAR_MASS], 6384.349999999999, tol ) # calculated by hand - assert_near_equal(self.prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 12606, tol) - assert_near_equal(self.prob[Aircraft.Engine.ADDITIONAL_MASS], 1765 / 2, tol) + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 12606, tol) + assert_near_equal(prob[Aircraft.Engine.ADDITIONAL_MASS], 1765 / 2, tol) # wing values: - assert_near_equal(self.prob['isolated_wing_mass'], 15653, tol) + assert_near_equal(prob['isolated_wing_mass'], 15653, tol) # fuel values: assert_near_equal( - self.prob['OEM_wingfuel_mass'], 79573.66265931, tol + prob['OEM_wingfuel_mass'], 79573.66265931, tol ) # modified from GASP value to account for updated crew mass. GASP value is 78966.7 assert_near_equal( - self.prob['fus_mass_full'], 101767.91388964, tol + prob['fus_mass_full'], 101767.91388964, tol ) # calculated by hand, #modified from GASP value to account for updated crew mass. GASP value is 102501.95695930265 - assert_near_equal(self.prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 1965.17218594, tol) + assert_near_equal(prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 1965.17218594, tol) assert_near_equal( - self.prob['OEM_wingfuel_mass'], 79573.66265931, tol + prob['OEM_wingfuel_mass'], 79573.66265931, tol ) # modified from GASP value to account for updated crew mass. GASP value is 78966.7 assert_near_equal( - self.prob['fus_mass_full'], 101767.91388964, tol + prob['fus_mass_full'], 101767.91388964, tol ) # calculated by hand, #modified from GASP value to account for updated crew mass. GASP value is 102501.95695930265 assert_near_equal( - self.prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 1965.17218594, tol + prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 1965.17218594, tol ) # modified from GASP value to account for updated crew mass. GASP value is 1938 - assert_near_equal(self.prob[Aircraft.Design.STRUCTURE_MASS], 50144.527, tol) + assert_near_equal(prob[Aircraft.Design.STRUCTURE_MASS], 50144.527, tol) assert_near_equal( - self.prob[Aircraft.Fuselage.MASS], 18633.04024108, tol + prob[Aircraft.Fuselage.MASS], 18633.04024108, tol ) # modified from GASP value to account for updated crew mass. GASP value is 18799 assert_near_equal( - self.prob[Aircraft.Propulsion.MASS], 16339.047, tol + prob[Aircraft.Propulsion.MASS], 16339.047, tol ) # modified from GASP value to account for updated crew mass. GASP value is 16309 assert_near_equal( - self.prob['fuel_mass_min'], 33533.66265931, tol + prob['fuel_mass_min'], 33533.66265931, tol ) # modified from GASP value to account for updated crew mass. GASP value is 32926.7 assert_near_equal( - self.prob[Aircraft.Fuel.WING_VOLUME_DESIGN], 958.19429461, tol + prob[Aircraft.Fuel.WING_VOLUME_DESIGN], 958.19429461, tol ) # modified from GASP value to account for updated crew mass. GASP value is 944.8 assert_near_equal( - self.prob['OEM_fuel_vol'], 1590.76554939, tol + prob['OEM_fuel_vol'], 1590.76554939, tol ) # modified from GASP value to account for updated crew mass. GASP value is 1578.6 assert_near_equal( - self.prob[Mission.OPERATING_MASS], 95826.33734069, tol + prob[Mission.OPERATING_MASS], 95826.33734069, tol ) # modified from GASP value to account for updated crew mass. GASP value is 96433.0 assert_near_equal( - self.prob['payload_mass_max_fuel'], 36000, tol + prob['payload_mass_max_fuel'], 36000, tol ) # note: value came from running the GASP code on my own and printing it out - assert_near_equal(self.prob['volume_wingfuel_mass'], 55725.1, tol) - assert_near_equal(self.prob['max_wingfuel_mass'], 55725.1, tol) + assert_near_equal(prob['volume_wingfuel_mass'], 55725.1, tol) + assert_near_equal(prob['max_wingfuel_mass'], 55725.1, tol) assert_near_equal( - self.prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 0, tol + prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 0, tol ) # always zero when no body tank - assert_near_equal(self.prob['extra_fuel_volume'], 0, tol) # always zero when no body tank - assert_near_equal(self.prob['max_extra_fuel_mass'], 0, tol) # always zero when no body tank + assert_near_equal(prob['extra_fuel_volume'], 0, tol) # always zero when no body tank + assert_near_equal(prob['max_extra_fuel_mass'], 0, tol) # always zero when no body tank - partial_data = self.prob.check_partials(out_stream=None, method='cs') + partial_data = prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, atol=2e-10, rtol=1e-12) @use_tempdirs -class MassSummationTestCase5(unittest.TestCase): +class MassPremissionTestCase5(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 All values are from V3.6 output (or hand calculated from the output, and these cases are specified). @@ -1781,362 +1169,315 @@ class MassSummationTestCase5(unittest.TestCase): def setUp(self): options = AviaryValues() - options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=180, units='unitless') - options.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, val=180, units='unitless') - options.set_val(Aircraft.Design.CRUISE_ALTITUDE, val=37500, units='ft') - options.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, val=False, units='unitless') - options.set_val( - Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless' - ) - options.set_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless') - options.set_val(Aircraft.LandingGear.FIXED_GEAR, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) - options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) - options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') - - options.set_val(Aircraft.Engine.NUM_ENGINES, [2], units='unitless') - options.set_val(Aircraft.Engine.TYPE, [GASPEngineType.TURBOJET], units='unitless') - options.set_val(Aircraft.Wing.HAS_FOLD, val=False, units='unitless') - options.set_val(Aircraft.Wing.HAS_STRUT, val=False, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') - options.set_val(Aircraft.Design.TYPE, AircraftTypes.TRANSPORT, units='unitless') - options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, 3, units='unitless') - options.set_val(Aircraft.Wing.LOADING_ABOVE_20, True, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 2, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2, units='unitless') - options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, False, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless') + options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless') + options.set_val(Settings.VERBOSITY, 0) - self.prob = om.Problem() - self.prob.model.add_subsystem( - 'size', - SizeGroup(), - promotes_inputs=['aircraft:*'], - promotes_outputs=[ - 'aircraft:*', - ], - ) - self.prob.model.add_subsystem( - 'GASP_mass', - MassPremission(), - promotes=['*'], + prob = self.prob = om.Problem() + prob.model.add_subsystem( + 'premission', + PreMission(aviary_options=options), + promotes_outputs=['*'], + promotes_inputs=['*'], ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') - self.prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') + prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + prob.model.set_input_defaults( Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS, val=200, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.00030975, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=10.13, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.33, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=25, units='deg') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=10.13, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.33, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=25, units='deg') + prob.model.set_input_defaults( Aircraft.Wing.THICKNESS_TO_CHORD_ROOT, val=0.15, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=175400, units='lbm') - self.prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=150, units='lbf/ft**2') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=175400, units='lbm') + prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=150, units='lbf/ft**2') + prob.model.set_input_defaults( Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, val=0, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.ASPECT_RATIO, val=1.67, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Engine.SCALED_SLS_THRUST, val=29500.0, units='lbf' - ) - self.prob.model.set_input_defaults( - Aircraft.Engine.WING_LOCATIONS, val=0.35, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PRESSURE_DIFFERENTIAL, val=7.5, units='psi' - ) - self.prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Engine.SCALED_SLS_THRUST, val=29500.0, units='lbf') + prob.model.set_input_defaults(Aircraft.Engine.WING_LOCATIONS, val=0.35, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.PRESSURE_DIFFERENTIAL, val=7.5, units='psi') + prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units='unitless') + prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) - - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') # Adjust WETTED_AREA_SCALER such that WETTED_AREA = 4000.0 - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuselage.WETTED_AREA_SCALER, val=0.86215, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless') + prob.model.set_input_defaults( Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') + prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - # self.prob.model.set_input_defaults( + # prob.model.set_input_defaults( # Aircraft.Engine.REFERENCE_SLS_THRUST, 28690, units='lbf' # ) - self.prob.model.set_input_defaults( - Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') - - self.prob.model.set_input_defaults( - Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h' - ) + prob.model.set_input_defaults(Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless') + prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') + prob.model.set_input_defaults(Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h') - self.prob.model.set_input_defaults(Aircraft.CrewPayload.CARGO_MASS, val=0, units='lbm') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.CrewPayload.CARGO_MASS, val=0, units='lbm') + prob.model.set_input_defaults( Aircraft.CrewPayload.Design.MAX_CARGO_MASS, val=10040, units='lbm' ) - self.prob.model.set_input_defaults(Aircraft.VerticalTail.SWEEP, val=0, units='deg') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.VerticalTail.SWEEP, val=0, units='deg') + prob.model.set_input_defaults( Aircraft.HorizontalTail.MASS_COEFFICIENT, val=0.232, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.TAIL_HOOK_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.MASS_COEFFICIENT, val=0.289, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.THICKNESS_TO_CHORD, val=0.12, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.THICKNESS_TO_CHORD, val=0.12, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT, val=1.9, units='unitless' ) # Based onlarge single aisle 1for updated flaps mass model - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Mission.Landing.LIFT_COEFFICIENT_MAX, val=2.817, units='unitless' ) # Based on large single aisle 1 for updated flaps mass model - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.SURFACE_CONTROL_MASS_COEFFICIENT, val=0.95, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Design.COCKPIT_CONTROL_MASS_COEFFICIENT, val=16.5, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.STABILITY_AUGMENTATION_SYSTEM_REFERENCE_MASS, val=0, units='lbm' ) # note: not actually defined in program, likely an error - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.COCKPIT_CONTROL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.SURFACE_CONTROL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.STABILITY_AUGMENTATION_SYSTEM_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.MASS, val=0, units='lbm' ) # note: not actually defined in program, likely an error - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.MASS_COEFFICIENT, val=0.04, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.MAIN_GEAR_MASS_FRACTION, val=0.85, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Nacelle.CLEARANCE_RATIO, val=0.2, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Engine.MASS_SPECIFIC, val=0.21366, units='lbm/lbf' - ) - self.prob.model.set_input_defaults(Aircraft.Nacelle.MASS_SPECIFIC, val=3, units='lbm/ft**2') - self.prob.model.set_input_defaults(Aircraft.Engine.PYLON_FACTOR, val=1.25, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Engine.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Propulsion.MISC_MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Nacelle.CLEARANCE_RATIO, val=0.2, units='unitless') + prob.model.set_input_defaults(Aircraft.Engine.MASS_SPECIFIC, val=0.21366, units='lbm/lbf') + prob.model.set_input_defaults(Aircraft.Nacelle.MASS_SPECIFIC, val=3, units='lbm/ft**2') + prob.model.set_input_defaults(Aircraft.Engine.PYLON_FACTOR, val=1.25, units='unitless') + prob.model.set_input_defaults(Aircraft.Engine.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Propulsion.MISC_MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults( Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0.15, units='unitless' ) - # self.prob.model.set_input_defaults(Aircraft.APU.MASS, val=928.0, units='lbm') - self.prob.model.set_input_defaults( + # prob.model.set_input_defaults(Aircraft.APU.MASS, val=928.0, units='lbm') + prob.model.set_input_defaults( Aircraft.Instruments.MASS_COEFFICIENT, val=0.0736, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Hydraulics.FLIGHT_CONTROL_MASS_COEFFICIENT, val=0.112, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Hydraulics.GEAR_MASS_COEFFICIENT, val=0.14, units='unitless' ) - # self.prob.model.set_input_defaults(Aircraft.Avionics.MASS, val=1959.0, units='lbm') - self.prob.model.set_input_defaults( + # prob.model.set_input_defaults(Aircraft.Avionics.MASS, val=1959.0, units='lbm') + prob.model.set_input_defaults( Aircraft.AirConditioning.MASS_COEFFICIENT, val=1.65, units='unitless' ) - # self.prob.model.set_input_defaults(Aircraft.AntiIcing.MASS, val=551.0, units='lbm') - # self.prob.model.set_input_defaults(Aircraft.Furnishings.MASS, val=11192.0, units='lbm') - self.prob.model.set_input_defaults( + # prob.model.set_input_defaults(Aircraft.AntiIcing.MASS, val=551.0, units='lbm') + # prob.model.set_input_defaults(Aircraft.Furnishings.MASS, val=11192.0, units='lbm') + prob.model.set_input_defaults( Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_PER_PASSENGER, val=5.0, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.WATER_MASS_PER_OCCUPANT, val=3.0, units='lbm' ) - # self.prob.model.set_input_defaults( + # prob.model.set_input_defaults( # Aircraft.Design.EMERGENCY_EQUIPMENT_MASS, val=50.0, units='lbm' # ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.CATERING_ITEMS_MASS_PER_PASSENGER, val=7.6, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuel.UNUSABLE_FUEL_MASS_COEFFICIENT, val=12.0, units='unitless' ) + prob.model.set_input_defaults(Aircraft.Wing.MASS_COEFFICIENT, val=102.5, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Wing.MASS_COEFFICIENT, val=102.5, units='unitless' - ) - - self.prob.model.set_input_defaults( - Aircraft.Fuselage.MASS_COEFFICIENT, val=128, units='unitless' - ) - self.prob.model.set_input_defaults('pylon_len', val=0, units='ft') - self.prob.model.set_input_defaults('pylon_len', val=0, units='ft') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.MASS_COEFFICIENT, val=128, units='unitless') + prob.model.set_input_defaults('pylon_len', val=0, units='ft') + prob.model.set_input_defaults('pylon_len', val=0, units='ft') + prob.model.set_input_defaults( 'MAT', val=0, units='lbm' ) # note: not actually defined in program, likely an error - self.prob.model.set_input_defaults(Aircraft.Wing.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.LandingGear.TOTAL_MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Engine.POD_MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Design.STRUCTURAL_MASS_INCREMENT, val=0, units='lbm' + prob.model.set_input_defaults(Aircraft.Wing.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.HorizontalTail.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.VerticalTail.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults( + Aircraft.LandingGear.TOTAL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Engine.POD_MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Design.STRUCTURAL_MASS_INCREMENT, val=0, units='lbm') + prob.model.set_input_defaults( Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuel.FUEL_SYSTEM_MASS_COEFFICIENT, val=0.041, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Fuel.DENSITY, val=6.687, units='lbm/galUS') - self.prob.model.set_input_defaults(Aircraft.Fuel.VOLUME_MARGIN, val=0.0, units='unitless') - - self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units='ft') - self.prob.model.set_input_defaults(Aircraft.Wing.SLAT_CHORD_RATIO, val=0.15) - self.prob.model.set_input_defaults(Aircraft.Wing.FLAP_CHORD_RATIO, val=0.3) - self.prob.model.set_input_defaults(Aircraft.Wing.SLAT_SPAN_RATIO, val=0.9) - self.prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') + prob.model.set_input_defaults(Aircraft.Fuel.DENSITY, val=6.687, units='lbm/galUS') + prob.model.set_input_defaults(Aircraft.Fuel.VOLUME_MARGIN, val=0.0, units='unitless') - setup_model_options(self.prob, options) + prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units='ft') + prob.model.set_input_defaults(Aircraft.Wing.SLAT_CHORD_RATIO, val=0.15) + prob.model.set_input_defaults(Aircraft.Wing.FLAP_CHORD_RATIO, val=0.3) + prob.model.set_input_defaults(Aircraft.Wing.SLAT_SPAN_RATIO, val=0.9) + prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') - self.prob.setup(check=False, force_alloc_complex=True) + # setup_model_options(prob, options) + prob.model_options['*'] = { + Aircraft.Electrical.HAS_HYBRID_SYSTEM: False, + Aircraft.CrewPayload.Design.NUM_PASSENGERS: 180, + Aircraft.CrewPayload.NUM_PASSENGERS: 180, + Aircraft.Design.CRUISE_ALTITUDE: (37500, 'ft'), + Aircraft.Wing.CHOOSE_FOLD_LOCATION: False, + Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.LandingGear.FIXED_GEAR: False, + Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 6, + Aircraft.Fuselage.NUM_AISLES: 1, + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (29, 'inch'), + Aircraft.Engine.ADDITIONAL_MASS_FRACTION: 0.14, + Aircraft.Engine.NUM_ENGINES: [2], + Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], + Aircraft.Wing.HAS_FOLD: False, + Aircraft.Wing.HAS_STRUT: False, + Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, + Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, + Aircraft.Electrical.HAS_HYBRID_SYSTEM: False, + Aircraft.Design.TYPE: AircraftTypes.TRANSPORT, + Aircraft.Design.PART25_STRUCTURAL_CATEGORY: 3, + Aircraft.Wing.LOADING_ABOVE_20: True, + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: 2, + Aircraft.Propulsion.TOTAL_NUM_ENGINES: 2, + Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES: False, + } + prob.setup(check=False, force_alloc_complex=True) - def test_case1(self): - self.prob.run_model() + def test_case(self): + prob = self.prob + prob.run_model() tol = 5e-4 # size values: - assert_near_equal(self.prob['size.cabin_height'], 13.1, tol) - assert_near_equal(self.prob['size.cabin_len'], 72.1, tol) - assert_near_equal(self.prob['size.nose_height'], 8.6, tol) + assert_near_equal(prob['size.cabin_height'], 13.1, tol) + assert_near_equal(prob['size.cabin_len'], 72.1, tol) + assert_near_equal(prob['size.nose_height'], 8.6, tol) - assert_near_equal(self.prob[Aircraft.Wing.CENTER_CHORD], 16.16, tol) - assert_near_equal(self.prob[Aircraft.Wing.ROOT_CHORD], 15.1, tol) + assert_near_equal(prob[Aircraft.Wing.CENTER_CHORD], 16.16, tol) + assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 15.1, tol) assert_near_equal( - self.prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.1394, tol + prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.1394, tol ) # slightly different from GASP value, likely rounding error assert_near_equal( - self.prob[Aircraft.HorizontalTail.AVERAGE_CHORD], 8.848695928254141, tol + prob[Aircraft.HorizontalTail.AVERAGE_CHORD], 8.848695928254141, tol ) # note: this is not the value in the GASP output, because the output calculates them differently. This was calculated by hand. assert_near_equal( - self.prob[Aircraft.VerticalTail.AVERAGE_CHORD], 15.550266681026597, tol + prob[Aircraft.VerticalTail.AVERAGE_CHORD], 15.550266681026597, tol ) # note: this is not the value in the GASP output, because the output calculates them differently. This was calculated by hand. - assert_near_equal(self.prob[Aircraft.Nacelle.AVG_LENGTH], 14.7, tol) + assert_near_equal(prob[Aircraft.Nacelle.AVG_LENGTH], 14.7, tol) # fixed mass values: assert_near_equal( - self.prob[Aircraft.LandingGear.MAIN_GEAR_MASS], + prob[Aircraft.LandingGear.MAIN_GEAR_MASS], 6384.349999999999, tol, - # self.prob['main_gear_mass'], 6384.349999999999, tol + # prob['main_gear_mass'], 6384.349999999999, tol ) # calculated by hand - assert_near_equal(self.prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 12606, tol) - assert_near_equal(self.prob[Aircraft.Engine.ADDITIONAL_MASS], 1765 / 2, tol) + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 12606, tol) + assert_near_equal(prob[Aircraft.Engine.ADDITIONAL_MASS], 1765 / 2, tol) # wing values: - assert_near_equal(self.prob['isolated_wing_mass'], 14631, tol) + assert_near_equal(prob['isolated_wing_mass'], 14631, tol) # fuel values: assert_near_equal( - self.prob['OEM_wingfuel_mass'], 81257.899404, tol + prob['OEM_wingfuel_mass'], 81257.899404, tol ) # modified from GASP value to account for updated crew mass. GASP value is 81424.8 - assert_near_equal(self.prob['fus_mass_full'], 102510.642, tol) # calculated by hand + assert_near_equal(prob['fus_mass_full'], 102510.642, tol) # calculated by hand assert_near_equal( - self.prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 1855.57387556, tol + prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 1855.57387556, tol ) # modified from GASP value to account for updated crew mass. GASP value is 1862 - assert_near_equal(self.prob[Aircraft.Design.STRUCTURE_MASS], 48940.74, tol) - assert_near_equal(self.prob[Aircraft.Fuselage.MASS], 18674.791, tol) + assert_near_equal(prob[Aircraft.Design.STRUCTURE_MASS], 48940.74, tol) + assert_near_equal(prob[Aircraft.Fuselage.MASS], 18674.791, tol) assert_near_equal( - self.prob[Aircraft.Propulsion.MASS], 16225.793, tol + prob[Aircraft.Propulsion.MASS], 16225.793, tol ) # modified from GASP value to account for updated crew mass. GASP value is 16233 assert_near_equal( - self.prob['fuel_mass_min'], 35217.899404, tol + prob['fuel_mass_min'], 35217.899404, tol ) # modified from GASP value to account for updated crew mass. GASP value is 35384.8 assert_near_equal( - self.prob[Aircraft.Fuel.WING_VOLUME_DESIGN], 904.75547818, tol + prob[Aircraft.Fuel.WING_VOLUME_DESIGN], 904.75547818, tol ) # modified from GASP value to account for updated crew mass. GASP value is 908.1 assert_near_equal( - self.prob['OEM_fuel_vol'], 1624.4353052, tol + prob['OEM_fuel_vol'], 1624.4353052, tol ) # modified from GASP value to account for updated crew mass. GASP value is 1627.8 assert_near_equal( - self.prob[Mission.OPERATING_MASS], 94142.100596, tol + prob[Mission.OPERATING_MASS], 94142.100596, tol ) # modified from GASP value to account for updated crew mass. GASP value is 93975 assert_near_equal( - self.prob['payload_mass_max_fuel'], 34594.23826045, tol + prob['payload_mass_max_fuel'], 34594.23826045, tol ) # note: value came from running the GASP code on my own and printing it out, #modified from GASP value to account for updated crew mass. GASP value is 34427.4 - assert_near_equal(self.prob['volume_wingfuel_mass'], 43852.1, tol) - assert_near_equal(self.prob['max_wingfuel_mass'], 43852.1, tol) + assert_near_equal(prob['volume_wingfuel_mass'], 43852.1, tol) + assert_near_equal(prob['max_wingfuel_mass'], 43852.1, tol) assert_near_equal( - self.prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 1405.76173955, tol + prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 1405.76173955, tol ) # modified from GASP value to account for updated crew mass. GASP value is 1572.6 assert_near_equal( - self.prob['extra_fuel_volume'], 28.10273238, tol + prob['extra_fuel_volume'], 28.10273238, tol ) # slightly different from GASP value, likely a rounding error, #modified from GASP value to account for updated crew mass. GASP value is 31.43 assert_near_equal( - self.prob['max_extra_fuel_mass'], 1405.76173955, tol + prob['max_extra_fuel_mass'], 1405.76173955, tol ) # modified from GASP value to account for updated crew mass. GASP value is 1572.6 - partial_data = self.prob.check_partials(out_stream=None, method='cs') + partial_data = prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, atol=3e-10, rtol=1e-12) -@use_tempdirs -class MassSummationTestCase6(unittest.TestCase): +class MassPremissionTestCase6(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 All values are from V3.6 output (or hand calculated from the output, and these cases are specified). @@ -2144,361 +1485,317 @@ class MassSummationTestCase6(unittest.TestCase): def setUp(self): options = AviaryValues() - options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=180, units='unitless') - options.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, val=180, units='unitless') - options.set_val(Aircraft.Design.CRUISE_ALTITUDE, val=37500, units='ft') - options.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, val=False, units='unitless') - options.set_val( - Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless' - ) - options.set_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless') - options.set_val(Aircraft.LandingGear.FIXED_GEAR, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) - options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) - options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') - - options.set_val(Aircraft.Engine.NUM_ENGINES, [2], units='unitless') - options.set_val(Aircraft.Engine.TYPE, [GASPEngineType.TURBOJET], units='unitless') - options.set_val(Aircraft.Wing.HAS_FOLD, val=False, units='unitless') - options.set_val(Aircraft.Wing.HAS_STRUT, val=False, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Design.TYPE, AircraftTypes.TRANSPORT, units='unitless') - options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, 3, units='unitless') - options.set_val(Aircraft.Wing.LOADING_ABOVE_20, True, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 2, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2, units='unitless') - options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, False, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless') + options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless') + options.set_val(Settings.VERBOSITY, 0) - self.prob = om.Problem() - self.prob.model.add_subsystem( - 'size', - SizeGroup(), - promotes_inputs=['aircraft:*'], - promotes_outputs=[ - 'aircraft:*', - ], - ) - self.prob.model.add_subsystem( - 'GASP_mass', - MassPremission(), - promotes=['*'], + prob = self.prob = om.Problem() + prob.model.add_subsystem( + 'premission', + PreMission(aviary_options=options), + promotes_outputs=['*'], + promotes_inputs=['*'], ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') - self.prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') + prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + prob.model.set_input_defaults( Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS, val=200, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.00030975, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=10.13, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.33, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=25, units='deg') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=10.13, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.33, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=25, units='deg') + prob.model.set_input_defaults( Aircraft.Wing.THICKNESS_TO_CHORD_ROOT, val=0.15, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=175400, units='lbm') - self.prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=150, units='lbf/ft**2') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=175400, units='lbm') + prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=150, units='lbf/ft**2') + prob.model.set_input_defaults( Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, val=0, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.ASPECT_RATIO, val=1.67, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Engine.SCALED_SLS_THRUST, val=29500.0, units='lbf' - ) - self.prob.model.set_input_defaults( - Aircraft.Engine.WING_LOCATIONS, val=0.35, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PRESSURE_DIFFERENTIAL, val=7.5, units='psi' - ) - self.prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Engine.SCALED_SLS_THRUST, val=29500.0, units='lbf') + prob.model.set_input_defaults(Aircraft.Engine.WING_LOCATIONS, val=0.35, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.PRESSURE_DIFFERENTIAL, val=7.5, units='psi') + prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units='unitless') + prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) - - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') # Adjust WETTED_AREA_SCALER such that WETTED_AREA = 4000.0 - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuselage.WETTED_AREA_SCALER, val=0.86215, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless') + prob.model.set_input_defaults( Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') + prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - # self.prob.model.set_input_defaults( + # prob.model.set_input_defaults( # Aircraft.Engine.REFERENCE_SLS_THRUST, 28690, units='lbf' # ) - self.prob.model.set_input_defaults( - Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') + prob.model.set_input_defaults(Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless') + prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h' - ) + prob.model.set_input_defaults(Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h') - self.prob.model.set_input_defaults(Aircraft.CrewPayload.CARGO_MASS, val=0, units='lbm') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.CrewPayload.CARGO_MASS, val=0, units='lbm') + prob.model.set_input_defaults( Aircraft.CrewPayload.Design.MAX_CARGO_MASS, val=10040, units='lbm' ) - self.prob.model.set_input_defaults(Aircraft.VerticalTail.SWEEP, val=0, units='deg') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.VerticalTail.SWEEP, val=0, units='deg') + prob.model.set_input_defaults( Aircraft.HorizontalTail.MASS_COEFFICIENT, val=0.232, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.TAIL_HOOK_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.MASS_COEFFICIENT, val=0.289, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.THICKNESS_TO_CHORD, val=0.12, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.THICKNESS_TO_CHORD, val=0.12, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT, val=1.9, units='unitless' ) # Based onlarge single aisle 1for updated flaps mass model - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Mission.Landing.LIFT_COEFFICIENT_MAX, val=2.817, units='unitless' ) # Based onlarge single aisle 1for updated flaps mass model - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.SURFACE_CONTROL_MASS_COEFFICIENT, val=0.95, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Design.COCKPIT_CONTROL_MASS_COEFFICIENT, val=16.5, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.STABILITY_AUGMENTATION_SYSTEM_REFERENCE_MASS, val=0, units='lbm' ) # note: not actually defined in program, likely an error - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.COCKPIT_CONTROL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.SURFACE_CONTROL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.STABILITY_AUGMENTATION_SYSTEM_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.MASS, val=0, units='lbm' ) # note: not actually defined in program, likely an error - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.MASS_COEFFICIENT, val=0.04, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.MAIN_GEAR_MASS_FRACTION, val=0.85, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Nacelle.CLEARANCE_RATIO, val=0.2, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Engine.MASS_SPECIFIC, val=0.21366, units='lbm/lbf' - ) - self.prob.model.set_input_defaults(Aircraft.Nacelle.MASS_SPECIFIC, val=3, units='lbm/ft**2') - self.prob.model.set_input_defaults(Aircraft.Engine.PYLON_FACTOR, val=1.25, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Engine.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Propulsion.MISC_MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Nacelle.CLEARANCE_RATIO, val=0.2, units='unitless') + prob.model.set_input_defaults(Aircraft.Engine.MASS_SPECIFIC, val=0.21366, units='lbm/lbf') + prob.model.set_input_defaults(Aircraft.Nacelle.MASS_SPECIFIC, val=3, units='lbm/ft**2') + prob.model.set_input_defaults(Aircraft.Engine.PYLON_FACTOR, val=1.25, units='unitless') + prob.model.set_input_defaults(Aircraft.Engine.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Propulsion.MISC_MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults( Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0.15, units='unitless' ) - # self.prob.model.set_input_defaults(Aircraft.APU.MASS, val=928.0, units='lbm') - self.prob.model.set_input_defaults( + # prob.model.set_input_defaults(Aircraft.APU.MASS, val=928.0, units='lbm') + prob.model.set_input_defaults( Aircraft.Instruments.MASS_COEFFICIENT, val=0.0736, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Hydraulics.FLIGHT_CONTROL_MASS_COEFFICIENT, val=0.112, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Hydraulics.GEAR_MASS_COEFFICIENT, val=0.14, units='unitless' ) - # self.prob.model.set_input_defaults(Aircraft.Avionics.MASS, val=1959.0, units='lbm') - self.prob.model.set_input_defaults( + # prob.model.set_input_defaults(Aircraft.Avionics.MASS, val=1959.0, units='lbm') + prob.model.set_input_defaults( Aircraft.AirConditioning.MASS_COEFFICIENT, val=1.65, units='unitless' ) - # self.prob.model.set_input_defaults(Aircraft.AntiIcing.MASS, val=551.0, units='lbm') - # self.prob.model.set_input_defaults(Aircraft.Furnishings.MASS, val=11192.0, units='lbm') - self.prob.model.set_input_defaults( + # prob.model.set_input_defaults(Aircraft.AntiIcing.MASS, val=551.0, units='lbm') + # prob.model.set_input_defaults(Aircraft.Furnishings.MASS, val=11192.0, units='lbm') + prob.model.set_input_defaults( Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_PER_PASSENGER, val=5.0, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.WATER_MASS_PER_OCCUPANT, val=3.0, units='lbm' ) - # self.prob.model.set_input_defaults( + # prob.model.set_input_defaults( # Aircraft.Design.EMERGENCY_EQUIPMENT_MASS, val=50.0, units='lbm' # ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.CATERING_ITEMS_MASS_PER_PASSENGER, val=7.6, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuel.UNUSABLE_FUEL_MASS_COEFFICIENT, val=12.0, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Wing.MASS_COEFFICIENT, val=102.5, units='unitless' - ) + prob.model.set_input_defaults(Aircraft.Wing.MASS_COEFFICIENT, val=102.5, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Fuselage.MASS_COEFFICIENT, val=128, units='unitless' - ) - self.prob.model.set_input_defaults('pylon_len', val=0, units='ft') - self.prob.model.set_input_defaults('pylon_len', val=0, units='ft') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.MASS_COEFFICIENT, val=128, units='unitless') + prob.model.set_input_defaults('pylon_len', val=0, units='ft') + prob.model.set_input_defaults('pylon_len', val=0, units='ft') + prob.model.set_input_defaults( 'MAT', val=0, units='lbm' ) # note: not actually defined in program, likely an error - self.prob.model.set_input_defaults(Aircraft.Wing.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.HorizontalTail.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.VerticalTail.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults( Aircraft.LandingGear.TOTAL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.POD_MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Design.STRUCTURAL_MASS_INCREMENT, val=0, units='lbm' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Engine.POD_MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Design.STRUCTURAL_MASS_INCREMENT, val=0, units='lbm') + prob.model.set_input_defaults( Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuel.FUEL_SYSTEM_MASS_COEFFICIENT, val=0.041, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Fuel.DENSITY, val=6.687, units='lbm/galUS') - self.prob.model.set_input_defaults(Aircraft.Fuel.VOLUME_MARGIN, val=10.0, units='unitless') - - self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units='ft') - self.prob.model.set_input_defaults(Aircraft.Wing.SLAT_CHORD_RATIO, val=0.15) - self.prob.model.set_input_defaults(Aircraft.Wing.FLAP_CHORD_RATIO, val=0.3) - self.prob.model.set_input_defaults(Aircraft.Wing.SLAT_SPAN_RATIO, val=0.9) - self.prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') + prob.model.set_input_defaults(Aircraft.Fuel.DENSITY, val=6.687, units='lbm/galUS') + prob.model.set_input_defaults(Aircraft.Fuel.VOLUME_MARGIN, val=10.0, units='unitless') - setup_model_options(self.prob, options) + prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units='ft') + prob.model.set_input_defaults(Aircraft.Wing.SLAT_CHORD_RATIO, val=0.15) + prob.model.set_input_defaults(Aircraft.Wing.FLAP_CHORD_RATIO, val=0.3) + prob.model.set_input_defaults(Aircraft.Wing.SLAT_SPAN_RATIO, val=0.9) + prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') - self.prob.setup(check=False, force_alloc_complex=True) + # setup_model_options(prob, options) + prob.model_options['*'] = { + Aircraft.Electrical.HAS_HYBRID_SYSTEM: False, + Aircraft.CrewPayload.Design.NUM_PASSENGERS: 180, + Aircraft.CrewPayload.NUM_PASSENGERS: 180, + Aircraft.Design.CRUISE_ALTITUDE: (37500, 'ft'), + Aircraft.Wing.CHOOSE_FOLD_LOCATION: False, + Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.LandingGear.FIXED_GEAR: False, + Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 6, + Aircraft.Fuselage.NUM_AISLES: 1, + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (29, 'inch'), + Aircraft.Engine.ADDITIONAL_MASS_FRACTION: 0.14, + Aircraft.Engine.NUM_ENGINES: [2], + Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], + Aircraft.Wing.HAS_FOLD: False, + Aircraft.Wing.HAS_STRUT: False, + Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, + Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, + Aircraft.Design.TYPE: AircraftTypes.TRANSPORT, + Aircraft.Design.PART25_STRUCTURAL_CATEGORY: 3, + Aircraft.Wing.LOADING_ABOVE_20: True, + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: 2, + Aircraft.Propulsion.TOTAL_NUM_ENGINES: 2, + Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES: False, + } + prob.setup(check=False, force_alloc_complex=True) - def test_case1(self): - self.prob.run_model() + def test_case(self): + prob = self.prob + prob.run_model() tol = 5e-4 # size values: - assert_near_equal(self.prob['size.cabin_height'], 13.1, tol) - assert_near_equal(self.prob['size.cabin_len'], 72.1, tol) - assert_near_equal(self.prob['size.nose_height'], 8.6, tol) + assert_near_equal(prob['size.cabin_height'], 13.1, tol) + assert_near_equal(prob['size.cabin_len'], 72.1, tol) + assert_near_equal(prob['size.nose_height'], 8.6, tol) - assert_near_equal(self.prob[Aircraft.Wing.CENTER_CHORD], 16.16, tol) - assert_near_equal(self.prob[Aircraft.Wing.ROOT_CHORD], 15.1, tol) + assert_near_equal(prob[Aircraft.Wing.CENTER_CHORD], 16.16, tol) + assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 15.1, tol) assert_near_equal( - self.prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.1394, tol + prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.1394, tol ) # note: not exact GASP value, likely rounding error assert_near_equal( - self.prob[Aircraft.HorizontalTail.AVERAGE_CHORD], 8.848695928254141, tol + prob[Aircraft.HorizontalTail.AVERAGE_CHORD], 8.848695928254141, tol ) # note: this is not the value in the GASP output, because the output calculates them differently. This was calculated by hand. assert_near_equal( - self.prob[Aircraft.VerticalTail.AVERAGE_CHORD], 15.550266681026597, tol + prob[Aircraft.VerticalTail.AVERAGE_CHORD], 15.550266681026597, tol ) # note: this is not the value in the GASP output, because the output calculates them differently. This was calculated by hand. - assert_near_equal(self.prob[Aircraft.Nacelle.AVG_LENGTH], 14.7, tol) + assert_near_equal(prob[Aircraft.Nacelle.AVG_LENGTH], 14.7, tol) # fixed mass values: assert_near_equal( - self.prob[Aircraft.LandingGear.MAIN_GEAR_MASS], + prob[Aircraft.LandingGear.MAIN_GEAR_MASS], 6384.349999999999, tol, - # self.prob['main_gear_mass'], 6384.349999999999, tol + # prob['main_gear_mass'], 6384.349999999999, tol ) # calculated by hand - assert_near_equal(self.prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 12606, tol) - assert_near_equal(self.prob[Aircraft.Engine.ADDITIONAL_MASS], 1765 / 2, tol) + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 12606, tol) + assert_near_equal(prob[Aircraft.Engine.ADDITIONAL_MASS], 1765 / 2, tol) # wing values: - assert_near_equal(self.prob['isolated_wing_mass'], 14631, tol) + assert_near_equal(prob['isolated_wing_mass'], 14631, tol) # fuel values: assert_near_equal( - self.prob['OEM_wingfuel_mass'], 80806.43449445, tol + prob['OEM_wingfuel_mass'], 80806.43449445, tol ) # modified from GASP value to account for updated crew mass. GASP value is 80982.7 - assert_near_equal(self.prob['fus_mass_full'], 106989.952, tol) # calculated by hand + assert_near_equal(prob['fus_mass_full'], 106989.952, tol) # calculated by hand assert_near_equal( - self.prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 2020.77019449, tol + prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 2020.77019449, tol ) # modified from GASP value to account for updated crew mass. GASP value is 2029 - assert_near_equal(self.prob[Aircraft.Design.STRUCTURE_MASS], 49209.648, tol) - assert_near_equal(self.prob[Aircraft.Fuselage.MASS], 18960.975, tol) + assert_near_equal(prob[Aircraft.Design.STRUCTURE_MASS], 49209.648, tol) + assert_near_equal(prob[Aircraft.Fuselage.MASS], 18960.975, tol) assert_near_equal( - self.prob[Aircraft.Propulsion.MASS], 16390.94, tol + prob[Aircraft.Propulsion.MASS], 16390.94, tol ) # modified from GASP value to account for updated crew mass. GASP value is 16399 assert_near_equal( - self.prob['fuel_mass_min'], 34766.43449445, tol + prob['fuel_mass_min'], 34766.43449445, tol ) # modified from GASP value to account for updated crew mass. GASP value is 34942.7 assert_near_equal( - self.prob[Aircraft.Fuel.WING_VOLUME_DESIGN], 985.30321469, tol + prob[Aircraft.Fuel.WING_VOLUME_DESIGN], 985.30321469, tol ) # modified from GASP value to account for updated crew mass. GASP value is 989.2 assert_near_equal( - self.prob['OEM_fuel_vol'], 1615.4100222, tol + prob['OEM_fuel_vol'], 1615.4100222, tol ) # modified from GASP value to account for updated crew mass. GASP value is 1618.9 assert_near_equal( - self.prob[Mission.OPERATING_MASS], 94593.56550555, tol + prob[Mission.OPERATING_MASS], 94593.56550555, tol ) # modified from GASP value to account for updated crew mass. GASP value is 94417 assert_near_equal( - self.prob['payload_mass_max_fuel'], 35045.70322352, tol + prob['payload_mass_max_fuel'], 35045.70322352, tol ) # note: value came from running the GASP code on my own and printing it out, #modified from GASP value to account for updated crew mass. GASP value is 34879.2 - assert_near_equal(self.prob['volume_wingfuel_mass'], 43852.1, tol) - assert_near_equal(self.prob['max_wingfuel_mass'], 43852.1, tol) + assert_near_equal(prob['volume_wingfuel_mass'], 43852.1, tol) + assert_near_equal(prob['max_wingfuel_mass'], 43852.1, tol) assert_near_equal( - self.prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 954.29683, tol + prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 954.29683, tol ) # modified from GASP value to account for updated crew mass. GASP value is 1120.9 assert_near_equal( - self.prob['extra_fuel_volume'], 108.65046889, tol + prob['extra_fuel_volume'], 108.65046889, tol ) # modified from GASP value to account for updated crew mass. GASP value is 112.3 assert_near_equal( - self.prob['max_extra_fuel_mass'], 5434.94027945, tol + prob['max_extra_fuel_mass'], 5434.94027945, tol ) # modified from GASP value to account for updated crew mass. GASP value is 5618.2 - partial_data = self.prob.check_partials(out_stream=None, method='cs') + partial_data = prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, atol=3e-10, rtol=1e-12) @use_tempdirs -class MassSummationTestCase7(unittest.TestCase): +class MassPremissionTestCase7(unittest.TestCase): """ This is the Advanced Tube and Wing V3.6 test case. All values are from V3.6 output, hand calculated from the output, or were printed out after running the code manually. @@ -2507,382 +1804,334 @@ class MassSummationTestCase7(unittest.TestCase): def setUp(self): options = AviaryValues() - options.set_val(Aircraft.Wing.HAS_FOLD, val=True, units='unitless') - options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=154, units='unitless') - options.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, val=154, units='unitless') - options.set_val(Aircraft.Design.CRUISE_ALTITUDE, val=37100, units='ft') - options.set_val( - Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless' - ) - options.set_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless') - options.set_val(Aircraft.LandingGear.FIXED_GEAR, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) - options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) - options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.165, units='unitless') - - options.set_val(Aircraft.Engine.NUM_ENGINES, [2], units='unitless') - options.set_val(Aircraft.Engine.TYPE, [GASPEngineType.TURBOJET], units='unitless') - options.set_val(Aircraft.Wing.HAS_STRUT, val=False, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Design.TYPE, AircraftTypes.TRANSPORT, units='unitless') - options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, 3, units='unitless') - options.set_val(Aircraft.Wing.LOADING_ABOVE_20, True, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 2, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2, units='unitless') - options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, False, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless') + options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.09986, units='unitless') + options.set_val(Settings.VERBOSITY, 0) - self.prob = om.Problem() - self.prob.model.add_subsystem( - 'size', - SizeGroup(), - promotes_inputs=['aircraft:*'], - promotes_outputs=[ - 'aircraft:*', - ], - ) - self.prob.model.add_subsystem( - 'GASP_mass', - MassPremission(), - promotes=['*'], + prob = self.prob = om.Problem() + prob.model.add_subsystem( + 'premission', + PreMission(aviary_options=options), + promotes_outputs=['*'], + promotes_inputs=['*'], ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') - self.prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') + prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + prob.model.set_input_defaults( Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS, val=200, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.0003482075, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=11, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.33, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=25, units='deg') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=11, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.33, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=25, units='deg') + prob.model.set_input_defaults( Aircraft.Wing.THICKNESS_TO_CHORD_ROOT, val=0.12, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=145388.0, units='lbm') - self.prob.model.set_input_defaults( - Aircraft.Design.WING_LOADING, val=104.50, units='lbf/ft**2' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=145388.0, units='lbm') + prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=104.50, units='lbf/ft**2') + prob.model.set_input_defaults( Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, val=0, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.ASPECT_RATIO, val=1.67, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Engine.SCALED_SLS_THRUST, val=17000.0, units='lbf' - ) - self.prob.model.set_input_defaults( - Aircraft.Engine.WING_LOCATIONS, val=0.35, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PRESSURE_DIFFERENTIAL, val=7.5, units='psi' - ) - self.prob.model.set_input_defaults( - Aircraft.Fuel.WING_FUEL_FRACTION, 0.475, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Engine.SCALED_SLS_THRUST, val=17000.0, units='lbf') + prob.model.set_input_defaults(Aircraft.Engine.WING_LOCATIONS, val=0.35, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.PRESSURE_DIFFERENTIAL, val=7.5, units='psi') + prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.475, units='unitless') + prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) - - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.09986, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Fuselage.WETTED_AREA_SCALER, 1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.1, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.WETTED_AREA_SCALER, 1, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.1, units='unitless') + prob.model.set_input_defaults( Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MOMENT_RATIO, 2.1621, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 2.1621, units='unitless') + prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - # self.prob.model.set_input_defaults( + # prob.model.set_input_defaults( # Aircraft.Engine.REFERENCE_SLS_THRUST, 28620.0, units='lbf' # ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.2095, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 1.715, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.FOLDED_SPAN, 118, units='ft') + prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 1.715, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.FOLDED_SPAN, 118, units='ft') - self.prob.model.set_input_defaults( - Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h' - ) - self.prob.model.set_input_defaults(Aircraft.CrewPayload.CARGO_MASS, val=0, units='lbm') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h') + prob.model.set_input_defaults(Aircraft.CrewPayload.CARGO_MASS, val=0, units='lbm') + prob.model.set_input_defaults( Aircraft.CrewPayload.Design.MAX_CARGO_MASS, val=15970.0, units='lbm' ) - self.prob.model.set_input_defaults(Aircraft.VerticalTail.SWEEP, val=0, units='deg') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.VerticalTail.SWEEP, val=0, units='deg') + prob.model.set_input_defaults( Aircraft.HorizontalTail.MASS_COEFFICIENT, val=0.232, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.TAIL_HOOK_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.MASS_COEFFICIENT, val=0.289, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.THICKNESS_TO_CHORD, val=0.12, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.THICKNESS_TO_CHORD, val=0.12, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT, val=1.9, units='unitless' ) # Based onlarge single aisle 1for updated flaps mass model - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Mission.Landing.LIFT_COEFFICIENT_MAX, val=2.817, units='unitless' ) # Based on large single aisle 1 for updated flaps mass model - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.SURFACE_CONTROL_MASS_COEFFICIENT, val=0.95, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Design.COCKPIT_CONTROL_MASS_COEFFICIENT, val=16.5, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.STABILITY_AUGMENTATION_SYSTEM_REFERENCE_MASS, val=0, units='lbm' ) # note: not actually defined in program, likely an error - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.COCKPIT_CONTROL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.SURFACE_CONTROL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.STABILITY_AUGMENTATION_SYSTEM_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.MASS, val=0, units='lbm' ) # note: not actually defined in program, likely an error - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.MASS_COEFFICIENT, val=0.04, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.MAIN_GEAR_MASS_FRACTION, val=0.85, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Nacelle.CLEARANCE_RATIO, val=0.2, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Engine.MASS_SPECIFIC, val=0.2355, units='lbm/lbf' - ) - self.prob.model.set_input_defaults(Aircraft.Nacelle.MASS_SPECIFIC, val=3, units='lbm/ft**2') - self.prob.model.set_input_defaults(Aircraft.Engine.PYLON_FACTOR, val=1.25, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Engine.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Propulsion.MISC_MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Nacelle.CLEARANCE_RATIO, val=0.2, units='unitless') + prob.model.set_input_defaults(Aircraft.Engine.MASS_SPECIFIC, val=0.2355, units='lbm/lbf') + prob.model.set_input_defaults(Aircraft.Nacelle.MASS_SPECIFIC, val=3, units='lbm/ft**2') + prob.model.set_input_defaults(Aircraft.Engine.PYLON_FACTOR, val=1.25, units='unitless') + prob.model.set_input_defaults(Aircraft.Engine.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Propulsion.MISC_MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults( Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0.15, units='unitless' ) - # self.prob.model.set_input_defaults(Aircraft.APU.MASS, val=1014.0, units='lbm') - self.prob.model.set_input_defaults( + # prob.model.set_input_defaults(Aircraft.APU.MASS, val=1014.0, units='lbm') + prob.model.set_input_defaults( Aircraft.Instruments.MASS_COEFFICIENT, val=0.0736, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Hydraulics.FLIGHT_CONTROL_MASS_COEFFICIENT, val=0.085, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Hydraulics.GEAR_MASS_COEFFICIENT, val=0.105, units='unitless' ) - # self.prob.model.set_input_defaults(Aircraft.Avionics.MASS, val=1504.0, units='lbm') - self.prob.model.set_input_defaults( + # prob.model.set_input_defaults(Aircraft.Avionics.MASS, val=1504.0, units='lbm') + prob.model.set_input_defaults( Aircraft.AirConditioning.MASS_COEFFICIENT, val=1.65, units='unitless' ) - # self.prob.model.set_input_defaults(Aircraft.AntiIcing.MASS, val=126.0, units='lbm') - # self.prob.model.set_input_defaults(Aircraft.Furnishings.MASS, val=9114.0, units='lbm') - self.prob.model.set_input_defaults( + # prob.model.set_input_defaults(Aircraft.AntiIcing.MASS, val=126.0, units='lbm') + # prob.model.set_input_defaults(Aircraft.Furnishings.MASS, val=9114.0, units='lbm') + prob.model.set_input_defaults( Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_PER_PASSENGER, val=5.0, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.WATER_MASS_PER_OCCUPANT, val=3.0, units='lbm' ) - # self.prob.model.set_input_defaults( + # prob.model.set_input_defaults( # Aircraft.Design.EMERGENCY_EQUIPMENT_MASS, val=0.0, units='lbm' # ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.CATERING_ITEMS_MASS_PER_PASSENGER, val=10.0, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuel.UNUSABLE_FUEL_MASS_COEFFICIENT, val=12.0, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.MASS_COEFFICIENT, val=85, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.MASS_COEFFICIENT, val=85, units='unitless') + prob.model.set_input_defaults( Aircraft.Wing.FOLD_MASS_COEFFICIENT, val=0.2, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Fuselage.MASS_COEFFICIENT, val=128, units='unitless' - ) - self.prob.model.set_input_defaults('pylon_len', val=0, units='ft') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.MASS_COEFFICIENT, val=128, units='unitless') + prob.model.set_input_defaults('pylon_len', val=0, units='ft') + prob.model.set_input_defaults( Aircraft.Wing.FOLD_MASS_COEFFICIENT, val=0.2, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Fuselage.MASS_COEFFICIENT, val=128, units='unitless' - ) - self.prob.model.set_input_defaults('pylon_len', val=0, units='ft') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.MASS_COEFFICIENT, val=128, units='unitless') + prob.model.set_input_defaults('pylon_len', val=0, units='ft') + prob.model.set_input_defaults( 'MAT', val=0, units='lbm' ) # note: not actually defined in program, likely an error - self.prob.model.set_input_defaults(Aircraft.Wing.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.HorizontalTail.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.VerticalTail.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults( Aircraft.LandingGear.TOTAL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.POD_MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Design.STRUCTURAL_MASS_INCREMENT, val=0, units='lbm' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Engine.POD_MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Design.STRUCTURAL_MASS_INCREMENT, val=0, units='lbm') + prob.model.set_input_defaults( Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuel.FUEL_SYSTEM_MASS_COEFFICIENT, val=0.041, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Fuel.DENSITY, val=6.687, units='lbm/galUS') - self.prob.model.set_input_defaults(Aircraft.Fuel.VOLUME_MARGIN, val=10.0, units='unitless') - - self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units='ft') - self.prob.model.set_input_defaults(Aircraft.Design.MACH, val=0.8, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.SLAT_CHORD_RATIO, val=0.15) - self.prob.model.set_input_defaults(Aircraft.Wing.FLAP_CHORD_RATIO, val=0.3) - self.prob.model.set_input_defaults(Aircraft.Wing.SLAT_SPAN_RATIO, val=0.9) - self.prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') + prob.model.set_input_defaults(Aircraft.Fuel.DENSITY, val=6.687, units='lbm/galUS') + prob.model.set_input_defaults(Aircraft.Fuel.VOLUME_MARGIN, val=10.0, units='unitless') - setup_model_options(self.prob, options) + prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units='ft') + prob.model.set_input_defaults(Aircraft.Design.MACH, val=0.8, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.SLAT_CHORD_RATIO, val=0.15) + prob.model.set_input_defaults(Aircraft.Wing.FLAP_CHORD_RATIO, val=0.3) + prob.model.set_input_defaults(Aircraft.Wing.SLAT_SPAN_RATIO, val=0.9) + prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') - self.prob.setup(check=False, force_alloc_complex=True) + # setup_model_options(prob, options) + prob.model_options['*'] = { + Aircraft.Wing.HAS_FOLD: True, + Aircraft.Electrical.HAS_HYBRID_SYSTEM: False, + Aircraft.CrewPayload.Design.NUM_PASSENGERS: 154, + Aircraft.CrewPayload.NUM_PASSENGERS: 154, + Aircraft.Design.CRUISE_ALTITUDE: (37100, 'ft'), + Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.LandingGear.FIXED_GEAR: False, + Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 6, + Aircraft.Fuselage.NUM_AISLES: 1, + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (29, 'inch'), + Aircraft.Engine.ADDITIONAL_MASS_FRACTION: 0.165, + Aircraft.Engine.NUM_ENGINES: [2], + Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], + Aircraft.Wing.HAS_STRUT: False, + Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, + Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, + Aircraft.Design.TYPE: AircraftTypes.TRANSPORT, + Aircraft.Design.PART25_STRUCTURAL_CATEGORY: 3, + Aircraft.Wing.LOADING_ABOVE_20: True, + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: 2, + Aircraft.Propulsion.TOTAL_NUM_ENGINES: 2, + Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES: False, + } + prob.setup(check=False, force_alloc_complex=True) - def test_case1(self): - self.prob.run_model() + def test_case(self): + prob = self.prob + prob.run_model() tol = 5e-4 # size values: - assert_near_equal(self.prob['size.cabin_height'], 13.1, tol) - assert_near_equal(self.prob['size.cabin_len'], 61.6, tol) - assert_near_equal(self.prob['size.nose_height'], 8.6, tol) + assert_near_equal(prob['size.cabin_height'], 13.1, tol) + assert_near_equal(prob['size.cabin_len'], 61.6, tol) + assert_near_equal(prob['size.nose_height'], 8.6, tol) - assert_near_equal(self.prob[Aircraft.Wing.CENTER_CHORD], 16.91, tol) - assert_near_equal(self.prob[Aircraft.Wing.ROOT_CHORD], 16.01, tol) + assert_near_equal(prob[Aircraft.Wing.CENTER_CHORD], 16.91, tol) + assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 16.01, tol) assert_near_equal( - self.prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.1132, tol + prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.1132, tol ) # slightly different from GASP value, likely a rounding error assert_near_equal( - self.prob[Aircraft.HorizontalTail.AVERAGE_CHORD], + prob[Aircraft.HorizontalTail.AVERAGE_CHORD], 9.6498, tol, # note: value came from running the GASP code on my own and printing it out (GASP output calculates this differently) ) assert_near_equal( - self.prob[Aircraft.VerticalTail.AVERAGE_CHORD], + prob[Aircraft.VerticalTail.AVERAGE_CHORD], 13.4662, tol, # note: value came from running the GASP code on my own and printing it out (GASP output calculates this differently) ) - assert_near_equal(self.prob[Aircraft.Nacelle.AVG_LENGTH], 11.77, tol) + assert_near_equal(prob[Aircraft.Nacelle.AVG_LENGTH], 11.77, tol) # fixed mass values: assert_near_equal( - self.prob[Aircraft.LandingGear.MAIN_GEAR_MASS], + prob[Aircraft.LandingGear.MAIN_GEAR_MASS], 5219.3076, tol, - # self.prob['main_gear_mass'], 5219.3076, tol + # prob['main_gear_mass'], 5219.3076, tol ) # note: value came from running the GASP code on my own and printing it out - assert_near_equal(self.prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 8007, tol) - assert_near_equal(self.prob[Aircraft.Engine.ADDITIONAL_MASS], 1321 / 2, tol) + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 8007, tol) + assert_near_equal(prob[Aircraft.Engine.ADDITIONAL_MASS], 1321 / 2, tol) # wing values: assert_near_equal( - self.prob['isolated_wing_mass'], 13993, tol + prob['isolated_wing_mass'], 13993, tol ) # calculated as difference between wing mass and fold mass, not an actual GASP variable # fuel values: assert_near_equal( - self.prob['OEM_wingfuel_mass'], 62747.11317787, tol + prob['OEM_wingfuel_mass'], 62747.11317787, tol ) # modified from GASP value to account for updated crew mass. GASP value is 62427.2 assert_near_equal( - self.prob['fus_mass_full'], 99327.18981874, tol + prob['fus_mass_full'], 99327.18981874, tol ) # note: value came from running the GASP code on my own and printing it out assert_near_equal( - self.prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 1440.81480417, tol + prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 1440.81480417, tol ) # modified from GASP value to account for updated crew mass. GASP value is 1426 - assert_near_equal(self.prob[Aircraft.Design.STRUCTURE_MASS], 45370.902, tol) - assert_near_equal(self.prob[Aircraft.Fuselage.MASS], 18858.356, tol) + assert_near_equal(prob[Aircraft.Design.STRUCTURE_MASS], 45370.902, tol) + assert_near_equal(prob[Aircraft.Fuselage.MASS], 18858.356, tol) assert_near_equal( - self.prob[Aircraft.Propulsion.MASS], 10768.96980417, tol + prob[Aircraft.Propulsion.MASS], 10768.96980417, tol ) # modified from GASP value to account for updated crew mass. GASP value is 10755.0 assert_near_equal( - self.prob['fuel_mass_min'], 15977.11317787, tol + prob['fuel_mass_min'], 15977.11317787, tol ) # modified from GASP value to account for updated crew mass. GASP value is 15657.2 assert_near_equal( - self.prob[Aircraft.Fuel.WING_VOLUME_DESIGN], 702.52394928, tol + prob[Aircraft.Fuel.WING_VOLUME_DESIGN], 702.52394928, tol ) # modified from GASP value to account for updated crew mass. GASP value is 695.5 assert_near_equal( - self.prob['OEM_fuel_vol'], 1254.38420994, tol + prob['OEM_fuel_vol'], 1254.38420994, tol ) # modified from GASP value to account for updated crew mass. GASP value is 1248.0 assert_near_equal( - self.prob[Mission.OPERATING_MASS], 82640.88682213, tol + prob[Mission.OPERATING_MASS], 82640.88682213, tol ) # modified from GASP value to account for updated crew mass. GASP value is 82961.0 assert_near_equal( - self.prob['payload_mass_max_fuel'], 30800.0039, tol + prob['payload_mass_max_fuel'], 30800.0039, tol ) # note: value came from running the GASP code on my own and printing it out - assert_near_equal(self.prob['volume_wingfuel_mass'], 33892.8, tol) - assert_near_equal(self.prob['max_wingfuel_mass'], 33892.8, tol) - assert_near_equal(self.prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 0, tol) + assert_near_equal(prob['volume_wingfuel_mass'], 33892.8, tol) + assert_near_equal(prob['max_wingfuel_mass'], 33892.8, tol) + assert_near_equal(prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 0, tol) assert_near_equal( - self.prob['extra_fuel_volume'], 24.8957623, tol + 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'], 1245.34189936, tol + 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) + assert_near_equal(prob[Aircraft.Fuel.WING_VOLUME_STRUCTURAL_MAX], 677.554, tol) + assert_near_equal(prob[Aircraft.Fuel.WING_VOLUME_GEOMETRIC_MAX], 677.554, tol) - partial_data = self.prob.check_partials(out_stream=None, method='cs') + partial_data = prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, atol=3e-9, rtol=6e-11) @use_tempdirs -class MassSummationTestCase8(unittest.TestCase): +class MassPremissionTestCase8(unittest.TestCase): """ This is the Trans-sonic Truss-Braced Wing V3.6 test case All values are from V3.6 output, hand calculated from the output, or were printed out after running the code manually. @@ -2891,380 +2140,339 @@ class MassSummationTestCase8(unittest.TestCase): def setUp(self): options = AviaryValues() - options.set_val(Aircraft.Wing.HAS_FOLD, val=True, units='unitless') - options.set_val(Aircraft.Wing.HAS_STRUT, val=True, units='unitless') - options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=154, units='unitless') - options.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, val=154, units='unitless') - options.set_val(Aircraft.Design.CRUISE_ALTITUDE, val=43000, units='ft') - options.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, val=False, units='unitless') - options.set_val( - Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless' - ) - options.set_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless') - options.set_val(Aircraft.LandingGear.FIXED_GEAR, val=False, units='unitless') - options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, val=True, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) - options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) - options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 44.2, units='inch') - options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.163, units='unitless') - - options.set_val(Aircraft.Engine.NUM_ENGINES, [2], units='unitless') - options.set_val(Aircraft.Engine.TYPE, [GASPEngineType.TURBOJET], units='unitless') - options.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Design.TYPE, AircraftTypes.TRANSPORT, units='unitless') - options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, 3, units='unitless') - options.set_val(Aircraft.Wing.LOADING_ABOVE_20, True, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 2, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.43, units='unitless') + options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.066, units='unitless') + options.set_val(Settings.VERBOSITY, 0) - self.prob = om.Problem() - self.prob.model.add_subsystem( - 'size', - SizeGroup(), - promotes_inputs=['aircraft:*'], - promotes_outputs=[ - 'aircraft:*', - ], - ) - self.prob.model.add_subsystem( - 'GASP_mass', - MassPremission(), - promotes=['*'], + prob = self.prob = om.Problem() + prob.model.add_subsystem( + 'premission', + PreMission(aviary_options=options), + promotes_outputs=['*'], + promotes_inputs=['*'], ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') - self.prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') + prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + prob.model.set_input_defaults( Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS, val=200, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.000474, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.MOMENT_RATIO, val=0.13067, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.025, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MOMENT_RATIO, 3.0496, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 3.0496, units='unitless') + prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) - # self.prob.model.set_input_defaults( + # prob.model.set_input_defaults( # Aircraft.Engine.REFERENCE_SLS_THRUST, 28620.0, units='lbf' # ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.2095, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 1.660, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') - self.prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 6.85, units='ft' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 1.18, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Fuselage.WETTED_AREA_SCALER, 1.0, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Design.WING_LOADING, val=87.5, units='lbf/ft**2' - ) - self.prob.model.set_input_defaults( - Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h' - ) + prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 1.660, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 6.85, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 1.18, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.WETTED_AREA_SCALER, 1.0, units='unitless') + prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=87.5, units='lbf/ft**2') + prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.1, units='unitless') + prob.model.set_input_defaults(Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h') - # self.prob.model.set_input_defaults(Aircraft.APU.MASS, val=1014.0, units='lbm') - self.prob.model.set_input_defaults( + # prob.model.set_input_defaults(Aircraft.APU.MASS, val=1014.0, units='lbm') + prob.model.set_input_defaults( Aircraft.Instruments.MASS_COEFFICIENT, val=0.0736, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Hydraulics.FLIGHT_CONTROL_MASS_COEFFICIENT, val=0.085, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Hydraulics.GEAR_MASS_COEFFICIENT, val=0.105, units='unitless' ) - # self.prob.model.set_input_defaults(Aircraft.Avionics.MASS, val=1504.0, units='lbm') - self.prob.model.set_input_defaults( + # prob.model.set_input_defaults(Aircraft.Avionics.MASS, val=1504.0, units='lbm') + prob.model.set_input_defaults( Aircraft.AirConditioning.MASS_COEFFICIENT, val=1.65, units='unitless' ) - # self.prob.model.set_input_defaults(Aircraft.AntiIcing.MASS, val=126.0, units='lbm') - # self.prob.model.set_input_defaults(Aircraft.Furnishings.MASS, val=9114.0, units='lbm') - self.prob.model.set_input_defaults( + # prob.model.set_input_defaults(Aircraft.AntiIcing.MASS, val=126.0, units='lbm') + # prob.model.set_input_defaults(Aircraft.Furnishings.MASS, val=9114.0, units='lbm') + prob.model.set_input_defaults( Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_PER_PASSENGER, val=5.0, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.WATER_MASS_PER_OCCUPANT, val=3.0, units='lbm' ) - # self.prob.model.set_input_defaults( + # prob.model.set_input_defaults( # Aircraft.Design.EMERGENCY_EQUIPMENT_MASS, val=0.0, units='lbm' # ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.CATERING_ITEMS_MASS_PER_PASSENGER, val=10.0, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuel.UNUSABLE_FUEL_MASS_COEFFICIENT, val=12.0, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PRESSURE_DIFFERENTIAL, val=7.5, units='psi' - ) - self.prob.model.set_input_defaults( - Aircraft.Engine.SCALED_SLS_THRUST, val=21160.0, units='lbf' - ) - self.prob.model.set_input_defaults( - Aircraft.Fuel.WING_FUEL_FRACTION, 0.5625, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=22.47, units='deg') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.PRESSURE_DIFFERENTIAL, val=7.5, units='psi') + prob.model.set_input_defaults(Aircraft.Engine.SCALED_SLS_THRUST, val=21160.0, units='lbf') + prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.5625, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=22.47, units='deg') + prob.model.set_input_defaults( Aircraft.Wing.VERTICAL_MOUNT_LOCATION, val=0.1, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=19.565, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Strut.ATTACHMENT_LOCATION, val=118, units='ft') - self.prob.model.set_input_defaults(Aircraft.CrewPayload.CARGO_MASS, val=0, units='lbm') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=19.565, units='unitless') + prob.model.set_input_defaults(Aircraft.Strut.ATTACHMENT_LOCATION, val=118, units='ft') + prob.model.set_input_defaults(Aircraft.CrewPayload.CARGO_MASS, val=0, units='lbm') + prob.model.set_input_defaults( Aircraft.CrewPayload.Design.MAX_CARGO_MASS, val=15970.0, units='lbm' ) - self.prob.model.set_input_defaults( - Aircraft.Engine.MASS_SPECIFIC, val=0.2470, units='lbm/lbf' - ) - self.prob.model.set_input_defaults( - Aircraft.Nacelle.MASS_SPECIFIC, val=2.5, units='lbm/ft**2' - ) - self.prob.model.set_input_defaults(Aircraft.Engine.PYLON_FACTOR, val=1.25, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Engine.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Propulsion.MISC_MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Engine.WING_LOCATIONS, val=0.2143, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Engine.MASS_SPECIFIC, val=0.2470, units='lbm/lbf') + prob.model.set_input_defaults(Aircraft.Nacelle.MASS_SPECIFIC, val=2.5, units='lbm/ft**2') + prob.model.set_input_defaults(Aircraft.Engine.PYLON_FACTOR, val=1.25, units='unitless') + prob.model.set_input_defaults(Aircraft.Engine.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Propulsion.MISC_MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Engine.WING_LOCATIONS, val=0.2143, units='unitless') + prob.model.set_input_defaults( Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.ASPECT_RATIO, val=0.825, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.SWEEP, val=0, units='deg' ) # not in file - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.MASS_COEFFICIENT, val=0.2076, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.TAIL_HOOK_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.MASS_COEFFICIENT, val=0.2587, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.THICKNESS_TO_CHORD, val=0.11, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.THICKNESS_TO_CHORD, val=0.1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT, val=1.9, units='unitless' ) # Based onlarge single aisle 1for updated flaps mass model - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Mission.Landing.LIFT_COEFFICIENT_MAX, val=2.817, units='unitless' ) # Based on large single aisle 1 for updated flaps mass model - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.SURFACE_CONTROL_MASS_COEFFICIENT, val=0.5936, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Design.COCKPIT_CONTROL_MASS_COEFFICIENT, val=30, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.STABILITY_AUGMENTATION_SYSTEM_REFERENCE_MASS, val=0, units='lbm' ) # not in file - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.COCKPIT_CONTROL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.SURFACE_CONTROL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.STABILITY_AUGMENTATION_SYSTEM_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Controls.MASS, val=0, units='lbm' - ) # not in file - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Controls.MASS, val=0, units='lbm') # not in file + prob.model.set_input_defaults( Aircraft.LandingGear.MASS_COEFFICIENT, val=0.03390, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.MAIN_GEAR_MASS_FRACTION, val=0.85, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Fuel.DENSITY, val=6.687, units='lbm/galUS') - self.prob.model.set_input_defaults(Aircraft.Fuel.VOLUME_MARGIN, val=10.0, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuel.DENSITY, val=6.687, units='lbm/galUS') + prob.model.set_input_defaults(Aircraft.Fuel.VOLUME_MARGIN, val=10.0, units='unitless') + prob.model.set_input_defaults( Aircraft.Fuel.FUEL_SYSTEM_MASS_COEFFICIENT, val=0.060, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuselage.MASS_COEFFICIENT, val=89.66, units='unitless' ) - self.prob.model.set_input_defaults('pylon_len', val=0, units='ft') - self.prob.model.set_input_defaults(Aircraft.Fuel.VOLUME_MARGIN, val=10.0, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults('pylon_len', val=0, units='ft') + prob.model.set_input_defaults(Aircraft.Fuel.VOLUME_MARGIN, val=10.0, units='unitless') + prob.model.set_input_defaults( Aircraft.Fuel.FUEL_SYSTEM_MASS_COEFFICIENT, val=0.060, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuselage.MASS_COEFFICIENT, val=89.66, units='unitless' ) - self.prob.model.set_input_defaults('pylon_len', val=0, units='ft') - self.prob.model.set_input_defaults('MAT', val=0, units='lbm') # not in file - self.prob.model.set_input_defaults(Aircraft.Wing.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults('pylon_len', val=0, units='ft') + prob.model.set_input_defaults('MAT', val=0, units='lbm') # not in file + prob.model.set_input_defaults(Aircraft.Wing.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.HorizontalTail.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.VerticalTail.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults( Aircraft.LandingGear.TOTAL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.POD_MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Design.STRUCTURAL_MASS_INCREMENT, val=0, units='lbm' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Engine.POD_MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Design.STRUCTURAL_MASS_INCREMENT, val=0, units='lbm') + prob.model.set_input_defaults( Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=143100.0, units='lbm') - self.prob.model.set_input_defaults( - Aircraft.Wing.MASS_COEFFICIENT, val=78.94, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.346, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=143100.0, units='lbm') + prob.model.set_input_defaults(Aircraft.Wing.MASS_COEFFICIENT, val=78.94, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.346, units='unitless') + prob.model.set_input_defaults( Aircraft.Wing.THICKNESS_TO_CHORD_ROOT, val=0.11, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.43, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.066, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.FOLD_MASS_COEFFICIENT, val=0.2, units='unitless' ) - # self.prob.model.set_input_defaults( + # prob.model.set_input_defaults( # Aircraft.Strut.AREA, 523.337, units='ft**2' # ) # had to calculate by hand - self.prob.model.set_input_defaults(Aircraft.Strut.MASS_COEFFICIENT, 0.238, units='unitless') - - self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units='ft') - self.prob.model.set_input_defaults(Aircraft.Design.MACH, val=0.8, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.SLAT_CHORD_RATIO, val=0.15) - self.prob.model.set_input_defaults(Aircraft.Wing.FLAP_CHORD_RATIO, val=0.3) - self.prob.model.set_input_defaults(Aircraft.Wing.SLAT_SPAN_RATIO, val=0.9) - self.prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') + prob.model.set_input_defaults(Aircraft.Strut.MASS_COEFFICIENT, 0.238, units='unitless') - setup_model_options(self.prob, options) + prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units='ft') + prob.model.set_input_defaults(Aircraft.Design.MACH, val=0.8, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.SLAT_CHORD_RATIO, val=0.15) + prob.model.set_input_defaults(Aircraft.Wing.FLAP_CHORD_RATIO, val=0.3) + prob.model.set_input_defaults(Aircraft.Wing.SLAT_SPAN_RATIO, val=0.9) + prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') - self.prob.setup(check=False, force_alloc_complex=True) + # setup_model_options(prob, options) + prob.model_options['*'] = { + Aircraft.Wing.HAS_FOLD: True, + Aircraft.Wing.HAS_STRUT: True, + Aircraft.Electrical.HAS_HYBRID_SYSTEM: False, + Aircraft.CrewPayload.Design.NUM_PASSENGERS: 154, + Aircraft.CrewPayload.NUM_PASSENGERS: 154, + Aircraft.Design.CRUISE_ALTITUDE: (43000, 'ft'), + Aircraft.Wing.CHOOSE_FOLD_LOCATION: False, + Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.LandingGear.FIXED_GEAR: False, + Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES: True, + Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 6, + Aircraft.Fuselage.NUM_AISLES: 1, + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (44.2, 'inch'), + Aircraft.Engine.ADDITIONAL_MASS_FRACTION: 0.163, + Aircraft.Engine.NUM_ENGINES: [2], + Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], + Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, + Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, + Aircraft.Design.TYPE: AircraftTypes.TRANSPORT, + Aircraft.Design.PART25_STRUCTURAL_CATEGORY: 3, + Aircraft.Wing.LOADING_ABOVE_20: True, + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: 2, + Aircraft.Propulsion.TOTAL_NUM_ENGINES: 2, + } + prob.setup(check=False, force_alloc_complex=True) - def test_case1(self): - self.prob.run_model() + def test_case(self): + prob = self.prob + prob.run_model() tol = 5e-4 # size values: - assert_near_equal(self.prob['size.cabin_height'], 13.1, tol) - assert_near_equal(self.prob['size.cabin_len'], 93.9, tol) - assert_near_equal(self.prob['size.nose_height'], 8.6, tol) + assert_near_equal(prob['size.cabin_height'], 13.1, tol) + assert_near_equal(prob['size.cabin_len'], 93.9, tol) + assert_near_equal(prob['size.nose_height'], 8.6, tol) - assert_near_equal(self.prob[Aircraft.Wing.CENTER_CHORD], 13.59, tol) - assert_near_equal(self.prob[Aircraft.Wing.ROOT_CHORD], 13.15, tol) + assert_near_equal(prob[Aircraft.Wing.CENTER_CHORD], 13.59, tol) + assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 13.15, tol) assert_near_equal( - self.prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.1068, tol + prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.1068, tol ) # note:precision came from running code on my own and printing it out assert_near_equal( - self.prob[Aircraft.HorizontalTail.AVERAGE_CHORD], 9.381, tol + prob[Aircraft.HorizontalTail.AVERAGE_CHORD], 9.381, tol ) # note, printed out manually because calculated differently in output subroutine assert_near_equal( - self.prob[Aircraft.VerticalTail.AVERAGE_CHORD], 20.056, tol + prob[Aircraft.VerticalTail.AVERAGE_CHORD], 20.056, tol ) # note, printed out manually because calculated differently in output subroutine - assert_near_equal(self.prob[Aircraft.Nacelle.AVG_LENGTH], 13.19, tol) + assert_near_equal(prob[Aircraft.Nacelle.AVG_LENGTH], 13.19, tol) # fixed mass values: assert_near_equal( - self.prob[Aircraft.LandingGear.MAIN_GEAR_MASS], + prob[Aircraft.LandingGear.MAIN_GEAR_MASS], 4123.4, tol, - # self.prob['main_gear_mass'], 4123.4, tol + # prob['main_gear_mass'], 4123.4, tol ) # note:printed out from GASP code - assert_near_equal(self.prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 10453.0, tol) - assert_near_equal(self.prob[Aircraft.Engine.ADDITIONAL_MASS], 1704.0 / 2, tol) + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 10453.0, tol) + assert_near_equal(prob[Aircraft.Engine.ADDITIONAL_MASS], 1704.0 / 2, tol) # wing values: - assert_near_equal(self.prob['isolated_wing_mass'], 14040, tol) - assert_near_equal(self.prob[Aircraft.Wing.MASS], 18031, tol) + assert_near_equal(prob['isolated_wing_mass'], 14040, tol) + assert_near_equal(prob[Aircraft.Wing.MASS], 18031, tol) # fuel values: assert_near_equal( - self.prob['OEM_wingfuel_mass'], 59367.49187498, tol + prob['OEM_wingfuel_mass'], 59367.49187498, tol ) # modified from GASP value to account for updated crew mass. GASP value is 59372.3 assert_near_equal( - self.prob['fus_mass_full'], 97594.48439759, tol + prob['fus_mass_full'], 97594.48439759, tol ) # note:printed out from GASP code assert_near_equal( - self.prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 1885.45446375, tol + prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 1885.45446375, tol ) # modified from GASP value to account for updated crew mass. GASP value is 1886.0 - assert_near_equal(self.prob[Aircraft.Design.STRUCTURE_MASS], 43655.977, tol) - assert_near_equal(self.prob[Aircraft.Fuselage.MASS], 14654.517, tol) + assert_near_equal(prob[Aircraft.Design.STRUCTURE_MASS], 43655.977, tol) + assert_near_equal(prob[Aircraft.Fuselage.MASS], 14654.517, tol) assert_near_equal( - self.prob[Aircraft.Propulsion.MASS], 14042.33998375, tol + prob[Aircraft.Propulsion.MASS], 14042.33998375, tol ) # modified from GASP value to account for updated crew mass. GASP value is 14043.0 assert_near_equal( - self.prob['fuel_mass_min'], 12597.49187498, tol + prob['fuel_mass_min'], 12597.49187498, tol ) # modified from GASP value to account for updated crew mass. GASP value is 12602.3 assert_near_equal( - self.prob[Aircraft.Fuel.WING_VOLUME_DESIGN], 628.20534367, tol + prob[Aircraft.Fuel.WING_VOLUME_DESIGN], 628.20534367, tol ) # modified from GASP value to account for updated crew mass. GASP value is 628.3 assert_near_equal( - self.prob['OEM_fuel_vol'], 1186.8218412, tol + prob['OEM_fuel_vol'], 1186.8218412, tol ) # modified from GASP value to account for updated crew mass. GASP value is 1186.9 assert_near_equal( - self.prob[Mission.OPERATING_MASS], 83732.50812502, tol + prob[Mission.OPERATING_MASS], 83732.50812502, tol ) # modified from GASP value to account for updated crew mass. GASP value is 83728.0 assert_near_equal( - self.prob['payload_mass_max_fuel'], 30800.0, tol + prob['payload_mass_max_fuel'], 30800.0, tol ) # note:printed out from GASP code - assert_near_equal(self.prob['volume_wingfuel_mass'], 31051.6, tol) - assert_near_equal(self.prob['max_wingfuel_mass'], 31051.6, tol) - assert_near_equal(self.prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 0, tol) + assert_near_equal(prob['volume_wingfuel_mass'], 31051.6, tol) + assert_near_equal(prob['max_wingfuel_mass'], 31051.6, tol) + assert_near_equal(prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 0, tol) assert_near_equal( - self.prob['extra_fuel_volume'], 7.44643516, tol + prob['extra_fuel_volume'], 7.44643516, tol ) # note: printed out from the GASP code, #modified from GASP value to account for updated crew mass. GASP value is 7.5568 assert_near_equal( - self.prob['max_extra_fuel_mass'], 372.48739763, tol + prob['max_extra_fuel_mass'], 372.48739763, tol ) # note: printed out from the GASP code, #modified from GASP value to account for updated crew mass. GASP value is 378.0062 - partial_data = self.prob.check_partials(out_stream=None, method='cs') + partial_data = prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, atol=3e-9, rtol=6e-11) @use_tempdirs -class MassSummationTestCase9(unittest.TestCase): +class MassPremissionTestCase9a(unittest.TestCase): """ This is the electrified Trans-sonic Truss-Braced Wing V3.6 test case All values are from V3.6 output, hand calculated from the output, or were printed out after running the code manually. @@ -3273,457 +2481,360 @@ class MassSummationTestCase9(unittest.TestCase): def setUp(self): options = AviaryValues() - options.set_val(Aircraft.Wing.HAS_FOLD, val=True, units='unitless') - options.set_val(Aircraft.Wing.HAS_STRUT, val=True, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=154, units='unitless') - options.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, val=154, units='unitless') - options.set_val(Aircraft.Design.CRUISE_ALTITUDE, val=43000, units='ft') - options.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, val=False, units='unitless') - options.set_val( - Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless' - ) - options.set_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless') - options.set_val(Aircraft.LandingGear.FIXED_GEAR, val=False, units='unitless') - options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, val=True, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) - options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) - options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 44.2, units='inch') - 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.NUM_ENGINES, [2], units='unitless') - options.set_val(Aircraft.Engine.TYPE, [GASPEngineType.TURBOJET], units='unitless') - options.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Design.TYPE, AircraftTypes.TRANSPORT, units='unitless') - options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, 3, units='unitless') - options.set_val(Aircraft.Wing.LOADING_ABOVE_20, True, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 2, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.43, units='unitless') + options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.066, units='unitless') + options.set_val(Settings.VERBOSITY, 0) - self.prob = om.Problem() - self.prob.model.add_subsystem( - 'size', - SizeGroup(), - promotes_inputs=['aircraft:*'], - promotes_outputs=[ - 'aircraft:*', - ], - ) - self.prob.model.add_subsystem( - 'GASP_mass', - MassPremission(), - promotes=['*'], + prob = self.prob = om.Problem() + prob.model.add_subsystem( + 'premission', + PreMission(aviary_options=options), + promotes_outputs=['*'], + promotes_inputs=['*'], ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') - self.prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') + prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + prob.model.set_input_defaults( Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS, val=200, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.000557, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.MOMENT_RATIO, val=0.13067, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.025, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MOMENT_RATIO, 3.0496, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 3.0496, units='unitless') + prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) - # self.prob.model.set_input_defaults( + # prob.model.set_input_defaults( # Aircraft.Engine.REFERENCE_SLS_THRUST, 28620, units='lbf' # ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.2095, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 1.569, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') - self.prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 6.85, units='ft' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 1.18, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Fuselage.WETTED_AREA_SCALER, 1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Design.WING_LOADING, val=96.10, units='lbf/ft**2' - ) - self.prob.model.set_input_defaults( - Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h' - ) + prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 1.569, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 6.85, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 1.18, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.WETTED_AREA_SCALER, 1, units='unitless') + prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=96.10, units='lbf/ft**2') + prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.1, units='unitless') + prob.model.set_input_defaults(Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h') - # self.prob.model.set_input_defaults(Aircraft.APU.MASS, val=1014.0, units='lbm') - self.prob.model.set_input_defaults( + # prob.model.set_input_defaults(Aircraft.APU.MASS, val=1014.0, units='lbm') + prob.model.set_input_defaults( Aircraft.Instruments.MASS_COEFFICIENT, val=0.0736, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Hydraulics.FLIGHT_CONTROL_MASS_COEFFICIENT, val=0.085, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Hydraulics.GEAR_MASS_COEFFICIENT, val=0.105, units='unitless' ) - # self.prob.model.set_input_defaults(Aircraft.Avionics.MASS, val=1504.0, units='lbm') - self.prob.model.set_input_defaults( + # prob.model.set_input_defaults(Aircraft.Avionics.MASS, val=1504.0, units='lbm') + prob.model.set_input_defaults( Aircraft.AirConditioning.MASS_COEFFICIENT, val=1.65, units='unitless' ) - # self.prob.model.set_input_defaults(Aircraft.AntiIcing.MASS, val=126.0, units='lbm') - # self.prob.model.set_input_defaults(Aircraft.Furnishings.MASS, val=9114.0, units='lbm') - self.prob.model.set_input_defaults( + # prob.model.set_input_defaults(Aircraft.AntiIcing.MASS, val=126.0, units='lbm') + # prob.model.set_input_defaults(Aircraft.Furnishings.MASS, val=9114.0, units='lbm') + prob.model.set_input_defaults( Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_PER_PASSENGER, val=5.0, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.WATER_MASS_PER_OCCUPANT, val=3.0, units='lbm' ) - # self.prob.model.set_input_defaults( + # prob.model.set_input_defaults( # Aircraft.Design.EMERGENCY_EQUIPMENT_MASS, val=0.0, units='lbm' # ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.CATERING_ITEMS_MASS_PER_PASSENGER, val=10.0, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuel.UNUSABLE_FUEL_MASS_COEFFICIENT, val=12.0, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PRESSURE_DIFFERENTIAL, val=7.5, units='psi' - ) - self.prob.model.set_input_defaults( - Aircraft.Engine.SCALED_SLS_THRUST, val=23750.0, units='lbf' - ) - self.prob.model.set_input_defaults( - Aircraft.Fuel.WING_FUEL_FRACTION, 0.5936, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=22.47, units='deg') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.PRESSURE_DIFFERENTIAL, val=7.5, units='psi') + prob.model.set_input_defaults(Aircraft.Engine.SCALED_SLS_THRUST, val=23750.0, units='lbf') + prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.5936, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=22.47, units='deg') + prob.model.set_input_defaults( Aircraft.Wing.VERTICAL_MOUNT_LOCATION, val=0.1, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=19.565, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Strut.ATTACHMENT_LOCATION, val=118.0, units='ft' - ) - self.prob.model.set_input_defaults(Aircraft.CrewPayload.CARGO_MASS, val=0, units='lbm') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=19.565, units='unitless') + prob.model.set_input_defaults(Aircraft.Strut.ATTACHMENT_LOCATION, val=118.0, units='ft') + prob.model.set_input_defaults(Aircraft.CrewPayload.CARGO_MASS, val=0, units='lbm') + prob.model.set_input_defaults( Aircraft.CrewPayload.Design.MAX_CARGO_MASS, val=15970.0, units='lbm' ) - self.prob.model.set_input_defaults( - Aircraft.Engine.MASS_SPECIFIC, val=0.2744, units='lbm/lbf' - ) - self.prob.model.set_input_defaults( - Aircraft.Nacelle.MASS_SPECIFIC, val=2.5, units='lbm/ft**2' - ) - self.prob.model.set_input_defaults(Aircraft.Engine.PYLON_FACTOR, val=1.25, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Engine.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Propulsion.MISC_MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.Engine.WING_LOCATIONS, val=0.2143, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Engine.MASS_SPECIFIC, val=0.2744, units='lbm/lbf') + prob.model.set_input_defaults(Aircraft.Nacelle.MASS_SPECIFIC, val=2.5, units='lbm/ft**2') + prob.model.set_input_defaults(Aircraft.Engine.PYLON_FACTOR, val=1.25, units='unitless') + prob.model.set_input_defaults(Aircraft.Engine.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Propulsion.MISC_MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Engine.WING_LOCATIONS, val=0.2143, units='unitless') + prob.model.set_input_defaults( Aircraft.LandingGear.MAIN_GEAR_LOCATION, val=0, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.ASPECT_RATIO, val=0.825, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.VerticalTail.SWEEP, val=0, units='deg') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.VerticalTail.SWEEP, val=0, units='deg') + prob.model.set_input_defaults( Aircraft.HorizontalTail.MASS_COEFFICIENT, val=0.2076, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.TAIL_HOOK_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.MASS_COEFFICIENT, val=0.2587, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.THICKNESS_TO_CHORD, val=0.11, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.THICKNESS_TO_CHORD, val=0.1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.HIGH_LIFT_MASS_COEFFICIENT, val=1.9, units='unitless' ) # Based onlarge single aisle 1for updated flaps mass model - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Mission.Landing.LIFT_COEFFICIENT_MAX, val=2.817, units='unitless' ) # Based on large single aisle 1 for updated flaps mass model - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.SURFACE_CONTROL_MASS_COEFFICIENT, val=0.5936, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Design.COCKPIT_CONTROL_MASS_COEFFICIENT, val=30.0, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.STABILITY_AUGMENTATION_SYSTEM_REFERENCE_MASS, val=1, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.COCKPIT_CONTROL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.SURFACE_CONTROL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Controls.STABILITY_AUGMENTATION_SYSTEM_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Controls.MASS, val=0, units='lbm') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Controls.MASS, val=0, units='lbm') + prob.model.set_input_defaults( Aircraft.LandingGear.MASS_COEFFICIENT, val=0.03390, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.LandingGear.MAIN_GEAR_MASS_FRACTION, val=0.85, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Fuel.DENSITY, val=6.687, units='lbm/galUS') - self.prob.model.set_input_defaults(Aircraft.Fuel.VOLUME_MARGIN, val=0.0, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuel.DENSITY, val=6.687, units='lbm/galUS') + prob.model.set_input_defaults(Aircraft.Fuel.VOLUME_MARGIN, val=0.0, units='unitless') + prob.model.set_input_defaults( Aircraft.Fuel.FUEL_SYSTEM_MASS_COEFFICIENT, val=0.060, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuselage.MASS_COEFFICIENT, val=96.94, units='unitless' ) - self.prob.model.set_input_defaults('pylon_len', val=0, units='ft') - self.prob.model.set_input_defaults('MAT', val=0, units='lbm') - self.prob.model.set_input_defaults(Aircraft.Wing.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults('pylon_len', val=0, units='ft') + prob.model.set_input_defaults('MAT', val=0, units='lbm') + prob.model.set_input_defaults(Aircraft.Wing.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.HorizontalTail.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.VerticalTail.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults( Aircraft.Fuselage.MASS_COEFFICIENT, val=96.94, units='unitless' ) - self.prob.model.set_input_defaults('pylon_len', val=0, units='ft') - self.prob.model.set_input_defaults('MAT', val=0, units='lbm') - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MASS_SCALER, val=1, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults('pylon_len', val=0, units='ft') + prob.model.set_input_defaults('MAT', val=0, units='lbm') + prob.model.set_input_defaults(Aircraft.HorizontalTail.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.VerticalTail.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults( Aircraft.LandingGear.TOTAL_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Engine.POD_MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Engine.POD_MASS_SCALER, val=1, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Design.STRUCTURAL_MASS_INCREMENT, val=0, units='lbm' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Engine.POD_MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Engine.POD_MASS_SCALER, val=1, units='unitless') + prob.model.set_input_defaults(Aircraft.Design.STRUCTURAL_MASS_INCREMENT, val=0, units='lbm') + prob.model.set_input_defaults( Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER, val=1, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=166100.0, units='lbm') - self.prob.model.set_input_defaults( - Aircraft.Wing.MASS_COEFFICIENT, val=78.94, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.346, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=166100.0, units='lbm') + prob.model.set_input_defaults(Aircraft.Wing.MASS_COEFFICIENT, val=78.94, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.346, units='unitless') + prob.model.set_input_defaults( Aircraft.Wing.THICKNESS_TO_CHORD_ROOT, val=0.11, units='unitless' ) - - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.43, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.066, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Wing.FOLD_MASS_COEFFICIENT, val=0.2, units='unitless' ) - # self.prob.model.set_input_defaults( + # prob.model.set_input_defaults( # Aircraft.Strut.AREA, 553.1, units='ft**2' # ) - self.prob.model.set_input_defaults(Aircraft.Strut.MASS_COEFFICIENT, 0.238, units='unitless') - self.prob.model.set_input_defaults('motor_power', 830, units='kW') - self.prob.model.set_input_defaults('motor_voltage', 850, units='V') - self.prob.model.set_input_defaults('max_amp_per_wire', 260, units='A') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Strut.MASS_COEFFICIENT, 0.238, units='unitless') + prob.model.set_input_defaults('motor_power', 830, units='kW') + prob.model.set_input_defaults('motor_voltage', 850, units='V') + prob.model.set_input_defaults('max_amp_per_wire', 260, units='A') + prob.model.set_input_defaults( 'safety_factor', 1, units='unitless' ) # (not in this GASP code) - self.prob.model.set_input_defaults('wire_area', 0.0015, units='ft**2') - self.prob.model.set_input_defaults('rho_wire', 565, units='lbm/ft**3') - self.prob.model.set_input_defaults('battery_energy', 6077, units='MJ') - self.prob.model.set_input_defaults('motor_eff', 0.98, units='unitless') - self.prob.model.set_input_defaults('inverter_eff', 0.99, units='unitless') - self.prob.model.set_input_defaults('transmission_eff', 0.975, units='unitless') - self.prob.model.set_input_defaults('battery_eff', 0.975, units='unitless') - self.prob.model.set_input_defaults('rho_battery', 0.5, units='kW*h/kg') - self.prob.model.set_input_defaults('motor_spec_mass', 4, units='hp/lbm') - self.prob.model.set_input_defaults('inverter_spec_mass', 12, units='kW/kg') - self.prob.model.set_input_defaults('TMS_spec_mass', 0.125, units='lbm/kW') - - self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units='ft') - self.prob.model.set_input_defaults(Aircraft.Design.MACH, val=0.8, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.SLAT_CHORD_RATIO, val=0.15) - self.prob.model.set_input_defaults(Aircraft.Wing.FLAP_CHORD_RATIO, val=0.3) - self.prob.model.set_input_defaults(Aircraft.Wing.SLAT_SPAN_RATIO, val=0.9) - self.prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') + prob.model.set_input_defaults('wire_area', 0.0015, units='ft**2') + prob.model.set_input_defaults('rho_wire', 565, units='lbm/ft**3') + prob.model.set_input_defaults('battery_energy', 6077, units='MJ') + prob.model.set_input_defaults('motor_eff', 0.98, units='unitless') + prob.model.set_input_defaults('inverter_eff', 0.99, units='unitless') + prob.model.set_input_defaults('transmission_eff', 0.975, units='unitless') + prob.model.set_input_defaults('battery_eff', 0.975, units='unitless') + prob.model.set_input_defaults('rho_battery', 0.5, units='kW*h/kg') + prob.model.set_input_defaults('motor_spec_mass', 4, units='hp/lbm') + prob.model.set_input_defaults('inverter_spec_mass', 12, units='kW/kg') + prob.model.set_input_defaults('TMS_spec_mass', 0.125, units='lbm/kW') - setup_model_options(self.prob, options) + prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units='ft') + prob.model.set_input_defaults(Aircraft.Design.MACH, val=0.8, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.SLAT_CHORD_RATIO, val=0.15) + prob.model.set_input_defaults(Aircraft.Wing.FLAP_CHORD_RATIO, val=0.3) + prob.model.set_input_defaults(Aircraft.Wing.SLAT_SPAN_RATIO, val=0.9) + prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') - self.prob.setup(check=False, force_alloc_complex=True) + # setup_model_options(prob, options) + prob.model_options['*'] = { + Aircraft.Wing.HAS_FOLD: True, + Aircraft.Wing.HAS_STRUT: True, + Aircraft.CrewPayload.Design.NUM_PASSENGERS: 154, + Aircraft.CrewPayload.NUM_PASSENGERS: 154, + Aircraft.Design.CRUISE_ALTITUDE: (43000, 'ft'), + Aircraft.Wing.CHOOSE_FOLD_LOCATION: False, + Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.LandingGear.FIXED_GEAR: False, + Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES: True, + Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 6, + Aircraft.Fuselage.NUM_AISLES: 1, + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (44.2, 'inch'), + Aircraft.Engine.ADDITIONAL_MASS_FRACTION: 0.163, + Aircraft.Electrical.HAS_HYBRID_SYSTEM: True, + Aircraft.Engine.NUM_ENGINES: [2], + Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], + Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, + Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, + Aircraft.Design.TYPE: AircraftTypes.TRANSPORT, + Aircraft.Design.PART25_STRUCTURAL_CATEGORY: 3, + Aircraft.Wing.LOADING_ABOVE_20: True, + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: 2, + Aircraft.Propulsion.TOTAL_NUM_ENGINES: 2, + } + prob.setup(check=False, force_alloc_complex=True) - def test_case1(self): - self.prob.run_model() + def test_case(self): + prob = self.prob + prob.run_model() tol = 5e-4 # size values: - assert_near_equal(self.prob['size.cabin_height'], 13.1, tol) - assert_near_equal(self.prob['size.cabin_len'], 93.9, tol) - assert_near_equal(self.prob['size.nose_height'], 8.6, tol) + assert_near_equal(prob['size.cabin_height'], 13.1, tol) + assert_near_equal(prob['size.cabin_len'], 93.9, tol) + assert_near_equal(prob['size.nose_height'], 8.6, tol) - assert_near_equal(self.prob[Aircraft.Wing.CENTER_CHORD], 13.97, tol) - assert_near_equal(self.prob[Aircraft.Wing.ROOT_CHORD], 13.53, tol) + assert_near_equal(prob[Aircraft.Wing.CENTER_CHORD], 13.97, tol) + assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 13.53, tol) assert_near_equal( - self.prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.1068, tol + prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.1068, tol ) # (printed out from GASP code to get better precision) assert_near_equal( - self.prob[Aircraft.HorizontalTail.AVERAGE_CHORD], 9.644, tol + prob[Aircraft.HorizontalTail.AVERAGE_CHORD], 9.644, tol ) # (printed out from GASP code) assert_near_equal( - self.prob[Aircraft.VerticalTail.AVERAGE_CHORD], 20.618, tol + prob[Aircraft.VerticalTail.AVERAGE_CHORD], 20.618, tol ) # (printed out from GASP code) - assert_near_equal(self.prob[Aircraft.Nacelle.AVG_LENGTH], 14.56, tol) + assert_near_equal(prob[Aircraft.Nacelle.AVG_LENGTH], 14.56, tol) # fixed mass values: assert_near_equal( - self.prob[Aircraft.LandingGear.MAIN_GEAR_MASS], 4786.2, tol + prob[Aircraft.LandingGear.MAIN_GEAR_MASS], 4786.2, tol ) # (printed out from GASP code) - assert_near_equal(self.prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 13034.0, tol) - assert_near_equal(self.prob[Aircraft.Engine.ADDITIONAL_MASS], 2124.5 / 2, tol) + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 13034.0, tol) + assert_near_equal(prob[Aircraft.Engine.ADDITIONAL_MASS], 2124.5 / 2, tol) # wing values: - assert_near_equal(self.prob['isolated_wing_mass'], 15895, tol) - assert_near_equal(self.prob[Aircraft.Wing.MASS], 20461.7, tol) + assert_near_equal(prob['isolated_wing_mass'], 15895, tol) + assert_near_equal(prob[Aircraft.Wing.MASS], 20461.7, tol) # fuel values: assert_near_equal( - self.prob['OEM_wingfuel_mass'], 63451.96389363, tol + prob['OEM_wingfuel_mass'], 63451.96389363, tol ) # modified from GASP value to account for updated crew mass. GASP value is 63707.6 - assert_near_equal( - self.prob['fus_mass_full'], 110007.00542891, tol + prob['fus_mass_full'], 110007.00542891, tol ) # (printed out from GASP code), #modified from GASP value to account for updated crew mass. GASP value is 108754.4 assert_near_equal( - self.prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 1959.11783362, 0.00055 + prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 1959.11783362, 0.00055 ) # slightly above tol, due to non-integer number of wires, #modified from GASP value to account for updated crew mass. GASP value is 1974.5 - assert_near_equal(self.prob[Aircraft.Design.STRUCTURE_MASS], 49642.90824339, tol) + assert_near_equal(prob[Aircraft.Design.STRUCTURE_MASS], 49642.90824339, tol) assert_near_equal( - self.prob[Aircraft.Fuselage.MASS], 16375.17869754, tol + prob[Aircraft.Fuselage.MASS], 16375.17869754, tol ) # modified from GASP value to account for updated crew mass. GASP value is 16436.0 assert_near_equal( - self.prob[Aircraft.Propulsion.MASS], 26496.71105457, 0.00054 + prob[Aircraft.Propulsion.MASS], 26496.71105457, 0.00054 ) # slightly above tol, due to non-integer number of wires, #modified from GASP value to account for updated crew mass. GASP value is 26527.0 assert_near_equal( - self.prob['fuel_mass_min'], 16681.96389363, 0.0012 + prob['fuel_mass_min'], 16681.96389363, 0.0012 ) # slightly above tol, due to non-integer number of wires, #modified from GASP value to account for updated crew mass. GASP value is 16937.6 assert_near_equal( - self.prob[Aircraft.Fuel.WING_VOLUME_DESIGN], 652.7488813, 0.00051 + prob[Aircraft.Fuel.WING_VOLUME_DESIGN], 652.7488813, 0.00051 ) # slightly above tol, due to non-integer number of wires, #modified from GASP value to account for updated crew mass. GASP value is 657.9 assert_near_equal( - self.prob['OEM_fuel_vol'], 1268.47495553, tol + prob['OEM_fuel_vol'], 1268.47495553, tol ) # modified from GASP value to account for updated crew mass. GASP value is 1273.6 assert_near_equal( - self.prob[Mission.OPERATING_MASS], 102648.03610637, tol + prob[Mission.OPERATING_MASS], 102648.03610637, tol ) # modified from GASP value to account for updated crew mass. GASP value is 102392.0 assert_near_equal( - self.prob['payload_mass_max_fuel'], 30800.0, tol + prob['payload_mass_max_fuel'], 30800.0, tol ) # (printed out from GASP code) - assert_near_equal(self.prob['volume_wingfuel_mass'], 35042.1, tol) - assert_near_equal(self.prob['max_wingfuel_mass'], 35042.1, tol) - assert_near_equal(self.prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 0, tol) - assert_near_equal(self.prob['extra_fuel_volume'], 0.69314718, tol) - assert_near_equal(self.prob['max_extra_fuel_mass'], 34.67277748, tol) - - assert_near_equal(self.prob[Aircraft.Electrical.HYBRID_CABLE_LENGTH], 65.6, tol) + assert_near_equal(prob['volume_wingfuel_mass'], 35042.1, tol) + assert_near_equal(prob['max_wingfuel_mass'], 35042.1, tol) + assert_near_equal(prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 0, tol) + assert_near_equal(prob['extra_fuel_volume'], 0.69314718, tol) + assert_near_equal(prob['max_extra_fuel_mass'], 34.67277748, tol) + assert_near_equal(prob[Aircraft.Electrical.HYBRID_CABLE_LENGTH], 65.6, tol) assert_near_equal( - self.prob['aug_mass'], 9394.3, 0.0017 + prob['aug_mass'], 9394.3, 0.0017 ) # slightly above tol, due to non-integer number of wires - partial_data = self.prob.check_partials(out_stream=None, method='cs') + partial_data = prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, atol=3e-9, rtol=6e-11) @use_tempdirs -class BWBMassSummationTestCase(unittest.TestCase): +class BWBStructMassTestCase(unittest.TestCase): """GASP BWB model.""" def setUp(self): options = AviaryValues() - # options from SizeGroup - options.set_val(Aircraft.Design.TYPE, val='BWB', units='unitless') - options.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=False, units='unitless') - options.set_val(Aircraft.Wing.HAS_STRUT, val=False, units='unitless') - options.set_val(Aircraft.Wing.HAS_FOLD, val=True, units='unitless') - options.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, val=True, units='unitless') - options.set_val( - Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless' - ) - options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=150, units='unitless') - options.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, val=150, units='unitless') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH_FIRST, 28, units='inch') - options.set_val(Aircraft.Fuselage.NUM_AISLES, 3) - options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 18) - options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST, 36, units='inch') - options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 32, units='inch') - options.set_val(Aircraft.CrewPayload.Design.NUM_FIRST_CLASS, 11) - # options from MassPremission - options.set_val(Aircraft.Design.CRUISE_ALTITUDE, val=41000, units='ft') - options.set_val(Aircraft.LandingGear.FIXED_GEAR, val=False, units='unitless') - options.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, val=False, units='unitless') - options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.04373, units='unitless') - options.set_val(Aircraft.Engine.NUM_FUSELAGE_ENGINES, 2, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 0, units='unitless') - options.set_val(Aircraft.CrewPayload.ULD_MASS_PER_PASSENGER, 0.0667, units='lbm') - - options.set_val(Aircraft.Engine.NUM_ENGINES, [2], units='unitless') - options.set_val(Aircraft.Engine.TYPE, [GASPEngineType.TURBOJET], units='unitless') - options.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, 3, units='unitless') - options.set_val(Aircraft.Wing.LOADING_ABOVE_20, True, units='unitless') - options.set_val(Aircraft.BWB.DETAILED_WING_PROVIDED, True, units='unitless') - options.set_val(Aircraft.BWB.MAX_BAY_WIDTH, 0.0, units='ft') - options.set_val(Aircraft.BWB.MAX_NUM_BAYS, 0, units='unitless') - options.set_val(Aircraft.Design.ULF_CALCULATED_FROM_MANEUVER, False, units='unitless') - options.set_val(Mission.SEA_LEVEL_DENSITY, 1.225, units='kg/m**3') - options.set_val(Aircraft.Furnishings.USE_EMPIRICAL_EQUATION, True, units='unitless') - options.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=0.000001, units='unitless') + options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.015, units='unitless') + options.set_val(Settings.VERBOSITY, 0) prob = self.prob = om.Problem() prob.model.add_subsystem( - 'size', - SizeGroup(), - promotes_inputs=['aircraft:*'], - promotes_outputs=[ - 'aircraft:*', - ], - ) - prob.model.add_subsystem( - 'GASP_mass', - MassPremission(), - promotes=['*'], + 'premission', + PreMission(aviary_options=options), + promotes_outputs=['*'], + promotes_inputs=['*'], ) prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_FIRST, 22, units='inch') @@ -3742,13 +2853,6 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.HorizontalTail.TAPER_RATIO, 0.366, units='unitless') prob.model.set_input_defaults(Aircraft.VerticalTail.TAPER_RATIO, 0.366, units='unitless') prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.45, units='unitless') - - prob.model.set_input_defaults( - Aircraft.HorizontalTail.VOLUME_COEFFICIENT, 0.000001, units='unitless' - ) - prob.model.set_input_defaults( - Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.015, units='unitless' - ) prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 5.0, units='ft') prob.model.set_input_defaults(Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 7.5, units='ft') prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 0.6, units='unitless') @@ -3763,9 +2867,6 @@ def setUp(self): Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.2205, units='unitless' ) prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 1.3588, units='unitless') - # prob.model.set_input_defaults( - # Aircraft.LandingGear.MAIN_GEAR_LOCATION, 0.0, units='unitless' - # ) prob.model.set_input_defaults(Aircraft.Wing.FOLDED_SPAN, 118, units='ft') prob.model.set_input_defaults(Aircraft.Wing.VERTICAL_MOUNT_LOCATION, 0.5, units='unitless') prob.model.set_input_defaults( @@ -3783,21 +2884,12 @@ def setUp(self): prob.model.set_input_defaults( Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS, val=225, units='lbm' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.ROOT_CHORD, val=0.03836448, units='ft' ) - # prob.model.set_input_defaults( - # Aircraft.Hydraulics.FLIGHT_CONTROL_MASS_COEFFICIENT, 0.107, units='unitless' - # ) - # prob.model.set_input_defaults( - # Aircraft.Hydraulics.GEAR_MASS_COEFFICIENT, 0.135, units='unitless' - # ) - # prob.model.set_input_defaults(Aircraft.Avionics.MASS, 1504.0, units='lbm') prob.model.set_input_defaults( Aircraft.AirConditioning.MASS_COEFFICIENT, 1.155, units='unitless' ) - # prob.model.set_input_defaults(Aircraft.AntiIcing.MASS, 236.0, units='lbm') - # prob.model.set_input_defaults(Aircraft.Furnishings.MASS, 9114.0, units='lbm') prob.model.set_input_defaults( Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_PER_PASSENGER, 6.0, units='lbm' ) @@ -3805,9 +2897,6 @@ def setUp(self): prob.model.set_input_defaults( Aircraft.CrewPayload.CATERING_ITEMS_MASS_PER_PASSENGER, 5.0, units='lbm' ) - # prob.model.set_input_defaults( - # Aircraft.Fuel.UNUSABLE_FUEL_MASS_COEFFICIENT, 12.0, units='unitless' - # ) prob.model.set_input_defaults(Aircraft.CrewPayload.CARGO_MASS, 0.0, units='lbm') prob.model.set_input_defaults(Aircraft.CrewPayload.Design.CARGO_MASS, 0.0, units='lbm') prob.model.set_input_defaults( @@ -3897,8 +2986,6 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Design.MAX_STRUCTURAL_SPEED, 402.5, units='mi/h') prob.model.set_input_defaults(Aircraft.Wing.FLAP_SPAN_RATIO, 0.61, units='unitless') prob.model.set_input_defaults(Aircraft.Nacelle.CLEARANCE_RATIO, 0.2, units='unitless') - - # prob.model.set_input_defaults(Aircraft.APU.MASS, 710.0, units='lbm') prob.model.set_input_defaults( Aircraft.Instruments.MASS_COEFFICIENT, 0.116, units='unitless' ) @@ -3913,12 +3000,8 @@ def setUp(self): prob.model.set_input_defaults( Aircraft.CrewPayload.WATER_MASS_PER_OCCUPANT, 3.0, units='lbm' ) - # prob.model.set_input_defaults( - # Aircraft.Fuel.UNUSABLE_FUEL_MASS_COEFFICIENT, 12.0, units='unitless' - # ) prob.model.set_input_defaults(Aircraft.Fuselage.LENGTH, 71.5245514, units='ft') prob.model.set_input_defaults(Aircraft.Wing.SPAN, 146.38501, units='ft') - # prob.model.set_input_defaults(Aircraft.Wing.AREA, 2142.85718, units='ft**2') prob.model.set_input_defaults(Aircraft.HorizontalTail.AREA, 0.001706279, units='ft**2') prob.model.set_input_defaults(Aircraft.VerticalTail.AREA, 169.119629, units='ft**2') prob.model.set_input_defaults(Aircraft.Fuselage.PRESSURE_DIFFERENTIAL, 10.0, units='psi') @@ -3946,11 +3029,48 @@ def setUp(self): Aircraft.Fuselage.AFTBODY_MASS_PER_UNIT_AREA, 5.0, units='lbm/ft**2' ) - setup_model_options(prob, options) - + # setup_model_options(prob, options) + prob.model_options['*'] = { + # options from SizeGroup + Aircraft.Design.TYPE: AircraftTypes.BLENDED_WING_BODY, + Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, + Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, + Aircraft.Wing.HAS_STRUT: False, + Aircraft.Wing.HAS_FOLD: True, + Aircraft.Wing.CHOOSE_FOLD_LOCATION: True, + Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.Electrical.HAS_HYBRID_SYSTEM: False, + Aircraft.CrewPayload.Design.NUM_PASSENGERS: 150, + Aircraft.CrewPayload.NUM_PASSENGERS: 150, + Aircraft.Fuselage.SEAT_WIDTH_FIRST: (28, 'inch'), + Aircraft.Fuselage.NUM_AISLES: 3, + Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 18, + Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST: (36, 'inch'), + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (32, 'inch'), + Aircraft.CrewPayload.Design.NUM_FIRST_CLASS: 11, + # options from MassPremission + Aircraft.Design.CRUISE_ALTITUDE: (41000, 'ft'), + Aircraft.LandingGear.FIXED_GEAR: False, + Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES: False, + Aircraft.Engine.ADDITIONAL_MASS_FRACTION: 0.04373, + Aircraft.Engine.NUM_FUSELAGE_ENGINES: 2, + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: 0, + Aircraft.CrewPayload.ULD_MASS_PER_PASSENGER: (0.0667, 'lbm'), + Aircraft.Engine.NUM_ENGINES: [2], + Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], + Aircraft.Design.PART25_STRUCTURAL_CATEGORY: 3, + Aircraft.Wing.LOADING_ABOVE_20: True, + Aircraft.BWB.DETAILED_WING_PROVIDED: True, + Aircraft.BWB.MAX_BAY_WIDTH: (0.0, 'ft'), + Aircraft.BWB.MAX_NUM_BAYS: 0, + Aircraft.Design.ULF_CALCULATED_FROM_MANEUVER: False, + Mission.SEA_LEVEL_DENSITY: (1.225, 'kg/m**3'), + Aircraft.Furnishings.USE_EMPIRICAL_EQUATION: True, + Aircraft.Propulsion.TOTAL_NUM_ENGINES: 2, + } prob.setup(check=False, force_alloc_complex=True) - def test_case1(self): + def test_case(self): """ Testing GASP data case: Aircraft.Propulsion.TOTAL_ENGINE_POD_MASS -- WPES = 2055 @@ -4004,31 +3124,25 @@ def test_case1(self): assert_near_equal(prob[Aircraft.Fuselage.LENGTH], 71.5245514, tol) assert_near_equal(prob[Aircraft.Fuselage.WETTED_AREA], 4573.42578, tol) assert_near_equal(prob[Aircraft.TailBoom.LENGTH], 71.5245514, tol) - assert_near_equal(prob[Aircraft.Wing.AREA], 2142.85714286, tol) assert_near_equal(prob[Aircraft.Wing.SPAN], 146.38501094, tol) - assert_near_equal(prob[Aircraft.Wing.CENTER_CHORD], 22.97244452, tol) assert_near_equal(prob[Aircraft.Wing.AVERAGE_CHORD], 16.2200522, tol) assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 20.33371617, tol) assert_near_equal(prob[Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED], 0.13596576, tol) - assert_near_equal(prob[Aircraft.HorizontalTail.AREA], 0.00117064, tol) assert_near_equal(prob[Aircraft.HorizontalTail.SPAN], 0.04467601, tol) assert_near_equal(prob[Aircraft.HorizontalTail.ROOT_CHORD], 0.03836448, tol) assert_near_equal(prob[Aircraft.HorizontalTail.AVERAGE_CHORD], 0.02808445, tol) assert_near_equal(prob[Aircraft.HorizontalTail.MOMENT_ARM], 29.69074172, tol) - assert_near_equal(prob[Aircraft.VerticalTail.AREA], 169.11964286, tol) assert_near_equal(prob[Aircraft.VerticalTail.SPAN], 16.98084188, tol) assert_near_equal(prob[Aircraft.VerticalTail.ROOT_CHORD], 14.58190052, tol) assert_near_equal(prob[Aircraft.VerticalTail.AVERAGE_CHORD], 10.67457744, tol) assert_near_equal(prob[Aircraft.VerticalTail.MOMENT_ARM], 27.82191598, tol) - assert_near_equal(prob[Aircraft.Nacelle.AVG_DIAMETER], 5.33382144, tol) assert_near_equal(prob[Aircraft.Nacelle.AVG_LENGTH], 7.24759657, tol) assert_near_equal(prob[Aircraft.Nacelle.SURFACE_AREA], 121.44575974, tol) - # outputs from MassPremission assert_near_equal(prob[Aircraft.LandingGear.TOTAL_MASS], 7800.0, tol) assert_near_equal(prob[Aircraft.LandingGear.MAIN_GEAR_MASS], 6630.0, tol) @@ -4052,12 +3166,10 @@ def test_case1(self): assert_near_equal(prob[Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS], 21885.38086961, tol) assert_near_equal(prob[Mission.OPERATING_ITEMS_MASS], 5961.79463002, tol) assert_near_equal(prob[Aircraft.Wing.SURFACE_CONTROL_MASS], 1986.25111783, tol) - # BWBWingMassGroup assert_near_equal(prob[Aircraft.Wing.MASS], 6959.72619224, tol) assert_near_equal(prob[Aircraft.Strut.MASS], 0, tol) assert_near_equal(prob[Aircraft.Wing.FOLD_MASS], 107.83351322, tol) - # FuelMassGroup # FuelSysAndFullFuselageMass assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_POD_MASS], 1686.62563123, tol) @@ -4081,7 +3193,6 @@ def test_case1(self): assert_near_equal(prob[Mission.OPERATING_MASS], 80987.12286499, tol) # BodyTankCalculations assert_near_equal(prob[Aircraft.Fuel.AUXILIARY_FUEL_MASS_CAPACITY], 4954.00837132, tol) - total_cap = prob[Aircraft.Fuel.MAX_CAPACITY_MASS] unusable = prob[Aircraft.Fuel.UNUSABLE_FUEL_MASS] assert_near_equal(total_cap - unusable, 40216.88550633, tol) @@ -4154,6 +3265,4 @@ def test_case1(self): if __name__ == '__main__': - # unittest.main() - test = MassPremissionTestCase2a() - test.test_case() + unittest.main() From 6f9feb351bdd6db14d5157067df0c06019876f6c Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 31 Aug 2026 14:03:13 -0400 Subject: [PATCH 10/21] modified MassPremissionTestCase1 by using PreMission helper class --- .../gasp_based/test/test_mass_premission.py | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py index 8b2859aa08..94aaa2092e 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py +++ b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py @@ -57,19 +57,17 @@ class MassPremissionTestCase1(unittest.TestCase): """ def setUp(self): - self.prob = om.Problem() - self.prob.model.add_subsystem( - 'gasp_based_geom', - SizeGroup(), - promotes_inputs=['aircraft:*'], - promotes_outputs=[ - 'aircraft:*', - ], - ) - self.prob.model.add_subsystem( - 'total_mass', - MassPremission(), - promotes=['*'], + options = AviaryValues() + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless') + options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless') + options.set_val(Settings.VERBOSITY, 0) + + prob = self.prob = om.Problem() + prob.model.add_subsystem( + 'premission', + PreMission(aviary_options=options), + promotes_outputs=['*'], + promotes_inputs=['*'], ) input_options = V3_bug_fixed_options.deepcopy() @@ -115,9 +113,9 @@ def test_case1(self): tol = 5e-4 expected_values = { - 'gasp_based_geom.cabin_height': 13.1, - 'gasp_based_geom.cabin_len': 72.09722222222223, - 'gasp_based_geom.nose_height': 8.6, + 'size.cabin_height': 13.1, + 'size.cabin_len': 72.09722222222223, + 'size.nose_height': 8.6, Aircraft.Wing.CENTER_CHORD: 17.63, Aircraft.Wing.ROOT_CHORD: 16.54, Aircraft.Wing.THICKNESS_TO_CHORD_UNWEIGHTED: 0.1397, # not exact GASP value from the output file, likely due to rounding error @@ -3265,4 +3263,7 @@ def test_case1(self): if __name__ == '__main__': - unittest.main() + # unittest.main() + test = MassPremissionTestCase1() + test.setUp() + test.test_case1() From 2c26e293a81aa9a8f56f64ebb4d901477c05ba23 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 31 Aug 2026 14:04:23 -0400 Subject: [PATCH 11/21] Aircraft.Design.COMPUTE_[HV]TAIL_VOLUME_COEFF = True --- .../validation_data/test_data/V3_bug_fixed_IO.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aviary/validation_cases/validation_data/test_data/V3_bug_fixed_IO.py b/aviary/validation_cases/validation_data/test_data/V3_bug_fixed_IO.py index 8ac1787d04..40f15be89e 100644 --- a/aviary/validation_cases/validation_data/test_data/V3_bug_fixed_IO.py +++ b/aviary/validation_cases/validation_data/test_data/V3_bug_fixed_IO.py @@ -41,8 +41,8 @@ def local_get_option_defaults() -> AviaryValues: option_defaults.set_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW, 0, units='unitless') option_defaults.set_val(Aircraft.CrewPayload.NUM_GALLEY_CREW, 0, units='unitless') option_defaults.set_val(Aircraft.CrewPayload.ULD_MASS_PER_PASSENGER, 0.0, units='lbm') - option_defaults.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, False, units='unitless') - option_defaults.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, False, units='unitless') + option_defaults.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, True, units='unitless') + option_defaults.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, True, units='unitless') option_defaults.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, 3, units='unitless') option_defaults.set_val(Aircraft.Design.PERCENT_EXCRESCENCE_DRAG, 0.0, units='unitless') option_defaults.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, False, units='unitless') From 68ef1b3058d0ec4caad66b76c2b00ac7232ed004 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 31 Aug 2026 14:26:24 -0400 Subject: [PATCH 12/21] minor update --- .../mass/gasp_based/test/test_mass_premission.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py index 94aaa2092e..8f50974d2d 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py +++ b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py @@ -2470,7 +2470,7 @@ def test_case(self): @use_tempdirs -class MassPremissionTestCase9a(unittest.TestCase): +class MassPremissionTestCase9(unittest.TestCase): """ This is the electrified Trans-sonic Truss-Braced Wing V3.6 test case All values are from V3.6 output, hand calculated from the output, or were printed out after running the code manually. @@ -3263,7 +3263,4 @@ def test_case1(self): if __name__ == '__main__': - # unittest.main() - test = MassPremissionTestCase1() - test.setUp() - test.test_case1() + unittest.main() From 81b0fbae489f6fd21189f2288f1443ef06c7c97a Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 31 Aug 2026 15:13:07 -0400 Subject: [PATCH 13/21] fix error due to merge --- .../gasp_based/test/test_mass_premission.py | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py index 7e2295ca1b..2d00dbdac5 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py +++ b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py @@ -177,6 +177,9 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + self.prob.model.set_input_defaults( + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch' + ) prob.model.set_input_defaults( Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS, val=200, units='lbm' ) @@ -355,7 +358,6 @@ def setUp(self): Aircraft.LandingGear.FIXED_GEAR: False, Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 6, Aircraft.Fuselage.NUM_AISLES: 1, - Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (29, 'inch'), Aircraft.Engine.ADDITIONAL_MASS_FRACTION: 0.14, Aircraft.Engine.NUM_ENGINES: [2], Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], @@ -575,6 +577,9 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + self.prob.model.set_input_defaults( + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch' + ) prob.model.set_input_defaults( Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS, val=200, units='lbm' ) @@ -756,7 +761,6 @@ def setUp(self): Aircraft.LandingGear.FIXED_GEAR: False, Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 6, Aircraft.Fuselage.NUM_AISLES: 1, - Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (29, 'inch'), Aircraft.Engine.ADDITIONAL_MASS_FRACTION: 0.14, Aircraft.Engine.NUM_ENGINES: [2], Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], @@ -869,6 +873,9 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + self.prob.model.set_input_defaults( + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch' + ) prob.model.set_input_defaults( Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS, val=200, units='lbm' ) @@ -1052,7 +1059,6 @@ def setUp(self): Aircraft.LandingGear.FIXED_GEAR: False, Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 6, Aircraft.Fuselage.NUM_AISLES: 1, - Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (29, 'inch'), Aircraft.Engine.ADDITIONAL_MASS_FRACTION: 0.14, Aircraft.Engine.NUM_ENGINES: [2], Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], @@ -1181,6 +1187,9 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + self.prob.model.set_input_defaults( + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch' + ) prob.model.set_input_defaults( Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS, val=200, units='lbm' ) @@ -1373,7 +1382,6 @@ def setUp(self): Aircraft.LandingGear.FIXED_GEAR: False, Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 6, Aircraft.Fuselage.NUM_AISLES: 1, - Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (29, 'inch'), Aircraft.Engine.ADDITIONAL_MASS_FRACTION: 0.14, Aircraft.Engine.NUM_ENGINES: [2], Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], @@ -1497,6 +1505,9 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + self.prob.model.set_input_defaults( + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch' + ) prob.model.set_input_defaults( Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS, val=200, units='lbm' ) @@ -1691,7 +1702,6 @@ def setUp(self): Aircraft.LandingGear.FIXED_GEAR: False, Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 6, Aircraft.Fuselage.NUM_AISLES: 1, - Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (29, 'inch'), Aircraft.Engine.ADDITIONAL_MASS_FRACTION: 0.14, Aircraft.Engine.NUM_ENGINES: [2], Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], @@ -1816,6 +1826,9 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + self.prob.model.set_input_defaults( + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch' + ) prob.model.set_input_defaults( Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS, val=200, units='lbm' ) @@ -2018,7 +2031,6 @@ def setUp(self): Aircraft.LandingGear.FIXED_GEAR: False, Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 6, Aircraft.Fuselage.NUM_AISLES: 1, - Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (29, 'inch'), Aircraft.Engine.ADDITIONAL_MASS_FRACTION: 0.165, Aircraft.Engine.NUM_ENGINES: [2], Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], @@ -2152,6 +2164,9 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + self.prob.model.set_input_defaults( + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 44.2, units='inch' + ) prob.model.set_input_defaults( Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS, val=200, units='lbm' ) @@ -2370,7 +2385,6 @@ def setUp(self): Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES: True, Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 6, Aircraft.Fuselage.NUM_AISLES: 1, - Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (44.2, 'inch'), Aircraft.Engine.ADDITIONAL_MASS_FRACTION: 0.163, Aircraft.Engine.NUM_ENGINES: [2], Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], @@ -2493,6 +2507,9 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + self.prob.model.set_input_defaults( + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 44.2, units='inch' + ) prob.model.set_input_defaults( Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS, val=200, units='lbm' ) @@ -2719,7 +2736,6 @@ def setUp(self): Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES: True, Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 6, Aircraft.Fuselage.NUM_AISLES: 1, - Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (44.2, 'inch'), Aircraft.Engine.ADDITIONAL_MASS_FRACTION: 0.163, Aircraft.Electrical.HAS_HYBRID_SYSTEM: True, Aircraft.Engine.NUM_ENGINES: [2], From 5085c655a43279a076ca0950465e8dd5d79aaf46 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 31 Aug 2026 15:40:45 -0400 Subject: [PATCH 14/21] modification due to merge --- .../geometry/gasp_based/test/test_size_group.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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 ac58cbf517..fa5cc4cb52 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_size_group.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_size_group.py @@ -594,6 +594,12 @@ def configure(self): promotes_inputs=['*'], ) + prob.model.set_input_defaults( + Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST, 36, units='inch' + ) + prob.model.set_input_defaults( + Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 32, units='inch' + ) prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_FIRST, 22, units='inch') prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 21, units='inch') prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 22, units='inch') @@ -660,8 +666,6 @@ def configure(self): Aircraft.Fuselage.SEAT_WIDTH_FIRST: (28, 'inch'), Aircraft.Fuselage.NUM_AISLES: 3, Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 18, - Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST: (36, 'inch'), - Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY: (32, 'inch'), Aircraft.CrewPayload.Design.NUM_FIRST_CLASS: 11, Aircraft.Engine.NUM_ENGINES: [2], } From dfe0c80592b2f8dd479942052f04aa505a0ba789 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 31 Aug 2026 19:14:31 -0400 Subject: [PATCH 15/21] found one test that needs helper class --- .../gasp_based/test/test_empennage.py | 121 +++++++++++++----- 1 file changed, 87 insertions(+), 34 deletions(-) diff --git a/aviary/subsystems/geometry/gasp_based/test/test_empennage.py b/aviary/subsystems/geometry/gasp_based/test/test_empennage.py index e3c9e649b7..8a3a00eb03 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_empennage.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_empennage.py @@ -19,6 +19,29 @@ partial_tols = {'atol': 1e-8, 'rtol': 1e-8} +class PreMission(om.Group): + """a helper class for overriding""" + + def initialize(self): + self.options.declare( + 'aviary_options', types=AviaryValues, desc='Aircraft options dictionary' + ) + + def setup(self): + self.add_subsystem( + 'emp', + EmpennageSize(), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) + + def configure(self): + aviary_options = self.options['aviary_options'] + + # Overrides + override_aviary_vars(self, aviary_options) + + class TestMomentRatio(unittest.TestCase): def setUp(self): self.prob = om.Problem() @@ -189,12 +212,25 @@ def test_large_single_aisle_1_vtail(self): @use_tempdirs -class TestEmpennageGroup( - unittest.TestCase -): # this is the GASP test case, input and output values based on large single aisle 1 v3 without bug fix +class TestEmpennageGroup1(unittest.TestCase): + """ + this is the GASP test case, input and output values based on large single aisle 1 v3 without bug fix + tail volume coefficients are given. + """ + def setUp(self): - self.prob = om.Problem() - self.prob.model.add_subsystem('emp', EmpennageSize(), promotes=['*']) + options = AviaryValues() + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=0.000001, units='unitless') + options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.015, units='unitless') + options.set_val(Settings.VERBOSITY, 0) + + prob = self.prob = om.Problem() + prob.model.add_subsystem( + 'premission', + PreMission(aviary_options=options), + promotes_outputs=['*'], + promotes_inputs=['*'], + ) self.prob.model.set_input_defaults( Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless' @@ -225,10 +261,12 @@ def setUp(self): Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) - def test_large_sinle_aisle_1_defaults(self): + prob.setup(check=False, force_alloc_complex=True) self.prob.setup(check=False, force_alloc_complex=True) - self.prob.run_model() + def test_large_sinle_aisle_1_defaults(self): + prob = self.prob + prob.run_model() # Htail AVERAGE_CHORD potentially not actual GASP value, it is calculated twice in different places # note: MOMENT_ARM slightly different from GASP output value, likely numerical diff.s, this value is from Kenny @@ -252,10 +290,49 @@ def test_large_sinle_aisle_1_defaults(self): partial_data = self.prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, **partial_tols) + +@use_tempdirs +class TestEmpennageGroup2(unittest.TestCase): + """ + this is the GASP test case, input and output values based on large single aisle 1 v3 without bug fix + tail volume coefficients are computed. + """ + + def setUp(self): + self.prob = om.Problem() + self.prob.model.add_subsystem('emp', EmpennageSize(), promotes=['*']) + + self.prob.model.set_input_defaults( + Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless' + ) + self.prob.model.set_input_defaults(Aircraft.Wing.AREA, val=1370.3, units='ft**2') + self.prob.model.set_input_defaults( + Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' + ) + self.prob.model.set_input_defaults(Aircraft.Wing.AVERAGE_CHORD, val=12.615, units='ft') + self.prob.model.set_input_defaults( + Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' + ) + self.prob.model.set_input_defaults( + Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' + ) + + self.prob.model.set_input_defaults( + Aircraft.VerticalTail.VOLUME_COEFFICIENT, val=0.145, units='unitless' + ) + self.prob.model.set_input_defaults( + Aircraft.VerticalTail.MOMENT_RATIO, val=2.362, units='unitless' + ) + self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=117.8, units='ft') + self.prob.model.set_input_defaults( + Aircraft.VerticalTail.ASPECT_RATIO, val=1.67, units='unitless' + ) + self.prob.model.set_input_defaults( + Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' + ) + def test_large_sinle_aisle_1_calc_volcoefs(self): options = get_option_defaults() - options.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val=True, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=True, units='unitless') setup_model_options(self.prob, options) @@ -283,29 +360,9 @@ def test_large_sinle_aisle_1_calc_volcoefs(self): @use_tempdirs class BWBTestEmpennageGroup(unittest.TestCase): - """GASP model does not compute volume coeffiients. So, override.""" + """GASP BWB model does not compute volume coeffiients. So, override.""" def test_case(self): - class PreMission(om.Group): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, desc='Aircraft options dictionary' - ) - - def setup(self): - self.add_subsystem( - 'emp', - EmpennageSize(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - def configure(self): - aviary_options = self.options['aviary_options'] - - # Overrides - override_aviary_vars(self, aviary_options) - options = AviaryValues() options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=0.000001, units='unitless') options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.015, units='unitless') @@ -341,10 +398,6 @@ def configure(self): Aircraft.VerticalTail.TAPER_RATIO, val=0.366, units='unitless' ) - prob.model_options['*'] = { - Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, - Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, - } prob.setup(check=False, force_alloc_complex=True) prob.run_model() From 7a71e47016958f1503c3a89ec29fefeac9972ffd Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 31 Aug 2026 19:52:15 -0400 Subject: [PATCH 16/21] remove Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF and Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF --- .../blended_wing_body/generic_BWB_GASP.csv | 2 - .../geometry/gasp_based/empennage.py | 30 ++- .../gasp_based/test/test_size_group.py | 197 +++++++++--------- .../geometry/test/test_flops_geom_builder.py | 12 -- .../geometry/test/test_gasp_geom_builder.py | 12 -- .../gasp_based/test/test_mass_premission.py | 18 -- aviary/utils/process_input_decks.py | 20 -- aviary/utils/test/test_aviary_values.py | 22 +- .../test_data/V3_bug_fixed_IO.py | 2 - aviary/variable_info/variable_meta_data.py | 24 --- aviary/variable_info/variables.py | 2 - 11 files changed, 116 insertions(+), 225 deletions(-) diff --git a/aviary/models/aircraft/blended_wing_body/generic_BWB_GASP.csv b/aviary/models/aircraft/blended_wing_body/generic_BWB_GASP.csv index 6cfc981278..87d14a05b2 100644 --- a/aviary/models/aircraft/blended_wing_body/generic_BWB_GASP.csv +++ b/aviary/models/aircraft/blended_wing_body/generic_BWB_GASP.csv @@ -27,8 +27,6 @@ aircraft:crew_and_payload:uld_mass_per_passenger,0.0667,lbm aircraft:crew_and_payload:water_mass_per_occupant,3,lbm aircraft:design:cg_delta,0.25,unitless aircraft:design:cockpit_control_mass_coefficient,16.5,unitless -aircraft:design:compute_htail_volume_coeff,True,unitless -aircraft:design:compute_vtail_volume_coeff,True,unitless aircraft:design:drag_coefficient_increment,0.00025,unitless aircraft:design:emergency_equipment_mass,100,lbm aircraft:design:max_structural_speed,402.5,mi/h diff --git a/aviary/subsystems/geometry/gasp_based/empennage.py b/aviary/subsystems/geometry/gasp_based/empennage.py index 53838cf9c0..1f20713ebc 100644 --- a/aviary/subsystems/geometry/gasp_based/empennage.py +++ b/aviary/subsystems/geometry/gasp_based/empennage.py @@ -288,10 +288,6 @@ class EmpennageSize(om.Group): computed via empirical relationships to general airplane parameters. """ - def initialize(self): - add_aviary_option(self, Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF) - add_aviary_option(self, Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF) - def setup(self): # For cruciform/T-tail configurations, see issue #1089 @@ -308,20 +304,18 @@ def setup(self): # promotes_outputs=['*'], # ) - if self.options[Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF]: - self.add_subsystem( - 'htail_vc', - TailVolCoef(orientation='horizontal'), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - if self.options[Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF]: - self.add_subsystem( - 'vtail_vc', - TailVolCoef(orientation='vertical'), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) + self.add_subsystem( + 'htail_vc', + TailVolCoef(orientation='horizontal'), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) + self.add_subsystem( + 'vtail_vc', + TailVolCoef(orientation='vertical'), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) self.add_subsystem( 'htail', 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 fa5cc4cb52..ce3ed26e1b 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_size_group.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_size_group.py @@ -14,20 +14,41 @@ # this is the GASP test case, input and output values based on large single aisle 1 v3 without bug fix +class PreMission(om.Group): + """a helper class for overriding""" + + def initialize(self): + self.options.declare( + 'aviary_options', types=AviaryValues, desc='Aircraft options dictionary' + ) + + def setup(self): + self.add_subsystem( + 'size', + SizeGroup(), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) + + def configure(self): + aviary_options = self.options['aviary_options'] + + # Overrides + override_aviary_vars(self, aviary_options) + + @use_tempdirs class SizeGroupTestCase1(unittest.TestCase): def setUp(self): - options = get_option_defaults() - options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=180, units='unitless') - options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) - options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) - options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, val=0.0003097, units='unitless') + options = AviaryValues() + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless') + options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless') + options.set_val(Settings.VERBOSITY, 0) - self.prob = om.Problem() - self.prob.model.add_subsystem( - 'size', - SizeGroup(), + prob = self.prob = om.Problem() + prob.model.add_subsystem( + 'premission', + PreMission(aviary_options=options), promotes=['*'], ) @@ -61,12 +82,6 @@ def setUp(self): 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( - Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless' - ) self.prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') self.prob.model.set_input_defaults( Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft' @@ -90,12 +105,20 @@ def setUp(self): ) self.prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') - setup_model_options(self.prob, options) - + # setup_model_options(self.prob, options) + prob.model_options['*'] = { + Aircraft.Electrical.HAS_HYBRID_SYSTEM: False, + Aircraft.CrewPayload.Design.NUM_PASSENGERS: 180, + Aircraft.Fuselage.NUM_AISLES: 1, + Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 6, + Aircraft.Engine.INLET_AREA_COEFFICIENT: 0.0003097, + Aircraft.Engine.NUM_ENGINES: [2], + } self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): - self.prob.run_model() + prob = self.prob + prob.run_model() tol = 5e-4 expected_values = { @@ -130,108 +153,96 @@ def test_case1(self): for var_name, expected_val in expected_values.items(): with self.subTest(var=var_name): - assert_near_equal(self.prob[var_name], expected_val, tol) + assert_near_equal(prob[var_name], expected_val, tol) - partial_data = self.prob.check_partials(out_stream=None, method='cs') + partial_data = prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, atol=2e-12, rtol=1e-12) @use_tempdirs class SizeGroupTestCase2(unittest.TestCase): def setUp(self): - options = get_option_defaults() - options.set_val(Aircraft.Wing.HAS_FOLD, val=True, units='unitless') - options.set_val(Aircraft.Wing.HAS_STRUT, val=True, units='unitless') - options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=180, units='unitless') - options.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, val=False, units='unitless') - options.set_val( - Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless' - ) - options.set_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless') - options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) - options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) - options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, val=0.00030975, units='unitless') + options = AviaryValues() + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless') + options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless') + options.set_val(Settings.VERBOSITY, 0) - self.prob = om.Problem() - self.prob.model.add_subsystem( - 'size', - SizeGroup(), + prob = self.prob = om.Problem() + prob.model.add_subsystem( + 'premission', + PreMission(aviary_options=options), promotes=['*'], ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') - self.prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') + prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + prob.model.set_input_defaults( Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch' ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') - self.prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') + prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + prob.model.set_input_defaults( Aircraft.Engine.INLET_AREA_COEFFICIENT, val=0.00030975, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=10.13, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.33, units='unitless') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=10.13, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.33, units='unitless') + prob.model.set_input_defaults( Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=25, units='deg') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=25, units='deg') + prob.model.set_input_defaults( Aircraft.Wing.THICKNESS_TO_CHORD_ROOT, val=0.15, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=175400, units='lbm') - self.prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=128, units='lbf/ft**2') - self.prob.model.set_input_defaults(Aircraft.Strut.ATTACHMENT_LOCATION, val=12, units='ft') - self.prob.model.set_input_defaults( - Aircraft.Strut.AREA_RATIO, val=0.021893, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=175400, units='lbm') + prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=128, units='lbf/ft**2') + prob.model.set_input_defaults(Aircraft.Strut.ATTACHMENT_LOCATION, val=12, units='ft') + prob.model.set_input_defaults(Aircraft.Strut.AREA_RATIO, val=0.021893, units='unitless') + prob.model.set_input_defaults( Aircraft.VerticalTail.ASPECT_RATIO, val=1.67, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) - 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') + prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, 175400.0, units='lbm') + prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless') + prob.model.set_input_defaults( Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') + prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') + prob.model.set_input_defaults(Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless') + prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') - setup_model_options(self.prob, options) - - self.prob.setup(check=False, force_alloc_complex=True) + # setup_model_options(prob, options) + prob.model_options['*'] = { + Aircraft.Wing.HAS_FOLD: True, + Aircraft.Wing.HAS_STRUT: True, + Aircraft.Electrical.HAS_HYBRID_SYSTEM: False, + Aircraft.CrewPayload.Design.NUM_PASSENGERS: 180, + Aircraft.Wing.CHOOSE_FOLD_LOCATION: False, + Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.Fuselage.NUM_AISLES: 1, + Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 6, + Aircraft.Engine.INLET_AREA_COEFFICIENT: 0.00030975, + Aircraft.Engine.NUM_ENGINES: [2], + } + prob.setup(check=False, force_alloc_complex=True) def test_case1(self): - self.prob.run_model() + prob = self.prob + prob.run_model() tol = 1e-4 expected_values = { @@ -274,9 +285,9 @@ def test_case1(self): for var_name, expected_val in expected_values.items(): with self.subTest(var=var_name): - assert_near_equal(self.prob[var_name], expected_val, tol) + assert_near_equal(prob[var_name], expected_val, tol) - partial_data = self.prob.check_partials(out_stream=None, method='cs') + partial_data = prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, atol=3e-10, rtol=1e-12) @@ -285,8 +296,6 @@ class SizeGroupTestCase3(unittest.TestCase): def setUp(self): options = get_option_defaults() options.set_val(Aircraft.Wing.HAS_FOLD, val=True, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val=True, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=True, units='unitless') options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=180, units='unitless') options.set_val( Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless' @@ -424,8 +433,6 @@ def test_case1(self): class SizeGroupTestCase4(unittest.TestCase): def setUp(self): options = get_option_defaults() - options.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val=True, units='unitless') - options.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=True, units='unitless') options.set_val(Aircraft.Wing.HAS_STRUT, val=True, units='unitless') options.set_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, val=False, units='unitless') options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') @@ -655,8 +662,6 @@ def configure(self): prob.model_options['*'] = { Aircraft.Design.TYPE: AircraftTypes.BLENDED_WING_BODY, - Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, - Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, Aircraft.Wing.HAS_STRUT: False, Aircraft.Wing.HAS_FOLD: True, Aircraft.Wing.CHOOSE_FOLD_LOCATION: True, diff --git a/aviary/subsystems/geometry/test/test_flops_geom_builder.py b/aviary/subsystems/geometry/test/test_flops_geom_builder.py index c279a87641..f3dd5f2923 100644 --- a/aviary/subsystems/geometry/test/test_flops_geom_builder.py +++ b/aviary/subsystems/geometry/test/test_flops_geom_builder.py @@ -32,12 +32,6 @@ def setUp(self): self.aviary_values.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, False, units='unitless') self.aviary_values.set_val(Aircraft.Wing.HAS_FOLD, True, units='unitless') self.aviary_values.set_val(Aircraft.Wing.HAS_STRUT, True, units='unitless') - self.aviary_values.set_val( - Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, True, units='unitless' - ) - self.aviary_values.set_val( - Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, True, units='unitless' - ) self.aviary_values.set_val(Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION, True, units='unitless') self.aviary_values.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, True, units='unitless') self.aviary_values.set_val( @@ -67,12 +61,6 @@ def setUp(self): self.aviary_values.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, True, units='unitless') self.aviary_values.set_val(Aircraft.Wing.HAS_FOLD, True, units='unitless') self.aviary_values.set_val(Aircraft.Wing.HAS_STRUT, True, units='unitless') - self.aviary_values.set_val( - Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, True, units='unitless' - ) - self.aviary_values.set_val( - Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, True, units='unitless' - ) self.aviary_values.set_val(Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION, True, units='unitless') self.aviary_values.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, True, units='unitless') self.aviary_values.set_val( diff --git a/aviary/subsystems/geometry/test/test_gasp_geom_builder.py b/aviary/subsystems/geometry/test/test_gasp_geom_builder.py index 89af1b3a66..c02c46c87b 100644 --- a/aviary/subsystems/geometry/test/test_gasp_geom_builder.py +++ b/aviary/subsystems/geometry/test/test_gasp_geom_builder.py @@ -32,12 +32,6 @@ def setUp(self): self.aviary_values.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, False, units='unitless') self.aviary_values.set_val(Aircraft.Wing.HAS_FOLD, True, units='unitless') self.aviary_values.set_val(Aircraft.Wing.HAS_STRUT, True, units='unitless') - self.aviary_values.set_val( - Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, True, units='unitless' - ) - self.aviary_values.set_val( - Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, True, units='unitless' - ) self.aviary_values.set_val(Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION, True, units='unitless') self.aviary_values.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, True, units='unitless') self.aviary_values.set_val( @@ -67,12 +61,6 @@ def setUp(self): self.aviary_values.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, True, units='unitless') self.aviary_values.set_val(Aircraft.Wing.HAS_FOLD, True, units='unitless') self.aviary_values.set_val(Aircraft.Wing.HAS_STRUT, True, units='unitless') - self.aviary_values.set_val( - Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, True, units='unitless' - ) - self.aviary_values.set_val( - Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, True, units='unitless' - ) self.aviary_values.set_val(Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION, True, units='unitless') self.aviary_values.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, True, units='unitless') self.aviary_values.set_val( diff --git a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py index 2d00dbdac5..c64f270567 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py +++ b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py @@ -363,8 +363,6 @@ def setUp(self): Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], Aircraft.Wing.HAS_FOLD: False, Aircraft.Wing.HAS_STRUT: False, - Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, - Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, Aircraft.Electrical.HAS_HYBRID_SYSTEM: False, Aircraft.Design.TYPE: AircraftTypes.TRANSPORT, Aircraft.Design.PART25_STRUCTURAL_CATEGORY: 3, @@ -766,8 +764,6 @@ def setUp(self): Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], Aircraft.Wing.HAS_FOLD: False, Aircraft.Wing.HAS_STRUT: False, - Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, - Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, Aircraft.Design.TYPE: AircraftTypes.TRANSPORT, Aircraft.Design.PART25_STRUCTURAL_CATEGORY: 3, Aircraft.Wing.LOADING_ABOVE_20: True, @@ -1064,8 +1060,6 @@ def setUp(self): Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], Aircraft.Wing.HAS_FOLD: False, Aircraft.Wing.HAS_STRUT: False, - Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, - Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, Aircraft.Design.TYPE: AircraftTypes.TRANSPORT, Aircraft.Design.PART25_STRUCTURAL_CATEGORY: 3, Aircraft.Wing.LOADING_ABOVE_20: True, @@ -1387,8 +1381,6 @@ def setUp(self): Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], Aircraft.Wing.HAS_FOLD: False, Aircraft.Wing.HAS_STRUT: False, - Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, - Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, Aircraft.Electrical.HAS_HYBRID_SYSTEM: False, Aircraft.Design.TYPE: AircraftTypes.TRANSPORT, Aircraft.Design.PART25_STRUCTURAL_CATEGORY: 3, @@ -1707,8 +1699,6 @@ def setUp(self): Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], Aircraft.Wing.HAS_FOLD: False, Aircraft.Wing.HAS_STRUT: False, - Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, - Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, Aircraft.Design.TYPE: AircraftTypes.TRANSPORT, Aircraft.Design.PART25_STRUCTURAL_CATEGORY: 3, Aircraft.Wing.LOADING_ABOVE_20: True, @@ -2035,8 +2025,6 @@ def setUp(self): Aircraft.Engine.NUM_ENGINES: [2], Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], Aircraft.Wing.HAS_STRUT: False, - Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, - Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, Aircraft.Design.TYPE: AircraftTypes.TRANSPORT, Aircraft.Design.PART25_STRUCTURAL_CATEGORY: 3, Aircraft.Wing.LOADING_ABOVE_20: True, @@ -2388,8 +2376,6 @@ def setUp(self): Aircraft.Engine.ADDITIONAL_MASS_FRACTION: 0.163, Aircraft.Engine.NUM_ENGINES: [2], Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], - Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, - Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, Aircraft.Design.TYPE: AircraftTypes.TRANSPORT, Aircraft.Design.PART25_STRUCTURAL_CATEGORY: 3, Aircraft.Wing.LOADING_ABOVE_20: True, @@ -2740,8 +2726,6 @@ def setUp(self): Aircraft.Electrical.HAS_HYBRID_SYSTEM: True, Aircraft.Engine.NUM_ENGINES: [2], Aircraft.Engine.TYPE: [GASPEngineType.TURBOJET], - Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, - Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, Aircraft.Design.TYPE: AircraftTypes.TRANSPORT, Aircraft.Design.PART25_STRUCTURAL_CATEGORY: 3, Aircraft.Wing.LOADING_ABOVE_20: True, @@ -3053,8 +3037,6 @@ def setUp(self): prob.model_options['*'] = { # options from SizeGroup Aircraft.Design.TYPE: AircraftTypes.BLENDED_WING_BODY, - Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF: True, - Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF: True, Aircraft.Wing.HAS_STRUT: False, Aircraft.Wing.HAS_FOLD: True, Aircraft.Wing.CHOOSE_FOLD_LOCATION: True, diff --git a/aviary/utils/process_input_decks.py b/aviary/utils/process_input_decks.py index 044ecbede8..faba51dd58 100644 --- a/aviary/utils/process_input_decks.py +++ b/aviary/utils/process_input_decks.py @@ -551,24 +551,4 @@ def initialization_guessing(aircraft_values: AviaryValues, initialization_guesse 'alternate': False, }, ], - [ - Aircraft.HorizontalTail.VOLUME_COEFFICIENT, - { - 'val': 0, - 'relation': '==', - 'target': Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, - 'result': True, - 'alternate': False, - }, - ], - [ - Aircraft.VerticalTail.VOLUME_COEFFICIENT, - { - 'val': 0, - 'relation': '==', - 'target': Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, - 'result': True, - 'alternate': False, - }, - ], ] diff --git a/aviary/utils/test/test_aviary_values.py b/aviary/utils/test/test_aviary_values.py index 33c43edc40..cac4ee5e50 100644 --- a/aviary/utils/test/test_aviary_values.py +++ b/aviary/utils/test/test_aviary_values.py @@ -35,12 +35,7 @@ def test_aircraft(self): self.fail('Expecting correct units and type to pass.') try: - vals.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val=True, units='unitless') - except: - self.fail('Expecting correct units and type to pass.') - - try: - vals.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val=True, units='unitless') + vals.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, val=True, units='unitless') except: self.fail('Expecting correct units and type to pass.') @@ -56,22 +51,11 @@ def test_aircraft(self): self.fail('Expecting TypeError.') try: - vals.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, val='five', units='unitless') - except TypeError as err: - self.assertEqual( - str(err), - f'{Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF} is of type(s) but you have provided a value of type .", - ) - else: - self.fail('Expecting TypeError.') - - try: - vals.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, val='five', units='unitless') + vals.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, val='five', units='unitless') except TypeError as err: self.assertEqual( str(err), - f'{Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF} is of type(s) but you have provided a value of type .", ) else: diff --git a/aviary/validation_cases/validation_data/test_data/V3_bug_fixed_IO.py b/aviary/validation_cases/validation_data/test_data/V3_bug_fixed_IO.py index 40f15be89e..9496b93743 100644 --- a/aviary/validation_cases/validation_data/test_data/V3_bug_fixed_IO.py +++ b/aviary/validation_cases/validation_data/test_data/V3_bug_fixed_IO.py @@ -41,8 +41,6 @@ def local_get_option_defaults() -> AviaryValues: option_defaults.set_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW, 0, units='unitless') option_defaults.set_val(Aircraft.CrewPayload.NUM_GALLEY_CREW, 0, units='unitless') option_defaults.set_val(Aircraft.CrewPayload.ULD_MASS_PER_PASSENGER, 0.0, units='lbm') - option_defaults.set_val(Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, True, units='unitless') - option_defaults.set_val(Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, True, units='unitless') option_defaults.set_val(Aircraft.Design.PART25_STRUCTURAL_CATEGORY, 3, units='unitless') option_defaults.set_val(Aircraft.Design.PERCENT_EXCRESCENCE_DRAG, 0.0, units='unitless') option_defaults.set_val(Aircraft.Design.SMOOTH_MASS_DISCONTINUITIES, False, units='unitless') diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 76f32adfbe..884e2065e3 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1237,30 +1237,6 @@ desc='compressibility aero calibration factor', ) -add_meta_data( - Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, - meta_data=_MetaData, - historical_name={'GASP': None, 'FLOPS': None}, - units='unitless', - option=True, - default_value=False, - types=bool, - desc='if true, use empirical tail volume coefficient equation. This is ' - 'true if VBARHX is 0 in GASP.', -) - -add_meta_data( - Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, - meta_data=_MetaData, - historical_name={'GASP': None, 'FLOPS': None}, - units='unitless', - option=True, - default_value=False, - types=bool, - desc='if true, use empirical tail volume coefficient equation. This is ' - 'true if VBARVX is 0 in GASP.', -) - add_meta_data( Aircraft.Design.CRUISE_ALTITUDE, meta_data=_MetaData, diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index 1f5d8a8814..8fe1db1ff6 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -137,8 +137,6 @@ class Design: CHARACTERISTIC_LENGTHS = 'aircraft:design:characteristic_lengths' COCKPIT_CONTROL_MASS_COEFFICIENT = 'aircraft:design:cockpit_control_mass_coefficient' COMPRESSIBILITY_DRAG_FACTOR = 'aircraft:design:compressibility_drag_factor' - COMPUTE_HTAIL_VOLUME_COEFF = 'aircraft:design:compute_htail_volume_coeff' - COMPUTE_VTAIL_VOLUME_COEFF = 'aircraft:design:compute_vtail_volume_coeff' CRUISE_ALTITUDE = 'aircraft:design:cruise_altitude' CRUISE_MACH = 'aircraft:design:cruise_mach' DRAG_COEFFICIENT_INCREMENT = 'aircraft:design:drag_coefficient_increment' From aaabfff628a8c8969982ebc040ee6db5bd28af27 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 1 Sep 2026 14:08:53 -0400 Subject: [PATCH 17/21] add MomentRatio into EmpennageSize --- .../geometry/gasp_based/empennage.py | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/aviary/subsystems/geometry/gasp_based/empennage.py b/aviary/subsystems/geometry/gasp_based/empennage.py index 1f20713ebc..4721959ae6 100644 --- a/aviary/subsystems/geometry/gasp_based/empennage.py +++ b/aviary/subsystems/geometry/gasp_based/empennage.py @@ -291,18 +291,18 @@ class EmpennageSize(om.Group): def setup(self): # For cruciform/T-tail configurations, see issue #1089 - # self.add_subsystem( - # 'htail_mr', - # MomentRatio(orientation='horizontal'), - # promotes_inputs=['*'], - # promotes_outputs=['*'], - # ) - # self.add_subsystem( - # 'vtail_mr', - # MomentRatio(orientation='vertical'), - # promotes_inputs=['*'], - # promotes_outputs=['*'], - # ) + self.add_subsystem( + 'htail_mr', + MomentRatio(orientation='horizontal'), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) + self.add_subsystem( + 'vtail_mr', + MomentRatio(orientation='vertical'), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) self.add_subsystem( 'htail_vc', From 451f0d320067488b3715f78bfb7f53b7fad518ee Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 1 Sep 2026 14:09:46 -0400 Subject: [PATCH 18/21] modified unit tests where moment ratios are fixed --- .../gasp_based/test/test_empennage.py | 54 +++--- .../gasp_based/test/test_size_group.py | 157 +++++++----------- .../gasp_based/test/test_mass_premission.py | 74 ++++----- 3 files changed, 114 insertions(+), 171 deletions(-) diff --git a/aviary/subsystems/geometry/gasp_based/test/test_empennage.py b/aviary/subsystems/geometry/gasp_based/test/test_empennage.py index 8a3a00eb03..bfde5a3153 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_empennage.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_empennage.py @@ -44,24 +44,25 @@ def configure(self): class TestMomentRatio(unittest.TestCase): def setUp(self): - self.prob = om.Problem() - self.prob.model.add_subsystem( + prob = self.prob = om.Problem() + prob.model.add_subsystem( 'hmr', MomentRatio(orientation='horizontal'), promotes=['aircraft:*'], ) - self.prob.model.add_subsystem( + prob.model.add_subsystem( 'vmr', MomentRatio(orientation='vertical'), promotes=['aircraft:*'], ) - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, val=0, units='unitless' + prob.model.set_input_defaults( + Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, 0, units='unitless' ) self.prob.setup(check=False, force_alloc_complex=True) def test_case_1(self): - self.prob.run_model() + prob = self.prob + prob.run_model() # These are not actual GASP values. expected_values = { @@ -71,14 +72,13 @@ def test_case_1(self): for var_name, expected in expected_values.items(): with self.subTest(var=var_name): - assert_near_equal(self.prob[var_name], expected, tol) + assert_near_equal(prob[var_name], expected, tol) def test_case_2(self): - self.prob.setup(check=False, force_alloc_complex=True) - self.prob.set_val( - Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, val=1, units='unitless' - ) - self.prob.run_model() + prob = self.prob + prob.setup(check=False, force_alloc_complex=True) + prob.set_val(Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, 1, units='unitless') + prob.run_model() # These are not actual GASP values. expected_values = { @@ -88,10 +88,10 @@ def test_case_2(self): for var_name, expected in expected_values.items(): with self.subTest(var=var_name): - assert_near_equal(self.prob[var_name], expected, tol) + assert_near_equal(prob[var_name], expected, tol) - def test_partials(self): - partial_data = self.prob.check_partials(out_stream=None, method='cs') + prob = self.prob + partial_data = prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, **partial_tols) @@ -220,8 +220,10 @@ class TestEmpennageGroup1(unittest.TestCase): def setUp(self): options = AviaryValues() - options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=0.000001, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, 0.000001, units='unitless') options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.015, units='unitless') + options.set_val(Aircraft.HorizontalTail.MOMENT_RATIO, 0.2307, units='unitless') + options.set_val(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') options.set_val(Settings.VERBOSITY, 0) prob = self.prob = om.Problem() @@ -236,9 +238,6 @@ def setUp(self): Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless' ) self.prob.model.set_input_defaults(Aircraft.Wing.AREA, val=1370.3, units='ft**2') - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' - ) self.prob.model.set_input_defaults(Aircraft.Wing.AVERAGE_CHORD, val=12.615, units='ft') self.prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' @@ -250,9 +249,6 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.VerticalTail.VOLUME_COEFFICIENT, val=0.145, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MOMENT_RATIO, val=2.362, units='unitless' - ) self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=117.8, units='ft') self.prob.model.set_input_defaults( Aircraft.VerticalTail.ASPECT_RATIO, val=1.67, units='unitless' @@ -262,7 +258,6 @@ def setUp(self): ) prob.setup(check=False, force_alloc_complex=True) - self.prob.setup(check=False, force_alloc_complex=True) def test_large_sinle_aisle_1_defaults(self): prob = self.prob @@ -364,8 +359,10 @@ class BWBTestEmpennageGroup(unittest.TestCase): def test_case(self): options = AviaryValues() - options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=0.000001, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, 0.000001, units='unitless') options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.015, units='unitless') + options.set_val(Aircraft.HorizontalTail.MOMENT_RATIO, 0.5463, units='unitless') + options.set_val(Aircraft.VerticalTail.MOMENT_RATIO, 5.2615, units='unitless') options.set_val(Settings.VERBOSITY, 0) prob = om.Problem() @@ -377,9 +374,6 @@ def test_case(self): ) prob.model.set_input_defaults(Aircraft.Wing.AREA, val=2142.85714286, units='ft**2') - prob.model.set_input_defaults( - Aircraft.HorizontalTail.MOMENT_RATIO, val=0.5463, units='unitless' - ) prob.model.set_input_defaults(Aircraft.Wing.AVERAGE_CHORD, val=16.2200522, units='ft') prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=1.705, units='unitless' @@ -387,9 +381,6 @@ def test_case(self): prob.model.set_input_defaults( Aircraft.HorizontalTail.TAPER_RATIO, val=0.366, units='unitless' ) - prob.model.set_input_defaults( - Aircraft.VerticalTail.MOMENT_RATIO, val=5.2615, units='unitless' - ) prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=146.38501094, units='ft') prob.model.set_input_defaults( Aircraft.VerticalTail.ASPECT_RATIO, val=1.705, units='unitless' @@ -425,3 +416,6 @@ def test_case(self): if __name__ == '__main__': unittest.main() + test = BWBTestEmpennageGroup() + test.setUp() + # test.test_case() 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 ce3ed26e1b..48ecabb4d7 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_size_group.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_size_group.py @@ -1,3 +1,4 @@ +import numpy as np import unittest import openmdao.api as om @@ -43,6 +44,8 @@ def setUp(self): options = AviaryValues() options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless') options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless') + options.set_val(Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless') + options.set_val(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') options.set_val(Settings.VERBOSITY, 0) prob = self.prob = om.Problem() @@ -91,12 +94,6 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless' - ) self.prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) @@ -163,8 +160,10 @@ def test_case1(self): class SizeGroupTestCase2(unittest.TestCase): def setUp(self): options = AviaryValues() - options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, 1.189, units='unitless') options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless') + options.set_val(Aircraft.HorizontalTail.MOMENT_RATIO, 0.2307, units='unitless') + options.set_val(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') options.set_val(Settings.VERBOSITY, 0) prob = self.prob = om.Problem() @@ -211,13 +210,9 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless') - prob.model.set_input_defaults( - Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' - ) prob.model.set_input_defaults( Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' ) - prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) @@ -294,21 +289,17 @@ def test_case1(self): @use_tempdirs class SizeGroupTestCase3(unittest.TestCase): def setUp(self): - options = get_option_defaults() - options.set_val(Aircraft.Wing.HAS_FOLD, val=True, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=180, units='unitless') - options.set_val( - Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True, units='unitless' - ) - options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) - options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 1) - options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=True, units='unitless') - - self.prob = om.Problem() - self.prob.model.add_subsystem( - 'size', - SizeGroup(), - promotes=['*'], + options = AviaryValues() + options.set_val(Aircraft.HorizontalTail.MOMENT_RATIO, 0.2307, units='unitless') + options.set_val(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') + options.set_val(Settings.VERBOSITY, 0) + + prob = self.prob = om.Problem() + prob.model.add_subsystem( + 'premission', + PreMission(aviary_options=options), + promotes_outputs=['*'], + promotes_inputs=['*'], ) self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') @@ -344,16 +335,10 @@ def setUp(self): ) 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' + Aircraft.Engine.WING_LOCATIONS, val=np.array([0.35]), units='unitless' ) self.prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless' - ) self.prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') self.prob.model.set_input_defaults( Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft' @@ -363,12 +348,6 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless' - ) self.prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) @@ -377,12 +356,23 @@ def setUp(self): ) self.prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') - setup_model_options(self.prob, options) + # setup_model_options(prob, options) + prob.model_options['*'] = { + Aircraft.Wing.HAS_FOLD: True, + Aircraft.CrewPayload.Design.NUM_PASSENGERS: 180, + Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED: True, + Aircraft.Fuselage.NUM_AISLES: 1, + Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 1, + Aircraft.Electrical.HAS_HYBRID_SYSTEM: True, + Aircraft.Engine.NUM_ENGINES: [2], + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: 2, + } self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): - self.prob.run_model() + prob = self.prob + prob.run_model() tol = 1e-4 expected_values = { @@ -432,20 +422,17 @@ def test_case1(self): @use_tempdirs class SizeGroupTestCase4(unittest.TestCase): def setUp(self): - options = get_option_defaults() - options.set_val(Aircraft.Wing.HAS_STRUT, val=True, units='unitless') - options.set_val(Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, val=False, units='unitless') - options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') - options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=180, units='unitless') - options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) - options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 1) - options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, val=0.00030975, units='unitless') - - self.prob = om.Problem() - self.prob.model.add_subsystem( - 'size', - SizeGroup(), - promotes=['*'], + options = AviaryValues() + options.set_val(Aircraft.HorizontalTail.MOMENT_RATIO, 0.2307, units='unitless') + options.set_val(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') + options.set_val(Settings.VERBOSITY, 0) + + prob = self.prob = om.Problem() + prob.model.add_subsystem( + 'premission', + PreMission(aviary_options=options), + promotes_outputs=['*'], + promotes_inputs=['*'], ) self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') @@ -487,12 +474,6 @@ def setUp(self): 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( - Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless' - ) self.prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') self.prob.model.set_input_defaults( Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft' @@ -502,12 +483,6 @@ def setUp(self): self.prob.model.set_input_defaults( Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' - ) - self.prob.model.set_input_defaults( - Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless' - ) self.prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) @@ -516,12 +491,24 @@ def setUp(self): ) self.prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') - setup_model_options(self.prob, options) + # setup_model_options(prob, options) + prob.model_options['*'] = { + Aircraft.Wing.HAS_STRUT: True, + Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED: False, + Aircraft.Electrical.HAS_HYBRID_SYSTEM: False, + Aircraft.CrewPayload.Design.NUM_PASSENGERS: 180, + Aircraft.Fuselage.NUM_AISLES: 1, + Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY: 1, + Aircraft.Engine.INLET_AREA_COEFFICIENT: 0.00030975, + Aircraft.Engine.NUM_ENGINES: [2], + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: 2, + } self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): - self.prob.run_model() + prob = self.prob + prob.run_model() tol = 1e-4 expected_values = { @@ -558,9 +545,9 @@ def test_case1(self): for var_name, expected_val in expected_values.items(): with self.subTest(var=var_name): - assert_near_equal(self.prob[var_name], expected_val, tol) + assert_near_equal(prob[var_name], expected_val, tol) - partial_data = self.prob.check_partials(out_stream=None, method='cs') + partial_data = prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, atol=2e-12, rtol=1e-12) @@ -568,29 +555,11 @@ class BWBSizeGroupTestCase1(unittest.TestCase): """GASP BWB model does not compute volume coeffiients. So, override.""" def test_case(self): - class PreMission(om.Group): - def initialize(self): - self.options.declare( - 'aviary_options', types=AviaryValues, desc='Aircraft options dictionary' - ) - - def setup(self): - self.add_subsystem( - 'size', - SizeGroup(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - def configure(self): - aviary_options = self.options['aviary_options'] - - # Overrides - override_aviary_vars(self, aviary_options) - options = AviaryValues() - options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=0.000001, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, 0.000001, units='unitless') options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.015, units='unitless') + options.set_val(Aircraft.HorizontalTail.MOMENT_RATIO, 0.5463, units='unitless') + options.set_val(Aircraft.VerticalTail.MOMENT_RATIO, 5.2615, units='unitless') options.set_val(Settings.VERBOSITY, 0) prob = om.Problem() @@ -634,10 +603,6 @@ def configure(self): prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 0.6, units='unitless') prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 1.75, units='unitless') prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.1, units='unitless') - prob.model.set_input_defaults( - Aircraft.HorizontalTail.MOMENT_RATIO, 0.5463, units='unitless' - ) - prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 5.2615, units='unitless') prob.model.set_input_defaults(Aircraft.HorizontalTail.ASPECT_RATIO, 1.705, units='unitless') prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.2205, units='unitless' diff --git a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py index c64f270567..6c9d34aead 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py +++ b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py @@ -58,8 +58,10 @@ class MassPremissionTestCase1(unittest.TestCase): def setUp(self): options = AviaryValues() - options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, 1.189, units='unitless') options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless') + options.set_val(Aircraft.HorizontalTail.MOMENT_RATIO, 0.2307, units='unitless') + options.set_val(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') options.set_val(Settings.VERBOSITY, 0) prob = self.prob = om.Problem() @@ -163,8 +165,10 @@ class MassPremissionTestCase2(unittest.TestCase): def setUp(self): options = AviaryValues() - options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, 1.189, units='unitless') options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless') + options.set_val(Aircraft.HorizontalTail.MOMENT_RATIO, 0.2307, units='unitless') + options.set_val(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') options.set_val(Settings.VERBOSITY, 0) prob = self.prob = om.Problem() @@ -219,10 +223,6 @@ def setUp(self): Aircraft.Fuselage.WETTED_AREA_SCALER, val=0.86215, units='unitless' ) prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless') - prob.model.set_input_defaults( - Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' - ) - prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) @@ -561,8 +561,10 @@ class MassPremissionTestCase3(unittest.TestCase): def setUp(self): options = AviaryValues() - options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, 1.189, units='unitless') options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless') + options.set_val(Aircraft.HorizontalTail.MOMENT_RATIO, 0.2307, units='unitless') + options.set_val(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') options.set_val(Settings.VERBOSITY, 0) prob = self.prob = om.Problem() @@ -617,10 +619,6 @@ def setUp(self): Aircraft.Fuselage.WETTED_AREA_SCALER, val=0.86215, units='unitless' ) prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless') - prob.model.set_input_defaults( - Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' - ) - prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) @@ -855,8 +853,10 @@ class MassPremissionTestCase4(unittest.TestCase): def setUp(self): options = AviaryValues() - options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, 1.189, units='unitless') options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless') + options.set_val(Aircraft.HorizontalTail.MOMENT_RATIO, 0.2307, units='unitless') + options.set_val(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') options.set_val(Settings.VERBOSITY, 0) prob = self.prob = om.Problem() @@ -911,10 +911,6 @@ def setUp(self): Aircraft.Fuselage.WETTED_AREA_SCALER, val=0.86215, units='unitless' ) prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless') - prob.model.set_input_defaults( - Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' - ) - prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) @@ -1167,8 +1163,10 @@ class MassPremissionTestCase5(unittest.TestCase): def setUp(self): options = AviaryValues() - options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, 1.189, units='unitless') options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless') + options.set_val(Aircraft.HorizontalTail.MOMENT_RATIO, 0.2307, units='unitless') + options.set_val(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') options.set_val(Settings.VERBOSITY, 0) prob = self.prob = om.Problem() @@ -1223,10 +1221,6 @@ def setUp(self): Aircraft.Fuselage.WETTED_AREA_SCALER, val=0.86215, units='unitless' ) prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless') - prob.model.set_input_defaults( - Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' - ) - prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) @@ -1483,8 +1477,10 @@ class MassPremissionTestCase6(unittest.TestCase): def setUp(self): options = AviaryValues() - options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, 1.189, units='unitless') options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless') + options.set_val(Aircraft.HorizontalTail.MOMENT_RATIO, 0.2307, units='unitless') + options.set_val(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') options.set_val(Settings.VERBOSITY, 0) prob = self.prob = om.Problem() @@ -1539,10 +1535,6 @@ def setUp(self): Aircraft.Fuselage.WETTED_AREA_SCALER, val=0.86215, units='unitless' ) prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless') - prob.model.set_input_defaults( - Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' - ) - prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 2.362, units='unitless') prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) @@ -1802,8 +1794,10 @@ class MassPremissionTestCase7(unittest.TestCase): def setUp(self): options = AviaryValues() - options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, 1.189, units='unitless') options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.09986, units='unitless') + options.set_val(Aircraft.HorizontalTail.MOMENT_RATIO, 0.2307, units='unitless') + options.set_val(Aircraft.VerticalTail.MOMENT_RATIO, 2.1621, units='unitless') options.set_val(Settings.VERBOSITY, 0) prob = self.prob = om.Problem() @@ -1855,10 +1849,6 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') prob.model.set_input_defaults(Aircraft.Fuselage.WETTED_AREA_SCALER, 1, units='unitless') prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.1, units='unitless') - prob.model.set_input_defaults( - Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' - ) - prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 2.1621, units='unitless') prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) @@ -2138,8 +2128,10 @@ class MassPremissionTestCase8(unittest.TestCase): def setUp(self): options = AviaryValues() - options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.43, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, 1.43, units='unitless') options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.066, units='unitless') + options.set_val(Aircraft.HorizontalTail.MOMENT_RATIO, 0.13067, units='unitless') + options.set_val(Aircraft.VerticalTail.MOMENT_RATIO, 3.0496, units='unitless') options.set_val(Settings.VERBOSITY, 0) prob = self.prob = om.Problem() @@ -2164,13 +2156,9 @@ def setUp(self): prob.model.set_input_defaults( Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' ) - prob.model.set_input_defaults( - Aircraft.HorizontalTail.MOMENT_RATIO, val=0.13067, units='unitless' - ) prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.025, units='unitless' ) - prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 3.0496, units='unitless') prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) @@ -2479,8 +2467,10 @@ class MassPremissionTestCase9(unittest.TestCase): def setUp(self): options = AviaryValues() - options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.43, units='unitless') + options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, 1.43, units='unitless') options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.066, units='unitless') + options.set_val(Aircraft.HorizontalTail.MOMENT_RATIO, 0.13067, units='unitless') + options.set_val(Aircraft.VerticalTail.MOMENT_RATIO, 3.0496, units='unitless') options.set_val(Settings.VERBOSITY, 0) prob = self.prob = om.Problem() @@ -2505,13 +2495,9 @@ def setUp(self): prob.model.set_input_defaults( Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' ) - prob.model.set_input_defaults( - Aircraft.HorizontalTail.MOMENT_RATIO, val=0.13067, units='unitless' - ) prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.025, units='unitless' ) - prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 3.0496, units='unitless') prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) @@ -2825,6 +2811,8 @@ def setUp(self): options = AviaryValues() options.set_val(Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=0.000001, units='unitless') options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.015, units='unitless') + options.set_val(Aircraft.HorizontalTail.MOMENT_RATIO, 0.5463, units='unitless') + options.set_val(Aircraft.VerticalTail.MOMENT_RATIO, 5.2615, units='unitless') options.set_val(Settings.VERBOSITY, 0) prob = self.prob = om.Problem() @@ -2862,10 +2850,6 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 0.6, units='unitless') prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 1.75, units='unitless') prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.1, units='unitless') - prob.model.set_input_defaults( - Aircraft.HorizontalTail.MOMENT_RATIO, 0.5463, units='unitless' - ) - prob.model.set_input_defaults(Aircraft.VerticalTail.MOMENT_RATIO, 5.2615, units='unitless') prob.model.set_input_defaults(Aircraft.HorizontalTail.ASPECT_RATIO, 1.705, units='unitless') prob.model.set_input_defaults( Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.2205, units='unitless' From c3a5d9153e47f857a1a858c9174dd22c9e8a8854 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 1 Sep 2026 14:27:32 -0400 Subject: [PATCH 19/21] minor updates --- .../gasp_based/test/test_empennage.py | 68 +++++---- .../gasp_based/test/test_size_group.py | 135 ++++++++---------- .../gasp_based/test/test_mass_premission.py | 41 +++--- 3 files changed, 113 insertions(+), 131 deletions(-) diff --git a/aviary/subsystems/geometry/gasp_based/test/test_empennage.py b/aviary/subsystems/geometry/gasp_based/test/test_empennage.py index bfde5a3153..17fab9a392 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_empennage.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_empennage.py @@ -234,26 +234,26 @@ def setUp(self): promotes_inputs=['*'], ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.AREA, val=1370.3, units='ft**2') - self.prob.model.set_input_defaults(Aircraft.Wing.AVERAGE_CHORD, val=12.615, units='ft') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.AREA, val=1370.3, units='ft**2') + prob.model.set_input_defaults(Aircraft.Wing.AVERAGE_CHORD, val=12.615, units='ft') + prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.VOLUME_COEFFICIENT, val=0.145, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=117.8, units='ft') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=117.8, units='ft') + prob.model.set_input_defaults( Aircraft.VerticalTail.ASPECT_RATIO, val=1.67, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) @@ -280,9 +280,9 @@ def test_large_sinle_aisle_1_defaults(self): for var_name, expected in expected_values.items(): with self.subTest(var=var_name): - assert_near_equal(self.prob[var_name], expected, tol) + assert_near_equal(prob[var_name], expected, tol) - partial_data = self.prob.check_partials(out_stream=None, method='cs') + partial_data = prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, **partial_tols) @@ -294,50 +294,51 @@ class TestEmpennageGroup2(unittest.TestCase): """ def setUp(self): - self.prob = om.Problem() - self.prob.model.add_subsystem('emp', EmpennageSize(), promotes=['*']) + prob = self.prob = om.Problem() + prob.model.add_subsystem('emp', EmpennageSize(), promotes=['*']) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.AREA, val=1370.3, units='ft**2') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.AREA, val=1370.3, units='ft**2') + prob.model.set_input_defaults( Aircraft.HorizontalTail.MOMENT_RATIO, val=0.2307, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.AVERAGE_CHORD, val=12.615, units='ft') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.AVERAGE_CHORD, val=12.615, units='ft') + prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.VOLUME_COEFFICIENT, val=0.145, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.MOMENT_RATIO, val=2.362, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=117.8, units='ft') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=117.8, units='ft') + prob.model.set_input_defaults( Aircraft.VerticalTail.ASPECT_RATIO, val=1.67, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) def test_large_sinle_aisle_1_calc_volcoefs(self): options = get_option_defaults() - setup_model_options(self.prob, options) + prob = self.prob + setup_model_options(prob, options) - self.prob.setup(check=False, force_alloc_complex=True) + prob.setup(check=False, force_alloc_complex=True) - self.prob.set_val(Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, 0, units='unitless') - self.prob.set_val(Aircraft.Fuselage.LENGTH, 129.4, units='ft') - self.prob.set_val(Aircraft.Fuselage.AVG_DIAMETER, 13.1, units='ft') + prob.set_val(Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, 0, units='unitless') + prob.set_val(Aircraft.Fuselage.LENGTH, 129.4, units='ft') + prob.set_val(Aircraft.Fuselage.AVG_DIAMETER, 13.1, units='ft') - self.prob.run_model() + prob.run_model() # not actual GASP values expected_values = { @@ -347,9 +348,9 @@ def test_large_sinle_aisle_1_calc_volcoefs(self): for var_name, expected in expected_values.items(): with self.subTest(var=var_name): - assert_near_equal(self.prob[var_name], expected, tol) + assert_near_equal(prob[var_name], expected, tol) - partial_data = self.prob.check_partials(out_stream=None, method='cs') + partial_data = prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, **partial_tols) @@ -416,6 +417,3 @@ def test_case(self): if __name__ == '__main__': unittest.main() - test = BWBTestEmpennageGroup() - test.setUp() - # test.test_case() 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 48ecabb4d7..d35920ad32 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_size_group.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_size_group.py @@ -9,7 +9,6 @@ from aviary.utils.aviary_values import AviaryValues from aviary.variable_info.enums import AircraftTypes from aviary.variable_info.functions import override_aviary_vars, setup_model_options -from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft, Settings # this is the GASP test case, input and output values based on large single aisle 1 v3 without bug fix @@ -302,59 +301,53 @@ def setUp(self): promotes_inputs=['*'], ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') - self.prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') + prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + prob.model.set_input_defaults( Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch' ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') - self.prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') + prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + prob.model.set_input_defaults( Aircraft.Engine.INLET_AREA_COEFFICIENT, val=0.00030975, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=10.13, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.33, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=25, units='deg') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=10.13, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.33, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=25, units='deg') + prob.model.set_input_defaults( Aircraft.Wing.THICKNESS_TO_CHORD_ROOT, val=0.15, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=175400, units='lbm') - self.prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=128, units='lbf/ft**2') - self.prob.model.set_input_defaults(Aircraft.Wing.FOLDED_SPAN, val=25, units='ft') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=175400, units='lbm') + prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=128, units='lbf/ft**2') + prob.model.set_input_defaults(Aircraft.Wing.FOLDED_SPAN, val=25, units='ft') + prob.model.set_input_defaults( Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, val=0, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.ASPECT_RATIO, val=1.67, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, 175400.0, units='lbm') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, 175400.0, units='lbm') + prob.model.set_input_defaults( Aircraft.Engine.WING_LOCATIONS, val=np.array([0.35]), units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless') + prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') + prob.model.set_input_defaults(Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless') + prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') # setup_model_options(prob, options) prob.model_options['*'] = { @@ -368,7 +361,7 @@ def setUp(self): Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: 2, } - self.prob.setup(check=False, force_alloc_complex=True) + prob.setup(check=False, force_alloc_complex=True) def test_case1(self): prob = self.prob @@ -413,9 +406,9 @@ def test_case1(self): for var_name, expected_val in expected_values.items(): with self.subTest(var=var_name): - assert_near_equal(self.prob[var_name], expected_val, tol) + assert_near_equal(prob[var_name], expected_val, tol) - partial_data = self.prob.check_partials(out_stream=None, method='cs') + partial_data = prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, atol=1e-9, rtol=1e-12) @@ -435,61 +428,53 @@ def setUp(self): promotes_inputs=['*'], ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') - self.prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') + prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + prob.model.set_input_defaults( Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch' ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') - self.prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') + prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') + prob.model.set_input_defaults( Aircraft.Engine.INLET_AREA_COEFFICIENT, val=0.00030975, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=10.13, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.33, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=25, units='deg') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, val=10.13, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.TAPER_RATIO, val=0.33, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.SWEEP, val=25, units='deg') + prob.model.set_input_defaults( Aircraft.Wing.THICKNESS_TO_CHORD_ROOT, val=0.15, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=175400, units='lbm') - self.prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=128, units='lbf/ft**2') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, val=175400, units='lbm') + prob.model.set_input_defaults(Aircraft.Design.WING_LOADING, val=128, units='lbf/ft**2') + prob.model.set_input_defaults( Aircraft.Strut.ATTACHMENT_LOCATION_DIMENSIONLESS, val=0, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Strut.AREA_RATIO, val=0.021893, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Strut.AREA_RATIO, val=0.021893, units='unitless') + prob.model.set_input_defaults( Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, val=0, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.ASPECT_RATIO, val=1.67, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.HorizontalTail.TAPER_RATIO, val=0.352, units='unitless' ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.VerticalTail.TAPER_RATIO, val=0.801, units='unitless' ) - 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') + prob.model.set_input_defaults(Aircraft.Design.GROSS_MASS, 175400.0, units='lbm') + prob.model.set_input_defaults(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') - self.prob.model.set_input_defaults( - Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft' - ) - self.prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') - self.prob.model.set_input_defaults( - Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless' - ) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults(Aircraft.Fuselage.DELTA_DIAMETER, 4.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH, 9.5, units='ft') + prob.model.set_input_defaults(Aircraft.Fuselage.NOSE_FINENESS, 1, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.TAIL_FINENESS, 3, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD_TIP, 0.12, units='unitless') + prob.model.set_input_defaults( Aircraft.HorizontalTail.ASPECT_RATIO, val=4.75, units='unitless' ) - self.prob.model.set_input_defaults( - Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless' - ) - self.prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') + prob.model.set_input_defaults(Aircraft.Nacelle.CORE_DIAMETER_RATIO, 1.25, units='unitless') + prob.model.set_input_defaults(Aircraft.Nacelle.FINENESS, 2, units='unitless') # setup_model_options(prob, options) prob.model_options['*'] = { @@ -504,7 +489,7 @@ def setUp(self): Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: 2, } - self.prob.setup(check=False, force_alloc_complex=True) + prob.setup(check=False, force_alloc_complex=True) def test_case1(self): prob = self.prob diff --git a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py index 6c9d34aead..04c7ce43f7 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py +++ b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py @@ -83,35 +83,34 @@ def setUp(self): for key, (val, units) in input_options.items(): if not CoreMetaData[key]['option']: - self.prob.model.set_input_defaults(key, val=val, units=units) + prob.model.set_input_defaults(key, val=val, units=units) for key, (val, units) in V3_bug_fixed_non_metadata.items(): - self.prob.model.set_input_defaults(key, val=val, units=units) + prob.model.set_input_defaults(key, val=val, units=units) - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( 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' - ) + prob.model.set_input_defaults(Aircraft.Design.MAX_STRUCTURAL_SPEED, val=402.5, units='mi/h') # self.prob.model.set_input_defaults(Aircraft.Wing.SPAN, val=0.0, units='ft') # Adjust WETTED_AREA_SCALER such that WETTED_AREA = 4000.0 - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.Fuselage.WETTED_AREA_SCALER, val=0.86215, units='unitless' ) - self.prob.model.set_input_defaults(Aircraft.Wing.SLAT_CHORD_RATIO, val=0.15) - self.prob.model.set_input_defaults(Aircraft.Wing.SLAT_SPAN_RATIO, val=0.9) - self.prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') - self.prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') - self.prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') + prob.model.set_input_defaults(Aircraft.Wing.SLAT_CHORD_RATIO, val=0.15) + prob.model.set_input_defaults(Aircraft.Wing.SLAT_SPAN_RATIO, val=0.9) + prob.model.set_input_defaults(Aircraft.Furnishings.MASS_SCALER, 40.0, units='unitless') + prob.model.set_input_defaults(Aircraft.Fuselage.CABIN_AREA, val=1069.0, units='ft**2') + prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') setup_model_options(self.prob, input_options) self.prob.setup(check=False, force_alloc_complex=True) def test_case1(self): - self.prob.run_model() + prob = self.prob + prob.run_model() tol = 5e-4 expected_values = { @@ -149,7 +148,7 @@ def test_case1(self): for var_name, expected_val in expected_values.items(): with self.subTest(var=var_name): - assert_near_equal(self.prob[var_name], expected_val, tol) + assert_near_equal(prob[var_name], expected_val, tol) partial_data = self.prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, atol=3e-10, rtol=1e-12) @@ -181,7 +180,7 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch' ) prob.model.set_input_defaults( @@ -869,7 +868,7 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch' ) prob.model.set_input_defaults( @@ -1179,7 +1178,7 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch' ) prob.model.set_input_defaults( @@ -1493,7 +1492,7 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch' ) prob.model.set_input_defaults( @@ -1810,7 +1809,7 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch' ) prob.model.set_input_defaults( @@ -2144,7 +2143,7 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 44.2, units='inch' ) prob.model.set_input_defaults( @@ -2483,7 +2482,7 @@ def setUp(self): prob.model.set_input_defaults(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') prob.model.set_input_defaults(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') - self.prob.model.set_input_defaults( + prob.model.set_input_defaults( Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 44.2, units='inch' ) prob.model.set_input_defaults( From 3aa547ce9ca26b68359d4818d52b87fd73d06f81 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 1 Sep 2026 14:32:53 -0400 Subject: [PATCH 20/21] added use_tempdirs --- aviary/subsystems/geometry/gasp_based/test/test_size_group.py | 1 + aviary/subsystems/mass/gasp_based/test/test_mass_premission.py | 3 +++ 2 files changed, 4 insertions(+) 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 d35920ad32..7955c97309 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_size_group.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_size_group.py @@ -536,6 +536,7 @@ def test_case1(self): assert_check_partials(partial_data, atol=2e-12, rtol=1e-12) +@use_tempdirs class BWBSizeGroupTestCase1(unittest.TestCase): """GASP BWB model does not compute volume coeffiients. So, override.""" diff --git a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py index 04c7ce43f7..cbbea9fc26 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py +++ b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py @@ -1468,6 +1468,7 @@ def test_case(self): assert_check_partials(partial_data, atol=3e-10, rtol=1e-12) +@use_tempdirs class MassPremissionTestCase6(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 @@ -3187,6 +3188,7 @@ def test_case(self): # this is the large single aisle 1 V3 test case +@use_tempdirs class StructMassTestCase1(unittest.TestCase): def setUp(self): self.prob = om.Problem() @@ -3219,6 +3221,7 @@ def test_case1(self): assert_check_partials(partial_data, atol=4e-12, rtol=1e-12) +@use_tempdirs class BWBStructMassTestCase(unittest.TestCase): """Using BWB data.""" From f44f757772856f1ad5754fafeec6873b29c53423 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 2 Sep 2026 12:21:12 -0400 Subject: [PATCH 21/21] added a new class ChordCheck --- .../geometry/gasp_based/empennage.py | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/aviary/subsystems/geometry/gasp_based/empennage.py b/aviary/subsystems/geometry/gasp_based/empennage.py index 4721959ae6..a44d4bcfc5 100644 --- a/aviary/subsystems/geometry/gasp_based/empennage.py +++ b/aviary/subsystems/geometry/gasp_based/empennage.py @@ -1,5 +1,6 @@ import numpy as np import openmdao.api as om +import warnings from aviary.variable_info.functions import add_aviary_input, add_aviary_output, add_aviary_option from aviary.variable_info.variables import Aircraft @@ -281,6 +282,43 @@ def compute_partials(self, inputs, J): J[str_arm, str_wing_ref] = 1.0 / r_arm +class ChordCheck(om.ExplicitComponent): + def setup(self): + add_aviary_input( + self, Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION, units='unitless' + ) + add_aviary_input(self, Aircraft.HorizontalTail.AREA, units='ft**2') + add_aviary_input(self, Aircraft.HorizontalTail.SPAN, units='ft') + add_aviary_input(self, Aircraft.HorizontalTail.ROOT_CHORD, units='ft') + add_aviary_input(self, Aircraft.VerticalTail.ROOT_CHORD, units='ft') + add_aviary_input(self, Aircraft.VerticalTail.TAPER_RATIO, units='unitless') + + def compute(self, inputs, outputs): + htail_loc = inputs[Aircraft.HorizontalTail.VERTICAL_TAIL_MOUNT_LOCATION] + hrchord = inputs[Aircraft.HorizontalTail.ROOT_CHORD] + vrchord = inputs[Aircraft.HorizontalTail.ROOT_CHORD] + v_tr = inputs[Aircraft.VerticalTail.TAPER_RATIO] + h_area = inputs[Aircraft.HorizontalTail.AREA] + h_span = inputs[Aircraft.HorizontalTail.SPAN] + + if htail_loc > 0: + chord_check = vrchord * (1.0 - htail_loc * (1.0 - v_tr)) + if chord_check < hrchord: + corr_hrchord = chord_check + warnings.warn( + f'Horizontal tail center-line chord must be {corr_hrchord} ' + '(ft) to be located at specified position on vertical tail.' + ) + corr_h_tr = 2.0 * h_area / corr_hrchord / h_span - 1.0 + if corr_h_tr <= 1.0: + warnings.warn(f'Horizontal taper ratio should be {corr_h_tr}.') + else: + corr_h_tr = 1.0 + corr_h_ar = h_area / corr_hrchord / corr_hrchord + warnings.warn(f'Horizontal taper ratio should be {corr_h_tr}.') + warnings.warn(f'Horizontal aspect ratio should be {corr_h_ar}.') + + class EmpennageSize(om.Group): """GASP geometry calculations for both horizontal and vertical tails. @@ -330,3 +368,9 @@ def setup(self): promotes_inputs=['*'], promotes_outputs=['*'], ) + + self.add_subsystem( + 'chord_check', + ChordCheck(), + promotes_inputs=['*'], + )