From 88d8f41ec4b2c18d7853ac2d69dd8e01edc7ae24 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 11 Feb 2026 16:56:04 -0500 Subject: [PATCH 01/67] work in progress --- aviary/utils/preprocessors.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index 32a44e1aaf..369b84ff54 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -400,6 +400,7 @@ def preprocess_crewpayload(aviary_options: AviaryValues, meta_data=_MetaData, ve # Process FLOPS based crew variables if mass_method == LegacyCode.FLOPS: + # TODO: check if this is excuted. # Check flight attendants if Aircraft.CrewPayload.NUM_FLIGHT_ATTENDANTS not in aviary_options: flight_attendants_count = 0 # assume no passengers From 2a9fc314861947bafc1d0fe0005cd09b2e932be7 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 11 Feb 2026 16:56:48 -0500 Subject: [PATCH 02/67] add note: If 0, use default. --- aviary/variable_info/variable_meta_data.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 1e516e96aa..26b23cee98 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1164,7 +1164,7 @@ meta_data=_MetaData, historical_name={'GASP': None, 'FLOPS': 'FUSEIN.NBABR', 'LEAPS1': None}, units='unitless', - desc='Number of business class passengers abreast', + desc='Number of business class passengers abreast. If 0, use default.', types=int, option=True, default_value=5, @@ -1175,7 +1175,7 @@ meta_data=_MetaData, historical_name={'GASP': 'INGASP.SAB', 'FLOPS': 'FUSEIN.NTABR', 'LEAPS1': None}, units='unitless', - desc='Number of economy class passengers abreast', + desc='Number of economy class passengers abreast. If 0, use default.', types=int, option=True, default_value=6, @@ -1186,7 +1186,7 @@ meta_data=_MetaData, historical_name={'GASP': None, 'FLOPS': 'FUSEIN.NFABR', 'LEAPS1': None}, units='unitless', - desc='Number of first class passengers abreast', + desc='Number of first class passengers abreast. If 0, use default.', types=int, option=True, default_value=4, @@ -1197,7 +1197,7 @@ meta_data=_MetaData, historical_name={'GASP': None, 'FLOPS': 'FUSEIN.BPITCH', 'LEAPS1': None}, units='inch', - desc='pitch of the business class seats', + desc='pitch of the business class seats. If 0, use default.', option=True, default_value=0.0, ) @@ -1207,7 +1207,7 @@ meta_data=_MetaData, historical_name={'GASP': 'INGASP.PS', 'FLOPS': 'FUSEIN.TPITCH', 'LEAPS1': None}, units='inch', - desc='pitch of the economy class seats', + desc='pitch of the economy class seats. If 0, use default.', option=True, default_value=0.0, ) @@ -1217,7 +1217,7 @@ meta_data=_MetaData, historical_name={'GASP': None, 'FLOPS': 'FUSEIN.FPITCH', 'LEAPS1': None}, units='inch', - desc='pitch of the first class seats', + desc='pitch of the first class seats. If 0, use default.', option=True, default_value=0.0, ) From fd6ad5be320a37b11dfb9c46dac7bba0aa43a298 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 18 Feb 2026 19:46:24 -0500 Subject: [PATCH 03/67] use max_width[0] when computing num_bays --- aviary/subsystems/geometry/flops_based/fuselage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/subsystems/geometry/flops_based/fuselage.py b/aviary/subsystems/geometry/flops_based/fuselage.py index 35c4cfaf1e..784e8e3f58 100644 --- a/aviary/subsystems/geometry/flops_based/fuselage.py +++ b/aviary/subsystems/geometry/flops_based/fuselage.py @@ -667,7 +667,7 @@ def compute(self, inputs, outputs): bay_width = max_width / num_bays if bay_width > bay_width_max: bay_width = bay_width_max - num_bays = int(0.999 + max_width / bay_width) + num_bays = int(0.999 + max_width[0] / bay_width) if num_bays > num_bays_max and num_bays_max > 0: num_bays = num_bays_max max_width = bay_width_max * bay_width From 3162a4bb4be7c856fb769dd393d17d32193dc77a Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 18 Feb 2026 19:47:53 -0500 Subject: [PATCH 04/67] work in progress: trying to add a new test using bwb300_baseline model. --- .../test/test_flops_based_premission.py | 386 +++++++++++++++++- 1 file changed, 385 insertions(+), 1 deletion(-) diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index 2ef158f33a..5fc79c6658 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -1221,5 +1221,389 @@ def test_case_all_subsystems(self): # TODO: test some aero variables +class BWB300PreMissionGroupCSVTest(unittest.TestCase): + """ + testing using bwb_detailed_FLOPS.csv + """ + + def setUp(self): + prob = self.prob = AviaryProblem() + + csv_path = 'models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv' + self.flops_inputs = prob.load_inputs(csv_path) + prob.check_and_preprocess_inputs() + + def test_case_geom(self): + """ + premission: geometry + """ + prob = self.prob + + preprocess_options(self.flops_inputs) + geom_subsystem = get_geom_and_mass_subsystems('FLOPS')[0:1] + + prob.model.add_subsystem( + 'pre_mission', + CorePreMission(aviary_options=self.flops_inputs, subsystems=geom_subsystem), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) + + setup_model_options(prob, self.flops_inputs) + prob.setup(check=False) + set_aviary_initial_values(prob, self.flops_inputs) + + prob.run_model() + + tol = 1e-5 + # Geometry + # BWBComputeDetailedWingDist + assert_near_equal(prob[Aircraft.Wing.SPAN], 186.3, tol) + # BWBSimpleCabinLayout + assert_near_equal(prob[Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH], 78.61013558, tol) + assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 38.5, tol) + assert_near_equal(prob[Aircraft.Fuselage.CABIN_AREA], 4697.33181006, tol) + assert_near_equal(prob[Aircraft.Fuselage.MAX_HEIGHT], 12.35302131, tol) + assert_near_equal(prob[Aircraft.BWB.NUM_BAYS], 7.0, tol) + # BWBFuselagePrelim + assert_near_equal(prob[Aircraft.Fuselage.REF_DIAMETER], 46.2868886894979, tol) + assert_near_equal(prob[Aircraft.Fuselage.PLANFORM_AREA], 6710.4740143724875, tol) + # BWBWingPrelim + assert_near_equal(prob[Aircraft.Wing.AREA], 12109.879719468739, tol) + assert_near_equal(prob[Aircraft.Wing.ASPECT_RATIO], 5.36951675, tol) + assert_near_equal(prob[Aircraft.Wing.ASPECT_RATIO_REFERENCE], 5.36951675, tol) + assert_near_equal(prob[Aircraft.Wing.LOAD_FRACTION], 0.46761341784858923, tol) + # _BWBWing + assert_near_equal(prob[Aircraft.Wing.WETTED_AREA], 24713.66129084, tol) + # _Tail + assert_near_equal(prob[Aircraft.HorizontalTail.WETTED_AREA], 0.0, tol) + assert_near_equal(prob[Aircraft.VerticalTail.WETTED_AREA], 0.0, tol) + # _FuselageRatios + assert_near_equal(prob[Aircraft.Fuselage.DIAMETER_TO_WING_SPAN], 0.18243240878599712, tol) + assert_near_equal(prob[Aircraft.Fuselage.LENGTH_TO_DIAMETER], 2.4261771932742167, tol) + # Nacelles + assert_near_equal(prob[Aircraft.Nacelle.WETTED_AREA], 498.26822066, tol) + assert_near_equal(prob[Aircraft.Nacelle.TOTAL_WETTED_AREA], 3 * 498.26822066, tol) + # Canard + assert_near_equal(prob[Aircraft.Canard.WETTED_AREA], 0.0, tol) + # BWBWingCharacteristicLength + assert_near_equal(prob[Aircraft.Wing.CHARACTERISTIC_LENGTH], 47.72916456, tol) + assert_near_equal(prob[Aircraft.Wing.FINENESS], 0.11, tol) + # OtherCharacteristicLengths + assert_near_equal(prob[Aircraft.Canard.CHARACTERISTIC_LENGTH], 0.0, tol) + assert_near_equal(prob[Aircraft.Canard.FINENESS], 0.0, tol) + assert_near_equal(prob[Aircraft.Fuselage.CHARACTERISTIC_LENGTH], 112.3001936860821, tol) + assert_near_equal(prob[Aircraft.Fuselage.FINENESS], 2.4261771932742167, tol) + assert_near_equal(prob[Aircraft.HorizontalTail.CHARACTERISTIC_LENGTH], 0.0, tol) + assert_near_equal(prob[Aircraft.HorizontalTail.FINENESS], 0.11, tol) + assert_near_equal(prob[Aircraft.Nacelle.CHARACTERISTIC_LENGTH], [15.68611614], tol) + assert_near_equal(prob[Aircraft.Nacelle.FINENESS], [1.38269353], tol) + # TotalWettedArea + assert_near_equal(prob[Aircraft.Design.TOTAL_WETTED_AREA], 26208.46595187, tol) + + def ttttest_case_geom_mass(self): + """ + premission: geometry + mass + """ + prob = self.prob + + preprocess_options(self.flops_inputs) + geom_mass_subsystems = get_geom_and_mass_subsystems('FLOPS') + + prob.model.add_subsystem( + 'pre_mission', + CorePreMission(aviary_options=self.flops_inputs, subsystems=geom_mass_subsystems), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) + + setup_model_options(prob, self.flops_inputs) + prob.setup(check=False) + set_aviary_initial_values(prob, self.flops_inputs) + + prob.set_val(Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, val=70000.0 * 3, units='lbf') + + prob.run_model() + + tol = 1e-4 + # Mass + # CargoMass + assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_MASS_TOTAL], 77220.0, tol) + assert_near_equal(prob[Aircraft.CrewPayload.BAGGAGE_MASS], 20592.0, tol) + assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS], 97812.0, tol) + assert_near_equal(prob[Aircraft.CrewPayload.CARGO_MASS], 0.0, tol) + assert_near_equal(prob[Aircraft.CrewPayload.TOTAL_PAYLOAD_MASS], 97812.0, tol) + # TransportCargoContainersMass + assert_near_equal(prob[Aircraft.CrewPayload.CARGO_CONTAINER_MASS], 3850.0, tol) + # TransportEngineCtrlsMass + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS], 206.36860226, tol) + # TransportAvionicsMass + assert_near_equal(prob[Aircraft.Avionics.MASS], 2778.5110590964073, tol) + # FuelCapacityGroup + assert_near_equal(prob[Aircraft.Fuel.WING_FUEL_CAPACITY], 1197720.2419621395, tol) + assert_near_equal(prob[Aircraft.Fuel.TOTAL_CAPACITY], 1197720.2419621395, tol) + # EngineMass + assert_near_equal(prob[Aircraft.Engine.MASS], 17825.63336233, tol) + assert_near_equal(prob[Aircraft.Engine.ADDITIONAL_MASS], 0.0, tol) + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 53476.90008698, tol) + # TransportFuelSystemMass + assert_near_equal(prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 5444.9572934402777, tol) + # TransportAirCondMass + assert_near_equal(prob[Aircraft.AirConditioning.MASS], 3897.6527857555625, tol) + # TransportEngineOilMass + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_OIL_MASS], 346.93557352, tol) + # BWBFurnishingsGroupMass + assert_near_equal(prob[Aircraft.Furnishings.MASS], 57747.97136452, tol) + # TransportHydraulicsGroupMass + assert_near_equal(prob[Aircraft.Hydraulics.MASS], 6200.37391189, tol) + # PassengerServiceMass + assert_near_equal( + prob[Aircraft.CrewPayload.PASSENGER_SERVICE_MASS], 10806.675950702213, tol + ) + # ElectricalMass + assert_near_equal(prob[Aircraft.Electrical.MASS], 4291.4778106479534, tol) + # AntiIcingMass + assert_near_equal(prob[Aircraft.AntiIcing.MASS], 562.09100951165135, tol) + # TransportAPUMass + assert_near_equal(prob[Aircraft.APU.MASS], 2125.8280135763703, tol) + # NonFlightCrewMass + assert_near_equal(prob[Aircraft.CrewPayload.CABIN_CREW_MASS], 3810.0, tol) + # FlightCrewMass + assert_near_equal(prob[Aircraft.CrewPayload.FLIGHT_CREW_MASS], 450.0, tol) + # TransportInstrumentMass + assert_near_equal(prob[Aircraft.Instruments.MASS], 1309.88942193, tol) + # EngineMiscMass + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_MISC_MASS], 0.0, tol) + # NacelleMass + assert_near_equal(prob[Aircraft.Nacelle.MASS], 0.0, tol) + # PaintMass + assert_near_equal(prob[Aircraft.Paint.MASS], 0.0, tol) + # ThrustReverserMass + assert_near_equal(prob[Aircraft.Engine.THRUST_REVERSERS_MASS], 0.0, tol) + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_THRUST_REVERSERS_MASS], 0.0, tol) + # LandingMassGroup + assert_near_equal(prob[Aircraft.Design.TOUCHDOWN_MASS], 699279.2, tol) + # SurfaceControlMass + assert_near_equal(prob[Aircraft.Wing.SURFACE_CONTROL_MASS], 11731.15573539, tol) + assert_near_equal(prob[Aircraft.Wing.CONTROL_SURFACE_AREA], 4032.5967, tol) + # BWBFuselageMass + assert_near_equal(prob[Aircraft.Fuselage.MASS], 137935.30594648936, tol) + # HorizontalTailMass + assert_near_equal(prob[Aircraft.HorizontalTail.MASS], 0.0, tol) + # VerticalTailMass + assert_near_equal(prob[Aircraft.VerticalTail.MASS], 0.0, tol) + # CanardMass + assert_near_equal(prob[Aircraft.Canard.MASS], 0.0, tol) + # FinMass + assert_near_equal(prob[Aircraft.Fins.MASS], 3159.3781042368792, tol) + # WingMassGroup + # BWBDetailedWingBendingFact + assert_near_equal(prob[Aircraft.Wing.BENDING_MATERIAL_FACTOR], 3.93743732, tol) + assert_near_equal(prob[Aircraft.Wing.ENG_POD_INERTIA_FACTOR], 1.0, tol) + # BWBWingMiscMass + assert_near_equal(prob[Aircraft.Wing.MISC_MASS], 9720.4199027685518, tol) + # WingShearControlMass + assert_near_equal(prob[Aircraft.Wing.SHEAR_CONTROL_MASS], 34867.592407371565, tol) + # WingBendingMass + assert_near_equal(prob[Aircraft.Wing.BENDING_MATERIAL_MASS], 8782.85692049, tol) + # BWBAftBodyMass + assert_near_equal(prob[Aircraft.Fuselage.AFTBODY_MASS], 18736.55008878, tol) + assert_near_equal(prob[Aircraft.Wing.BWB_AFTBODY_MASS], 15551.33657368, tol) + # MassSummation + # StructureMass + assert_near_equal(prob[Aircraft.Design.STRUCTURE_MASS], 240915.88664709, tol) + # PropulsionMass + assert_near_equal(prob[Aircraft.Propulsion.MASS], 58921.857380417721, tol) + # SystemsEquipMass + assert_near_equal(prob[Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS], 90644.95111232, tol) + # EmptyMass + assert_near_equal(prob[Aircraft.Design.EMPTY_MASS], 390482.6804821, tol) + # OperatingMass + assert_near_equal(prob[Mission.Summary.OPERATING_MASS], 411479.0724484, tol) + # ZeroFuelMass + assert_near_equal(prob[Mission.Summary.ZERO_FUEL_MASS], 509291.0724484, tol) + # FuelMass + assert_near_equal(prob[Mission.Summary.FUEL_MASS], 364807.9275516, tol) + + def ttttest_case_all_subsystems(self): + """ + premission: propulsion + geometry + aerodynamics + mass + Note: not checking propulsion and aerodynamics + """ + prob = self.prob + + engines = [build_engine_deck(self.flops_inputs)] + preprocess_options(self.flops_inputs) + default_premission_subsystems = get_default_premission_subsystems('FLOPS', engines=engines) + + prob.model.add_subsystem( + 'pre_mission', + CorePreMission( + aviary_options=self.flops_inputs, subsystems=default_premission_subsystems + ), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) + + setup_model_options(prob, self.flops_inputs) + prob.setup(check=False) + set_aviary_initial_values(prob, self.flops_inputs) + + prob.run_model() + + tol = 1e-4 + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST], 70000.0 * 3, tol) + # Geometry + # BWBSimpleCabinLayout + assert_near_equal(prob[Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH], 78.61013558, tol) + assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 38.5, tol) + assert_near_equal(prob[Aircraft.Fuselage.CABIN_AREA], 4697.33181006, tol) + assert_near_equal(prob[Aircraft.Fuselage.MAX_HEIGHT], 12.35302131, tol) + assert_near_equal(prob[Aircraft.BWB.NUM_BAYS], 7.0, tol) + # BWBFuselagePrelim + assert_near_equal(prob[Aircraft.Fuselage.REF_DIAMETER], 46.2868886894979, tol) + assert_near_equal(prob[Aircraft.Fuselage.PLANFORM_AREA], 6710.4740143724875, tol) + # BWBWingPrelim + assert_near_equal(prob[Aircraft.Wing.AREA], 12109.879719468739, tol) + assert_near_equal(prob[Aircraft.Wing.ASPECT_RATIO], 5.36951675, tol) + assert_near_equal(prob[Aircraft.Wing.ASPECT_RATIO_REFERENCE], 5.36951675, tol) + assert_near_equal(prob[Aircraft.Wing.LOAD_FRACTION], 0.46761341784858923, tol) + # _BWBWing + assert_near_equal(prob[Aircraft.Wing.WETTED_AREA], 24713.66129084, tol) + # _Tail + assert_near_equal(prob[Aircraft.HorizontalTail.WETTED_AREA], 0.0, tol) + assert_near_equal(prob[Aircraft.VerticalTail.WETTED_AREA], 0.0, tol) + # _FuselageRatios + assert_near_equal(prob[Aircraft.Fuselage.DIAMETER_TO_WING_SPAN], 0.18243240878599712, tol) + assert_near_equal(prob[Aircraft.Fuselage.LENGTH_TO_DIAMETER], 2.4261771932742167, tol) + # Nacelles + assert_near_equal(prob[Aircraft.Nacelle.WETTED_AREA], 498.26822066, tol) + assert_near_equal(prob[Aircraft.Nacelle.TOTAL_WETTED_AREA], 3 * 498.26822066, tol) + # Canard + assert_near_equal(prob[Aircraft.Canard.WETTED_AREA], 0.0, tol) + # BWBWingCharacteristicLength + assert_near_equal(prob[Aircraft.Wing.CHARACTERISTIC_LENGTH], 47.72916456, tol) + assert_near_equal(prob[Aircraft.Wing.FINENESS], 0.11, tol) + # OtherCharacteristicLengths + assert_near_equal(prob[Aircraft.Canard.CHARACTERISTIC_LENGTH], 0.0, tol) + assert_near_equal(prob[Aircraft.Canard.FINENESS], 0.0, tol) + assert_near_equal(prob[Aircraft.Fuselage.CHARACTERISTIC_LENGTH], 112.3001936860821, tol) + assert_near_equal(prob[Aircraft.Fuselage.FINENESS], 2.4261771932742167, tol) + assert_near_equal(prob[Aircraft.HorizontalTail.CHARACTERISTIC_LENGTH], 0.0, tol) + assert_near_equal(prob[Aircraft.HorizontalTail.FINENESS], 0.11, tol) + assert_near_equal(prob[Aircraft.Nacelle.CHARACTERISTIC_LENGTH], [15.68611614], tol) + assert_near_equal(prob[Aircraft.Nacelle.FINENESS], [1.38269353], tol) + assert_near_equal(prob[Aircraft.VerticalTail.CHARACTERISTIC_LENGTH], 0.0, tol) + assert_near_equal(prob[Aircraft.VerticalTail.FINENESS], 0.11, tol) + # TotalWettedArea + assert_near_equal(prob[Aircraft.Design.TOTAL_WETTED_AREA], 26208.46595187, tol) + # Mass + # CargoMass + assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_MASS_TOTAL], 77220.0, tol) + assert_near_equal(prob[Aircraft.CrewPayload.BAGGAGE_MASS], 20592.0, tol) + assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS], 97812.0, tol) + assert_near_equal(prob[Aircraft.CrewPayload.CARGO_MASS], 0.0, tol) + assert_near_equal(prob[Aircraft.CrewPayload.TOTAL_PAYLOAD_MASS], 97812.0, tol) + # TransportCargoContainersMass + assert_near_equal(prob[Aircraft.CrewPayload.CARGO_CONTAINER_MASS], 3850.0, tol) + # TransportEngineCtrlsMass + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS], 206.36860226, tol) + # TransportAvionicsMass + assert_near_equal(prob[Aircraft.Avionics.MASS], 2778.5110590964073, tol) + # FuelCapacityGroup + assert_near_equal(prob[Aircraft.Fuel.WING_FUEL_CAPACITY], 1197720.2419621395, tol) + assert_near_equal(prob[Aircraft.Fuel.TOTAL_CAPACITY], 1197720.2419621395, tol) + # EngineMass + assert_near_equal(prob[Aircraft.Engine.MASS], 17825.63336233, tol) + assert_near_equal(prob[Aircraft.Engine.ADDITIONAL_MASS], 0.0, tol) + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 53476.90008698, tol) + # TransportFuelSystemMass + assert_near_equal(prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 5444.9572934402777, tol) + # TransportAirCondMass + assert_near_equal(prob[Aircraft.AirConditioning.MASS], 3897.6527857555625, tol) + # TransportEngineOilMass + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_OIL_MASS], 346.93557352, tol) + # BWBFurnishingsGroupMass + assert_near_equal(prob[Aircraft.Furnishings.MASS], 57747.97136452, tol) + # TransportHydraulicsGroupMass + assert_near_equal(prob[Aircraft.Hydraulics.MASS], 6200.37391189, tol) + # PassengerServiceMass + assert_near_equal( + prob[Aircraft.CrewPayload.PASSENGER_SERVICE_MASS], 10806.675950702213, tol + ) + # ElectricalMass + assert_near_equal(prob[Aircraft.Electrical.MASS], 4291.4778106479534, tol) + # AntiIcingMass + assert_near_equal(prob[Aircraft.AntiIcing.MASS], 562.09100951165135, tol) + # TransportAPUMass + assert_near_equal(prob[Aircraft.APU.MASS], 2125.8280135763703, tol) + # NonFlightCrewMass + assert_near_equal(prob[Aircraft.CrewPayload.CABIN_CREW_MASS], 3810.0, tol) + # FlightCrewMass + assert_near_equal(prob[Aircraft.CrewPayload.FLIGHT_CREW_MASS], 450.0, tol) + # TransportInstrumentMass + assert_near_equal(prob[Aircraft.Instruments.MASS], 1309.88942193, tol) + # EngineMiscMass + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_MISC_MASS], 0.0, tol) + # NacelleMass + assert_near_equal(prob[Aircraft.Nacelle.MASS], 0.0, tol) + # PaintMass + assert_near_equal(prob[Aircraft.Paint.MASS], 0.0, tol) + # ThrustReverserMass + assert_near_equal(prob[Aircraft.Engine.THRUST_REVERSERS_MASS], 0.0, tol) + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_THRUST_REVERSERS_MASS], 0.0, tol) + # LandingMassGroup + assert_near_equal(prob[Aircraft.Design.TOUCHDOWN_MASS], 699279.2, tol) + # SurfaceControlMass + assert_near_equal(prob[Aircraft.Wing.SURFACE_CONTROL_MASS], 11731.15573539, tol) + assert_near_equal(prob[Aircraft.Wing.CONTROL_SURFACE_AREA], 4032.5967, tol) + # BWBFuselageMass + assert_near_equal(prob[Aircraft.Fuselage.MASS], 137935.30594648936, tol) + # HorizontalTailMass + assert_near_equal(prob[Aircraft.HorizontalTail.MASS], 0.0, tol) + # VerticalTailMass + assert_near_equal(prob[Aircraft.VerticalTail.MASS], 0.0, tol) + # CanardMass + assert_near_equal(prob[Aircraft.Canard.MASS], 0.0, tol) + # FinMass + assert_near_equal(prob[Aircraft.Fins.MASS], 3159.3781042368792, tol) + # WingMassGroup + # BWBDetailedWingBendingFact + assert_near_equal(prob[Aircraft.Wing.BENDING_MATERIAL_FACTOR], 3.93743732, tol) + assert_near_equal(prob[Aircraft.Wing.ENG_POD_INERTIA_FACTOR], 1.0, tol) + # BWBWingMiscMass + assert_near_equal(prob[Aircraft.Wing.MISC_MASS], 9720.4199027685518, tol) + # WingShearControlMass + assert_near_equal(prob[Aircraft.Wing.SHEAR_CONTROL_MASS], 34867.592407371565, tol) + # WingBendingMass + assert_near_equal(prob[Aircraft.Wing.BENDING_MATERIAL_MASS], 8782.85692049, tol) + # BWBAftBodyMass + assert_near_equal(prob[Aircraft.Fuselage.AFTBODY_MASS], 18736.55008878, tol) + assert_near_equal(prob[Aircraft.Wing.BWB_AFTBODY_MASS], 15551.33657368, tol) + # MassSummation + # StructureMass + assert_near_equal(prob[Aircraft.Design.STRUCTURE_MASS], 240915.88664709, tol) + # PropulsionMass + assert_near_equal(prob[Aircraft.Propulsion.MASS], 58921.857380417721, tol) + # SystemsEquipMass + assert_near_equal(prob[Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS], 90644.95111232, tol) + # EmptyMass + assert_near_equal(prob[Aircraft.Design.EMPTY_MASS], 390482.6804821, tol) + # OperatingMass + assert_near_equal(prob[Mission.Summary.OPERATING_MASS], 411479.0724484, tol) + # ZeroFuelMass + assert_near_equal(prob[Mission.Summary.ZERO_FUEL_MASS], 509291.0724484, tol) + # FuelMass + assert_near_equal(prob[Mission.Summary.FUEL_MASS], 364807.9275516, tol) + # TODO: test some aero variables + + if __name__ == '__main__': - unittest.main() + # unittest.main() + import numpy as np + + np.seterr(invalid='raise') + test = BWB300PreMissionGroupCSVTest() + # test = BWBPreMissionGroupCSVTest2() + test.setUp() + test.test_case_geom() From 32f09658d2338eaa2be7385fd930762f9eb9a8f4 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 19 Feb 2026 13:38:54 -0500 Subject: [PATCH 05/67] work in progress: working on bwb300_baseline model --- aviary/subsystems/test/test_flops_based_premission.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index 5fc79c6658..32c50f4e29 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -882,7 +882,7 @@ def test_case_geom(self): # Geometry # BWBComputeDetailedWingDist assert_near_equal(prob[Aircraft.Wing.SPAN], 253.720756, tol) - # BWBSimpleCabinLayout + # DetailedCabinLayout assert_near_equal(prob[Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH], 78.61013558, tol) assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 38.5, tol) assert_near_equal(prob[Aircraft.Fuselage.CABIN_AREA], 4697.33181006, tol) @@ -1221,6 +1221,7 @@ def test_case_all_subsystems(self): # TODO: test some aero variables +@use_tempdirs class BWB300PreMissionGroupCSVTest(unittest.TestCase): """ testing using bwb_detailed_FLOPS.csv @@ -1259,8 +1260,8 @@ def test_case_geom(self): # Geometry # BWBComputeDetailedWingDist assert_near_equal(prob[Aircraft.Wing.SPAN], 186.3, tol) - # BWBSimpleCabinLayout - assert_near_equal(prob[Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH], 78.61013558, tol) + # DetailedCabinLayout + assert_near_equal(prob[Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH], 81.43, tol) assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 38.5, tol) assert_near_equal(prob[Aircraft.Fuselage.CABIN_AREA], 4697.33181006, tol) assert_near_equal(prob[Aircraft.Fuselage.MAX_HEIGHT], 12.35302131, tol) From 3794b9f69b79640fb6334eb5d551753d3f3dec1b Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 19 Feb 2026 13:39:43 -0500 Subject: [PATCH 06/67] make Aircraft.Fuselage.SIMPLE_LAYOUT a boolean --- aviary/variable_info/variable_meta_data.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index adc78abc04..5b83d04d98 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -3698,6 +3698,7 @@ Aircraft.Fuselage.SIMPLE_LAYOUT, meta_data=_MetaData, historical_name={'GASP': None, 'FLOPS': None, 'LEAPS1': None}, + types=bool, units='unitless', desc='carry out simple or detailed layout of fuselage.', option=True, From fb9cfaa8e5d35895231950568dea2059dff346a7 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 19 Feb 2026 22:46:27 -0500 Subject: [PATCH 07/67] update fuselage layout code due to the model of bwb300_baseline --- .../geometry/flops_based/fuselage.py | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/fuselage.py b/aviary/subsystems/geometry/flops_based/fuselage.py index dd7fa9cd5e..425f7723a5 100644 --- a/aviary/subsystems/geometry/flops_based/fuselage.py +++ b/aviary/subsystems/geometry/flops_based/fuselage.py @@ -456,7 +456,7 @@ def compute(self, inputs, outputs): rear_spar_percent_chord = inputs['Rear_spar_percent_chord'] max_width = inputs[Aircraft.Fuselage.MAX_WIDTH][0] height_to_width = inputs[Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO] - bay_width_max = 12.0 # ft + bay_width_nom = 12.0 # ft if length <= 0.0: raise ValueError( @@ -477,7 +477,7 @@ def compute(self, inputs, outputs): # Enforce maximum number of bays num_bays_max = self.options[Aircraft.BWB.MAX_NUM_BAYS] - num_bays = int(0.5 + max_width.real / bay_width_max.real) + num_bays = int(0.5 + max_width.real / bay_width_nom) if num_bays > num_bays_max and num_bays_max > 0: num_bays = num_bays_max outputs[Aircraft.BWB.NUM_BAYS] = smooth_int_tanh(num_bays, mu=20.0) @@ -563,7 +563,9 @@ def compute(self, inputs, outputs): height_to_width = inputs[Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO] tan_sweep = np.tan(sweep / 57.296) - bay_width_max = 12.0 # ft + bay_width_nom = 12.0 # ft + # Do not set max bay width for now. Later can create an Aviary variable for BAYWMX + bay_width_max = 0.0 num_bays = 0 num_bays_loc = num_bays num_bays_max = self.options[Aircraft.BWB.MAX_NUM_BAYS] @@ -600,9 +602,9 @@ def compute(self, inputs, outputs): seat_pitch_economy = 32.0 # inch # Determine unit seat areas for each type of passenger - area_seat_business = bay_width_max * seat_pitch_business / 12.0 / num_seat_abreast_business - area_seat_first = bay_width_max * seat_pitch_first / 12.0 / num_seat_abreast_first - area_seat_economy = bay_width_max * seat_pitch_economy / 12.0 / num_seat_abreast_economy + area_seat_business = bay_width_nom * seat_pitch_business / 12.0 / num_seat_abreast_business + area_seat_first = bay_width_nom * seat_pitch_first / 12.0 / num_seat_abreast_first + area_seat_economy = bay_width_nom * seat_pitch_economy / 12.0 / num_seat_abreast_economy # Find the number of lavatories, galleys and closets based on the # number of passengers for each class and the area for each @@ -617,9 +619,9 @@ def compute(self, inputs, outputs): num_galleys = int(0.99 + 0.6 * num_lavas) num_closets = int(0.99 + 0.4 * num_lavas) - area_lava = (bay_width_max / 2.0) * (width_lava / 12.0) - area_galley = (bay_width_max / 2.0) * (width_galley / 12.0) - area_closet = (bay_width_max / 2.0) * (width_closet / 12.0) + area_lava = (bay_width_nom / 2.0) * (width_lava / 12.0) + area_galley = (bay_width_nom / 2.0) * (width_galley / 12.0) + area_closet = (bay_width_nom / 2.0) * (width_closet / 12.0) # Calculate area required for passengers and services area_seats = ( @@ -637,11 +639,11 @@ def compute(self, inputs, outputs): while num_bays_loc != num_bays: num_bays_loc = num_bays # Cabin area wasted due to slanted != side wall - area_waste = num_bays * tan_sweep * (bay_width_max / 2.0) ** 2 + area_waste = num_bays * tan_sweep * (bay_width_nom / 2.0) ** 2 # Aisle area for horseshoe (5'), cross (2') and rear (3') aisles # Aisles only go to center of outboard bays, hence num_bays-1 - area_aisle = 10.0 * (num_bays - 1) * bay_width_max + area_aisle = 10.0 * (num_bays - 1) * bay_width_nom # Total pressurized cabin area area_cabin = area_seats + area_service + area_waste + area_aisle @@ -654,7 +656,7 @@ def compute(self, inputs, outputs): pax_compart_length = root_chord + tan_sweep * max_width / 2.0 # Enforce maximum number of bays - z = 0.5 + max_width / bay_width_max + z = 0.5 + max_width / bay_width_nom z = z[0] num_bays = int(z.real) if num_bays > num_bays_max and num_bays_max > 0: @@ -662,7 +664,7 @@ def compute(self, inputs, outputs): # Enforce maximum bay width bay_width = max_width / num_bays - if bay_width > bay_width_max: + if bay_width > bay_width_max and bay_width_max > 0.0: bay_width = bay_width_max num_bays = int(0.999 + max_width[0] / bay_width) if num_bays > num_bays_max and num_bays_max > 0: From 43e5bcae26c129d4f1216dc58908fdfbd57ce187 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 19 Feb 2026 22:48:44 -0500 Subject: [PATCH 08/67] adding test_case2 for bwb300_baseline --- .../flops_based/test/test_fuselage.py | 56 ++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/test/test_fuselage.py b/aviary/subsystems/geometry/flops_based/test/test_fuselage.py index e839ee9d2d..ec0d38f082 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_fuselage.py +++ b/aviary/subsystems/geometry/flops_based/test/test_fuselage.py @@ -114,7 +114,7 @@ def test_case1(self): @use_tempdirs class BWBDetailedCabinLayoutTest(unittest.TestCase): - """Test simple cabin layout computation.""" + """Test detailed cabin layout computation.""" def setUp(self): self.prob = om.Problem() @@ -166,6 +166,55 @@ def test_case1(self): root_chord = prob.get_val(Aircraft.Wing.ROOT_CHORD) assert_near_equal(root_chord, 38.5, tolerance=1e-9) + def test_case2(self): + """bwb300_baseline""" + prob = self.prob + options = self.aviary_options = AviaryValues() + options.set_val(Settings.VERBOSITY, 1, units='unitless') + + options.set_val(Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS, 76, units='unitless') + options.set_val(Aircraft.CrewPayload.Design.NUM_FIRST_CLASS, 24, units='unitless') + options.set_val(Aircraft.CrewPayload.Design.NUM_ECONOMY_CLASS, 200, units='unitless') + options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_BUSINESS, 0, units='unitless') + options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_FIRST, 0, units='unitless') + options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 0, units='unitless') + options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_BUSINESS, 0.0, units='inch') + options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST, 0.0, units='inch') + options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 0.0, units='inch') + options.set_val(Aircraft.BWB.MAX_NUM_BAYS, 0, units='unitless') + + prob.model.add_subsystem( + 'layout', BWBDetailedCabinLayout(), promotes_outputs=['*'], promotes_inputs=['*'] + ) + setup_model_options(self.prob, options) + prob.setup(check=False, force_alloc_complex=True) + prob.set_val(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, val=60.0, units='deg') + prob.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, val=0.11, units='unitless') + # prob.set_val(Aircraft.Fuselage.MAX_WIDTH, val=50.0, units='ft') + prob.set_val('Rear_spar_percent_chord', val=0.7, units='unitless') + prob.run_model() + + fuselage_width = prob.get_val(Aircraft.Fuselage.MAX_WIDTH) + assert_near_equal(fuselage_width, 49.77182929, tolerance=1e-9) + + num_bays = prob.get_val(Aircraft.BWB.NUM_BAYS) + assert_near_equal(num_bays, [4], tolerance=1e-9) + + fuselage_length = prob.get_val(Aircraft.Fuselage.LENGTH) + assert_near_equal(fuselage_length, 116.57609631, tolerance=1e-9) + + pax_compart_length = prob.get_val(Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH) + assert_near_equal(pax_compart_length, 81.60326742, tolerance=1e-9) + + fuselage_height = prob.get_val(Aircraft.Fuselage.MAX_HEIGHT) + assert_near_equal(fuselage_height, 12.82337059, tolerance=1e-9) + + cabin_area = prob.get_val(Aircraft.Fuselage.CABIN_AREA) + assert_near_equal(cabin_area, 2988.87966179, tolerance=1e-9) + + root_chord = prob.get_val(Aircraft.Wing.ROOT_CHORD) + assert_near_equal(root_chord, 38.5, tolerance=1e-9) + @use_tempdirs class BWBFuselagePrelimTest(unittest.TestCase): @@ -200,4 +249,7 @@ def test_case1(self): if __name__ == '__main__': - unittest.main() + # unittest.main() + test = BWBDetailedCabinLayoutTest() + test.setUp() + test.test_case2() From e4b1f182d29f348647b088807a6407faaa2d3512 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 19 Feb 2026 22:50:25 -0500 Subject: [PATCH 09/67] work in progress: adding bwb300_baseline --- aviary/subsystems/test/test_flops_based_premission.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index 4cfd790479..c87a3cb7b4 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -1263,11 +1263,12 @@ def test_case_geom(self): # BWBComputeDetailedWingDist assert_near_equal(prob[Aircraft.Wing.SPAN], 186.3, tol) # DetailedCabinLayout - assert_near_equal(prob[Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH], 81.43, tol) + assert_near_equal(prob[Aircraft.Fuselage.MAX_WIDTH], 49.77182929, tolerance=1e-9) + assert_near_equal(prob[Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH], 81.60326742, tol) assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 38.5, tol) - assert_near_equal(prob[Aircraft.Fuselage.CABIN_AREA], 4697.33181006, tol) - assert_near_equal(prob[Aircraft.Fuselage.MAX_HEIGHT], 12.35302131, tol) - assert_near_equal(prob[Aircraft.BWB.NUM_BAYS], 7.0, tol) + assert_near_equal(prob[Aircraft.Fuselage.CABIN_AREA], 2988.879661796, tol) + assert_near_equal(prob[Aircraft.Fuselage.MAX_HEIGHT], 12.82337059, tol) + assert_near_equal(prob[Aircraft.BWB.NUM_BAYS], 4.0, tol) # BWBFuselagePrelim assert_near_equal(prob[Aircraft.Fuselage.REF_DIAMETER], 46.2868886894979, tol) assert_near_equal(prob[Aircraft.Fuselage.PLANFORM_AREA], 6710.4740143724875, tol) From e02998db8d87dcb70f41012aa83599e2c42752cc Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 20 Feb 2026 20:44:15 -0500 Subject: [PATCH 10/67] add unit test for bwb300_baseline --- .../flops_based/test/test_fuselage.py | 5 +- .../flops_based/test/test_prep_geom.py | 34 +++++++- .../test/test_wing_detailed_bwb.py | 85 ++++++++++++++++++- 3 files changed, 117 insertions(+), 7 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/test/test_fuselage.py b/aviary/subsystems/geometry/flops_based/test/test_fuselage.py index ec0d38f082..9ac95b21d0 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_fuselage.py +++ b/aviary/subsystems/geometry/flops_based/test/test_fuselage.py @@ -249,7 +249,4 @@ def test_case1(self): if __name__ == '__main__': - # unittest.main() - test = BWBDetailedCabinLayoutTest() - test.setUp() - test.test_case2() + unittest.main() diff --git a/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py b/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py index e334ab0f31..82d55856f4 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py +++ b/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py @@ -749,6 +749,35 @@ def test_case1(self): exp1 = 17683.7562096 assert_near_equal(out1, exp1, tolerance=1e-8) + def test_case2(self): + """Provided detailed wing case for bwb300_baseline""" + prob = self.prob + self.aviary_options = AviaryValues() + self.aviary_options.set_val( + Aircraft.Wing.INPUT_STATION_DIST, + [0.0, 0.0, 0.2075, 0.415, 0.6927, 0.928, 1.0], + units='unitless', + ) + prob.model.add_subsystem('wing', _BWBWing(), promotes_outputs=['*'], promotes_inputs=['*']) + setup_model_options(self.prob, self.aviary_options) + prob.setup(check=False, force_alloc_complex=True) + prob.set_val( + 'BWB_CHORD_PER_SEMISPAN_DIST', + val=[116.57609631, 55.0, 33.2, 18.97, 14.19, 10.2, 2.36127568], + ) + prob.set_val( + 'BWB_THICKNESS_TO_CHORD_DIST', + val=[0.1792, 0.1792, 0.125, 0.076, 0.076, 0.076, 0.06], + ) + prob.set_val(Aircraft.Fuselage.MAX_WIDTH, val=49.77182929) + prob.set_val(Aircraft.Wing.GLOVE_AND_BAT, val=1230.5) + prob.set_val(Aircraft.Wing.SPAN, val=186.631829293424) + prob.run_model() + + out1 = prob.get_val(Aircraft.Wing.WETTED_AREA) + exp1 = 17302.04910213 + assert_near_equal(out1, exp1, tolerance=1e-8) + @use_tempdirs class BWBSimplePrepGeomTest(unittest.TestCase): @@ -1300,4 +1329,7 @@ def test_case1(self): if __name__ == '__main__': - unittest.main() + # unittest.main() + test = BWBWingTest() + test.setUp() + test.test_case2() diff --git a/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py b/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py index 8ca47622a7..e2c72228a0 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py +++ b/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py @@ -84,9 +84,8 @@ def test_case1(self): prob.set_val(Aircraft.Fuselage.MAX_WIDTH, val=80.220756073526772) prob.set_val(Aircraft.Wing.OUTBOARD_SEMISPAN, val=86.75) prob.set_val(Aircraft.Fuselage.LENGTH, val=112.3001936860821) - prob.set_val(Aircraft.Wing.THICKNESS_TO_CHORD, val=0.11) + prob.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, val=0.11) prob.set_val(Aircraft.Wing.ROOT_CHORD, 38.5) - prob.set_val(Aircraft.Wing.OUTBOARD_SEMISPAN, 86.75) prob.run_model() out1 = prob.get_val('BWB_CHORD_PER_SEMISPAN_DIST') @@ -136,6 +135,54 @@ def test_case1(self): # partial_data = self.prob.check_partials(out_stream=None, method='cs') # assert_check_partials(partial_data, atol=1e-9, rtol=1e-8) + def test_case2(self): + prob = self.prob + options = self.aviary_options = AviaryValues() + options.set_val(Settings.VERBOSITY, 1, units='unitless') + options.set_val( + Aircraft.Wing.INPUT_STATION_DIST, + [0.0, 0.0, 0.2075, 0.415, 0.6927, 0.928, 1.0], + units='unitless', + ) # ETAW + prob.model.add_subsystem( + 'dist', BWBUpdateDetailedWingDist(), promotes_outputs=['*'], promotes_inputs=['*'] + ) + setup_model_options(self.prob, options) + prob.setup(check=False, force_alloc_complex=True) + prob.set_val( + Aircraft.Wing.CHORD_PER_SEMISPAN_DIST, + val=[-1.0, 48.25, 33.20, 18.97, 14.19, 10.20, 3.220], + ) # CHD + prob.set_val( + Aircraft.Wing.THICKNESS_TO_CHORD_DIST, + val=[-1.0, 0.125, 0.125, 0.076, 0.076, 0.076, 0.06], + ) # TOC + prob.set_val( + Aircraft.Wing.LOAD_PATH_SWEEP_DIST, + val=[0.0, 0.0, 0.0, 17.0, 17.0, 17.0], + ) # SWL + prob.set_val(Aircraft.Fuselage.MAX_WIDTH, val=49.77182929) + prob.set_val(Aircraft.Wing.OUTBOARD_SEMISPAN, val=68.43) + prob.set_val(Aircraft.Fuselage.LENGTH, val=116.57609631) + prob.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, val=0.1792) + prob.set_val(Aircraft.Wing.ROOT_CHORD, 38.5) + prob.run_model() + + out1 = prob.get_val('BWB_CHORD_PER_SEMISPAN_DIST') + exp1 = [116.57609631, 55.0, 33.2, 18.97, 14.19, 10.2, 2.36127568] + assert_near_equal(out1, exp1, tolerance=1e-8) + + out2 = prob.get_val('BWB_THICKNESS_TO_CHORD_DIST') + exp2 = [0.1792, 0.1792, 0.125, 0.076, 0.076, 0.076, 0.06] + assert_near_equal(out2, exp2, tolerance=1e-10) + + out3 = prob.get_val('BWB_LOAD_PATH_SWEEP_DIST') + exp3 = [0.0, 0.0, 0.0, 17.0, 17.0, 17.0] + assert_near_equal(out3, exp3, tolerance=1e-10) + + # partial_data = self.prob.check_partials(out_stream=None, method='cs') + # assert_check_partials(partial_data, atol=1e-9, rtol=1e-8) + @use_tempdirs class BWBComputeDetailedWingDistTest(unittest.TestCase): @@ -168,6 +215,7 @@ def test_case1(self): prob.set_val(Aircraft.Wing.OUTBOARD_SEMISPAN, val=86.75) prob.set_val(Aircraft.Fuselage.LENGTH, val=137.5) prob.set_val(Aircraft.Wing.THICKNESS_TO_CHORD, val=0.11) + prob.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, val=0.11) prob.set_val(Aircraft.Wing.ROOT_CHORD, 63.96) prob.set_val(Aircraft.Wing.SWEEP, 35.7, units='deg') prob.run_model() @@ -279,6 +327,39 @@ def test_case2(self): prob.get_val(Aircraft.Wing.LOAD_FRACTION), 0.46761341784858923, tolerance=1e-9 ) + def test_case3(self): + """Provided detailed wing case for bwb300_baseline""" + prob = self.prob + self.aviary_options = AviaryValues() + self.aviary_options.set_val(Settings.VERBOSITY, 1, units='unitless') + self.aviary_options.set_val( + Aircraft.Wing.INPUT_STATION_DIST, + [0.0, 0.0, 0.2075, 0.415, 0.6927, 0.928, 1.0], + units='unitless', + ) + prob.model.add_subsystem( + 'dist', BWBWingPrelim(), promotes_outputs=['*'], promotes_inputs=['*'] + ) + setup_model_options(self.prob, self.aviary_options) + prob.setup(check=False, force_alloc_complex=True) + prob.set_val(Aircraft.Fuselage.MAX_WIDTH, val=49.77182929) + prob.set_val(Aircraft.Wing.GLOVE_AND_BAT, val=1230.5) + prob.set_val(Aircraft.Wing.SPAN, val=186.631829293424) + prob.set_val( + 'BWB_CHORD_PER_SEMISPAN_DIST', + val=[116.57609631, 55.0, 33.2, 18.97, 14.19, 10.2, 2.36127568], + ) + prob.run_model() + + assert_near_equal(prob.get_val(Aircraft.Wing.AREA), 8421.7146805052689, tolerance=1e-9) + assert_near_equal(prob.get_val(Aircraft.Wing.ASPECT_RATIO), 4.84361005, tolerance=1e-9) + assert_near_equal( + prob.get_val(Aircraft.Wing.ASPECT_RATIO_REFERENCE), 4.84361005, tolerance=1e-9 + ) + assert_near_equal( + prob.get_val(Aircraft.Wing.LOAD_FRACTION), 0.53775151869737092, tolerance=1e-9 + ) + if __name__ == '__main__': unittest.main() From fc4c372e401ef9fc117a3efdba609215917219cf Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 20 Feb 2026 20:44:52 -0500 Subject: [PATCH 11/67] fix an error --- .../geometry/flops_based/wing_detailed_bwb.py | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py b/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py index ee50e02065..540b3c44f7 100644 --- a/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py +++ b/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py @@ -31,7 +31,7 @@ def setup(self): add_aviary_input(self, Aircraft.Fuselage.LENGTH, units='ft') add_aviary_input(self, Aircraft.Fuselage.MAX_WIDTH, units='ft') add_aviary_input(self, Aircraft.Wing.OUTBOARD_SEMISPAN, units='ft') - add_aviary_input(self, Aircraft.Wing.THICKNESS_TO_CHORD, units='unitless') + add_aviary_input(self, Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, units='unitless') add_aviary_input(self, Aircraft.Wing.ROOT_CHORD, units='ft') self.add_input( 'rear_spar_percent_chord_side', @@ -70,7 +70,7 @@ def setup_partials(self): 'BWB_THICKNESS_TO_CHORD_DIST', [ Aircraft.Wing.THICKNESS_TO_CHORD_DIST, - Aircraft.Wing.THICKNESS_TO_CHORD, + Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, ], ) self.declare_partials( @@ -86,7 +86,7 @@ def compute(self, inputs, outputs): outputs[Aircraft.Wing.SPAN] = wingspan rate_span = (wingspan - width) / wingspan length = inputs[Aircraft.Fuselage.LENGTH][0] - tc = inputs[Aircraft.Wing.THICKNESS_TO_CHORD][0] + hw = inputs[Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO][0] root_chord = inputs[Aircraft.Wing.ROOT_CHORD][0] rear_spar_percent_chord_side = inputs['rear_spar_percent_chord_side'][0] if rear_spar_percent_chord_side <= 0.0: @@ -102,8 +102,8 @@ def compute(self, inputs, outputs): outputs['BWB_CHORD_PER_SEMISPAN_DIST'][0] = length outputs['BWB_CHORD_PER_SEMISPAN_DIST'][1] = xl_out - outputs['BWB_THICKNESS_TO_CHORD_DIST'][0] = tc - outputs['BWB_THICKNESS_TO_CHORD_DIST'][1] = tc + outputs['BWB_THICKNESS_TO_CHORD_DIST'][0] = hw + outputs['BWB_THICKNESS_TO_CHORD_DIST'][1] = hw # In FLOPS, this can be different outputs['BWB_THICKNESS_TO_CHORD_DIST'][2:] = inputs[Aircraft.Wing.THICKNESS_TO_CHORD_DIST][ 2: ] @@ -115,7 +115,7 @@ def compute_partials(self, inputs, J): # wingspan = width + 2 * osspan # rate_span = (wingspan - width) / wingspan # length = inputs[Aircraft.Fuselage.LENGTH][0] - # tc = inputs[Aircraft.Wing.THICKNESS_TO_CHORD][0] + # hw = inputs[Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO][0] # root_chord = inputs[Aircraft.Wing.ROOT_CHORD][0] # rear_spar_percent_chord_side = inputs['rear_spar_percent_chord_side'][0] # xl_out = root_chord / rear_spar_percent_chord_side @@ -125,9 +125,9 @@ def compute_partials(self, inputs, J): num_stations = len(self.options[Aircraft.Wing.INPUT_STATION_DIST]) - J['BWB_THICKNESS_TO_CHORD_DIST', Aircraft.Wing.THICKNESS_TO_CHORD][0] = 1.0 - J['BWB_THICKNESS_TO_CHORD_DIST', Aircraft.Wing.THICKNESS_TO_CHORD][1] = 1.0 - J['BWB_THICKNESS_TO_CHORD_DIST', Aircraft.Wing.THICKNESS_TO_CHORD][2:] = 0.0 + J['BWB_THICKNESS_TO_CHORD_DIST', Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO][0] = 1.0 + J['BWB_THICKNESS_TO_CHORD_DIST', Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO][1] = 1.0 + J['BWB_THICKNESS_TO_CHORD_DIST', Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO][2:] = 0.0 diag2_matrix = np.identity(num_stations) J['BWB_THICKNESS_TO_CHORD_DIST', Aircraft.Wing.THICKNESS_TO_CHORD_DIST] = diag2_matrix @@ -154,6 +154,7 @@ def setup(self): add_aviary_input(self, Aircraft.Fuselage.LENGTH, units='ft') add_aviary_input(self, Aircraft.Wing.OUTBOARD_SEMISPAN, units='ft') add_aviary_input(self, Aircraft.Wing.ROOT_CHORD, units='ft') + add_aviary_input(self, Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, units='unitless') add_aviary_input(self, Aircraft.Wing.THICKNESS_TO_CHORD, units='unitless') add_aviary_input(self, Aircraft.Wing.SWEEP, units='deg') self.add_input( @@ -175,7 +176,6 @@ def setup_partials(self): Aircraft.Fuselage.MAX_WIDTH, Aircraft.Wing.OUTBOARD_SEMISPAN, ], - method='cs', ) self.declare_partials( 'BWB_CHORD_PER_SEMISPAN_DIST', @@ -187,7 +187,13 @@ def setup_partials(self): 'rear_spar_percent_chord_side', ], ) - self.declare_partials('BWB_THICKNESS_TO_CHORD_DIST', Aircraft.Wing.THICKNESS_TO_CHORD) + self.declare_partials( + 'BWB_THICKNESS_TO_CHORD_DIST', + [ + Aircraft.Wing.THICKNESS_TO_CHORD, + Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, + ], + ) self.declare_partials( 'BWB_LOAD_PATH_SWEEP_DIST', [ @@ -223,6 +229,7 @@ def compute(self, inputs, outputs): ) xl_out = root_chord / rear_spar_percent_chord_side wing_tip_chord = 0.06 * wingspan + hw = inputs[Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO][0] tc = inputs[Aircraft.Wing.THICKNESS_TO_CHORD][0] sweep = inputs[Aircraft.Wing.SWEEP][0] tr_out = wing_tip_chord / xl_out @@ -235,8 +242,8 @@ def compute(self, inputs, outputs): outputs['BWB_CHORD_PER_SEMISPAN_DIST'][1] = xl_out outputs['BWB_CHORD_PER_SEMISPAN_DIST'][2] = wing_tip_chord - outputs['BWB_THICKNESS_TO_CHORD_DIST'][0] = tc - outputs['BWB_THICKNESS_TO_CHORD_DIST'][1] = tc + outputs['BWB_THICKNESS_TO_CHORD_DIST'][0] = hw + outputs['BWB_THICKNESS_TO_CHORD_DIST'][1] = hw outputs['BWB_THICKNESS_TO_CHORD_DIST'][2] = tc outputs['BWB_LOAD_PATH_SWEEP_DIST'][0] = 0.0 @@ -274,7 +281,9 @@ def compute_partials(self, inputs, J): 0.0, ] - J['BWB_THICKNESS_TO_CHORD_DIST', Aircraft.Wing.THICKNESS_TO_CHORD] = 1 + J['BWB_THICKNESS_TO_CHORD_DIST', Aircraft.Wing.THICKNESS_TO_CHORD] = [0.0, 0.0, 1.0] + + J['BWB_THICKNESS_TO_CHORD_DIST', Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO] = [1.0, 1.0, 0.0] dswp_ld_path_dsweep = 1 / (1 + angle**2) / np.cos(sweep / 57.2958) ** 2 J['BWB_LOAD_PATH_SWEEP_DIST', Aircraft.Wing.SWEEP] = [ From 67dee26ba13f5b817d202ccbe2d25cfccf5f9bfa Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 20 Feb 2026 20:45:38 -0500 Subject: [PATCH 12/67] work in progress: testing premisison of bwb300 model --- .../test/test_flops_based_premission.py | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index c87a3cb7b4..6d57f0165e 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -1261,30 +1261,30 @@ def test_case_geom(self): tol = 1e-5 # Geometry # BWBComputeDetailedWingDist - assert_near_equal(prob[Aircraft.Wing.SPAN], 186.3, tol) + assert_near_equal(prob[Aircraft.Wing.SPAN], 186.631829293424, tol) # DetailedCabinLayout assert_near_equal(prob[Aircraft.Fuselage.MAX_WIDTH], 49.77182929, tolerance=1e-9) assert_near_equal(prob[Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH], 81.60326742, tol) assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 38.5, tol) assert_near_equal(prob[Aircraft.Fuselage.CABIN_AREA], 2988.879661796, tol) - assert_near_equal(prob[Aircraft.Fuselage.MAX_HEIGHT], 12.82337059, tol) + assert_near_equal(prob[Aircraft.Fuselage.MAX_HEIGHT], 20.89043646, tol) assert_near_equal(prob[Aircraft.BWB.NUM_BAYS], 4.0, tol) # BWBFuselagePrelim - assert_near_equal(prob[Aircraft.Fuselage.REF_DIAMETER], 46.2868886894979, tol) - assert_near_equal(prob[Aircraft.Fuselage.PLANFORM_AREA], 6710.4740143724875, tol) + assert_near_equal(prob[Aircraft.Fuselage.REF_DIAMETER], 35.33113288, tol) + assert_near_equal(prob[Aircraft.Fuselage.PLANFORM_AREA], 4269.82808827, tol) # BWBWingPrelim - assert_near_equal(prob[Aircraft.Wing.AREA], 12109.879719468739, tol) - assert_near_equal(prob[Aircraft.Wing.ASPECT_RATIO], 5.36951675, tol) - assert_near_equal(prob[Aircraft.Wing.ASPECT_RATIO_REFERENCE], 5.36951675, tol) - assert_near_equal(prob[Aircraft.Wing.LOAD_FRACTION], 0.46761341784858923, tol) + assert_near_equal(prob[Aircraft.Wing.AREA], 8421.7146805052689, tol) + assert_near_equal(prob[Aircraft.Wing.ASPECT_RATIO], 4.84361005, tol) + # assert_near_equal(prob[Aircraft.Wing.ASPECT_RATIO_REFERENCE], 5.42525, tol) + # assert_near_equal(prob[Aircraft.Wing.LOAD_FRACTION], 0.46761341784858923, tol) # _BWBWing - assert_near_equal(prob[Aircraft.Wing.WETTED_AREA], 24713.66129084, tol) + assert_near_equal(prob[Aircraft.Wing.WETTED_AREA], 17302.04910213, tol) # _Tail - assert_near_equal(prob[Aircraft.HorizontalTail.WETTED_AREA], 0.0, tol) - assert_near_equal(prob[Aircraft.VerticalTail.WETTED_AREA], 0.0, tol) + assert_near_equal(prob[Aircraft.HorizontalTail.WETTED_AREA], 983.26501, tol) + assert_near_equal(prob[Aircraft.VerticalTail.WETTED_AREA], 125.0, tol) # _FuselageRatios - assert_near_equal(prob[Aircraft.Fuselage.DIAMETER_TO_WING_SPAN], 0.18243240878599712, tol) - assert_near_equal(prob[Aircraft.Fuselage.LENGTH_TO_DIAMETER], 2.4261771932742167, tol) + assert_near_equal(prob[Aircraft.Fuselage.DIAMETER_TO_WING_SPAN], 0.18930926, tol) + assert_near_equal(prob[Aircraft.Fuselage.LENGTH_TO_DIAMETER], 3.29952897, tol) # Nacelles assert_near_equal(prob[Aircraft.Nacelle.WETTED_AREA], 498.26822066, tol) assert_near_equal(prob[Aircraft.Nacelle.TOTAL_WETTED_AREA], 3 * 498.26822066, tol) From 4a8ea466486ee57d26bfc8feeb75303bf37cb8aa Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 25 Feb 2026 17:39:52 -0500 Subject: [PATCH 13/67] minor update: remove commented out lines --- .../blended_wing_body/bwb_detailed_FLOPS_data.py | 9 --------- .../aircraft/blended_wing_body/bwb_simple_FLOPS_data.py | 7 ------- 2 files changed, 16 deletions(-) diff --git a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py index 57f6db93e0..12ffbd8211 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py @@ -49,11 +49,9 @@ # --------------------------- inputs.set_val(Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS, 100) # NPB inputs.set_val(Aircraft.CrewPayload.Design.NUM_FIRST_CLASS, 28) # NPF -# inputs.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, 468, units='unitless') # NPB+NPF+NPT inputs.set_val(Aircraft.CrewPayload.Design.NUM_ECONOMY_CLASS, 340) # NPT inputs.set_val(Aircraft.CrewPayload.NUM_BUSINESS_CLASS, 100) # NPB inputs.set_val(Aircraft.CrewPayload.NUM_FIRST_CLASS, 28) # NPF -# inputs.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, 468, units='unitless') # sum of three classes inputs.set_val(Aircraft.CrewPayload.NUM_ECONOMY_CLASS, 340) # NPT inputs.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_BUSINESS, 4) # NBABR inputs.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_FIRST, 4) # NFABR @@ -107,7 +105,6 @@ inputs.set_val(Aircraft.Fuselage.MASS_SCALER, 1.0) # FRFU inputs.set_val(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, 45.0, 'deg') # SWPLE inputs.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, 0.11) # TCF -# inputs.set_val(Aircraft.Fuselage.WETTED_AREA, 0.0, 'ft**2') # see _BWBFuselage() inputs.set_val(Aircraft.Fuselage.WETTED_AREA_SCALER, 1.0) # SWETF # Horizontal Tail @@ -116,11 +113,9 @@ inputs.set_val(Aircraft.HorizontalTail.ASPECT_RATIO, 0.1) # ARHT inputs.set_val(Aircraft.HorizontalTail.TAPER_RATIO, 0.0) # TRHT inputs.set_val(Aircraft.HorizontalTail.THICKNESS_TO_CHORD, 0.11) # TCHT -# inputs.set_val(Aircraft.HorizontalTail.VERTICAL_TAIL_FRACTION, 0.0) # HHT inputs.set_val(Aircraft.HorizontalTail.MASS_SCALER, 1.0) # FRHT inputs.set_val(Aircraft.HorizontalTail.NUM_TAILS, 0) inputs.set_val(Aircraft.HorizontalTail.WETTED_AREA_SCALER, 1.0) # SWETH -# inputs.set_val(Aircraft.HorizontalTail.SWEEP, 0.0) # SWPHT # Hydraulics # --------------------------- @@ -159,7 +154,6 @@ inputs.set_val(Aircraft.Engine.REFERENCE_MASS, 22017, 'lbm') # WENG inputs.set_val(Aircraft.Engine.SCALED_SLS_THRUST, 70000.0, 'lbf') # THRUST inputs.set_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 86459.2, 'lbf') # THRSO -# inputs.set_val(Aircraft.Engine.NUM_ENGINES, np.array([3])) # NEW+NEF inputs.set_val(Aircraft.Engine.NUM_FUSELAGE_ENGINES, 3) # NEF inputs.set_val(Aircraft.Engine.NUM_WING_ENGINES, np.array([0])) # NEW inputs.set_val(Aircraft.Engine.THRUST_REVERSERS_MASS_SCALER, 0.0) # WTHR @@ -241,7 +235,6 @@ inputs.set_val(Aircraft.Wing.MISC_MASS_SCALER, 1.0) # FRWI3 inputs.set_val(Aircraft.Wing.NUM_INTEGRATION_STATIONS, 50) # NSTD inputs.set_val(Aircraft.Wing.SHEAR_CONTROL_MASS_SCALER, 1.0) # FRWI2 -inputs.set_val(Aircraft.Wing.CONTROL_SURFACE_AREA_RATIO, 0.333) # FLAPR inputs.set_val(Aircraft.Wing.OUTBOARD_SEMISPAN, 86.75, 'ft') # OSSPAN inputs.set_val(Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION, False) # MIKE inputs.set_val(Aircraft.Wing.STRUT_BRACING_FACTOR, 0.0) # FSTRT @@ -286,11 +279,9 @@ inputs.set_val(Mission.Summary.FUEL_FLOW_SCALER, 1.0) # FACT inputs.set_val(Mission.Design.RANGE, 7750.0, 'NM') # DESRNG inputs.set_val(Mission.Constraints.MAX_MACH, 0.85) # VMMO -# inputs.set_val(Mission.Takeoff.FUEL_SIMPLE, 577, 'lbm') # FTKOFL inputs.set_val(Mission.Landing.LIFT_COEFFICIENT_MAX, 3.0) # CLLDM inputs.set_val(Mission.Takeoff.LIFT_COEFFICIENT_MAX, 2) # CLTOM -# inputs.set_val(Mission.Takeoff.LIFT_OVER_DRAG, 17.354) inputs.set_val(Aircraft.Design.LANDING_TO_TAKEOFF_MASS_RATIO, 0.8) # WRATIO inputs.set_val(Mission.Landing.INITIAL_VELOCITY, 140.0, 'ft/s') # VAPPR inputs.set_val(Mission.Takeoff.ROLLING_FRICTION_COEFFICIENT, 0.025) # ROLLMU diff --git a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py index 573ef907ac..1f7436a8f3 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py @@ -49,11 +49,9 @@ # --------------------------- inputs.set_val(Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS, 100) # NPB inputs.set_val(Aircraft.CrewPayload.Design.NUM_FIRST_CLASS, 28) # NPF -# inputs.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, 468, units='unitless') # NPB+NPF+NPT inputs.set_val(Aircraft.CrewPayload.Design.NUM_ECONOMY_CLASS, 340) # NPT inputs.set_val(Aircraft.CrewPayload.NUM_BUSINESS_CLASS, 100) # NPB inputs.set_val(Aircraft.CrewPayload.NUM_FIRST_CLASS, 28) # NPF -# inputs.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, 468, units='unitless') # sum of three classes inputs.set_val(Aircraft.CrewPayload.NUM_ECONOMY_CLASS, 340) # NPT inputs.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_BUSINESS, 4) # NBABR inputs.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_FIRST, 4) # NFABR @@ -109,7 +107,6 @@ inputs.set_val(Aircraft.Fuselage.MAX_WIDTH, 64.58, 'ft') # WF inputs.set_val(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, 45.0, 'deg') # SWPLE inputs.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, 0.11) # TCF -# inputs.set_val(Aircraft.Fuselage.WETTED_AREA, 0.0, 'ft**2') # see _BWBFuselage() inputs.set_val(Aircraft.Fuselage.WETTED_AREA_SCALER, 1.0) # SWETF # Horizontal Tail @@ -118,7 +115,6 @@ inputs.set_val(Aircraft.HorizontalTail.ASPECT_RATIO, 0.1) # ARHT inputs.set_val(Aircraft.HorizontalTail.TAPER_RATIO, 0.0) # TRHT inputs.set_val(Aircraft.HorizontalTail.THICKNESS_TO_CHORD, 0.11) # TCHT -# inputs.set_val(Aircraft.HorizontalTail.VERTICAL_TAIL_FRACTION, 0.0) # HHT inputs.set_val(Aircraft.HorizontalTail.MASS_SCALER, 1.0) # FRHT inputs.set_val(Aircraft.HorizontalTail.NUM_TAILS, 0) inputs.set_val(Aircraft.HorizontalTail.WETTED_AREA_SCALER, 1.0) # SWETH @@ -161,7 +157,6 @@ inputs.set_val(Aircraft.Engine.REFERENCE_MASS, 22017, 'lbm') # WENG inputs.set_val(Aircraft.Engine.SCALED_SLS_THRUST, 70000.0, 'lbf') # THRUST inputs.set_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 86459.2, 'lbf') # THRSO -# inputs.set_val(Aircraft.Engine.NUM_ENGINES, np.array([3])) # NEW+NEF inputs.set_val(Aircraft.Engine.NUM_FUSELAGE_ENGINES, 3) # NEF inputs.set_val(Aircraft.Engine.NUM_WING_ENGINES, np.array([0])) # NEW inputs.set_val(Aircraft.Engine.THRUST_REVERSERS_MASS_SCALER, 0.0) # WTHR @@ -210,7 +205,6 @@ inputs.set_val(Aircraft.Wing.MISC_MASS_SCALER, 1.0) # FRWI3 inputs.set_val(Aircraft.Wing.NUM_INTEGRATION_STATIONS, 50) # NSTD inputs.set_val(Aircraft.Wing.SHEAR_CONTROL_MASS_SCALER, 1.0) # FRWI2 -inputs.set_val(Aircraft.Wing.CONTROL_SURFACE_AREA_RATIO, 0.333) # FLAPR inputs.set_val(Aircraft.Wing.OUTBOARD_SEMISPAN, 86.75, 'ft') # OSSPAN inputs.set_val(Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION, False) # MIKE inputs.set_val(Aircraft.Wing.STRUT_BRACING_FACTOR, 0.0) # FSTRT @@ -233,7 +227,6 @@ inputs.set_val(Mission.Summary.FUEL_FLOW_SCALER, 1.0) # FACT inputs.set_val(Mission.Design.RANGE, 7750.0, 'NM') # DESRNG inputs.set_val(Mission.Constraints.MAX_MACH, 0.85) # VMMO -# inputs.set_val(Mission.Takeoff.FUEL_SIMPLE, 577, 'lbm') # FTKOFL inputs.set_val(Mission.Landing.LIFT_COEFFICIENT_MAX, 3.0) # CLLDM inputs.set_val(Mission.Takeoff.LIFT_COEFFICIENT_MAX, 2) # CLTOM From e0f5058fe552d299752508e1bdc2bace7f562e55 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 25 Feb 2026 17:42:25 -0500 Subject: [PATCH 14/67] add a docstring for test_case2() --- .../geometry/flops_based/test/test_wing_detailed_bwb.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py b/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py index e2c72228a0..1849649a2d 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py +++ b/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py @@ -136,6 +136,7 @@ def test_case1(self): # assert_check_partials(partial_data, atol=1e-9, rtol=1e-8) def test_case2(self): + """bwb300_baseline""" prob = self.prob options = self.aviary_options = AviaryValues() options.set_val(Settings.VERBOSITY, 1, units='unitless') From 46d0d9d46ac32d68f09f6a2afb382beda7824f9e Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 25 Feb 2026 17:45:40 -0500 Subject: [PATCH 15/67] set AR_Ref to AR if AR_Ref is not provided. Similarly for TC_Ref --- aviary/subsystems/mass/flops_based/wing_detailed.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/aviary/subsystems/mass/flops_based/wing_detailed.py b/aviary/subsystems/mass/flops_based/wing_detailed.py index 9d6a97a2f1..d3b84677fa 100644 --- a/aviary/subsystems/mass/flops_based/wing_detailed.py +++ b/aviary/subsystems/mass/flops_based/wing_detailed.py @@ -365,6 +365,8 @@ def compute(self, inputs, outputs): ar = inputs[Aircraft.Wing.ASPECT_RATIO] arref = inputs[Aircraft.Wing.ASPECT_RATIO_REFERENCE] + if arref[0] == 0: + arref[0] = ar[0] chord = inputs['BWB_CHORD_PER_SEMISPAN_DIST'] chord_mod = [] for x in chord: @@ -385,6 +387,8 @@ def compute(self, inputs, outputs): thickness_to_chord = inputs['BWB_THICKNESS_TO_CHORD_DIST'] tc = inputs[Aircraft.Wing.THICKNESS_TO_CHORD] tcref = inputs[Aircraft.Wing.THICKNESS_TO_CHORD_REFERENCE] + if tcref == 0.0: + tcref = tc thickness_to_chord_mod = [] for x in thickness_to_chord: thickness_to_chord_mod.append(x * tc[0] / tcref[0]) @@ -469,7 +473,9 @@ def compute(self, inputs, outputs): tc_interp = InterpND( method='slinear', points=(inp_stations_mod), x_interp=integration_stations ) - tc_int_stations = tc_interp.evaluate_spline(thickness_to_chord, compute_derivative=False) + tc_int_stations = tc_interp.evaluate_spline( + thickness_to_chord_mod, compute_derivative=False + ) if tcref > 0.0: tc_int_stations *= tc / tcref From 8a3beddf0b5102edfd2bf0defab9d5bfb9fbf7f7 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 25 Feb 2026 18:01:04 -0500 Subject: [PATCH 16/67] work in progress: add test_case2() for bwb300_baseline to investigate the different result of Aircraft.Wing.BENDING_MATERIAL_FACTOR (or BT as returned by subroutine BNDMAT) between Aviary and FLOPS. --- .../flops_based/test/test_wing_detailed.py | 88 ++++++++++++++++++- 1 file changed, 87 insertions(+), 1 deletion(-) diff --git a/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py b/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py index 3402007105..1479c925ba 100644 --- a/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py +++ b/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py @@ -603,6 +603,92 @@ def test_case1(self): # current BWB data set does not check the following assert_near_equal(pod_inertia, pod_inertia_expected, tolerance=1e-9) + def test_case2(self): + """ + bwb300_baseline + This test is to investigate the different result of Aircraft.Wing.BENDING_MATERIAL_FACTOR + (or BT as returned by subroutine BNDMAT) between this function and FLOPS. The algorithm is + not exactly the same. Note that Aircraft.Wing.NUM_INTEGRATION_STATIONS is set to 10 to make + debugging easier. + In BNDMAT(), AR is computed locally but is not passed back. So, we call it "calc_ar" in + our algorithm. + """ + prob = self.prob + + aviary_options = AviaryValues() + aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, [2], units='unitless') + aviary_options.set_val(Aircraft.Engine.NUM_WING_ENGINES, [0], units='unitless') + aviary_options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 0, units='unitless') + aviary_options.set_val( + Aircraft.Wing.INPUT_STATION_DIST, + [0.0, 0.0, 0.2075, 0.415, 0.6927, 0.928, 1.0], + units='unitless', + ) + aviary_options.set_val(Aircraft.Wing.LOAD_DISTRIBUTION_CONTROL, 2.0, units='unitless') + aviary_options.set_val(Aircraft.Wing.NUM_INTEGRATION_STATIONS, 10, units='unitless') + aviary_options.set_val(Aircraft.BWB.DETAILED_WING_PROVIDED, True, units='unitless') + + prob.model.add_subsystem( + 'bending', + BWBDetailedWingBendingFact(), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) + + prob.model.set_input_defaults(Mission.Design.GROSS_MASS, val=600000.0, units='lbm') + prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, 5.4252, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO_REFERENCE, 0.0, units='unitless') + prob.model.set_input_defaults(Aircraft.Wing.STRUT_BRACING_FACTOR, 0.0, units='unitless') + prob.model.set_input_defaults( + Aircraft.Wing.AEROELASTIC_TAILORING_FACTOR, 0.0, units='unitless' + ) + prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD, 0.11, units='unitless') + prob.model.set_input_defaults( + Aircraft.Wing.THICKNESS_TO_CHORD_REFERENCE, 0.0, units='unitless' + ) + + setup_model_options(self.prob, aviary_options) + prob.setup(check=False, force_alloc_complex=True) + + prob.set_val(Aircraft.Engine.POD_MASS, np.array([0]), units='lbm') + prob.set_val(Aircraft.Wing.SPAN, val=186.631829293424) + prob.set_val(Aircraft.Fuselage.MAX_WIDTH, 49.77182929, 'ft') + + wing_location = np.zeros(0) + wing_location = np.append(wing_location, [0.2]) + prob.set_val(Aircraft.Engine.WING_LOCATIONS, wing_location) + + prob.set_val( + 'BWB_CHORD_PER_SEMISPAN_DIST', + [116.57609631, 55.0, 33.2, 18.97, 14.19, 10.2, 2.36127568], + units='unitless', + ) + prob.set_val( + 'BWB_THICKNESS_TO_CHORD_DIST', + [0.1792, 0.1792, 0.125, 0.076, 0.076, 0.076, 0.06], + units='unitless', + ) + prob.set_val( + 'BWB_LOAD_PATH_SWEEP_DIST', + [0.0, 0.0, 0.0, 17.0, 17.0, 17.0], + units='deg', + ) + + prob.run_model() + + BENDING_MATERIAL_FACTOR = prob.get_val(Aircraft.Wing.BENDING_MATERIAL_FACTOR) + pod_inertia = prob.get_val(Aircraft.Wing.ENG_POD_INERTIA_FACTOR) + + BENDING_MATERIAL_FACTOR_expected = 4.53053124 # Real FLOPS BT = 5.998060404 + pod_inertia_expected = 1.0 + assert_near_equal(BENDING_MATERIAL_FACTOR, BENDING_MATERIAL_FACTOR_expected, tolerance=1e-9) + assert_near_equal(prob.get_val('calculated_wing_area'), 4151.88659141, tolerance=1e-9) + # current BWB data set does not check the following + assert_near_equal(pod_inertia, pod_inertia_expected, tolerance=1e-9) + if __name__ == '__main__': - unittest.main() + # unittest.main() + test = BWBDetailedWingBendingTest() + test.setUp() + test.test_case2() From 1f76edac989e0da46fb9060f80e0ee1680b2efea Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 25 Feb 2026 18:03:05 -0500 Subject: [PATCH 17/67] work on bwb300_baseline model --- .../test/test_flops_based_premission.py | 276 ++++-------------- 1 file changed, 64 insertions(+), 212 deletions(-) diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index 6d57f0165e..d95b87c596 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -275,8 +275,6 @@ def test_case_all_subsystems(self, case_name): # BWBWingPrelim Aircraft.Wing.AREA, Aircraft.Wing.ASPECT_RATIO, - Aircraft.Wing.ASPECT_RATIO_REFERENCE, - Aircraft.Wing.LOAD_FRACTION, # _BWBWing Aircraft.Wing.WETTED_AREA, # _Tail @@ -314,7 +312,7 @@ def test_case_all_subsystems(self, case_name): Aircraft.CrewPayload.CARGO_MASS, Aircraft.CrewPayload.TOTAL_PAYLOAD_MASS, # TransportCargoContainersMass - Aircraft.CrewPayload.CARGO_CONTAINER_MASS, + # Aircraft.CrewPayload.CARGO_CONTAINER_MASS, # TransportEngineCtrlsMass Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS, # TransportAvionicsMass @@ -1275,7 +1273,9 @@ def test_case_geom(self): # BWBWingPrelim assert_near_equal(prob[Aircraft.Wing.AREA], 8421.7146805052689, tol) assert_near_equal(prob[Aircraft.Wing.ASPECT_RATIO], 4.84361005, tol) - # assert_near_equal(prob[Aircraft.Wing.ASPECT_RATIO_REFERENCE], 5.42525, tol) + assert_near_equal( + prob['AIRCRAFT_DATA_OVERRIDE:aircraft:wing:aspect_ratio_reference'], 4.84361005, tol + ) # assert_near_equal(prob[Aircraft.Wing.LOAD_FRACTION], 0.46761341784858923, tol) # _BWBWing assert_near_equal(prob[Aircraft.Wing.WETTED_AREA], 17302.04910213, tol) @@ -1286,26 +1286,26 @@ def test_case_geom(self): assert_near_equal(prob[Aircraft.Fuselage.DIAMETER_TO_WING_SPAN], 0.18930926, tol) assert_near_equal(prob[Aircraft.Fuselage.LENGTH_TO_DIAMETER], 3.29952897, tol) # Nacelles - assert_near_equal(prob[Aircraft.Nacelle.WETTED_AREA], 498.26822066, tol) - assert_near_equal(prob[Aircraft.Nacelle.TOTAL_WETTED_AREA], 3 * 498.26822066, tol) + assert_near_equal(prob[Aircraft.Nacelle.WETTED_AREA], 613.74211034217353, tol) + assert_near_equal(prob[Aircraft.Nacelle.TOTAL_WETTED_AREA], 2 * 613.7421103421735, tol) # Canard assert_near_equal(prob[Aircraft.Canard.WETTED_AREA], 0.0, tol) # BWBWingCharacteristicLength - assert_near_equal(prob[Aircraft.Wing.CHARACTERISTIC_LENGTH], 47.72916456, tol) + assert_near_equal(prob[Aircraft.Wing.CHARACTERISTIC_LENGTH], 45.124750222881779, tol) assert_near_equal(prob[Aircraft.Wing.FINENESS], 0.11, tol) # OtherCharacteristicLengths assert_near_equal(prob[Aircraft.Canard.CHARACTERISTIC_LENGTH], 0.0, tol) assert_near_equal(prob[Aircraft.Canard.FINENESS], 0.0, tol) - assert_near_equal(prob[Aircraft.Fuselage.CHARACTERISTIC_LENGTH], 112.3001936860821, tol) - assert_near_equal(prob[Aircraft.Fuselage.FINENESS], 2.4261771932742167, tol) - assert_near_equal(prob[Aircraft.HorizontalTail.CHARACTERISTIC_LENGTH], 0.0, tol) - assert_near_equal(prob[Aircraft.HorizontalTail.FINENESS], 0.11, tol) - assert_near_equal(prob[Aircraft.Nacelle.CHARACTERISTIC_LENGTH], [15.68611614], tol) - assert_near_equal(prob[Aircraft.Nacelle.FINENESS], [1.38269353], tol) + assert_near_equal(prob[Aircraft.Fuselage.CHARACTERISTIC_LENGTH], 116.5760963133181, tol) + assert_near_equal(prob[Aircraft.Fuselage.FINENESS], 3.2995289656062941, tol) + assert_near_equal(prob[Aircraft.HorizontalTail.CHARACTERISTIC_LENGTH], 26.45751311065, tol) + assert_near_equal(prob[Aircraft.HorizontalTail.FINENESS], 0.1, tol) + assert_near_equal(prob[Aircraft.Nacelle.CHARACTERISTIC_LENGTH], [17.367966592444596], tol) + assert_near_equal(prob[Aircraft.Nacelle.FINENESS], [1.3761635770546583], tol) # TotalWettedArea - assert_near_equal(prob[Aircraft.Design.TOTAL_WETTED_AREA], 26208.46595187, tol) + assert_near_equal(prob[Aircraft.Design.TOTAL_WETTED_AREA], 19637.79833526, tol) - def ttttest_case_geom_mass(self): + def test_case_geom_mass(self): """ premission: geometry + mass """ @@ -1325,57 +1325,55 @@ def ttttest_case_geom_mass(self): prob.setup(check=False) set_aviary_initial_values(prob, self.flops_inputs) - prob.set_val(Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, val=70000.0 * 3, units='lbf') + prob.set_val(Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, val=87500.0 * 2, units='lbf') prob.run_model() tol = 1e-4 # Mass # CargoMass - assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_MASS_TOTAL], 77220.0, tol) - assert_near_equal(prob[Aircraft.CrewPayload.BAGGAGE_MASS], 20592.0, tol) - assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS], 97812.0, tol) + assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_MASS_TOTAL], 49500.0, tol) + assert_near_equal(prob[Aircraft.CrewPayload.BAGGAGE_MASS], 13200.0, tol) + assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS], 62700.0, tol) assert_near_equal(prob[Aircraft.CrewPayload.CARGO_MASS], 0.0, tol) - assert_near_equal(prob[Aircraft.CrewPayload.TOTAL_PAYLOAD_MASS], 97812.0, tol) + assert_near_equal(prob[Aircraft.CrewPayload.TOTAL_PAYLOAD_MASS], 62700.0, tol) # TransportCargoContainersMass - assert_near_equal(prob[Aircraft.CrewPayload.CARGO_CONTAINER_MASS], 3850.0, tol) + assert_near_equal(prob[Aircraft.CrewPayload.CARGO_CONTAINER_MASS], 23500.0, tol) # TransportEngineCtrlsMass - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS], 206.36860226, tol) + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS], 153.81807436, tol) # TransportAvionicsMass - assert_near_equal(prob[Aircraft.Avionics.MASS], 2778.5110590964073, tol) + assert_near_equal(prob[Aircraft.Avionics.MASS], 2280.13561342, tol) # FuelCapacityGroup - assert_near_equal(prob[Aircraft.Fuel.WING_FUEL_CAPACITY], 1197720.2419621395, tol) - assert_near_equal(prob[Aircraft.Fuel.TOTAL_CAPACITY], 1197720.2419621395, tol) + assert_near_equal(prob[Aircraft.Fuel.WING_FUEL_CAPACITY], 787493.65267018, tol) + assert_near_equal(prob[Aircraft.Fuel.TOTAL_CAPACITY], 787493.65267018, tol) # EngineMass - assert_near_equal(prob[Aircraft.Engine.MASS], 17825.63336233, tol) + assert_near_equal(prob[Aircraft.Engine.MASS], 44541.857940875525 / 2, tol) assert_near_equal(prob[Aircraft.Engine.ADDITIONAL_MASS], 0.0, tol) - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 53476.90008698, tol) + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 44541.857940875525, tol) # TransportFuelSystemMass - assert_near_equal(prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 5444.9572934402777, tol) + assert_near_equal(prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 3656.7260445688612, tol) # TransportAirCondMass - assert_near_equal(prob[Aircraft.AirConditioning.MASS], 3897.6527857555625, tol) + assert_near_equal(prob[Aircraft.AirConditioning.MASS], 3781.61256774, tol) # TransportEngineOilMass - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_OIL_MASS], 346.93557352, tol) + assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_OIL_MASS], 267.39241429019251, tol) # BWBFurnishingsGroupMass - assert_near_equal(prob[Aircraft.Furnishings.MASS], 57747.97136452, tol) + assert_near_equal(prob[Aircraft.Furnishings.MASS], 52096.553437128503, tol) # TransportHydraulicsGroupMass - assert_near_equal(prob[Aircraft.Hydraulics.MASS], 6200.37391189, tol) + assert_near_equal(prob[Aircraft.Hydraulics.MASS], 3962.6923427813854, tol) # PassengerServiceMass - assert_near_equal( - prob[Aircraft.CrewPayload.PASSENGER_SERVICE_MASS], 10806.675950702213, tol - ) + assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_SERVICE_MASS], 7029.593528180887, tol) # ElectricalMass - assert_near_equal(prob[Aircraft.Electrical.MASS], 4291.4778106479534, tol) + assert_near_equal(prob[Aircraft.Electrical.MASS], 2646.52723481, tol) # AntiIcingMass - assert_near_equal(prob[Aircraft.AntiIcing.MASS], 562.09100951165135, tol) + assert_near_equal(prob[Aircraft.AntiIcing.MASS], 400.3921819029477, tol) # TransportAPUMass - assert_near_equal(prob[Aircraft.APU.MASS], 2125.8280135763703, tol) + assert_near_equal(prob[Aircraft.APU.MASS], 1578.8098560285962, tol) # NonFlightCrewMass - assert_near_equal(prob[Aircraft.CrewPayload.CABIN_CREW_MASS], 3810.0, tol) + assert_near_equal(prob[Aircraft.CrewPayload.CABIN_CREW_MASS], 1640.0, tol) # FlightCrewMass assert_near_equal(prob[Aircraft.CrewPayload.FLIGHT_CREW_MASS], 450.0, tol) # TransportInstrumentMass - assert_near_equal(prob[Aircraft.Instruments.MASS], 1309.88942193, tol) + assert_near_equal(prob[Aircraft.Instruments.MASS], 961.543462363, tol) # EngineMiscMass assert_near_equal(prob[Aircraft.Propulsion.TOTAL_MISC_MASS], 0.0, tol) # NacelleMass @@ -1386,50 +1384,50 @@ def ttttest_case_geom_mass(self): assert_near_equal(prob[Aircraft.Engine.THRUST_REVERSERS_MASS], 0.0, tol) assert_near_equal(prob[Aircraft.Propulsion.TOTAL_THRUST_REVERSERS_MASS], 0.0, tol) # LandingMassGroup - assert_near_equal(prob[Aircraft.Design.TOUCHDOWN_MASS], 699279.2, tol) + assert_near_equal(prob[Aircraft.Design.TOUCHDOWN_MASS], 420000.0, tol) # SurfaceControlMass - assert_near_equal(prob[Aircraft.Wing.SURFACE_CONTROL_MASS], 11731.15573539, tol) - assert_near_equal(prob[Aircraft.Wing.CONTROL_SURFACE_AREA], 4032.5967, tol) + assert_near_equal(prob[Aircraft.Wing.SURFACE_CONTROL_MASS], 8093.1997108029764, tol) + assert_near_equal(prob[Aircraft.Wing.CONTROL_SURFACE_AREA], 2526.5144041515805, tol) # BWBFuselageMass - assert_near_equal(prob[Aircraft.Fuselage.MASS], 137935.30594648936, tol) + assert_near_equal(prob[Aircraft.Fuselage.MASS], 80216.313556241628, tol) # HorizontalTailMass - assert_near_equal(prob[Aircraft.HorizontalTail.MASS], 0.0, tol) + assert_near_equal(prob[Aircraft.HorizontalTail.MASS], 6444.9988831532046, tol) # VerticalTailMass assert_near_equal(prob[Aircraft.VerticalTail.MASS], 0.0, tol) # CanardMass assert_near_equal(prob[Aircraft.Canard.MASS], 0.0, tol) # FinMass - assert_near_equal(prob[Aircraft.Fins.MASS], 3159.3781042368792, tol) + assert_near_equal(prob[Aircraft.Fins.MASS], 2822.1415450307886, tol) # WingMassGroup - # BWBDetailedWingBendingFact - assert_near_equal(prob[Aircraft.Wing.BENDING_MATERIAL_FACTOR], 3.93743732, tol) + # BWBDetailedWingBendingFact, In FLOPS run, 6.7996347825592336 + assert_near_equal(prob[Aircraft.Wing.BENDING_MATERIAL_FACTOR], 5.20084141, tol) assert_near_equal(prob[Aircraft.Wing.ENG_POD_INERTIA_FACTOR], 1.0, tol) # BWBWingMiscMass - assert_near_equal(prob[Aircraft.Wing.MISC_MASS], 9720.4199027685518, tol) + assert_near_equal(prob[Aircraft.Wing.MISC_MASS], 6975.77622754, tol) # WingShearControlMass - assert_near_equal(prob[Aircraft.Wing.SHEAR_CONTROL_MASS], 34867.592407371565, tol) + assert_near_equal(prob[Aircraft.Wing.SHEAR_CONTROL_MASS], 24461.161868706797, tol) # WingBendingMass - assert_near_equal(prob[Aircraft.Wing.BENDING_MATERIAL_MASS], 8782.85692049, tol) + assert_near_equal(prob[Aircraft.Wing.BENDING_MATERIAL_MASS], 13872.4182868, tol) # BWBAftBodyMass - assert_near_equal(prob[Aircraft.Fuselage.AFTBODY_MASS], 18736.55008878, tol) - assert_near_equal(prob[Aircraft.Wing.BWB_AFTBODY_MASS], 15551.33657368, tol) + assert_near_equal(prob[Aircraft.Fuselage.AFTBODY_MASS], 10384.964957095559, tol) + assert_near_equal(prob[Aircraft.Wing.BWB_AFTBODY_MASS], 8884.3375208, tol) # MassSummation - # StructureMass - assert_near_equal(prob[Aircraft.Design.STRUCTURE_MASS], 240915.88664709, tol) + # StructureMass 158921.83401643133 + assert_near_equal(prob[Aircraft.Design.STRUCTURE_MASS], 162969.90469722, tol) # PropulsionMass - assert_near_equal(prob[Aircraft.Propulsion.MASS], 58921.857380417721, tol) + assert_near_equal(prob[Aircraft.Propulsion.MASS], 48198.583985444384, tol) # SystemsEquipMass - assert_near_equal(prob[Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS], 90644.95111232, tol) + assert_near_equal(prob[Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS], 75801.466406974854, tol) # EmptyMass - assert_near_equal(prob[Aircraft.Design.EMPTY_MASS], 390482.6804821, tol) + assert_near_equal(prob[Aircraft.Design.EMPTY_MASS], 286969.99768419, tol) # OperatingMass - assert_near_equal(prob[Mission.Summary.OPERATING_MASS], 411479.0724484, tol) + assert_near_equal(prob[Mission.Summary.OPERATING_MASS], 321171.82272983, tol) # ZeroFuelMass - assert_near_equal(prob[Mission.Summary.ZERO_FUEL_MASS], 509291.0724484, tol) + assert_near_equal(prob[Mission.Summary.ZERO_FUEL_MASS], 383871.82272983, tol) # FuelMass - assert_near_equal(prob[Mission.Summary.FUEL_MASS], 364807.9275516, tol) + assert_near_equal(prob[Mission.Summary.FUEL_MASS], 216128.17727017, tol) - def ttttest_case_all_subsystems(self): + def test_case_all_subsystems(self): """ premission: propulsion + geometry + aerodynamics + mass Note: not checking propulsion and aerodynamics @@ -1456,158 +1454,12 @@ def ttttest_case_all_subsystems(self): prob.run_model() tol = 1e-4 - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST], 70000.0 * 3, tol) - # Geometry - # BWBSimpleCabinLayout - assert_near_equal(prob[Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH], 78.61013558, tol) - assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 38.5, tol) - assert_near_equal(prob[Aircraft.Fuselage.CABIN_AREA], 4697.33181006, tol) - assert_near_equal(prob[Aircraft.Fuselage.MAX_HEIGHT], 12.35302131, tol) - assert_near_equal(prob[Aircraft.BWB.NUM_BAYS], 7.0, tol) - # BWBFuselagePrelim - assert_near_equal(prob[Aircraft.Fuselage.REF_DIAMETER], 46.2868886894979, tol) - assert_near_equal(prob[Aircraft.Fuselage.PLANFORM_AREA], 6710.4740143724875, tol) - # BWBWingPrelim - assert_near_equal(prob[Aircraft.Wing.AREA], 12109.879719468739, tol) - assert_near_equal(prob[Aircraft.Wing.ASPECT_RATIO], 5.36951675, tol) - assert_near_equal(prob[Aircraft.Wing.ASPECT_RATIO_REFERENCE], 5.36951675, tol) - assert_near_equal(prob[Aircraft.Wing.LOAD_FRACTION], 0.46761341784858923, tol) - # _BWBWing - assert_near_equal(prob[Aircraft.Wing.WETTED_AREA], 24713.66129084, tol) - # _Tail - assert_near_equal(prob[Aircraft.HorizontalTail.WETTED_AREA], 0.0, tol) - assert_near_equal(prob[Aircraft.VerticalTail.WETTED_AREA], 0.0, tol) - # _FuselageRatios - assert_near_equal(prob[Aircraft.Fuselage.DIAMETER_TO_WING_SPAN], 0.18243240878599712, tol) - assert_near_equal(prob[Aircraft.Fuselage.LENGTH_TO_DIAMETER], 2.4261771932742167, tol) - # Nacelles - assert_near_equal(prob[Aircraft.Nacelle.WETTED_AREA], 498.26822066, tol) - assert_near_equal(prob[Aircraft.Nacelle.TOTAL_WETTED_AREA], 3 * 498.26822066, tol) - # Canard - assert_near_equal(prob[Aircraft.Canard.WETTED_AREA], 0.0, tol) - # BWBWingCharacteristicLength - assert_near_equal(prob[Aircraft.Wing.CHARACTERISTIC_LENGTH], 47.72916456, tol) - assert_near_equal(prob[Aircraft.Wing.FINENESS], 0.11, tol) - # OtherCharacteristicLengths - assert_near_equal(prob[Aircraft.Canard.CHARACTERISTIC_LENGTH], 0.0, tol) - assert_near_equal(prob[Aircraft.Canard.FINENESS], 0.0, tol) - assert_near_equal(prob[Aircraft.Fuselage.CHARACTERISTIC_LENGTH], 112.3001936860821, tol) - assert_near_equal(prob[Aircraft.Fuselage.FINENESS], 2.4261771932742167, tol) - assert_near_equal(prob[Aircraft.HorizontalTail.CHARACTERISTIC_LENGTH], 0.0, tol) - assert_near_equal(prob[Aircraft.HorizontalTail.FINENESS], 0.11, tol) - assert_near_equal(prob[Aircraft.Nacelle.CHARACTERISTIC_LENGTH], [15.68611614], tol) - assert_near_equal(prob[Aircraft.Nacelle.FINENESS], [1.38269353], tol) - assert_near_equal(prob[Aircraft.VerticalTail.CHARACTERISTIC_LENGTH], 0.0, tol) - assert_near_equal(prob[Aircraft.VerticalTail.FINENESS], 0.11, tol) - # TotalWettedArea - assert_near_equal(prob[Aircraft.Design.TOTAL_WETTED_AREA], 26208.46595187, tol) - # Mass - # CargoMass - assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_MASS_TOTAL], 77220.0, tol) - assert_near_equal(prob[Aircraft.CrewPayload.BAGGAGE_MASS], 20592.0, tol) - assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS], 97812.0, tol) - assert_near_equal(prob[Aircraft.CrewPayload.CARGO_MASS], 0.0, tol) - assert_near_equal(prob[Aircraft.CrewPayload.TOTAL_PAYLOAD_MASS], 97812.0, tol) - # TransportCargoContainersMass - assert_near_equal(prob[Aircraft.CrewPayload.CARGO_CONTAINER_MASS], 3850.0, tol) - # TransportEngineCtrlsMass - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS], 206.36860226, tol) - # TransportAvionicsMass - assert_near_equal(prob[Aircraft.Avionics.MASS], 2778.5110590964073, tol) - # FuelCapacityGroup - assert_near_equal(prob[Aircraft.Fuel.WING_FUEL_CAPACITY], 1197720.2419621395, tol) - assert_near_equal(prob[Aircraft.Fuel.TOTAL_CAPACITY], 1197720.2419621395, tol) - # EngineMass - assert_near_equal(prob[Aircraft.Engine.MASS], 17825.63336233, tol) - assert_near_equal(prob[Aircraft.Engine.ADDITIONAL_MASS], 0.0, tol) - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 53476.90008698, tol) - # TransportFuelSystemMass - assert_near_equal(prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 5444.9572934402777, tol) - # TransportAirCondMass - assert_near_equal(prob[Aircraft.AirConditioning.MASS], 3897.6527857555625, tol) - # TransportEngineOilMass - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_OIL_MASS], 346.93557352, tol) - # BWBFurnishingsGroupMass - assert_near_equal(prob[Aircraft.Furnishings.MASS], 57747.97136452, tol) - # TransportHydraulicsGroupMass - assert_near_equal(prob[Aircraft.Hydraulics.MASS], 6200.37391189, tol) - # PassengerServiceMass + # Design + assert_near_equal(prob['AIRCRAFT_DATA_OVERRIDE:mission:design:mach'], 0.89939238, tol) assert_near_equal( - prob[Aircraft.CrewPayload.PASSENGER_SERVICE_MASS], 10806.675950702213, tol + prob['AIRCRAFT_DATA_OVERRIDE:mission:design:lift_coefficient'], 0.40810915, tol ) - # ElectricalMass - assert_near_equal(prob[Aircraft.Electrical.MASS], 4291.4778106479534, tol) - # AntiIcingMass - assert_near_equal(prob[Aircraft.AntiIcing.MASS], 562.09100951165135, tol) - # TransportAPUMass - assert_near_equal(prob[Aircraft.APU.MASS], 2125.8280135763703, tol) - # NonFlightCrewMass - assert_near_equal(prob[Aircraft.CrewPayload.CABIN_CREW_MASS], 3810.0, tol) - # FlightCrewMass - assert_near_equal(prob[Aircraft.CrewPayload.FLIGHT_CREW_MASS], 450.0, tol) - # TransportInstrumentMass - assert_near_equal(prob[Aircraft.Instruments.MASS], 1309.88942193, tol) - # EngineMiscMass - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_MISC_MASS], 0.0, tol) - # NacelleMass - assert_near_equal(prob[Aircraft.Nacelle.MASS], 0.0, tol) - # PaintMass - assert_near_equal(prob[Aircraft.Paint.MASS], 0.0, tol) - # ThrustReverserMass - assert_near_equal(prob[Aircraft.Engine.THRUST_REVERSERS_MASS], 0.0, tol) - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_THRUST_REVERSERS_MASS], 0.0, tol) - # LandingMassGroup - assert_near_equal(prob[Aircraft.Design.TOUCHDOWN_MASS], 699279.2, tol) - # SurfaceControlMass - assert_near_equal(prob[Aircraft.Wing.SURFACE_CONTROL_MASS], 11731.15573539, tol) - assert_near_equal(prob[Aircraft.Wing.CONTROL_SURFACE_AREA], 4032.5967, tol) - # BWBFuselageMass - assert_near_equal(prob[Aircraft.Fuselage.MASS], 137935.30594648936, tol) - # HorizontalTailMass - assert_near_equal(prob[Aircraft.HorizontalTail.MASS], 0.0, tol) - # VerticalTailMass - assert_near_equal(prob[Aircraft.VerticalTail.MASS], 0.0, tol) - # CanardMass - assert_near_equal(prob[Aircraft.Canard.MASS], 0.0, tol) - # FinMass - assert_near_equal(prob[Aircraft.Fins.MASS], 3159.3781042368792, tol) - # WingMassGroup - # BWBDetailedWingBendingFact - assert_near_equal(prob[Aircraft.Wing.BENDING_MATERIAL_FACTOR], 3.93743732, tol) - assert_near_equal(prob[Aircraft.Wing.ENG_POD_INERTIA_FACTOR], 1.0, tol) - # BWBWingMiscMass - assert_near_equal(prob[Aircraft.Wing.MISC_MASS], 9720.4199027685518, tol) - # WingShearControlMass - assert_near_equal(prob[Aircraft.Wing.SHEAR_CONTROL_MASS], 34867.592407371565, tol) - # WingBendingMass - assert_near_equal(prob[Aircraft.Wing.BENDING_MATERIAL_MASS], 8782.85692049, tol) - # BWBAftBodyMass - assert_near_equal(prob[Aircraft.Fuselage.AFTBODY_MASS], 18736.55008878, tol) - assert_near_equal(prob[Aircraft.Wing.BWB_AFTBODY_MASS], 15551.33657368, tol) - # MassSummation - # StructureMass - assert_near_equal(prob[Aircraft.Design.STRUCTURE_MASS], 240915.88664709, tol) - # PropulsionMass - assert_near_equal(prob[Aircraft.Propulsion.MASS], 58921.857380417721, tol) - # SystemsEquipMass - assert_near_equal(prob[Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS], 90644.95111232, tol) - # EmptyMass - assert_near_equal(prob[Aircraft.Design.EMPTY_MASS], 390482.6804821, tol) - # OperatingMass - assert_near_equal(prob[Mission.Summary.OPERATING_MASS], 411479.0724484, tol) - # ZeroFuelMass - assert_near_equal(prob[Mission.Summary.ZERO_FUEL_MASS], 509291.0724484, tol) - # FuelMass - assert_near_equal(prob[Mission.Summary.FUEL_MASS], 364807.9275516, tol) - # TODO: test some aero variables if __name__ == '__main__': - # unittest.main() - import numpy as np - - np.seterr(invalid='raise') - test = BWB300PreMissionGroupCSVTest() - # test = BWBPreMissionGroupCSVTest2() - test.setUp() - test.test_case_geom() + unittest.main() From b3f71d732ce254151df2ec0bc45a65db27262e98 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 25 Feb 2026 20:35:18 -0500 Subject: [PATCH 18/67] add note --- aviary/subsystems/mass/flops_based/test/test_wing_detailed.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py b/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py index 1479c925ba..8dc3932a9a 100644 --- a/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py +++ b/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py @@ -612,6 +612,10 @@ def test_case2(self): debugging easier. In BNDMAT(), AR is computed locally but is not passed back. So, we call it "calc_ar" in our algorithm. + In FLOPS, given CHD = [48.25, 33.20, 18.97, 14.19, 10.20, 3.220] as bwb300_baseline, + subroutin DEFINE() will update it to CHD = [116.576, 55, 33.2, 18.97, 14.19, 10.2, 2.361] + Then in subroutin WWGHT(), right before calling BNDMAT(), it updates CHD to + C = [1.249, 0.589, 0.356, 0.203, 0.152, 0.109, 2.361] which is used in BNDMAT(). Is it right? """ prob = self.prob From ded515a2d3e930cfe3bf1bc363b48e2b56b33ccf Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 4 Mar 2026 11:34:59 -0500 Subject: [PATCH 19/67] add bwb300 baseline model --- .../bwb300_baseline_FLOPS.csv | 667 +++++++++ .../bwb300_baseline_FLOPS.inp | 1199 +++++++++++++++++ .../bwb300_baseline_FLOPS_data.py | 438 ++++++ 3 files changed, 2304 insertions(+) create mode 100644 aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv create mode 100644 aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.inp create mode 100644 aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py diff --git a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv new file mode 100644 index 0000000000..fc82c8dc85 --- /dev/null +++ b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv @@ -0,0 +1,667 @@ +# created 02/11/26 +# FLOPS-derived aircraft input deck converted from bwb300_baseline_FLOPS.inp + +# Input Values +aircraft:air_conditioning:mass_scaler,1.0,unitless +aircraft:anti_icing:mass_scaler,1.0,unitless +aircraft:apu:mass_scaler,1.0,unitless +aircraft:avionics:mass_scaler,1.0,unitless +aircraft:blended_wing_body_design:detailed_wing_provided,True,unitless +aircraft:blended_wing_body_design:passenger_leading_edge_sweep,60.0,deg +aircraft:canard:area,0.0,ft**2 +aircraft:canard:aspect_ratio,0.0,unitless +aircraft:canard:laminar_flow_lower,0.0,unitless +aircraft:canard:laminar_flow_upper,0.0,unitless +aircraft:canard:mass_scaler,1.0,unitless +aircraft:canard:taper_ratio,0.0,unitless +aircraft:canard:thickness_to_chord,0.0,unitless +aircraft:canard:wetted_area_scaler,1.0,unitless +aircraft:crew_and_payload:baggage_mass_per_passenger,44.0,lbm +aircraft:crew_and_payload:cabin_crew_mass_scaler,1.0,unitless +aircraft:crew_and_payload:cargo_container_mass_scaler,1.0,unitless +aircraft:crew_and_payload:cargo_container_mass,23500.0,lbm +aircraft:crew_and_payload:design:num_business_class,76,unitless +aircraft:crew_and_payload:design:num_economy_class,200,unitless +aircraft:crew_and_payload:design:num_first_class,24,unitless +aircraft:crew_and_payload:design:num_seats_abreast_business,0,unitless +aircraft:crew_and_payload:design:num_seats_abreast_economy,0,unitless +aircraft:crew_and_payload:design:num_seats_abreast_first,0,unitless +aircraft:crew_and_payload:design:seat_pitch_business,0,inch +aircraft:crew_and_payload:design:seat_pitch_economy,0,inch +aircraft:crew_and_payload:design:seat_pitch_first,0,inch +aircraft:crew_and_payload:flight_crew_mass_scaler,1.0,unitless +aircraft:crew_and_payload:mass_per_passenger,165.0,lbm +aircraft:crew_and_payload:misc_cargo,0.0,lbm +aircraft:crew_and_payload:num_business_class,76,unitless +aircraft:crew_and_payload:num_economy_class,200,unitless +aircraft:crew_and_payload:num_first_class,24,unitless +aircraft:crew_and_payload:num_flight_attendants,-1,unitless +aircraft:crew_and_payload:num_flight_crew,2,unitless +aircraft:crew_and_payload:num_galley_crew,-1,unitless +aircraft:crew_and_payload:passenger_service_mass_scaler,1.0,unitless +aircraft:crew_and_payload:wing_cargo,0.0,lbm +aircraft:design:base_area,0.0,ft**2 +aircraft:design:empty_mass_margin_scaler,0.0,unitless +aircraft:design:landing_to_takeoff_mass_ratio,0.7,unitless +aircraft:design:lift_dependent_drag_coeff_factor,1.0,unitless +aircraft:design:subsonic_drag_coeff_factor,1.0,unitless +aircraft:design:supersonic_drag_coeff_factor,1.0,unitless +aircraft:design:type,BWB,unitless +aircraft:design:use_alt_mass,False,unitless +aircraft:design:zero_lift_drag_coeff_factor,1.0,unitless +aircraft:electrical:mass_scaler,1.0,unitless +aircraft:engine:additional_mass_fraction,0.0,unitless +aircraft:engine:constant_fuel_consumption,0.0,lbm/h +aircraft:engine:data_file,'models/engines/PAX300_baseline_ENGDEK.csv,unitless +aircraft:engine:flight_idle_max_fraction,1.0,unitless +aircraft:engine:flight_idle_min_fraction,0.08,unitless +aircraft:engine:flight_idle_thrust_fraction,0.0,unitless +aircraft:engine:fuel_flow_scaler_constant_term,0.0,unitless +aircraft:engine:fuel_flow_scaler_linear_term,0.0,unitless +aircraft:engine:generate_flight_idle,True,unitless +aircraft:engine:geopotential_alt,False,unitless +aircraft:engine:ignore_negative_thrust,False,unitless +aircraft:engine:interpolation_method,slinear,unitless +aircraft:engine:mass_scaler,1.0,unitless +aircraft:engine:num_fuselage_engines,2,unitless +aircraft:engine:num_wing_engines,0,unitless +aircraft:engine:reference_mass,22089.3,lbm +aircraft:engine:reference_sls_thrust,86786.4,lbf +aircraft:engine:scale_factor,1.0082224864725349,unitless +aircraft:engine:scale_mass,True,unitless +aircraft:engine:scale_performance,True,unitless +aircraft:engine:scaled_sls_thrust,87500.0,lbf +aircraft:engine:subsonic_fuel_flow_scaler,1.0,unitless +aircraft:engine:supersonic_fuel_flow_scaler,1.0,unitless +aircraft:engine:thrust_reversers_mass_scaler,0.0,unitless +aircraft:engine:wing_locations,0.2,unitless +aircraft:fins:area,184.89,ft**2 +aircraft:fins:mass_scaler,1.0,unitless +aircraft:fins:num_fins,2,unitless +aircraft:fins:taper_ratio,0.464,unitless +aircraft:fuel:auxiliary_fuel_capacity,0.0,lbm +aircraft:fuel:fuel_system_mass_scaler,1.0,unitless +aircraft:fuel:fuselage_fuel_capacity,0.0,lbm +aircraft:fuel:ignore_fuel_capacity_constraint,False,unitless +aircraft:fuel:num_tanks,7,unitless +aircraft:fuel:unusable_fuel_mass_scaler,1.0,unitless +aircraft:fuel:wing_fuel_fraction,0.6883549569366508,unitless +aircraft:fuel:wing_ref_capacity,0.0,lbm +aircraft:fuel:wing_ref_capacity_area,-1.0,unitless +aircraft:fuel:wing_ref_capacity_term_a,0.0,unitless +aircraft:fuel:wing_ref_capacity_term_b,0.0,unitless +aircraft:furnishings:mass_scaler,1.118,unitless +aircraft:fuselage:height_to_width_ratio,0.1792,unitless +aircraft:fuselage:laminar_flow_lower,0.0,unitless +aircraft:fuselage:laminar_flow_upper,0.0,unitless +aircraft:fuselage:mass_scaler,1.0,unitless +# aircraft:fuselage:max_height,14.16,ft +# aircraft:fuselage:max_width,50.0,ft +aircraft:fuselage:military_cargo_floor,False,unitless +aircraft:fuselage:num_fuselages,1,unitless +aircraft:fuselage:simple_layout,False,unitless +aircraft:fuselage:wetted_area_scaler,1.0,unitless +aircraft:horizontal_tail:area,700.0,ft**2 +aircraft:horizontal_tail:aspect_ratio,1.0,unitless +aircraft:horizontal_tail:laminar_flow_lower,0.0,unitless +aircraft:horizontal_tail:laminar_flow_upper,0.0,unitless +aircraft:horizontal_tail:mass_scaler,1.0,unitless +aircraft:horizontal_tail:num_tails,1,unitless +aircraft:horizontal_tail:sweep,0.0,deg +aircraft:horizontal_tail:taper_ratio,0.714,unitless +aircraft:horizontal_tail:thickness_to_chord,0.1,unitless +aircraft:horizontal_tail:vertical_tail_fraction,-100.0,unitless +aircraft:horizontal_tail:wetted_area_scaler,1.0,unitless +aircraft:hydraulics:mass_scaler,1.0,unitless +aircraft:hydraulics:system_pressure,3000.0,psi +aircraft:instruments:mass_scaler,1.0,unitless +aircraft:landing_gear:drag_coefficient,0.005,unitless +aircraft:landing_gear:main_gear_mass_scaler,1.0,unitless +aircraft:landing_gear:main_gear_oleo_length,85.0,inch +aircraft:landing_gear:nose_gear_mass_scaler,1.0,unitless +aircraft:landing_gear:nose_gear_oleo_length,87.0,inch +aircraft:nacelle:avg_diameter,12.569,ft +aircraft:nacelle:avg_length,17.297,ft +aircraft:nacelle:laminar_flow_lower,0.0,unitless +aircraft:nacelle:laminar_flow_upper,0.0,unitless +aircraft:nacelle:mass_scaler,0.0,unitless +aircraft:nacelle:wetted_area_scaler,1.0,unitless +aircraft:paint:mass_per_unit_area,0.0,lbm/ft**2 +aircraft:propulsion:engine_oil_mass_scaler,1.0,unitless +aircraft:propulsion:misc_mass_scaler,0.0,unitless +aircraft:vertical_tail:area,0.0,ft**2 +aircraft:vertical_tail:aspect_ratio,0.5,unitless +aircraft:vertical_tail:laminar_flow_lower,0.0,unitless +aircraft:vertical_tail:laminar_flow_upper,0.0,unitless +aircraft:vertical_tail:mass_scaler,1.0,unitless +aircraft:vertical_tail:num_tails,0,unitless +aircraft:vertical_tail:sweep,0.0,deg +aircraft:vertical_tail:taper_ratio,0.714,unitless +aircraft:vertical_tail:thickness_to_chord,0.11,unitless +aircraft:vertical_tail:wetted_area,125.0,ft**2 +aircraft:vertical_tail:wetted_area_scaler,1.0,unitless +aircraft:wing:aeroelastic_tailoring_factor,0.0,unitless +aircraft:wing:airfoil_technology,2.0,unitless +# aircraft:wing:aspect_ratio,5.4252,unitless +aircraft:wing:aspect_ratio_reference,0.0,unitless +aircraft:wing:bending_material_mass_scaler,1.0,unitless +aircraft:wing:chord_per_semispan_dist,-1.0,48.25,33.2,18.97,14.19,10.2,3.22,unitless +aircraft:wing:composite_fraction,0.85,unitless +aircraft:wing:control_surface_area_ratio,0.3,unitless +aircraft:wing:detailed_wing,True,unitless +aircraft:wing:dihedral,3.0,deg +aircraft:wing:glove_and_bat,1230.5,ft**2 +aircraft:wing:input_station_dist,0.0,0.0,0.2075,0.415,0.6927,0.928,1.0,unitless +aircraft:wing:laminar_flow_lower,0.0,unitless +aircraft:wing:laminar_flow_upper,0.0,unitless +aircraft:wing:load_distribution_control,2.0,unitless +aircraft:wing:load_fraction,1.0,unitless +aircraft:wing:load_path_sweep_dist,0.0,0.0,0.0,17.0,17.0,17.0,deg +aircraft:wing:mass_scaler,1.0,unitless +aircraft:wing:max_camber_at_70_semispan,2.0,unitless +aircraft:wing:misc_mass_scaler,1.0,unitless +aircraft:wing:num_integration_stations,50,unitless +aircraft:wing:outboard_semispan,68.43,ft +# aircraft:wing:root_chord,50.0,ft +aircraft:wing:shear_control_mass_scaler,1.0,unitless +aircraft:wing:span,186.631829293424,ft +aircraft:wing:span_efficiency_factor,1.0,unitless +aircraft:wing:span_efficiency_reduction,False,unitless +aircraft:wing:strut_bracing_factor,0.0,unitless +aircraft:wing:surface_control_mass_scaler,1.0,unitless +aircraft:wing:sweep,35.7,deg +aircraft:wing:taper_ratio,0.311,unitless +aircraft:wing:thickness_to_chord,0.11,unitless +aircraft:wing:thickness_to_chord_dist,-1.0,0.125,0.125,0.076,0.076,0.076,0.06,unitless +aircraft:wing:thickness_to_chord_reference,0.0,unitless +aircraft:wing:ultimate_load_factor,3.75,unitless +aircraft:wing:var_sweep_mass_penalty,0.0,unitless +aircraft:wing:wetted_area_scaler,0.61,unitless +mission:constraints:max_mach,0.9,unitless +mission:design:gross_mass,600000.0,lbm +mission:design:lift_coefficient,-1.0,unitless +mission:design:mach,-1.0,unitless +mission:design:range,7500.0,NM +mission:design:thrust_takeoff_per_eng,0.0,lbf +mission:landing:drag_coefficient_min,0.0,unitless +mission:landing:flare_rate,3.0,deg/s +mission:landing:initial_velocity,150.0,ft/s +mission:landing:lift_coefficient_max,3.0,unitless +mission:summary:cruise_mach,0.85,unitless +mission:summary:fuel_flow_scaler,1.0,unitless +mission:takeoff:angle_of_attack_runway,4.0,deg +mission:takeoff:braking_friction_coefficient,0.35,unitless +mission:takeoff:drag_coefficient_min,0.035258,unitless +mission:takeoff:final_altitude,35.0,ft +mission:takeoff:lift_coefficient_max,1.3,unitless +mission:takeoff:rolling_friction_coefficient,0.025,unitless +mission:takeoff:spoiler_drag_coefficient,0.0,unitless +mission:takeoff:spoiler_lift_coefficient,0.0,unitless +mission:takeoff:thrust_incidence,4.0,deg +settings:aerodynamics_method,FLOPS,unitless +settings:equations_of_motion,height_energy,unitless +settings:mass_method,FLOPS,unitless + +# Unconverted Values +AERIN.CLAPP,0.0 +AERIN.DRATIO,1.0 +AERIN.ELODMA,0.0 +AERIN.ELODSS,0.0 +AERIN.FLLDG,9900.0 +AERIN.FLTO,9900.0 +AERIN.FWAVE,1.0 +AERIN.IBO,0 +AERIN.ITPAER,2 +AERIN.IWAVE,0 +AERIN.MYAERO,0 +AERIN.THRMA,0.0 +AERIN.THRSS,0.0 +AERIN.XLLAM,0.0 +ASCLIN.AWETN,0.0 +ASCLIN.AWETT,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +ASCLIN.AWETW,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +ASCLIN.CDWAV,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +ASCLIN.DCDNAC,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +ASCLIN.ELTOT,0.0 +ASCLIN.ELW,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +ASCLIN.EQL,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +ASCLIN.FORM,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +ASCLIN.SREF,0.0 +ASCLIN.TREF,0.0 +ASCLIN.VOLTOT,0.0 +ASCLIN.VOLW,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +CONFIN.CH,45000.0,0.0,0.0,0.0,0.0,0.0 +CONFIN.EBLA,0.0,0.0,0.0,0.0,0.0,0.0 +CONFIN.EBPR,0.0,0.0,0.0,0.0,0.0,0.0 +CONFIN.EFPR,0.0,0.0,0.0,0.0,0.0,0.0 +CONFIN.EOPR,0.0,0.0,0.0,0.0,0.0,0.0 +CONFIN.ETIT,0.0,0.0,0.0,0.0,0.0,0.0 +CONFIN.ETTR,0.0,0.0,0.0,0.0,0.0,0.0 +CONFIN.FIXFUL,0.0 +CONFIN.FIXSPN,0.0 +CONFIN.GW,600000.0,0.0,0.0,0.0,0.0,0.0 +CONFIN.HTVC,0.0 +CONFIN.OAREA,0.0 +CONFIN.OFC,0.0 +CONFIN.OFF,0.0 +CONFIN.OFG,1.0 +CONFIN.OFH,0.0 +CONFIN.OFM,0.0 +CONFIN.OFNF,0.0 +CONFIN.OFNFOM,0.0 +CONFIN.OFNOX,0.0 +CONFIN.OFNS,0.0 +CONFIN.OFR,0.0 +CONFIN.OSFC,0.0 +CONFIN.PGLOV,0.0 +CONFIN.PLR,0.0,0.0,0.0,0.0,0.0,0.0 +CONFIN.ROTVEL,0.0,0.0,0.0,0.0,0.0,0.0 +CONFIN.TWR,0.0 +CONFIN.VARTH,0.0,0.0,0.0,0.0,0.0,0.0 +CONFIN.VTVC,0.0 +CONFIN.WSR,0.0 +ENGDIN.IFILL,2 +ENGDIN.MAXCR,1 +ENGDIN.NGPRT,1 +FUSEIN.TCF,0.1792 +FUSEIN.XLW,50.0 +MISSIN.ACTAB,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +MISSIN.ADTAB,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +MISSIN.ALTBM,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +MISSIN.ALTRAN,200.0 +MISSIN.APPFFF,2.0 +MISSIN.APPRTM,4.0 +MISSIN.CDFETH,0.0,0.0,0.0,0.0,0.0,0.0 +MISSIN.CDST,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +MISSIN.CLAMAX,0.0,0.0,0.0,0.0 +MISSIN.CLAMIN,0.0,0.0,0.0,0.0 +MISSIN.CLDCD,0.0,0.0,0.0,0.0 +MISSIN.CLMMAX,0.0,0.0,0.0,0.0 +MISSIN.CLMMIN,0.3,0.3,0.3,0.3 +MISSIN.CRALT,45000.0,25000.0,1500.0,-1.0,-1.0,-1.0 +MISSIN.CRCLMX,0.0,0.0,0.0,0.0,0.0,0.0 +MISSIN.CRDCD,0.0,0.0,0.0,0.0,0.0,0.0 +MISSIN.CRMACH,0.85,0.6,0.0,0.0,0.0,0.0 +MISSIN.CRMMIN,0.0,0.0,0.0,0.0,0.0,0.0 +MISSIN.DCWT,1000.0 +MISSIN.DEAMAX,0.0 +MISSIN.DEAMIN,0.0 +MISSIN.DECL,0.8 +MISSIN.DEDCD,0.0 +MISSIN.DEMMAX,0.0 +MISSIN.DEMMIN,0.3 +MISSIN.DIVLIM,0.0 +MISSIN.DTC,0.0 +MISSIN.DWT,1.0 +MISSIN.EREALT,-1.0 +MISSIN.EREMCH,-1.0 +MISSIN.FEATHF,0.5,0.5,0.5,0.5,0.5,0.5 +MISSIN.FFUEL,1.0,1.0,1.0,1.0,1.0,1.0 +MISSIN.FLRCR,1.0,1.0,1.0,1.0,1.0,1.0 +MISSIN.FNOX,0.0,0.0,0.0,0.0,0.0,0.0 +MISSIN.FUEMAX,0.0 +MISSIN.FWF,-0.001,-0.001,-0.001,-0.001 +MISSIN.HOLDTM,30.0 +MISSIN.HPMIN,1000.0,1000.0,1000.0,1000.0,1000.0,1000.0 +MISSIN.IATA,0 +MISSIN.ICRON,0 +MISSIN.IDOQ,0 +MISSIN.IFAACL,1 +MISSIN.IFAADE,-1 +MISSIN.IFEATH,0,0,0,0,0,0 +MISSIN.IFLAG,2 +MISSIN.IHOPOS,1 +MISSIN.INDR,0 +MISSIN.IOC,1,4,4,1,1,1 +MISSIN.IPPCL,1,1,1,1 +MISSIN.IRADAC,0 +MISSIN.IRS,1 +MISSIN.IRW,1 +MISSIN.ISKAL,1 +MISSIN.ISTCL,0,0,0,0 +MISSIN.ISTCR,0,0,0,0,0,0 +MISSIN.ISTDE,0 +MISSIN.ITTFF,1 +MISSIN.IVS,1 +MISSIN.MAXCL,1,1,1,1 +MISSIN.MIRROR,0 +MISSIN.MSUMPT,1 +MISSIN.MYWTS,1 +MISSIN.NCLIMB,1 +MISSIN.NCLRES,1 +MISSIN.NCRCL,1,1,1,1 +MISSIN.NCRHOL,3 +MISSIN.NCRRES,2 +MISSIN.NCRTH,1 +MISSIN.NCRUSE,3 +MISSIN.NHOLD,0 +MISSIN.NINCL,31,31,31,31 +MISSIN.NINDE,31 +MISSIN.NO,0,0,0,0 +MISSIN.NODIVE,0 +MISSIN.NPCON,0 +MISSIN.NQL,0 +MISSIN.NS,0 +MISSIN.NSADJ,0 +MISSIN.NSOUT,0 +MISSIN.OFFDR,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +MISSIN.OWFACT,1.0 +MISSIN.PAYLOD,0.0 +MISSIN.QLALT,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +MISSIN.QLIM,0.0 +MISSIN.RAMPWT,0.0 +MISSIN.RCIN,300.0 +MISSIN.RDLIM,-99999.0 +MISSIN.REARTH,20890000.0 +MISSIN.RESRFU,0.0 +MISSIN.RESTRP,0.05 +MISSIN.RTOL,0.001 +MISSIN.SPDLIM,0.0 +MISSIN.SREALT,-1.0 +MISSIN.SREMCH,-1.0 +MISSIN.STMA,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +MISSIN.TAKOFF,0.0 +MISSIN.TAKOTM,2.0 +MISSIN.TAXITM,5.0 +MISSIN.TAXOTM,9.0 +MISSIN.THOLD,0.1 +MISSIN.TIMMAP,2.0 +MISSIN.TLWIND,0.0 +MISSIN.TXFUFL,0.0 +MISSIN.VCTAB,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +MISSIN.VDTAB,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +MISSIN.VQLM,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +MISSIN.WTBM,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +MISSIN.XCL,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +MISSIN.XMACH,0.0,5.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +MISSIN.XNZ,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +OPTION.APFILE,"""POLPLOT""" +OPTION.CNFILE,"""FLPPLOT""" +OPTION.CRFILE,"""CRUPLOT""" +OPTION.HSFILE,"""HISPLOT""" +OPTION.IANAL,3 +OPTION.IANOPP,0 +OPTION.ICOST,0 +OPTION.ILAND,1 +OPTION.INENG,0 +OPTION.IPLTHS,0 +OPTION.IPLTPS,0 +OPTION.IPLTSG,0,0,0,0,0,0,0,0,0,0 +OPTION.IPLTTH,0 +OPTION.IPSTDG,0,0,0,0,0,0,0,0,0,0 +OPTION.ITAKOF,1 +OPTION.IXFL,0 +OPTION.MPRINT,1 +OPTION.MSFILE,"""MSMPLOT""" +OPTION.NMACH,0 +OPTION.NOFILE,'TO.NPR' +OPTION.NOPRO,1 +OPTION.NPFILE,1 +OPTION.PLTFM,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +OPTION.PLTNZ,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0 +OPTION.PLTPC,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0 +OPTION.PLTWT,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +OPTION.PLTWTA,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +OPTION.PMACH,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +OPTION.POLALT,0.0 +OPTION.PSFILE,"""PSPLOT""" +OPTION.THFILE,"""THRPLOT""" +OPTION.TOFILE,"""TOLPLOT""" +OPTION.XINC,0.2 +OPTION.XMAX,0.9 +OPTION.XMIN,0.3 +OPTION.YINC,10000.0 +OPTION.YMAX,40000.0 +OPTION.YMIN,0.0 +PCONIN.CONALT,35000.0 +PCONIN.CONAUX,0.0 +PCONIN.CONFM,0.0 +PCONIN.CONLIM,0.0 +PCONIN.CONMCH,0.85 +PCONIN.CONNZ,1.0 +PCONIN.CONPC,1.0 +PCONIN.CONWT,0.0 +PCONIN.CONWTA,0.0 +PCONIN.ICONSG,2 +PCONIN.ICONTP,5 +PCONIN.ICSTDG,0 +PCONIN.NEO,2 +PROIN.ALPMIN,0.0 +PROIN.ALPRO,0.0,4.0,6.0,8.0,10.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0,25.0,26.0,27.0,28.0,30.0,32.0,34.0,36.0,-100.0,-100.0,-100.0,-100.0 +PROIN.CDPRO,0.031664,0.025258,0.026053,0.029529,0.036235,0.045467,0.051257,0.057003,0.063994,0.070955,0.080059,0.089179,0.11585,0.142313,0.16197,0.176325,0.196659,0.213941,0.229069,0.247171,0.268876,0.297378,0.346767,0.400762,0.442503,0.483076,0.0,0.0,0.0,0.0 +PROIN.CLPRO,-0.056782,0.176206,0.28103,0.395085,0.505416,0.609138,0.658895,0.709463,0.760166,0.810948,0.859611,0.908241,0.933666,0.958067,0.972702,0.954969,0.93792,0.936314,0.931608,0.943601,0.956648,0.984358,0.988573,0.980125,0.962508,0.942321,0.0,0.0,0.0,0.0 +PROIN.DFLAP,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 +PROIN.FLAPID,"""TOFF""","""FlapID""","""FlapID""","""FlapID""","""FlapID""","""FlapID""","""FlapID""","""FlapID""","""FlapID""","""FlapID""" +PROIN.GAMLIM,0.0 +PROIN.IATR,0 +PROIN.INM,0 +PROIN.IPCMAX,1 +PROIN.KEAS,0 +PROIN.NPOL,1 +PROIN.NTIME,1 +PROIN.SPRATE,0.1 +PROIN.TXF,-1.0 +RERUN.DESRNG,3000.0 +RERUN.ICOST,0 +RERUN.ILAND,1 +RERUN.ITAKOF,1 +RERUN.MYWTS,1 +RERUN.NOISE,0 +RERUN.NOPRO,1 +RERUN.TWR,0.0 +RERUN.WSR,0.0 +SEGIN.AFIX,0.0 +SEGIN.DELT,1.0 +SEGIN.DSTOP,50000.0 +SEGIN.ENGSCL,0.95 +SEGIN.GFIX,0.0 +SEGIN.GRDAEO,2.29061 +SEGIN.GRDOEO,0.0 +SEGIN.HMIN,0.0 +SEGIN.HSTOP,0.0 +SEGIN.IFIX,1 +SEGIN.IPLR,0 +SEGIN.KEY,'LAST' +SEGIN.NFLAP,1 +SEGIN.NOYCAL,0 +SEGIN.SPRATE,0.1 +SEGIN.TSTOP,0.0 +SEGIN.VFIX,0.0 +SEGIN.VSTOP,0.0 +SYNTIN.ACCUX,1e-05 +SYNTIN.ADFUN,0.001 +SYNTIN.AMULT,1.2 +SYNTIN.ARMAX,99999.0 +SYNTIN.AUTSCL,1.0 +SYNTIN.CDPMAX,99999.0 +SYNTIN.CDTMAX,99999.0 +SYNTIN.DEP,0.001 +SYNTIN.DESRNG,7500.0 +SYNTIN.DHDTLM,100.0 +SYNTIN.EF,3.0 +SYNTIN.EMOVE,0.05 +SYNTIN.EPS,0.002 +SYNTIN.EXFCAP,0.0 +SYNTIN.FDD,0.2 +SYNTIN.FDELT,0.0 +SYNTIN.FDMIN,0.0 +SYNTIN.FLLDG,9900.0 +SYNTIN.FLTO,9900.0 +SYNTIN.GFACT,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0 +SYNTIN.GLM,0.002 +SYNTIN.GNOX,0.0 +SYNTIN.IBFGS,1 +SYNTIN.ICENT,0 +SYNTIN.IG,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 +SYNTIN.IGRAD,0 +SYNTIN.ISDRST,0 +SYNTIN.ITFINE,0 +SYNTIN.ITMAX,30 +SYNTIN.JPRNT,2 +SYNTIN.JVKC,0 +SYNTIN.NDD,4 +SYNTIN.NLIN,4 +SYNTIN.NSCALE,98765 +SYNTIN.NSTEP,20 +SYNTIN.RDFUN,0.01 +SYNTIN.RHODEL,0.0 +SYNTIN.RHOMAX,300.0 +SYNTIN.RHOMIN,0.0 +SYNTIN.RK,0.0 +SYNTIN.ROCLIM,100.0 +SYNTIN.STMIN,1.0 +SYNTIN.TMGLIM,0.1 +SYNTIN.VAPPR,150.0 +SYNTIN.VJMAX,99999.0 +TOLIN.ACCLIM,16.0 +TOLIN.ALMXLD,25.0 +TOLIN.ALMXTO,25.0 +TOLIN.ALPLD,0.0,4.0,6.0,8.0,10.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0,25.0,26.0,27.0,28.0,30.0,32.0,34.0,36.0,-100.0,-100.0,-100.0,-100.0 +TOLIN.ALPROT,14.0 +TOLIN.ALPTO,0.0,4.0,6.0,8.0,10.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0,25.0,26.0,27.0,28.0,30.0,32.0,34.0,36.0,-100.0,-100.0,-100.0,-100.0 +TOLIN.APA,0.0 +TOLIN.APRANG,-3.0 +TOLIN.APRHGT,1500.0 +TOLIN.ARGEF,1.0 +TOLIN.ARRET,0.0 +TOLIN.CDEOUT,0.005 +TOLIN.CDLD,0.031664,0.025258,0.026053,0.029529,0.036235,0.045467,0.051257,0.057003,0.063994,0.070955,0.080059,0.089179,0.11585,0.142313,0.16197,0.176325,0.196659,0.213941,0.229069,0.247171,0.268876,0.297378,0.346767,0.400762,0.442503,0.483076,0.0,0.0,0.0,0.0 +TOLIN.CDREV,0.0 +TOLIN.CDTO,0.031664,0.025258,0.026053,0.029529,0.036235,0.045467,0.051257,0.057003,0.063994,0.070955,0.080059,0.089179,0.11585,0.142313,0.16197,0.176325,0.196659,0.213941,0.229069,0.247171,0.268876,0.297378,0.346767,0.400762,0.442503,0.483076,0.0,0.0,0.0,0.0 +TOLIN.CLLD,-0.056782,0.176206,0.28103,0.395085,0.505416,0.609138,0.658895,0.709463,0.760166,0.810948,0.859611,0.908241,0.933666,0.958067,0.972702,0.954969,0.93792,0.936314,0.931608,0.943601,0.956648,0.984358,0.988573,0.980125,0.962508,0.942321,0.0,0.0,0.0,0.0 +TOLIN.CLLDM,1.3 +TOLIN.CLREV,0.0 +TOLIN.CLTO,-0.056782,0.176206,0.28103,0.395085,0.505416,0.609138,0.658895,0.709463,0.760166,0.810948,0.859611,0.908241,0.933666,0.958067,0.972702,0.954969,0.93792,0.936314,0.931608,0.943601,0.956648,0.984358,0.988573,0.980125,0.962508,0.942321,0.0,0.0,0.0,0.0 +TOLIN.DELDFL,5.0 +TOLIN.DELHAP,5.0 +TOLIN.DELTCL,0.2 +TOLIN.DELTRN,0.25 +TOLIN.DELTRO,0.2 +TOLIN.DELVTO,4.0 +TOLIN.DTCT,15.0 +TOLIN.FCDMLD,-1.0 +TOLIN.FCDMTO,0.2 +TOLIN.FLDCD,1.8246 +TOLIN.FLDCL,1.8246 +TOLIN.FTOCD,1.8246 +TOLIN.FTOCL,1.8246 +TOLIN.IBAL,1 +TOLIN.IGOBS,0 +TOLIN.INCGEF,1 +TOLIN.INTHLD,2 +TOLIN.INTHRV,2 +TOLIN.INTHTO,2 +TOLIN.IREV,1 +TOLIN.ISPOL,0 +TOLIN.ITIME,1 +TOLIN.ITXOUT,1 +TOLIN.MAGRUP,0 +TOLIN.NOFLAR,0 +TOLIN.OBSLD,50.0 +TOLIN.PILOTT,0.85 +TOLIN.REVCUT,-1000.0 +TOLIN.RVFACT,-0.4 +TOLIN.SWREF,3655.4 +TOLIN.TDELG,0.0 +TOLIN.TDSINK,0.0 +TOLIN.THDRY,0.0 +TOLIN.THFACT,1.0 +TOLIN.THRLD,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +TOLIN.THRRV,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +TOLIN.THRTO,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +TOLIN.TIBRA,3.0 +TOLIN.TIBRAK,4.0 +TOLIN.TICUT,3.0 +TOLIN.TIGEAR,9.0 +TOLIN.TIRVA,1000.0 +TOLIN.TIRVRS,5.0 +TOLIN.TISPA,3.0 +TOLIN.TISPOL,2.0 +TOLIN.VANGL,3.0 +TOLIN.VELLD,0.0,50.0,100.0,150.0,200.0,250.0,300.0,350.0,400.0,450.0 +TOLIN.VELRV,0.0,50.0,100.0,150.0,200.0,250.0,300.0,350.0,400.0,450.0 +TOLIN.VELTO,0.0,50.0,100.0,150.0,200.0,250.0,300.0,350.0,400.0,450.0 +TOLIN.VROTAT,1.05 +TOLIN.WHGT,7.0 +WTIN.ARFIN,1.952 +WTIN.CGACON,0.0 +WTIN.CGAIS,0.0 +WTIN.CGAMMO,0.0 +WTIN.CGAP,0.0 +WTIN.CGARM,0.0 +WTIN.CGAV,0.0 +WTIN.CGAXG,0.0 +WTIN.CGAXT,0.0 +WTIN.CGCAN,0.0 +WTIN.CGCF,0.0 +WTIN.CGCR,0.0 +WTIN.CGCW,0.0 +WTIN.CGEA,0.0 +WTIN.CGEF,0.0 +WTIN.CGF,0.0 +WTIN.CGFIN,0.0 +WTIN.CGFWF,0.0 +WTIN.CGHT,0.0 +WTIN.CGLGM,0.0 +WTIN.CGLGN,0.0 +WTIN.CGMIS,0.0 +WTIN.CGP,0.0 +WTIN.CGREFL,0.0 +WTIN.CGREFX,0.0 +WTIN.CGVT,0.0 +WTIN.CGW,0.0 +WTIN.CGZWF,0.0 +WTIN.DLDWT,0.0 +WTIN.EINL,1.0 +WTIN.ENOZ,1.0 +WTIN.ETAP,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +WTIN.INCPAY,0 +WTIN.INRTIA,0 +WTIN.ISPOWE,0 +WTIN.ITANK,1 +WTIN.MLDWT,0 +WTIN.MYWTS,0 +WTIN.NETAP,0 +WTIN.NETAW,6 +WTIN.NFCON,1 +WTIN.NSWR,0 +WTIN.NTHR,0 +WTIN.NTOW,0 +WTIN.NWREF,39 +WTIN.PVAL,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +WTIN.SPWCON,38584.0 +WTIN.SPWGW,0.104087 +WTIN.SPWSW,9.5 +WTIN.SPWTH,2.23439 +WTIN.SWPCAN,0.0 +WTIN.SWPFIN,39.42 +WTIN.SWTFF,0.0 +WTIN.TCFIN,0.08 +WTIN.TCR,0.0 +WTIN.TCT,0.0 +WTIN.TD,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +WTIN.TF,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +WTIN.TL,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +WTIN.TW,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +WTIN.TX,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +WTIN.TY,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +WTIN.TZ,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +WTIN.WARM,0.0 +WTIN.WAUXT,1.0 +WTIN.WINL,0.0 +WTIN.WNOZ,0.0 +WTIN.WTFILE,"""WTDAT""" +WTIN.YEA,0.0 +WTIN.YEF,0.0 +WTIN.YFIN,0.0 +WTIN.YFUSE,0.0 +WTIN.YMLG,0.0 +WTIN.YVERT,0.0 +WTIN.ZAP,0.0 +WTIN.ZBW,0.0 +WTIN.ZEA,0.0 +WTIN.ZEF,0.0 +WTIN.ZFIN,0.0 +WTIN.ZHT,0.0 +WTIN.ZRVT,0.0 +WTIN.ZVT,0.0 diff --git a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.inp b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.inp new file mode 100644 index 0000000000..51af9f0e27 --- /dev/null +++ b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.inp @@ -0,0 +1,1199 @@ +! BWB300-N1 + &OPTION + MPRINT = 1, + IOPT = 3, + IANAL = 3, + INENG = 0, + ITAKOF = 1, + ILAND = 1, + NOPRO = 1, + NOISE = 0, + ICOST = 0, + IFITE = 3, + + ! Plot File Input Data + CNFILE = "FLPPLOT", + IXFL = 0, + MSFILE = "MSMPLOT", + CRFILE = "CRUPLOT", + TOFILE = "TOLPLOT", + NPFILE = 1, + NOFILE = 'TO.NPR', + + ! Drag Polar Plot File + IPOLP = 0, + APFILE = "POLPLOT", + POLALT = 0.0, + NMACH = 0, + PMACH = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + IPLTTH = 0, + THFILE = "THRPLOT", + + ! Additional Plot files + IPLTHS = 0, + HSFILE = "HISPLOT", + IPLTPS = 0, + PSFILE = "PSPLOT", + XMAX = 0.9, + XMIN = 0.3, + XINC = 0.2, + YMAX = 40000.0, + YMIN = 0.0, + YINC = 10000.0, + PLTNZ = -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, + PLTPC = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + IPSTDG = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + PLTWT = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + IPLTSG = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + PLTFM = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + PLTWTA = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + IANOPP = 0, + / + &WTIN + ULF = 3.75, + DGW = 1.0, + VMMO = 0.9, + NWREF = 39, + CGREFL = 0.0, + CGREFX = 0.0, + MYWTS = 0, + HYDPR = 3000.0, + WPAINT = 0.0, + IALTWT = 0, + ISPOWE = 0, + SPWTH = 2.23439, + SPWSW = 9.5, + SPWGW = 0.104087, + SPWCON = 38584.0, + ! IFITE = 0, + + ! Wing Data + ! SPAN = 186.3, + SPAN = 186.3, + DIH = 3.0, + FLAPR = 0.3, + GLOV = 0.0, + VARSWP = 0.0, + FCOMP = 0.85, + FAERT = 0.0, + FSTRT = 0.0, + + ! Detailed Wing Data + ! ETAW = 0.0, 14.20, 28.40, 47.40, 63.50, 68.43, + NETAW = 6, + ETAW = 0.0, .2075, .4150, .6927, .9280, 1.000, + CHD = 48.25, 33.20, 18.97, 14.19, 10.20, 3.220, + TOC = 0.125, 0.125, 0.076, 0.076, 0.076, 0.060, + SWL = 0.0, 0.0, 17.0, 17.0, 17.0, 17.0, + ETAE = 0.2, 0.0, 0.0, 0.0, + PCTL = 1.0, + ARREF = 0.0, + TCREF = 0.0, + NSTD = 50, + PDIST = 2.0, + NETAP = 0, + ETAP = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + PVAL = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + + ! Tails, Fins, Canards + SHT = 700.0, + SWPHT = 0.0, + ARHT = 1.0, + TRHT = 0.714, + TCHT = 0.1, + HHT = -100.0, + NVERT = 0, + SVT = 0.0, + SWPVT = -100.0, + ARVT = -100.0, + TRVT = -100.0, + TCVT = 0.0, + NFIN = 2, + SFIN = 184.89, + ARFIN = 1.952, + TRFIN = 0.464, + SWPFIN = 39.42, + TCFIN = 0.08, + SCAN = 0.0, + SWPCAN = 0.0, + ARCAN = 0.0, + TRCAN = 0.0, + TCCAN = 0.0, + + ! Fuselage Data + NFUSE = 1, + XL = 0.0, + WF = 0.0, ! WF = 50.0 + DF = 14.16, + ! XLP = 72.7, + + ! Landing Gear Data + XMLG = 85.0, + XNLG = 87.0, + WLDG = 0.0, + MLDWT = 0, + DLDWT = 0.0, + CARBAS = 0.0, + + ! Propulsion System Data + NEW = 0, + NEF = 2, + THRSO = 86786.4, + WENG = 22089.3, + EEXP = 1.0, + WINL = 0.0, + EINL = 1.0, + WNOZ = 0.0, + ENOZ = 1.0, + XNAC = 17.297, + DNAC = 12.569, + WPMISC = 0.0, + + ! Fuel System Data + NTANK = 7, + FULWMX = -1.0, + FUELRF = 0.0, + FSWREF = -1.0, + FUSCLA = 0.0, + FUSCLB = 0.0, + FULFMX = 0.0, + IFUFU = 0, + FULAUX = 0.0, + + ! Crew and Payload Data + NPF = 24, + NPB = 76, + NPT = 200, + NSTU = -1, + NGALC = -1, + NFLCR = 2, + WPPASS = 165.0, + BPP = -1.0, + CARGF = 0.0, + CARGOW = 0.0, + CARGOF = 0.0, + + ! Override Parameters + FRWI = 1.0, + FRWI1 = 1.0, + FRWI2 = 1.0, + FRWI3 = 1.0, + FRHT = 1.0, + FRVT = 1.0, + FRFIN = 1.0, + FRCAN = 1.0, + FRFU = 1.0, + FRLGN = 1.0, + FRLGM = 1.0, + FRNA = 0.0, + WTHR = 0.0, + WPMSC = 0.0, + WFSYS = 1.0, + FRSC = 1.0, + WAPU = 1.0, + WIN = 1.0, + WHYD = 1.0, + WELEC = 1.0, + WAVONC = 1.0, + WARM = 0.0, + WFURN = 1.118, + WAC = 1.0, + WAI = 1.0, + WUF = 1.0, + WOIL = 1.0, + WSRV = 1.0, + WCON = 23500., + WAUXT = 1.0, + WFLCRB = 1.0, + WSTUAB = 1.0, + EWMARG = 0.0, + + ! Center of Gravity Data + CGW = 0.0, + CGHT = 0.0, + CGVT = 0.0, + CGFIN = 0.0, + CGCAN = 0.0, + CGF = 0.0, + CGLGN = 0.0, + CGLGM = 0.0, + CGEF = 0.0, + CGEA = 0.0, + CGAP = 0.0, + CGAV = 0.0, + CGARM = 0.0, + CGCR = 0.0, + CGP = 0.0, + CGCW = 0.0, + CGCF = 0.0, + CGZWF = 0.0, + CGFWF = 0.0, + CGAIS = 0.0, + CGACON = 0.0, + CGAXG = 0.0, + CGAXT = 0.0, + CGAMMO = 0.0, + CGMIS = 0.0, + + ! Inertia Data + INRTIA = 0, + ZHT = 0.0, + ZVT = 0.0, + ZFIN = 0.0, + YFIN = 0.0, + ZEF = 0.0, + YEF = 0.0, + ZEA = 0.0, + YEA = 0.0, + ZBW = 0.0, + ZAP = 0.0, + ZRVT = 0.0, + YMLG = 0.0, + YFUSE = 0.0, + YVERT = 0.0, + SWTFF = 0.0, + TCR = 0.0, + TCT = 0.0, + + INCPAY = 0, + ITANK = 1, + NFCON = 1, + TX = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + TY = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + TZ = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + TL = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + TW = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + TD = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + TF = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + + ! Undocumented Input + NTOW = 0, + NSWR = 0, + NTHR = 0, + WTFILE = "WTDAT", + / + &FUSEIN + TCF=0.1792, + SWPLE=60., + OSSPAN=68.43, + XLW=50.0, + / + &CONFIN ! TITLE = title + DESRNG = 7500.0, + WSR = 0.0, + TWR = 0.0, + HTVC = 0.0, + VTVC = 0.0, + PGLOV = 0.0, + FIXSPN = 0.0, + FIXFUL = 0.0, + ! ICOST = 0, + + ! Objective function weight + OFG = 1.0, + OFF = 0.0, + OFM = 0.0, + OFR = 0.0, + OFC = 0.0, + OSFC = 0.0, + OFNOX = 0.0, + OFNF = 0.0, + OFNS = 0.0, + OFNFOM = 0.0, + OAREA = 0.0, + OFH = 0.0, + + ! Vehicle/mission design variables + GW = 600000.0, 0.0, 0.0, 0.0, 0.0, 0.0, + AR = 5.4252, 0.0, 0.0, 0.0, 0.0, 0.0, + THRUST = 87500.0, 1.0, 0.0, 0.0, 0.0, 0.0, + SW = 7628., 1.0, 0.0, 0.0, 0.0, 0.0, + TR = 0.311, 0.0, 0.0, 0.0, 0.0, 0.0, + SWEEP = 35.7, 0.0, 0.0, 0.0, 0.0, 0.0, + TCA = 0.11, 0.0, 0.0, 0.0, 0.0, 0.0, + VCMN = 0.85, 0.0, 0.0, 0.0, 0.0, 0.0, + CH = 45000.0, 0.0, 0.0, 0.0, 0.0, 0.0, + + ! Engine cycle design variables + ETIT = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + EOPR = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + EFPR = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + EBPR = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ETTR = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + EBLA = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + + ! IC Engine cycle design variables + ! ETIT = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ! EOPR = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ! EFPR = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ! EBPR = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ! ETTR = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ! EBLA = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + + ! Takeoff and landing variables + VARTH = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ROTVEL = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + PLR = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + / + &AERIN + MYAERO = 0, + IWAVE = 0, + FWAVE = 1.0, + + ! INENG = 0, + ! NFUSE = 1, + ! NVERT = 1, + + ITPAER = 2, + IBO = 0, + CAM = 2.0, + SBASE = 0.0, + AITEK = 2.0, + E = 1.0, + MODARO = 0, + FCLDES = -1.0, + FMDES = -1.0, + + XLLAM = 0.0, + TRUW = 0.0, + TRLW = 0.0, + TRUH = 0.0, + TRLH = 0.0, + TRUV = 0.0, + TRLV = 0.0, + TRUB = 0.0, + TRLB = 0.0, + TRUN = 0.0, + TRLN = 0.0, + TRUC = 0.0, + TRLC = 0.0, + + SWETW = 0.61, ! was 1.0, changed to match the AERO from old version of FLOPS + SWETH = 1.0, + SWETV = 125.0, + SWETF = 1.0, + SWETN = 1.0, + SWETC = 1.0, + + WRATIO = 0.7, + VAPPR = 150.0, + FLTO = 9900.0, + FLLDG = 9900.0, + CLTOM = 2.0, + CLLDM = 3.0, + CLAPP = 0.0, + DRATIO = 1.0, + ELODSS = 0.0, + ELODMA = 0.0, + THRSS = 0.0, + THRMA = 0.0, + THROFF = 0.0, + + ! ITAKOF = 1, + ! ILAND = 1, + ! NOPRO = 1, + ! NOISE = 1, + MIKE = 0, + / + &ENGDIN + NGPRT = 1, + IGENEN = -1, + EIFILE = "/users1/karlg/sfw/b777/PAX300_outputFLOPS_baseline.txt", + EXTFAC = 1.0, + FFFSUB = 1.0, + FFFSUP = 1.0, + IDLE = 1, + NONEG = 0, + FIDMIN = 0.08, + FIDMAX = 1.0, + IXTRAP = 1, + IFILL = 2, + MAXCR = 1, + NOX = 1, + NPCODE = 0, + PCODE = 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, + BOOST = 0.0, + IGEO = 0, + DFFAC = 0.0, + FFFAC = 0.0, + / + &MISSIN + IRW = 1, + MSUMPT = 1, + IFLAG = 2, + + FACT = 1.0, + FLEAK = 0.0, + FCDO = 1.0, + FCDI = 1.0, + FCDSUB = 1.0, + FCDSUP = 1.0, + + INDR = 0, + ISKAL = 1, + OWFACT = 1.0, + DTC = 0.0, + RTOL = 0.0010, + NHOLD = 0, + IATA = 0, + TLWIND = 0.0, + NPCON = 1, + DWT = 1.0, + OFFDR = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + IDOQ = 0, + + NSOUT = 0, + NSADJ = 0, + MIRROR = 0, + + STMA = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + CDST = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ISTCL = 0, 0, 0, 0, + ISTCR = 0, 0, 0, 0, 0, 0, + ISTDE = 0, + + MYWTS = 0, + RAMPWT = 0.0, + ! DOWE = 0.0, + PAYLOD = 0.0, + FUEMAX = 0.0, + + TAKOTM = 2.0, + TAXOTM = 9.0, + APPRTM = 4.0, + APPFFF = 2.0, + TAXITM = 5.0, + ITTFF = 1, + TAKOFF = 0.0, + TXFUFL = 0.0, + + XNZ = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + XCL = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + XMACH = 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + + NCLIMB = 1, + CLMMIN = 0.3, 0.3, 0.3, 0.3, + CLMMAX = 0.0, 0.0, 0.0, 0.0, + CLAMIN = 0.0, 0.0, 0.0, 0.0, + CLAMAX = 0.0, 0.0, 0.0, 0.0, + NINCL = 31, 31, 31, 31, + FWF = -0.0010, -0.0010, -0.0010, -0.0010, + NCRCL = 1, 1, 1, 1, + CLDCD = 0.0, 0.0, 0.0, 0.0, + IPPCL = 1, 1, 1, 1, + MAXCL = 1, 1, 1, 1, + + ! Input Climb Schedules + NO = 0, 0, 0, 0, + ACTAB = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + VCTAB = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + + IFAACL = 1, + IFAADE = -1, + NODIVE = 0, + DIVLIM = 0.0, + QLIM = 0.0, + SPDLIM = 0.0, + NQL = 0, + QLALT = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + VQLM = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + + NCRUSE = 3, + IOC = 1, 4, 4, 1, 1, 1, + CRMACH = 0.85, 0.6, 0.0, 0.0, 0.0, 0.0, + CRALT = 45000.0, 25000.0, 1500.0, -1.0, -1.0, -1.0, + CRDCD = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + FLRCR = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + CRMMIN = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + CRCLMX = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + HPMIN = 1000.0, 1000.0, 1000.0, 1000.0, 1000.0, 1000.0, + FFUEL = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + FNOX = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + IFEATH = 0, 0, 0, 0, 0, 0, + FEATHF = 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, + CDFETH = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + DCWT = 1.0, + RCIN = 300.0, + + WTBM = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ALTBM = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + + IVS = 1, + DECL = 0.8, + DEMMIN = 0.3, + DEMMAX = 0.0, + DEAMIN = 0.0, + DEAMAX = 0.0, + NINDE = 31, + DEDCD = 0.0, + RDLIM = -99999.0, + + NS = 0, + ADTAB = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + VDTAB = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + + IRS = 1, + RESRFU = 0.0, + RESTRP = 0.05, + TIMMAP = 2.0, + ALTRAN = 200.0, + NCLRES = 1, + NCRRES = 2, + SREMCH = -1.0, + EREMCH = -1.0, + SREALT = -1.0, + EREALT = -1.0, + HOLDTM = 30.0, + NCRHOL = 3, + IHOPOS = 1, + ICRON = 0, + THOLD = 0.1, + NCRTH = 1, + + REARTH = 20890000., + IRADAC = 0, + / +START 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +CLIMB 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +CRUISE 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +DESCENT0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 + &PCONIN + CONALT = 35000.0, + CONMCH = 0.85, + CONNZ = 1.0, + CONPC = 1.0, + NEO = 2, + ICSTDG = 0, + CONWT = 0.0, + ICONSG = 2, + CONFM = 0.0, + CONWTA = 0.0, + ICONTP = 5, + CONLIM = 300.0, + CONAUX = 0.0, + / + &PCONIN + CONALT = 35000.0, + CONMCH = 0.85, + CONNZ = 1.0, + CONPC = 1.0, + NEO = 2, + ICSTDG = 0, + CONWT = 0.0, + ICONSG = 2, + CONFM = 0.0, + CONWTA = 0.0, + ICONTP = 5, + CONLIM = 0.0, + CONAUX = 0.0, + / + &PCONIN + CONALT = 35000.0, + CONMCH = 0.85, + CONNZ = 1.0, + CONPC = 1.0, + NEO = 2, + ICSTDG = 0, + CONWT = 0.0, + ICONSG = 2, + CONFM = 0.0, + CONWTA = 0.0, + ICONTP = 5, + CONLIM = 0.0, + CONAUX = 0.0, + / + &PCONIN + CONALT = 35000.0, + CONMCH = 0.85, + CONNZ = 1.0, + CONPC = 1.0, + NEO = 2, + ICSTDG = 0, + CONWT = 0.0, + ICONSG = 2, + CONFM = 0.0, + CONWTA = 0.0, + ICONTP = 5, + CONLIM = 0.0, + CONAUX = 0.0, + / + &PCONIN + CONALT = 35000.0, + CONMCH = 0.85, + CONNZ = 1.0, + CONPC = 1.0, + NEO = 2, + ICSTDG = 0, + CONWT = 0.0, + ICONSG = 2, + CONFM = 0.0, + CONWTA = 0.0, + ICONTP = 5, + CONLIM = 0.0, + CONAUX = 0.0, + / + &PCONIN + CONALT = 35000.0, + CONMCH = 0.85, + CONNZ = 1.0, + CONPC = 1.0, + NEO = 2, + ICSTDG = 0, + CONWT = 0.0, + ICONSG = 2, + CONFM = 0.0, + CONWTA = 0.0, + ICONTP = 5, + CONLIM = 0.0, + CONAUX = 0.0, + / + &ASCLIN + SREF = 0.0, + TREF = 0.0, + AWETN = 0.0, + ELTOT = 0.0, + VOLTOT = 0.0, + AWETT = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + AWETW = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ELW = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + VOLW = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + FORM = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + EQL = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + CDWAV = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + DCDNAC = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + / + &TOLIN + APA = 0.0, + DTCT = 15.0, + SWREF = 3655.4, + ARRET = 0.0, + WHGT = 7.0, + ALPRUN = 4.0, + TINC = 4.0, + ROLLMU = 0.025, + BRAKMU = 0.35, + CDGEAR = 0.0050, + CDEOUT = 0.0050, + CLSPOL = 0.0, + CDSPOL = 0.0, + INCGEF = 1, + ARGEF = 1.0, + ITIME = 1, + + ! Thrust Reverser + INTHRV = 2, + RVFACT = -0.4, + VELRV = 0.0, 50.0, 100.0, 150.0, 200.0, 250.0, 300.0, 350.0, 400.0, 450.0, + THRRV = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + TIRVRS = 5.0, + REVCUT = -1000.0, + CLREV = 0.0, + CDREV = 0.0, + + ! Integration Intervals + DELVTO = 4.0, + DELTCL = 0.2, + DELTRO = 0.2, + DELHAP = 5.0, + DELDFL = 5.0, + DELTRN = 0.25, + + ! Takeoff Data + CLTOM = 1.3, + CDMTO = 0.035258, + FCDMTO = 0.2, ! was 0.40 + ALMXTO = 25.0, + OBSTO = 35.0, + ALPTO = 0.0, 4.0, 6.0, 8.0, 10.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 30.0, 32.0, 34.0, 36.0, -100.0, -100.0, -100.0, -100.0, + CLTO = -0.056782, 0.176206, 0.28103, 0.395085, 0.505416, 0.609138, 0.658895, 0.709463, 0.760166, 0.810948, 0.859611, 0.908241, 0.933666, 0.958067, 0.972702, 0.954969, 0.93792, 0.936314, 0.931608, 0.943601, 0.956648, 0.984358, 0.988573, 0.980125, 0.962508, 0.942321, 0.0, 0.0, 0.0, 0.0, + CDTO = 0.031664, 0.025258, 0.026053, 0.029529, 0.036235, 0.045467, 0.051257, 0.057003, 0.063994, 0.070955, 0.080059, 0.089179, 0.11585, 0.142313, 0.16197, 0.176325, 0.196659, 0.213941, 0.229069, 0.247171, 0.268876, 0.297378, 0.346767, 0.400762, 0.442503, 0.483076, 0.0, 0.0, 0.0, 0.0, + INTHTO = 2, + VELTO = 0.0, 50.0, 100.0, 150.0, 200.0, 250.0, 300.0, 350.0, 400.0, 450.0, + THRTO = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ALPROT = 14.0, + VROTAT = 1.05, + VANGL = 3.0, + THFACT = 1.0, + FTOCL = 1.8246, + FTOCD = 1.8246, + IGOBS = 0, + TDELG = 0.0, + TIGEAR = 9.0, + IBAL = 1, + ITXOUT = 1, + + ! Aborted Takeoff + PILOTT = 0.85, + ISPOL = 0, + IREV = 1, + ! Not wrapped and not currently used. + TISPA = 3., + TIBRA = 3., + TIRVA = 1000., + + ! Landing Data + CLLDM = 1.3, + CDMLD = 0.0, + FCDMLD = -1.0, + ALMXLD = 25.0, + OBSLD = 50.0, + ALPLD = 0.0, 4.0, 6.0, 8.0, 10.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 30.0, 32.0, 34.0, 36.0, -100.0, -100.0, -100.0, -100.0, + CLLD = -0.056782, 0.176206, 0.28103, 0.395085, 0.505416, 0.609138, 0.658895, 0.709463, 0.760166, 0.810948, 0.859611, 0.908241, 0.933666, 0.958067, 0.972702, 0.954969, 0.93792, 0.936314, 0.931608, 0.943601, 0.956648, 0.984358, 0.988573, 0.980125, 0.962508, 0.942321, 0.0, 0.0, 0.0, 0.0, + CDLD = 0.031664, 0.025258, 0.026053, 0.029529, 0.036235, 0.045467, 0.051257, 0.057003, 0.063994, 0.070955, 0.080059, 0.089179, 0.11585, 0.142313, 0.16197, 0.176325, 0.196659, 0.213941, 0.229069, 0.247171, 0.268876, 0.297378, 0.346767, 0.400762, 0.442503, 0.483076, 0.0, 0.0, 0.0, 0.0, + INTHLD = 2, + VELLD = 0.0, 50.0, 100.0, 150.0, 200.0, 250.0, 300.0, 350.0, 400.0, 450.0, + THRLD = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + THDRY = 0.0, + APRHGT = 1500.0, + APRANG = -3.0, + FLDCL = 1.8246, + FLDCD = 1.8246, + TDSINK = 0.0, + VANGLD = 3.0, + NOFLAR = 0, + TISPOL = 2.0, + TICUT = 3.0, + TIBRAK = 4.0, + ACCLIM = 16.0, + MAGRUP = 0, + + ! NOPRO = 1, + ! NOISE = 1, + ! MAPCAL = 1, + / + &PROIN + NPOL = 1, + + ALPRO = 0.0, 4.0, 6.0, 8.0, 10.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 30.0, 32.0, 34.0, 36.0, -100.0, -100.0, -100.0, -100.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + + CLPRO = -0.056782, 0.176206, 0.28103, 0.395085, 0.505416, 0.609138, 0.658895, 0.709463, 0.760166, 0.810948, 0.859611, 0.908241, 0.933666, 0.958067, 0.972702, 0.954969, 0.93792, 0.936314, 0.931608, 0.943601, 0.956648, 0.984358, 0.988573, 0.980125, 0.962508, 0.942321, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + + CDPRO = 0.031664, 0.025258, 0.026053, 0.029529, 0.036235, 0.045467, 0.051257, 0.057003, 0.063994, 0.070955, 0.080059, 0.089179, 0.11585, 0.142313, 0.16197, 0.176325, 0.196659, 0.213941, 0.229069, 0.247171, 0.268876, 0.297378, 0.346767, 0.400762, 0.442503, 0.483076, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + + DFLAP = 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, + + NTIME = 1, + IPCMAX = 1, + KEAS = 0, + TXF = -1.0, + ALPMIN = 0.0, + GAMLIM = 0.0, + INM = 0, + IATR = 0, + FLAPID = "TOFF ", "FlapID", "FlapID", "FlapID", "FlapID", "FlapID", "FlapID", "FlapID", "FlapID", "FlapID", + + SPRATE = 0.10, + ! NPFILE = 0, + / + &SEGIN + KEY = 'ROTATE', + NFLAP = 1, + IFIX = 1, + ENGSCL = 0.0, + AFIX = 0.0, + GFIX = 0.0, + VFIX = 0.0, + HSTOP = 0.0, + DSTOP = 0.0, + TSTOP = 0.0, + VSTOP = 0.0, + HMIN = 0.0, + SPRATE = 0.1, + IPLR = 0, + NOYCAL = 0, + DELT = 1.0, + GRDAEO = 2.29061, + GRDOEO = 0.0, + / + &SEGIN + KEY = 'LIFTOFF', + NFLAP = 1, + IFIX = 1, + ENGSCL = 0.0, + AFIX = 0.0, + GFIX = 0.0, + VFIX = 0.0, + HSTOP = 0.0, + DSTOP = 0.0, + TSTOP = 0.0, + VSTOP = 0.0, + HMIN = 0.0, + SPRATE = 0.1, + IPLR = 0, + NOYCAL = 0, + DELT = 1.0, + GRDAEO = 2.29061, + GRDOEO = 0.0, + / + &SEGIN + KEY = 'OBSTACLE', + NFLAP = 1, + IFIX = 1, + ENGSCL = 0.0, + AFIX = 0.0, + GFIX = 0.0, + VFIX = 0.0, + HSTOP = 0.0, + DSTOP = 0.0, + TSTOP = 0.0, + VSTOP = 0.0, + HMIN = 0.0, + SPRATE = 0.1, + IPLR = 0, + NOYCAL = 0, + DELT = 1.0, + GRDAEO = 2.29061, + GRDOEO = 0.0, + / + &SEGIN + KEY = 'CHANGE', + NFLAP = 1, + IFIX = 1, + ENGSCL = 0.0, + AFIX = 0.0, + GFIX = 0.0, + VFIX = 0.0, + HSTOP = 0.0, + DSTOP = 18000.0, + TSTOP = 0.0, + VSTOP = 0.0, + HMIN = 0.0, + SPRATE = 0.1, + IPLR = 0, + NOYCAL = 0, + DELT = 1.0, + GRDAEO = 2.29061, + GRDOEO = 0.0, + / + &SEGIN + KEY = 'CUTBACK', + NFLAP = 1, + IFIX = 1, + ENGSCL = 0.0, + AFIX = 0.0, + GFIX = 0.0, + VFIX = 0.0, + HSTOP = 0.0, + DSTOP = 0.0, + TSTOP = 0.0, + VSTOP = 0.0, + HMIN = 0.0, + SPRATE = 0.1, + IPLR = 0, + NOYCAL = 0, + DELT = 1.0, + GRDAEO = 2.29061, + GRDOEO = 0.0, + / + &SEGIN + KEY = 'CHANGE', + NFLAP = 1, + IFIX = 1, + ENGSCL = 0.0, + AFIX = 0.0, + GFIX = 0.0, + VFIX = 0.0, + HSTOP = 0.0, + DSTOP = 28000.0, + TSTOP = 0.0, + VSTOP = 0.0, + HMIN = 0.0, + SPRATE = 0.1, + IPLR = 0, + NOYCAL = 0, + DELT = 1.0, + GRDAEO = 2.29061, + GRDOEO = 0.0, + / + &SEGIN + KEY = 'LAST', + NFLAP = 1, + IFIX = 1, + ENGSCL = 0.95, + AFIX = 0.0, + GFIX = 0.0, + VFIX = 0.0, + HSTOP = 0.0, + DSTOP = 50000.0, + TSTOP = 0.0, + VSTOP = 0.0, + HMIN = 0.0, + SPRATE = 0.1, + IPLR = 0, + NOYCAL = 0, + DELT = 1.0, + GRDAEO = 2.29061, + GRDOEO = 0.0, + / + &SYNTIN + IG = 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + DESRNG = 7500.0, + VAPPR = 150.0, + FLTO = 9900.0, + FLLDG = 9900.0, + EXFCAP = 0.0, + CDTMAX = 99999.0, + CDPMAX = 99999.0, + VJMAX = 99999.0, + STMIN = 1.0, + ARMAX = 99999.0, + GNOX = 0.0, + ROCLIM = 100.0, + DHDTLM = 100.0, + TMGLIM = 0.1, + + IBFGS = 1, + ITFINE = 0, + NDD = 4, + RK = 0.0, + FDD = 0.2, + NLIN = 4, + NSTEP = 20, + EF = 3.0, + EPS = 0.0020, + AMULT = 1.2, + DEP = 0.0010, + ACCUX = 1.0E-5, + GLM = 0.0020, + + GFACT = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + AUTSCL = 1.0, + ICENT = 0, + + RHOMIN = 0.0, + RHOMAX = 300.0, + RHODEL = 0.0, + ITMAX = 30, + JPRNT = 2, + RDFUN = 0.01, + ADFUN = 0.0010, + + JVKC = 0, + EMOVE = 5.00E-2, + FDELT = 0.0, + FDMIN = 0.0, + NSCALE = 98765, + ISDRST = 0, + IGRAD = 0, + / + &RERUN + DESRNG = 3000.0, + MYWTS = 1, + ! RAMPWT = 637866.2, + ! DOWE = 314628.9, + ! PAYLOD = 62700.0, + ! FUEMAX = 260537.3, + ITAKOF = 1, + ILAND = 1, + NOPRO = 1, + NOISE = 0, + ICOST = 0, + WSR = 0.0, + TWR = 0.0, + / + &MISSIN + IRW = 1, + MSUMPT = 1, + IFLAG = 2, + + FACT = 1.0, + FLEAK = 0.0, + FCDO = 1.0, + FCDI = 1.0, + FCDSUB = 1.0, + FCDSUP = 1.0, + + INDR = 0, + ISKAL = 1, + OWFACT = 1.0, + DTC = 0.0, + RTOL = 0.0010, + NHOLD = 0, + IATA = 0, + TLWIND = 0.0, + NPCON = 0, + DWT = 1.0, + OFFDR = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + IDOQ = 0, + + NSOUT = 0, + NSADJ = 0, + MIRROR = 0, + + STMA = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + CDST = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ISTCL = 0, 0, 0, 0, + ISTCR = 0, 0, 0, 0, 0, 0, + ISTDE = 0, + + MYWTS = 1, + ! RAMPWT = 631389.1, + ! DOWE = 309088.2, + ! PAYLOD = 62700.0, + ! FUEMAX = 259600.9, + + TAKOTM = 2.0, + TAXOTM = 9.0, + APPRTM = 4.0, + APPFFF = 2.0, + TAXITM = 5.0, + ITTFF = 1, + TAKOFF = 0.0, + TXFUFL = 0.0, + + XNZ = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + XCL = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + XMACH = 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + + NCLIMB = 1, + CLMMIN = 0.3, 0.3, 0.3, 0.3, + CLMMAX = 0.0, 0.0, 0.0, 0.0, + CLAMIN = 0.0, 0.0, 0.0, 0.0, + CLAMAX = 0.0, 0.0, 0.0, 0.0, + NINCL = 31, 31, 31, 31, + FWF = -0.0010, -0.0010, -0.0010, -0.0010, + NCRCL = 1, 1, 1, 1, + CLDCD = 0.0, 0.0, 0.0, 0.0, + IPPCL = 1, 1, 1, 1, + MAXCL = 1, 1, 1, 1, + + ! Input Climb Schedules + NO = 0, 0, 0, 0, + ACTAB = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + VCTAB = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + + IFAACL = 1, + IFAADE = -1, + NODIVE = 0, + DIVLIM = 0.0, + QLIM = 0.0, + SPDLIM = 0.0, + NQL = 0, + QLALT = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + VQLM = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + + NCRUSE = 3, + IOC = 1, 4, 4, 1, 1, 1, + CRMACH = 0.85, 0.6, 0.0, 0.0, 0.0, 0.0, + CRALT = 45000.0, 25000.0, 1500.0, -1.0, -1.0, -1.0, + CRDCD = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + FLRCR = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + CRMMIN = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + CRCLMX = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + HPMIN = 1000.0, 1000.0, 1000.0, 1000.0, 1000.0, 1000.0, + FFUEL = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + FNOX = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + IFEATH = 0, 0, 0, 0, 0, 0, + FEATHF = 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, + CDFETH = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + DCWT = 1000.0, + RCIN = 300.0, + + WTBM = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ALTBM = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + + IVS = 1, + DECL = 0.8, + DEMMIN = 0.3, + DEMMAX = 0.0, + DEAMIN = 0.0, + DEAMAX = 0.0, + NINDE = 31, + DEDCD = 0.0, + RDLIM = -99999.0, + + NS = 0, + ADTAB = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + VDTAB = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + + IRS = 1, + RESRFU = 0.0, + RESTRP = 0.05, + TIMMAP = 2.0, + ALTRAN = 200.0, + NCLRES = 1, + NCRRES = 2, + SREMCH = -1.0, + EREMCH = -1.0, + SREALT = -1.0, + EREALT = -1.0, + HOLDTM = 30.0, + NCRHOL = 3, + IHOPOS = 1, + ICRON = 0, + THOLD = 0.1, + NCRTH = 1, + + REARTH = 20890000., + IRADAC = 0, + / +START 0 0 0.100 0.000 0.00000 0.0 0.000000 0.0 +CLIMB 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +CRUISE 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +DESCENT0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.100 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 +END 0 0 0.000 0.000 0.00000 0.0 0.000000 0.0 diff --git a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py new file mode 100644 index 0000000000..6470a6f4d5 --- /dev/null +++ b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py @@ -0,0 +1,438 @@ +import numpy as np + +from aviary.utils.aviary_values import AviaryValues +from aviary.utils.functions import get_path +from aviary.variable_info.enums import AircraftTypes, EquationsOfMotion, LegacyCode +from aviary.variable_info.variables import Aircraft, Mission, Settings + +BWB300FLOPS = {} +inputs = BWB300FLOPS['inputs'] = AviaryValues() +outputs = BWB300FLOPS['outputs'] = AviaryValues() + +# Overall Aircraft +# --------------------------- +inputs.set_val(Aircraft.Design.BASE_AREA, 0.0, 'ft**2') # SBASE +inputs.set_val(Aircraft.Design.EMPTY_MASS_MARGIN_SCALER, 0.0) # EWMARG +inputs.set_val( + Mission.Design.GROSS_MASS, 600000.0, 'lbm' +) # DGW, value taken from GW which is not in Aviary +inputs.set_val(Mission.Design.LIFT_COEFFICIENT, -1.0) # FCLDES +inputs.set_val(Mission.Design.MACH, -1) # FMDES +inputs.set_val(Aircraft.Design.USE_ALT_MASS, False) +inputs.set_val(Aircraft.Design.LIFT_DEPENDENT_DRAG_COEFF_FACTOR, 1.0) # FCDI +inputs.set_val(Aircraft.Design.SUBSONIC_DRAG_COEFF_FACTOR, 1.0) # FCDSUB +inputs.set_val(Aircraft.Design.SUPERSONIC_DRAG_COEFF_FACTOR, 1.0) # FCDSUP +inputs.set_val(Aircraft.Design.ZERO_LIFT_DRAG_COEFF_FACTOR, 1.0) # FCDO +inputs.set_val(Aircraft.Design.TYPE, AircraftTypes.BLENDED_WING_BODY) +inputs.set_val(Aircraft.Fuselage.SIMPLE_LAYOUT, False) +inputs.set_val(Aircraft.BWB.DETAILED_WING_PROVIDED, True) + +# Air Conditioning +# --------------------------- +inputs.set_val(Aircraft.AirConditioning.MASS_SCALER, 1.0) # WAC + +# Anti-Icing +# --------------------------- +inputs.set_val(Aircraft.AntiIcing.MASS_SCALER, 1.0) # WAI + +# APU +# --------------------------- +inputs.set_val(Aircraft.APU.MASS_SCALER, 1.0) # WAPU + +# Avionics +# --------------------------- +inputs.set_val(Aircraft.Avionics.MASS_SCALER, 1.0) # WAVONC + +# Canard +# --------------------------- +inputs.set_val(Aircraft.Canard.AREA, 0.0, 'ft**2') # SCAN +inputs.set_val(Aircraft.Canard.ASPECT_RATIO, 0.0) # ARCAN +inputs.set_val(Aircraft.Canard.THICKNESS_TO_CHORD, 0.0) # TCCAN +inputs.set_val(Aircraft.Canard.LAMINAR_FLOW_LOWER, 0.0) # TRLC +inputs.set_val(Aircraft.Canard.LAMINAR_FLOW_UPPER, 0.0) # TRUC +inputs.set_val(Aircraft.Canard.MASS_SCALER, 1.0) # FRCAN +inputs.set_val(Aircraft.Canard.TAPER_RATIO, 0.0) # TRCAN +inputs.set_val(Aircraft.Canard.WETTED_AREA_SCALER, 1.0) # SWETC + +# Crew and Payload +# --------------------------- +inputs.set_val(Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS, 76) # NPB +inputs.set_val(Aircraft.CrewPayload.Design.NUM_FIRST_CLASS, 24) # NPF +inputs.set_val(Aircraft.CrewPayload.Design.NUM_ECONOMY_CLASS, 200) # NPT +inputs.set_val(Aircraft.CrewPayload.NUM_BUSINESS_CLASS, 76) # NPB +inputs.set_val(Aircraft.CrewPayload.NUM_FIRST_CLASS, 24) # NPF +inputs.set_val(Aircraft.CrewPayload.NUM_ECONOMY_CLASS, 200) # NPT +inputs.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_BUSINESS, 0) # NBABR +inputs.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_FIRST, 0) # NFABR +inputs.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 0) # NTABR +inputs.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_BUSINESS, 0.0, 'inch') # BPITCH +inputs.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST, 0.0, 'inch') # FPITCH +inputs.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 0.0, 'inch') # TPITCH + +inputs.set_val(Aircraft.CrewPayload.CARGO_CONTAINER_MASS_SCALER, 1.0) # WCON +inputs.set_val(Aircraft.CrewPayload.CARGO_CONTAINER_MASS, 23500.0, 'lbm') # WCON +inputs.set_val(Aircraft.CrewPayload.NUM_FLIGHT_ATTENDANTS, -1) # NSTU +inputs.set_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW, 2) # NFLCR +inputs.set_val(Aircraft.CrewPayload.FLIGHT_CREW_MASS_SCALER, 1.0) # WFLCRB +inputs.set_val(Aircraft.CrewPayload.NUM_GALLEY_CREW, -1) # NGALC +inputs.set_val(Aircraft.CrewPayload.MISC_CARGO, 0.0, 'lbm') # CARGOF +inputs.set_val(Aircraft.CrewPayload.CABIN_CREW_MASS_SCALER, 1.0) # WSTUAB +inputs.set_val(Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_SCALER, 1.0) # WSRV +inputs.set_val(Aircraft.CrewPayload.MASS_PER_PASSENGER, 165.0, 'lbm') # WPPASS +inputs.set_val(Aircraft.CrewPayload.WING_CARGO, 0.0, 'lbm') # CARGOW +inputs.set_val( + Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER, 44.0, 'lbm' +) # BPP, value taken from FLOPS run + +# Electrical +# --------------------------- +inputs.set_val(Aircraft.Electrical.MASS_SCALER, 1.0) # WELEC + +# Fins +# --------------------------- +inputs.set_val(Aircraft.Fins.AREA, 184.89, 'ft**2') # SFIN +inputs.set_val(Aircraft.Fins.NUM_FINS, 2) # NFIN +inputs.set_val(Aircraft.Fins.TAPER_RATIO, 0.464) # TRFIN +inputs.set_val(Aircraft.Fins.MASS_SCALER, 1.0) # FRFIN + +# Fuel +# --------------------------- +inputs.set_val(Aircraft.Fuel.AUXILIARY_FUEL_CAPACITY, 0.0, 'lbm') # FULAUX +inputs.set_val(Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER, 1.0) # WFSYS +inputs.set_val(Aircraft.Fuel.FUSELAGE_FUEL_CAPACITY, 0.0, 'lbm') # FULFMX +inputs.set_val(Aircraft.Fuel.NUM_TANKS, 7) # NTANK +inputs.set_val(Aircraft.Fuel.UNUSABLE_FUEL_MASS_SCALER, 1.0) # WUF +inputs.set_val(Aircraft.Fuel.IGNORE_FUEL_CAPACITY_CONSTRAINT, False) # IFUFU +inputs.set_val(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6883549569366508, 'unitless') +inputs.set_val(Aircraft.Fuel.WING_REF_CAPACITY, 0.0, 'lbm') # FUELRF +inputs.set_val(Aircraft.Fuel.WING_REF_CAPACITY_AREA, -1) # FSWREF +inputs.set_val(Aircraft.Fuel.WING_REF_CAPACITY_TERM_A, 0.0) # FUSCLA +inputs.set_val(Aircraft.Fuel.WING_REF_CAPACITY_TERM_B, 0.0) # FUSCLB + + +# Furnishings +# --------------------------- +inputs.set_val(Aircraft.Furnishings.MASS_SCALER, 1.118) # WFURN + +# Fuselage +# --------------------------- +inputs.set_val(Aircraft.Fuselage.NUM_FUSELAGES, 1) # NFUSE +inputs.set_val(Aircraft.Fuselage.MILITARY_CARGO_FLOOR, False) # CARGF +inputs.set_val(Aircraft.Fuselage.MASS_SCALER, 1.0) # FRFU +inputs.set_val(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, 60.0, 'deg') # SWPLE +inputs.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, 0.1792) # TCF +inputs.set_val(Aircraft.Fuselage.WETTED_AREA_SCALER, 1.0) # SWETF +inputs.set_val(Aircraft.Fuselage.LAMINAR_FLOW_LOWER, 0.0) # TRLB +inputs.set_val(Aircraft.Fuselage.LAMINAR_FLOW_UPPER, 0.0) # TRUB + +# Horizontal Tail +# --------------------------- +inputs.set_val(Aircraft.HorizontalTail.AREA, 700.0, 'ft**2') # SHT +inputs.set_val(Aircraft.HorizontalTail.ASPECT_RATIO, 1.0) # ARHT +inputs.set_val(Aircraft.HorizontalTail.TAPER_RATIO, 0.7140) # TRHT +inputs.set_val(Aircraft.HorizontalTail.THICKNESS_TO_CHORD, 0.1) # TCHT +inputs.set_val(Aircraft.HorizontalTail.VERTICAL_TAIL_FRACTION, -100.0) # HHT +inputs.set_val(Aircraft.HorizontalTail.MASS_SCALER, 1.0) # FRHT +inputs.set_val(Aircraft.HorizontalTail.NUM_TAILS, 1) +inputs.set_val(Aircraft.HorizontalTail.WETTED_AREA_SCALER, 1.0) # SWETH +inputs.set_val(Aircraft.HorizontalTail.SWEEP, 0.0, 'deg') # SWPHT +inputs.set_val(Aircraft.HorizontalTail.LAMINAR_FLOW_LOWER, 0.0) # TRLH +inputs.set_val(Aircraft.HorizontalTail.LAMINAR_FLOW_UPPER, 0.0) # TRUH + +# Hydraulics +# --------------------------- +inputs.set_val(Aircraft.Hydraulics.SYSTEM_PRESSURE, 3000.0, 'psi') # HYDPR +inputs.set_val(Aircraft.Hydraulics.MASS_SCALER, 1.0) # WHYD + +# Instruments +# --------------------------- +inputs.set_val(Aircraft.Instruments.MASS_SCALER, 1.0) # WIN + +# Landing Gear +# --------------------------- +inputs.set_val(Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, 85.0, 'inch') # XMLG +inputs.set_val(Aircraft.LandingGear.MAIN_GEAR_MASS_SCALER, 1.0) # FRLGM +inputs.set_val(Aircraft.LandingGear.NOSE_GEAR_OLEO_LENGTH, 87.0, 'inch') # XNLG +inputs.set_val(Aircraft.LandingGear.NOSE_GEAR_MASS_SCALER, 1.0) # FRLGN + +# Nacelle +# --------------------------- +inputs.set_val(Aircraft.Nacelle.AVG_DIAMETER, 12.569, 'ft') # DNAC +inputs.set_val(Aircraft.Nacelle.AVG_LENGTH, 17.297, 'ft') # XNAC +inputs.set_val(Aircraft.Nacelle.MASS_SCALER, 0.0) # FRNA +inputs.set_val(Aircraft.Nacelle.WETTED_AREA_SCALER, 1.0) # SWETN +inputs.set_val(Aircraft.Nacelle.LAMINAR_FLOW_LOWER, 0.0) # TRLN +inputs.set_val(Aircraft.Nacelle.LAMINAR_FLOW_UPPER, 0.0) # TRUN + +# Paint +# --------------------------- +inputs.set_val(Aircraft.Paint.MASS_PER_UNIT_AREA, 0.0, 'lbm/ft**2') # WPAINT + +# Propulsion and Engine +# --------------------------- +inputs.set_val(Aircraft.Propulsion.ENGINE_OIL_MASS_SCALER, 1.0) # WOIL +inputs.set_val(Aircraft.Propulsion.MISC_MASS_SCALER, 0.0) # WPMSC + +filename = get_path('models/engines/PAX300_baseline_ENGDEK.csv') +inputs.set_val(Aircraft.Engine.DATA_FILE, filename) +inputs.set_val(Aircraft.Engine.REFERENCE_MASS, 22089.3, 'lbm') # WENG +inputs.set_val(Aircraft.Engine.SCALED_SLS_THRUST, 87500.0, 'lbf') # THRUST +inputs.set_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 86786.4, 'lbf') # THRSO +inputs.set_val(Aircraft.Engine.NUM_FUSELAGE_ENGINES, 2) # NEF +inputs.set_val(Aircraft.Engine.NUM_WING_ENGINES, np.array([0])) # NEW +inputs.set_val(Aircraft.Engine.THRUST_REVERSERS_MASS_SCALER, 0.0) # WTHR +inputs.set_val(Aircraft.Engine.WING_LOCATIONS, np.array([0.2])) # ETAE +inputs.set_val(Aircraft.Engine.SCALE_FACTOR, 1.0082224864725349) # THRUST/THRSO +inputs.set_val(Aircraft.Engine.SCALE_MASS, True) +inputs.set_val(Aircraft.Engine.MASS_SCALER, 1.0) # EEXP +inputs.set_val(Aircraft.Engine.SCALE_PERFORMANCE, True) +inputs.set_val(Aircraft.Engine.SUBSONIC_FUEL_FLOW_SCALER, 1.0) # FFFSUB +inputs.set_val(Aircraft.Engine.SUPERSONIC_FUEL_FLOW_SCALER, 1.0) # FFFSUP +inputs.set_val(Aircraft.Engine.FUEL_FLOW_SCALER_CONSTANT_TERM, 0.0) # DFFAC +inputs.set_val(Aircraft.Engine.FUEL_FLOW_SCALER_LINEAR_TERM, 0.0) # FFFAC +inputs.set_val(Aircraft.Engine.CONSTANT_FUEL_CONSUMPTION, 0.0, units='lbm/h') # FLEAK +inputs.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.0) # WPMISC +inputs.set_val(Aircraft.Engine.GENERATE_FLIGHT_IDLE, True) # IDLE +inputs.set_val(Aircraft.Engine.IGNORE_NEGATIVE_THRUST, False) # NONEG +inputs.set_val(Aircraft.Engine.FLIGHT_IDLE_THRUST_FRACTION, 0.0) +inputs.set_val(Aircraft.Engine.FLIGHT_IDLE_MAX_FRACTION, 1.0) # FIDMAX +inputs.set_val(Aircraft.Engine.FLIGHT_IDLE_MIN_FRACTION, 0.08) # FIDMIN +inputs.set_val(Aircraft.Engine.GEOPOTENTIAL_ALT, False) # IGEO +inputs.set_val(Aircraft.Engine.INTERPOLATION_METHOD, 'slinear') + +# Vertical Tail +# --------------------------- +inputs.set_val(Aircraft.VerticalTail.NUM_TAILS, 0) # NVERT +inputs.set_val(Aircraft.VerticalTail.AREA, 0.0, 'ft**2') # SVT +inputs.set_val(Aircraft.VerticalTail.ASPECT_RATIO, 0.5) # ARVT +inputs.set_val(Aircraft.VerticalTail.TAPER_RATIO, 0.714) # TRVT +inputs.set_val(Aircraft.VerticalTail.THICKNESS_TO_CHORD, 0.11) # TCVT +inputs.set_val(Aircraft.VerticalTail.MASS_SCALER, 1.0) # FRVT +inputs.set_val(Aircraft.VerticalTail.WETTED_AREA_SCALER, 1.0) # SWETV +inputs.set_val(Aircraft.VerticalTail.WETTED_AREA, 125.0, 'ft**2') # SWETV +inputs.set_val(Aircraft.VerticalTail.SWEEP, 0.0, 'deg') # SWPVT +inputs.set_val(Aircraft.VerticalTail.LAMINAR_FLOW_LOWER, 0.0) # TRLV +inputs.set_val(Aircraft.VerticalTail.LAMINAR_FLOW_UPPER, 0.0) # TRUV + +# Wing +# --------------------------- +inputs.set_val(Aircraft.Wing.AEROELASTIC_TAILORING_FACTOR, 0.0) # FAERT +inputs.set_val(Aircraft.Wing.AIRFOIL_TECHNOLOGY, 2.0) # AITEK +inputs.set_val(Aircraft.Wing.BENDING_MATERIAL_MASS_SCALER, 1.0) # FRWI1 +inputs.set_val(Aircraft.Wing.SPAN, 186.631829293424, 'ft') # SPAN +inputs.set_val(Aircraft.Wing.LOAD_FRACTION, 1.0) # PCTL + +inputs.set_val( + Aircraft.Wing.CHORD_PER_SEMISPAN_DIST, + np.array([-1.0, 48.25, 33.20, 18.97, 14.19, 10.20, 3.220]), +) # CHD +inputs.set_val(Aircraft.Wing.COMPOSITE_FRACTION, 0.85) # FCOMP +inputs.set_val(Aircraft.Wing.CONTROL_SURFACE_AREA_RATIO, 0.3) # FLAPR +inputs.set_val(Aircraft.Wing.DETAILED_WING, True) +inputs.set_val( + Aircraft.Wing.GLOVE_AND_BAT, 1230.5, 'ft**2' +) # GLOV, it was 0.0 as input and computed + +inputs.set_val( + Aircraft.Wing.INPUT_STATION_DIST, + np.array([0.0, 0.0, 0.2075, 0.415, 0.6927, 0.928, 1.0]), # ETAW +) + +inputs.set_val(Aircraft.Wing.LOAD_DISTRIBUTION_CONTROL, 2.0) # PDIST + +inputs.set_val( + Aircraft.Wing.LOAD_PATH_SWEEP_DIST, + np.array([0.0, 0.0, 0.0, 17.0, 17.0, 17.0]), + 'deg', # SWL +) +inputs.set_val(Aircraft.Wing.MAX_CAMBER_AT_70_SEMISPAN, 2.0) # CAM +inputs.set_val(Aircraft.Wing.MISC_MASS_SCALER, 1.0) # FRWI3 +inputs.set_val(Aircraft.Wing.NUM_INTEGRATION_STATIONS, 50) # NSTD +inputs.set_val(Aircraft.Wing.SHEAR_CONTROL_MASS_SCALER, 1.0) # FRWI2 +inputs.set_val(Aircraft.Wing.OUTBOARD_SEMISPAN, 68.43, 'ft') # OSSPAN +inputs.set_val(Aircraft.Wing.SPAN_EFFICIENCY_REDUCTION, False) # MIKE +inputs.set_val(Aircraft.Wing.STRUT_BRACING_FACTOR, 0.0) # FSTRT +inputs.set_val(Aircraft.Wing.SURFACE_CONTROL_MASS_SCALER, 1.0) # FRSC +inputs.set_val(Aircraft.Wing.SWEEP, 35.7, 'deg') # SWEEP +inputs.set_val(Aircraft.Wing.TAPER_RATIO, 0.311) # TR +inputs.set_val(Aircraft.Wing.THICKNESS_TO_CHORD, 0.11) # TCA +inputs.set_val(Aircraft.Wing.THICKNESS_TO_CHORD_REFERENCE, 0.0) # TCREF + +inputs.set_val( + Aircraft.Wing.THICKNESS_TO_CHORD_DIST, + np.array([-1.0, 0.125, 0.125, 0.076, 0.076, 0.076, 0.06]), # TOC +) +inputs.set_val(Aircraft.Wing.ULTIMATE_LOAD_FACTOR, 3.75) # ULF +inputs.set_val(Aircraft.Wing.VAR_SWEEP_MASS_PENALTY, 0.0) # VARSWP +inputs.set_val(Aircraft.Wing.MASS_SCALER, 1.0) # FRWI +inputs.set_val( + Aircraft.Wing.WETTED_AREA_SCALER, 0.61 +) # SWETW was 1.0, changed to match the AERO from old version of FLOPS +inputs.set_val(Aircraft.Wing.DIHEDRAL, 3.0, 'deg') # DIH +inputs.set_val(Aircraft.Wing.SPAN_EFFICIENCY_FACTOR, 1.0) # E +inputs.set_val(Aircraft.Wing.LAMINAR_FLOW_LOWER, 0.0) # TRLW +inputs.set_val(Aircraft.Wing.LAMINAR_FLOW_UPPER, 0.0) # TRUW +inputs.set_val(Aircraft.Wing.ASPECT_RATIO_REFERENCE, 0.0) # ARREF + +# Mission +# --------------------------- +inputs.set_val(Mission.Summary.CRUISE_MACH, 0.85) # VCMN +inputs.set_val(Mission.Summary.FUEL_FLOW_SCALER, 1.0) # FACT +inputs.set_val(Mission.Design.RANGE, 7500.0, 'NM') # DESRNG +inputs.set_val(Mission.Constraints.MAX_MACH, 0.9) # VMMO + +inputs.set_val(Mission.Landing.LIFT_COEFFICIENT_MAX, 3.0) # CLLDM +inputs.set_val(Mission.Takeoff.LIFT_COEFFICIENT_MAX, 1.3) # CLTOM +inputs.set_val(Aircraft.Design.LANDING_TO_TAKEOFF_MASS_RATIO, 0.7) # WRATIO +inputs.set_val(Mission.Landing.INITIAL_VELOCITY, 150.0, 'ft/s') # VAPPR +inputs.set_val(Mission.Takeoff.ROLLING_FRICTION_COEFFICIENT, 0.025) # ROLLMU +inputs.set_val(Mission.Design.THRUST_TAKEOFF_PER_ENG, 0.0, 'lbf') # THROFF +inputs.set_val(Mission.Takeoff.ANGLE_OF_ATTACK_RUNWAY, 4.0, 'deg') # ALPRUN +inputs.set_val(Mission.Takeoff.THRUST_INCIDENCE, 4.0, 'deg') # TINC +inputs.set_val(Mission.Takeoff.BRAKING_FRICTION_COEFFICIENT, 0.35) # BRAKMU +inputs.set_val(Aircraft.LandingGear.DRAG_COEFFICIENT, 0.005) # CDGEAR +inputs.set_val(Mission.Takeoff.SPOILER_LIFT_COEFFICIENT, 0.0) # CLSPOL +inputs.set_val(Mission.Takeoff.SPOILER_DRAG_COEFFICIENT, 0.0) # CDSPOL +inputs.set_val(Mission.Takeoff.DRAG_COEFFICIENT_MIN, 0.035258) # CDMTO +inputs.set_val(Mission.Takeoff.FINAL_ALTITUDE, 35.0, 'ft') # OBSTO +inputs.set_val(Mission.Landing.DRAG_COEFFICIENT_MIN, 0.0) # CDMLD +inputs.set_val(Mission.Landing.FLARE_RATE, 3.0, 'deg/s') # VANGLD + +# Settings +# --------------------------- +inputs.set_val(Settings.EQUATIONS_OF_MOTION, EquationsOfMotion.HEIGHT_ENERGY) +inputs.set_val(Settings.MASS_METHOD, LegacyCode.FLOPS) +inputs.set_val(Settings.AERODYNAMICS_METHOD, LegacyCode.FLOPS) + +# --------------------------- +# OUTPUTS +# --------------------------- + +outputs.set_val(Aircraft.Design.EMPTY_MASS, 286969.99768419, 'lbm') +outputs.set_val(Aircraft.Design.EMPTY_MASS_MARGIN, 0.0, 'lbm') # WMARG +outputs.set_val(Aircraft.Design.STRUCTURE_MASS, 162969.90469722, 'lbm') # WSTRCT 158921.83401643133 +outputs.set_val(Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS, 75801.466406974854, 'lbm') # WSYS +outputs.set_val(Aircraft.Design.TOTAL_WETTED_AREA, 19637.79833526, 'ft**2') # TWET +outputs.set_val(Aircraft.Design.TOUCHDOWN_MASS, 420000.0, 'lbm') # WLDG = GW*WRATIO + +outputs.set_val(Aircraft.AirConditioning.MASS, 3781.61256774, 'lbm') # WAC +outputs.set_val(Aircraft.AntiIcing.MASS, 400.3921819029477, 'lbm') # WAI +outputs.set_val(Aircraft.APU.MASS, 1578.8098560285962, 'lbm') # WAPU +outputs.set_val(Aircraft.Avionics.MASS, 2280.13561342, 'lbm') # WAVONC + +outputs.set_val(Aircraft.BWB.NUM_BAYS, 4.0, 'unitless') # NBAY +outputs.set_val(Aircraft.Canard.CHARACTERISTIC_LENGTH, 0.0, 'ft') # EL[-1] +outputs.set_val(Aircraft.Canard.FINENESS, 0.0) # FR[-1] +outputs.set_val(Aircraft.Canard.WETTED_AREA, 0.0, 'ft**2') # SWTCN +outputs.set_val(Aircraft.Canard.MASS, 0.0, 'lbm') # WCAN + +outputs.set_val(Aircraft.CrewPayload.BAGGAGE_MASS, 13200.0, 'lbm') # WPBAG +outputs.set_val(Aircraft.CrewPayload.CARGO_MASS, 0.0, 'lbm') # WCARGO +outputs.set_val(Aircraft.CrewPayload.FLIGHT_CREW_MASS, 450.0, 'lbm') # WFLCRB +outputs.set_val(Aircraft.CrewPayload.CABIN_CREW_MASS, 1640.0, 'lbm') # WSTUAB +outputs.set_val(Aircraft.CrewPayload.PASSENGER_SERVICE_MASS, 7029.593528180887, 'lbm') # WSRV +outputs.set_val(Aircraft.CrewPayload.PASSENGER_MASS_TOTAL, 49500.0, 'lbm') # WPASS +outputs.set_val(Aircraft.CrewPayload.TOTAL_PAYLOAD_MASS, 62700.0, 'lbm') # WPASS+WPBAG+WCARGO +outputs.set_val(Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS, 62700.0, 'lbm') # WPASS+WPBAG + +outputs.set_val(Aircraft.Electrical.MASS, 2646.5272348061812, 'lbm') # WELEC + +outputs.set_val(Aircraft.Fuel.TOTAL_CAPACITY, 787493.65267017565, 'lbm') # FMXTOT +outputs.set_val(Aircraft.Fuel.FUEL_SYSTEM_MASS, 3656.7260445688612, 'lbm') # WFSYS +outputs.set_val(Aircraft.Fuel.UNUSABLE_FUEL_MASS, 1732.78186198, 'lbm') # WUF +outputs.set_val(Aircraft.Fuel.WING_FUEL_CAPACITY, 787493.65267018, 'lbm') # FULWMX + +outputs.set_val(Aircraft.Fins.MASS, 2822.1415450307886, 'lbm') # WFIN +outputs.set_val(Aircraft.Furnishings.MASS, 52096.553437128503, 'lbm') # WFURN + +outputs.set_val(Aircraft.Fuselage.CABIN_AREA, 2988.87966179, 'ft**2') # ACABIN +ref_diameter = 35.331132876385297 +outputs.set_val(Aircraft.Fuselage.REF_DIAMETER, ref_diameter, 'ft') # XD +outputs.set_val(Aircraft.Fuselage.CHARACTERISTIC_LENGTH, 116.5760963133181, 'ft') # EL(4) +outputs.set_val(Aircraft.Fuselage.CROSS_SECTION, np.pi * (ref_diameter / 2.0) ** 2.0, 'ft**2') +outputs.set_val(Aircraft.Fuselage.DIAMETER_TO_WING_SPAN, 0.18930926) # DB +outputs.set_val(Aircraft.Fuselage.FINENESS, 3.2995289656062941) # FR(4) +outputs.set_val(Aircraft.Fuselage.LENGTH_TO_DIAMETER, 3.29952897) # BODYLD +outputs.set_val(Aircraft.Fuselage.MASS, 80216.313556241628, 'lbm') # WFUSE +outputs.set_val(Aircraft.Fuselage.MAX_HEIGHT, 20.89043646, 'ft') # DF +outputs.set_val(Aircraft.Fuselage.PLANFORM_AREA, 4269.82808827, 'ft**2') # FPAREA +outputs.set_val(Aircraft.Fuselage.AFTBODY_MASS, 10384.964957095559, 'lbm') # WAFTB +outputs.set_val(Aircraft.Fuselage.LENGTH, 116.57609631, 'ft') # XL +outputs.set_val(Aircraft.Fuselage.MAX_WIDTH, 49.77182929, 'ft') # WF +outputs.set_val(Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH, 81.60326742, 'ft') # XLP + +outputs.set_val(Aircraft.HorizontalTail.CHARACTERISTIC_LENGTH, 26.45751311065, 'ft') # EL(2) +outputs.set_val(Aircraft.HorizontalTail.FINENESS, 0.1) # FR(2) +outputs.set_val(Aircraft.HorizontalTail.MASS, 6444.9988831532046, 'lbm') # WHT +outputs.set_val(Aircraft.HorizontalTail.WETTED_AREA, 983.26501, 'ft**2') # SWTHT + +outputs.set_val(Aircraft.Design.EMPENNAGE_MASS, 3159.3781042368792, 'lbm') + +outputs.set_val(Aircraft.Hydraulics.MASS, 3962.6923427813854, 'lbm') # WHYD + +outputs.set_val(Aircraft.Instruments.MASS, 961.54346235801643, 'lbm') # WIN + +outputs.set_val(Aircraft.LandingGear.MAIN_GEAR_MASS, 28200.322805698346, 'lbm') # WLGM +outputs.set_val(Aircraft.LandingGear.NOSE_GEAR_MASS, 2698.6740002098945, 'lbm') # WLGN +outputs.set_val(Aircraft.LandingGear.TOTAL_MASS, 30898.996805908242, 'lbm') + +outputs.set_val(Aircraft.Nacelle.CHARACTERISTIC_LENGTH, np.array([17.367966592445]), 'ft') # EL(5) +outputs.set_val(Aircraft.Nacelle.FINENESS, np.array([1.3761635770546583])) # FR(5) +outputs.set_val(Aircraft.Nacelle.MASS, 0.0, 'lbm') # WNAC +nacelle_wetted_area = np.array([613.74211034217353]) # SWET(5) +outputs.set_val(Aircraft.Nacelle.WETTED_AREA, nacelle_wetted_area, 'ft**2') +outputs.set_val(Aircraft.Nacelle.TOTAL_WETTED_AREA, 2 * nacelle_wetted_area, 'ft**2') + +outputs.set_val(Aircraft.Paint.MASS, 0.0, 'lbm') # WPAINT, WTPNT + +outputs.set_val(Aircraft.Propulsion.MASS, 48198.583985444384, 'lbm') # WPRO +outputs.set_val(Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, 70000.0 * 3, 'lbf') +outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 3) +outputs.set_val(Aircraft.Propulsion.TOTAL_ENGINE_OIL_MASS, 267.39241429019251, 'lbm') # WOIL +outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 0) +outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES, 2) + +outputs.set_val(Aircraft.Engine.MASS, 44541.857940875525 / 2, 'lbm') # WSP(10, 2) +# In FLOPS BWB, WPOD = 18782.055842810063 because WSTART is scaled by +# WPMSC (Aircraft.Propulsion.MISC_MASS_SCALER) but not in Aviary. +# In Aviary, starter mass and engine controls are scaled later in EngineMiscMass() +# but it does not help for engine POD mass. +# In FLOPS, WSTART = 0.0 for the same reason (WPMSC = 0.0). +outputs.set_val(Aircraft.Engine.POD_MASS, 19307.96319637, 'lbm') # WPOD +# In FLOPS BWB, WEC = 0.0 because WEC is scaled by WPMSC (Aircraft.Propulsion.MISC_MASS_SCALER) +engine_ctrls_mass = 153.81807436 # WEC +outputs.set_val(Aircraft.Engine.ADDITIONAL_MASS, 0.0, 'lbm') # WPMISC +outputs.set_val(Aircraft.Engine.THRUST_REVERSERS_MASS, 0.0, 'lbm') # WTHR +outputs.set_val(Aircraft.Propulsion.TOTAL_STARTER_MASS, 1526.1294678475103, 'lbm') # WSTART +outputs.set_val(Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS, engine_ctrls_mass, 'lbm') +outputs.set_val(Aircraft.Propulsion.TOTAL_MISC_MASS, 0.0, 'lbm') +outputs.set_val(Aircraft.Propulsion.TOTAL_THRUST_REVERSERS_MASS, 0.0, 'lbm') # sum of zeros +outputs.set_val(Aircraft.Propulsion.TOTAL_ENGINE_MASS, 44541.857940875525, 'lbm') # WENG + +outputs.set_val(Aircraft.VerticalTail.CHARACTERISTIC_LENGTH, 0.0, 'ft') # EL(3) +outputs.set_val(Aircraft.VerticalTail.FINENESS, 0.11) # FR(3) +outputs.set_val(Aircraft.VerticalTail.MASS, 0.0, 'lbm') # WVT +outputs.set_val(Aircraft.VerticalTail.WETTED_AREA, 125.0, 'ft**2') + +outputs.set_val(Aircraft.Wing.BWB_AFTBODY_MASS, 8884.3375208, 'lbm') # W4 +outputs.set_val(Aircraft.Wing.BENDING_MATERIAL_FACTOR, 5.20084141) # FLOPS BT = 6.7996347825592336 +outputs.set_val(Aircraft.Wing.BENDING_MATERIAL_MASS, 13872.4182868, 'lbm') # W1 +outputs.set_val(Aircraft.Wing.CHARACTERISTIC_LENGTH, 45.124750222881779, 'ft') # EL(1) +outputs.set_val(Aircraft.Wing.CONTROL_SURFACE_AREA, 2526.5144041515805, 'ft**2') # SFLAP +outputs.set_val(Aircraft.Wing.ENG_POD_INERTIA_FACTOR, 1.0) # CAYE +outputs.set_val(Aircraft.Wing.FINENESS, 0.11) # FR(1) +outputs.set_val(Aircraft.Wing.MISC_MASS, 6975.77622754, 'lbm') # W3 +outputs.set_val(Aircraft.Wing.SHEAR_CONTROL_MASS, 24461.161868706797, 'lbm') # W2 +outputs.set_val(Aircraft.Wing.SURFACE_CONTROL_MASS, 8093.1997108029764, 'lbm') # WSC +outputs.set_val(Aircraft.Wing.ASPECT_RATIO, 4.84361005) # AR +outputs.set_val(Aircraft.Wing.MASS, 68922.20579045, 'lbm') # WWING 68995.460470895763 +outputs.set_val(Aircraft.Wing.ROOT_CHORD, 38.5, 'ft') # XLW +outputs.set_val(Aircraft.Wing.AREA, 8421.7146805052689, 'ft**2') # SW +outputs.set_val(Aircraft.Wing.WETTED_AREA, 17302.04910213, 'ft**2') # SWET(1) + +outputs.set_val(Mission.Summary.USEFUL_LOAD, 20996.3933862, 'lbm') + +# outputs.set_val(Mission.Design.MACH, 0.800) # FMDES +outputs.set_val(Mission.Summary.OPERATING_MASS, 321171.82272983, 'lbm') # DOWE +outputs.set_val(Mission.Summary.ZERO_FUEL_MASS, 383871.82272983, 'lbm') # WZF +outputs.set_val(Mission.Summary.FUEL_MASS, 216128.17727028, 'lbm') # FUELM From 54e9c3da6ce107229ceb1196d7872aa8b75138a6 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 4 Mar 2026 11:36:54 -0500 Subject: [PATCH 20/67] add bwb300 baseline bench test --- .../benchmark_tests/test_bwb300_FwFm.py | 152 ++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 aviary/validation_cases/benchmark_tests/test_bwb300_FwFm.py diff --git a/aviary/validation_cases/benchmark_tests/test_bwb300_FwFm.py b/aviary/validation_cases/benchmark_tests/test_bwb300_FwFm.py new file mode 100644 index 0000000000..e85fbe250d --- /dev/null +++ b/aviary/validation_cases/benchmark_tests/test_bwb300_FwFm.py @@ -0,0 +1,152 @@ +import unittest +from copy import deepcopy + +from openmdao.core.problem import _clear_problem_names +from openmdao.utils.assert_utils import assert_near_equal +from openmdao.utils.testing_utils import require_pyoptsparse, use_tempdirs + +from aviary.interface.run_aviary import run_aviary +from aviary.variable_info.variables import Mission + +phase_info = { + 'pre_mission': {'include_takeoff': False, 'optimize_mass': True}, + 'climb': { + 'subsystem_options': {'core_aerodynamics': {'method': 'cruise', 'solve_alpha': 'true'}}, + 'user_options': { + 'num_segments': 5, + 'order': 3, + 'mach_optimize': True, + 'mach_initial': (0.3, 'unitless'), + 'mach_bounds': ((0.3, 0.85), 'unitless'), + 'altitude_optimize': True, + 'altitude_initial': (500.0, 'ft'), + 'altitude_bounds': ((500.0, 35000.0), 'ft'), + 'no_descent': True, + 'mass_ref': (875000, 'lbm'), + 'throttle_enforcement': 'control', + 'time_initial_bounds': ((0.0, 0.0), 'min'), + 'time_duration_bounds': ((24.0, 90.0), 'min'), + }, + 'initial_guesses': { + 'altitude': ([500.5, 35000.0], 'ft'), + 'mach': ([0.3, 0.85], 'unitless'), + }, + }, + 'cruise': { + 'subsystem_options': {'core_aerodynamics': {'method': 'cruise', 'solve_alpha': 'true'}}, + 'user_options': { + 'num_segments': 5, + 'order': 3, + 'mach_optimize': False, + 'mach_initial': (0.85, 'unitless'), + 'mach_bounds': ((0.85, 0.85), 'unitless'), + 'altitude_optimize': False, + 'altitude_initial': (35000.0, 'ft'), + 'altitude_bounds': ((35000.0, 43000.0), 'ft'), + 'mass_ref': (875000, 'lbm'), + 'distance_ref': (7750, 'nmi'), + 'throttle_enforcement': 'control', + 'time_initial_bounds': ((24.0, 180.0), 'min'), + 'time_duration_bounds': ((10.0, 19.0), 'h'), + }, + 'initial_guesses': { + 'altitude': ([35000, 42000.0], 'ft'), + 'mach': ([0.85, 0.85], 'unitless'), + }, + }, + 'descent': { + 'subsystem_options': {'core_aerodynamics': {'method': 'cruise', 'solve_alpha': 'true'}}, + 'user_options': { + 'num_segments': 5, + 'order': 3, + 'mach_optimize': True, + 'mach_initial': (0.85, 'unitless'), + 'mach_final': (0.2, 'unitless'), + 'mach_bounds': ((0.2, 0.85), 'unitless'), + 'altitude_optimize': True, + 'altitude_initial': (42000.0, 'ft'), + 'altitude_final': (500.0, 'ft'), + 'altitude_bounds': ((500.0, 42000.0), 'ft'), + 'mass_ref': (875000, 'lbm'), + 'distance_ref': (7750, 'nmi'), + 'no_climb': True, + 'throttle_enforcement': 'control', + 'time_initial_bounds': ((10, 19.0), 'h'), + 'time_duration_bounds': ((0.15, 1.0), 'h'), + }, + }, + 'post_mission': { + 'include_landing': False, + 'constrain_range': True, + 'target_range': (7750.0, 'nmi'), + }, +} + + +# @use_tempdirs +class BWB300ProblemPhaseTestCase(unittest.TestCase): + """ + Test the setup and run of a BWB aircraft using FLOPS mass and aero method + and HEIGHT_ENERGY mission method. Expected outputs based on + 'models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv' model. + """ + + def setUp(self): + _clear_problem_names() # need to reset these to simulate separate runs + + @require_pyoptsparse(optimizer='SNOPT') + def test_bench_bwb300_FwFm_SNOPT(self): + local_phase_info = deepcopy(phase_info) + prob = run_aviary( + 'models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv', + local_phase_info, + optimizer='SNOPT', + verbosity=1, + max_iter=60, + ) + # prob.model.list_vars(units=True, print_arrays=True) + # prob.list_indep_vars() + # prob.list_problem_vars() + # prob.model.list_outputs() + + rtol = 1e-3 + + # There are no truth values for these. + assert_near_equal( + prob.get_val(Mission.Design.GROSS_MASS, units='lbm'), + 139803.667415, + tolerance=rtol, + ) + + assert_near_equal( + prob.get_val(Mission.Summary.OPERATING_MASS, units='lbm'), + 79873.05255347, + tolerance=rtol, + ) + + assert_near_equal( + prob.get_val(Mission.Summary.TOTAL_FUEL_MASS, units='lbm'), + 26180.61486153, + tolerance=rtol, + ) + + assert_near_equal(prob.get_val(Mission.Summary.RANGE, units='NM'), 3500.0, tolerance=rtol) + + assert_near_equal( + prob.get_val(Mission.Landing.GROUND_DISTANCE, units='ft'), + 2216.0066613, + tolerance=rtol, + ) + + assert_near_equal( + prob.get_val(Mission.Landing.TOUCHDOWN_MASS, units='lbm'), + 116003.31044998, + tolerance=rtol, + ) + + +if __name__ == '__main__': + # unittest.main() + test = BWB300ProblemPhaseTestCase() + test.setUp() + test.test_bench_bwb300_FwFm_SNOPT() From b9ab75ad8402e8d8d0aa808da1356c25014b3562 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 4 Mar 2026 18:33:22 -0500 Subject: [PATCH 21/67] add horizontal tail parameters and vertical tail parameters to aerobuilder if they exist. --- .../aerodynamics/aerodynamics_builder.py | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/aviary/subsystems/aerodynamics/aerodynamics_builder.py b/aviary/subsystems/aerodynamics/aerodynamics_builder.py index fb5db225d0..a614bfea93 100644 --- a/aviary/subsystems/aerodynamics/aerodynamics_builder.py +++ b/aviary/subsystems/aerodynamics/aerodynamics_builder.py @@ -498,10 +498,22 @@ def get_parameters(self, aviary_inputs=None, **kwargs): design_type = aviary_inputs.get_val(Aircraft.Design.TYPE) except KeyError: design_type = AircraftTypes.TRANSPORT + num_horizontal_tails = aviary_inputs.get_val(Aircraft.HorizontalTail.NUM_TAILS) + num_vertical_tails = aviary_inputs.get_val(Aircraft.VerticalTail.NUM_TAILS) if design_type is AircraftTypes.BLENDED_WING_BODY: - core_inputs_computed = COMPUTED_CORE_INPUTS_BWB + if num_horizontal_tails == 0 and num_vertical_tails == 0: + core_inputs_computed = COMPUTED_CORE_INPUTS_BWB + elif num_horizontal_tails == 0: + core_inputs_computed = COMPUTED_CORE_INPUTS_BWB + VERTICAL_TAIL_INPUTS + else: + core_inputs_computed = COMPUTED_CORE_INPUTS_BWB + HORIZONTAL_TAIL_INPUTS else: - core_inputs_computed = COMPUTED_CORE_INPUTS + if num_horizontal_tails == 0 and num_vertical_tails == 0: + core_inputs_computed = COMPUTED_CORE_INPUTS + elif num_horizontal_tails == 0: + core_inputs_computed = COMPUTED_CORE_INPUTS + VERTICAL_TAIL_INPUTS + else: + core_inputs_computed = COMPUTED_CORE_INPUTS + HORIZONTAL_TAIL_INPUTS for var in core_inputs_computed: meta = _MetaData[var] @@ -771,6 +783,22 @@ def report(self, prob, reports_folder, **kwargs): Mission.Design.MACH, ] +HORIZONTAL_TAIL_INPUTS = [ + Aircraft.HorizontalTail.CHARACTERISTIC_LENGTH, + Aircraft.HorizontalTail.FINENESS, + Aircraft.HorizontalTail.LAMINAR_FLOW_LOWER, + Aircraft.HorizontalTail.LAMINAR_FLOW_UPPER, + Aircraft.HorizontalTail.WETTED_AREA, +] + +VERTICAL_TAIL_INPUTS = [ + Aircraft.VerticalTail.CHARACTERISTIC_LENGTH, + Aircraft.VerticalTail.FINENESS, + Aircraft.VerticalTail.LAMINAR_FLOW_LOWER, + Aircraft.VerticalTail.LAMINAR_FLOW_UPPER, + Aircraft.VerticalTail.WETTED_AREA, +] + TABULAR_CORE_INPUTS = [ Aircraft.Wing.AREA, Aircraft.Design.SUBSONIC_DRAG_COEFF_FACTOR, From f5905584b66155d2512310c4f9ceeafbddd1b68a Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 4 Mar 2026 18:33:50 -0500 Subject: [PATCH 22/67] update outputs for bwb300 baseline model --- .../benchmark_tests/test_bwb300_FwFm.py | 25 ++++--------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/aviary/validation_cases/benchmark_tests/test_bwb300_FwFm.py b/aviary/validation_cases/benchmark_tests/test_bwb300_FwFm.py index e85fbe250d..b91a0e0bfd 100644 --- a/aviary/validation_cases/benchmark_tests/test_bwb300_FwFm.py +++ b/aviary/validation_cases/benchmark_tests/test_bwb300_FwFm.py @@ -114,39 +114,24 @@ def test_bench_bwb300_FwFm_SNOPT(self): # There are no truth values for these. assert_near_equal( prob.get_val(Mission.Design.GROSS_MASS, units='lbm'), - 139803.667415, + 612316.18409159, tolerance=rtol, ) assert_near_equal( prob.get_val(Mission.Summary.OPERATING_MASS, units='lbm'), - 79873.05255347, + 322535.11792879, tolerance=rtol, ) assert_near_equal( prob.get_val(Mission.Summary.TOTAL_FUEL_MASS, units='lbm'), - 26180.61486153, + 227081.00913178, tolerance=rtol, ) - assert_near_equal(prob.get_val(Mission.Summary.RANGE, units='NM'), 3500.0, tolerance=rtol) - - assert_near_equal( - prob.get_val(Mission.Landing.GROUND_DISTANCE, units='ft'), - 2216.0066613, - tolerance=rtol, - ) - - assert_near_equal( - prob.get_val(Mission.Landing.TOUCHDOWN_MASS, units='lbm'), - 116003.31044998, - tolerance=rtol, - ) + assert_near_equal(prob.get_val(Mission.Summary.RANGE, units='NM'), 7750.0, tolerance=rtol) if __name__ == '__main__': - # unittest.main() - test = BWB300ProblemPhaseTestCase() - test.setUp() - test.test_bench_bwb300_FwFm_SNOPT() + unittest.main() From d397d2779fbdbc94a6db5d41650c9fd67c322145 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 4 Mar 2026 18:34:51 -0500 Subject: [PATCH 23/67] update bwb300 baseline model by removing negative values --- .../aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv | 9 +++------ .../blended_wing_body/bwb300_baseline_FLOPS_data.py | 9 +++------ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv index fc82c8dc85..c61d28ed12 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv @@ -35,9 +35,9 @@ aircraft:crew_and_payload:misc_cargo,0.0,lbm aircraft:crew_and_payload:num_business_class,76,unitless aircraft:crew_and_payload:num_economy_class,200,unitless aircraft:crew_and_payload:num_first_class,24,unitless -aircraft:crew_and_payload:num_flight_attendants,-1,unitless +aircraft:crew_and_payload:num_flight_attendants,8,unitless aircraft:crew_and_payload:num_flight_crew,2,unitless -aircraft:crew_and_payload:num_galley_crew,-1,unitless +aircraft:crew_and_payload:num_galley_crew,2,unitless aircraft:crew_and_payload:passenger_service_mass_scaler,1.0,unitless aircraft:crew_and_payload:wing_cargo,0.0,lbm aircraft:design:base_area,0.0,ft**2 @@ -87,7 +87,6 @@ aircraft:fuel:num_tanks,7,unitless aircraft:fuel:unusable_fuel_mass_scaler,1.0,unitless aircraft:fuel:wing_fuel_fraction,0.6883549569366508,unitless aircraft:fuel:wing_ref_capacity,0.0,lbm -aircraft:fuel:wing_ref_capacity_area,-1.0,unitless aircraft:fuel:wing_ref_capacity_term_a,0.0,unitless aircraft:fuel:wing_ref_capacity_term_b,0.0,unitless aircraft:furnishings:mass_scaler,1.118,unitless @@ -110,7 +109,7 @@ aircraft:horizontal_tail:num_tails,1,unitless aircraft:horizontal_tail:sweep,0.0,deg aircraft:horizontal_tail:taper_ratio,0.714,unitless aircraft:horizontal_tail:thickness_to_chord,0.1,unitless -aircraft:horizontal_tail:vertical_tail_fraction,-100.0,unitless +aircraft:horizontal_tail:vertical_tail_fraction,0.0,unitless aircraft:horizontal_tail:wetted_area_scaler,1.0,unitless aircraft:hydraulics:mass_scaler,1.0,unitless aircraft:hydraulics:system_pressure,3000.0,psi @@ -179,8 +178,6 @@ aircraft:wing:var_sweep_mass_penalty,0.0,unitless aircraft:wing:wetted_area_scaler,0.61,unitless mission:constraints:max_mach,0.9,unitless mission:design:gross_mass,600000.0,lbm -mission:design:lift_coefficient,-1.0,unitless -mission:design:mach,-1.0,unitless mission:design:range,7500.0,NM mission:design:thrust_takeoff_per_eng,0.0,lbf mission:landing:drag_coefficient_min,0.0,unitless diff --git a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py index 6470a6f4d5..c0270617e9 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py +++ b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py @@ -16,8 +16,6 @@ inputs.set_val( Mission.Design.GROSS_MASS, 600000.0, 'lbm' ) # DGW, value taken from GW which is not in Aviary -inputs.set_val(Mission.Design.LIFT_COEFFICIENT, -1.0) # FCLDES -inputs.set_val(Mission.Design.MACH, -1) # FMDES inputs.set_val(Aircraft.Design.USE_ALT_MASS, False) inputs.set_val(Aircraft.Design.LIFT_DEPENDENT_DRAG_COEFF_FACTOR, 1.0) # FCDI inputs.set_val(Aircraft.Design.SUBSONIC_DRAG_COEFF_FACTOR, 1.0) # FCDSUB @@ -71,10 +69,10 @@ inputs.set_val(Aircraft.CrewPayload.CARGO_CONTAINER_MASS_SCALER, 1.0) # WCON inputs.set_val(Aircraft.CrewPayload.CARGO_CONTAINER_MASS, 23500.0, 'lbm') # WCON -inputs.set_val(Aircraft.CrewPayload.NUM_FLIGHT_ATTENDANTS, -1) # NSTU +inputs.set_val(Aircraft.CrewPayload.NUM_FLIGHT_ATTENDANTS, 8) # NSTU inputs.set_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW, 2) # NFLCR inputs.set_val(Aircraft.CrewPayload.FLIGHT_CREW_MASS_SCALER, 1.0) # WFLCRB -inputs.set_val(Aircraft.CrewPayload.NUM_GALLEY_CREW, -1) # NGALC +inputs.set_val(Aircraft.CrewPayload.NUM_GALLEY_CREW, 2) # NGALC inputs.set_val(Aircraft.CrewPayload.MISC_CARGO, 0.0, 'lbm') # CARGOF inputs.set_val(Aircraft.CrewPayload.CABIN_CREW_MASS_SCALER, 1.0) # WSTUAB inputs.set_val(Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_SCALER, 1.0) # WSRV @@ -105,7 +103,6 @@ inputs.set_val(Aircraft.Fuel.IGNORE_FUEL_CAPACITY_CONSTRAINT, False) # IFUFU inputs.set_val(Aircraft.Fuel.WING_FUEL_FRACTION, 0.6883549569366508, 'unitless') inputs.set_val(Aircraft.Fuel.WING_REF_CAPACITY, 0.0, 'lbm') # FUELRF -inputs.set_val(Aircraft.Fuel.WING_REF_CAPACITY_AREA, -1) # FSWREF inputs.set_val(Aircraft.Fuel.WING_REF_CAPACITY_TERM_A, 0.0) # FUSCLA inputs.set_val(Aircraft.Fuel.WING_REF_CAPACITY_TERM_B, 0.0) # FUSCLB @@ -131,7 +128,7 @@ inputs.set_val(Aircraft.HorizontalTail.ASPECT_RATIO, 1.0) # ARHT inputs.set_val(Aircraft.HorizontalTail.TAPER_RATIO, 0.7140) # TRHT inputs.set_val(Aircraft.HorizontalTail.THICKNESS_TO_CHORD, 0.1) # TCHT -inputs.set_val(Aircraft.HorizontalTail.VERTICAL_TAIL_FRACTION, -100.0) # HHT +inputs.set_val(Aircraft.HorizontalTail.VERTICAL_TAIL_FRACTION, 0.0) # HHT inputs.set_val(Aircraft.HorizontalTail.MASS_SCALER, 1.0) # FRHT inputs.set_val(Aircraft.HorizontalTail.NUM_TAILS, 1) inputs.set_val(Aircraft.HorizontalTail.WETTED_AREA_SCALER, 1.0) # SWETH From a937e7e82e5074644bc5ce0987419c10b5a800ad Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 4 Mar 2026 18:52:51 -0500 Subject: [PATCH 24/67] get Aircraft.HorizontalTail.NUM_TAILS and Aircraft.VerticalTail.NUM_TAILS and set default if they don't exist --- aviary/subsystems/aerodynamics/aerodynamics_builder.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/aviary/subsystems/aerodynamics/aerodynamics_builder.py b/aviary/subsystems/aerodynamics/aerodynamics_builder.py index a614bfea93..f6908645eb 100644 --- a/aviary/subsystems/aerodynamics/aerodynamics_builder.py +++ b/aviary/subsystems/aerodynamics/aerodynamics_builder.py @@ -498,8 +498,14 @@ def get_parameters(self, aviary_inputs=None, **kwargs): design_type = aviary_inputs.get_val(Aircraft.Design.TYPE) except KeyError: design_type = AircraftTypes.TRANSPORT - num_horizontal_tails = aviary_inputs.get_val(Aircraft.HorizontalTail.NUM_TAILS) - num_vertical_tails = aviary_inputs.get_val(Aircraft.VerticalTail.NUM_TAILS) + try: + num_horizontal_tails = aviary_inputs.get_val(Aircraft.HorizontalTail.NUM_TAILS) + except KeyError: + num_horizontal_tails = 1 + try: + num_vertical_tails = aviary_inputs.get_val(Aircraft.VerticalTail.NUM_TAILS) + except KeyError: + num_vertical_tails = 1 if design_type is AircraftTypes.BLENDED_WING_BODY: if num_horizontal_tails == 0 and num_vertical_tails == 0: core_inputs_computed = COMPUTED_CORE_INPUTS_BWB From 7ea1bb076739ec45066c6395aef7c9e6587f5202 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 4 Mar 2026 19:19:51 -0500 Subject: [PATCH 25/67] minor update --- aviary/subsystems/test/test_flops_based_premission.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index 8346aa4aff..3ac95e1009 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -1455,10 +1455,8 @@ def test_case_all_subsystems(self): tol = 1e-4 # Design - assert_near_equal(prob['AIRCRAFT_DATA_OVERRIDE:mission:design:mach'], 0.89939238, tol) - assert_near_equal( - prob['AIRCRAFT_DATA_OVERRIDE:mission:design:lift_coefficient'], 0.40810915, tol - ) + assert_near_equal(prob[Mission.Design.MACH], 0.89939238, tol) + assert_near_equal(prob[Mission.Design.LIFT_COEFFICIENT], 0.40810915, tol) if __name__ == '__main__': From fb9149212b390ba791e8a739d4a1a0c8f0068050 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Mar 2026 16:02:23 -0800 Subject: [PATCH 26/67] Refactor BWB thickness to chord distribution assignment formatting --- aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py b/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py index 66a65e1bea..17163fbc9a 100644 --- a/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py +++ b/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py @@ -311,7 +311,9 @@ def compute_partials(self, inputs, J): J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Wing.THICKNESS_TO_CHORD] = [0.0, 0.0, 1.0] - J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO] = [1.0, 1.0, 0.0] + J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO] = [ + 1.0, 1.0, 0.0 + ] dswp_ld_path_dsweep = 1 / (1 + angle**2) / np.cos(sweep / 57.2958) ** 2 J['BWB_LOAD_PATH_SWEEP_DISTRIBUTION', Aircraft.Wing.SWEEP] = [ From 2bd80a56ef7b81684591102f8569a4ec8fbaf941 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Mar 2026 16:04:01 -0800 Subject: [PATCH 27/67] Fix formatting in wing_detailed_bwb.py --- aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py b/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py index 17163fbc9a..f75c813621 100644 --- a/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py +++ b/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py @@ -312,7 +312,9 @@ def compute_partials(self, inputs, J): J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Wing.THICKNESS_TO_CHORD] = [0.0, 0.0, 1.0] J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO] = [ - 1.0, 1.0, 0.0 + 1.0, + 1.0, + 0.0, ] dswp_ld_path_dsweep = 1 / (1 + angle**2) / np.cos(sweep / 57.2958) ** 2 From 72a16c30230e74e73600b016fc03914b3f06f375 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Mar 2026 16:29:32 -0800 Subject: [PATCH 28/67] Rename input station distribution variables --- .../flops_based/test/test_wing_detailed_bwb.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py b/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py index f671fe3e60..3912052687 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py +++ b/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py @@ -141,7 +141,7 @@ def test_case2(self): options = self.aviary_options = AviaryValues() options.set_val(Settings.VERBOSITY, 1, units='unitless') options.set_val( - Aircraft.Wing.INPUT_STATION_DIST, + Aircraft.Wing.INPUT_STATION_DISTRIBUTION, [0.0, 0.0, 0.2075, 0.415, 0.6927, 0.928, 1.0], units='unitless', ) # ETAW @@ -151,15 +151,15 @@ def test_case2(self): setup_model_options(self.prob, options) prob.setup(check=False, force_alloc_complex=True) prob.set_val( - Aircraft.Wing.CHORD_PER_SEMISPAN_DIST, + Aircraft.Wing.CHORD_PER_SEMISPAN_DISTRIBUTION, val=[-1.0, 48.25, 33.20, 18.97, 14.19, 10.20, 3.220], ) # CHD prob.set_val( - Aircraft.Wing.THICKNESS_TO_CHORD_DIST, + Aircraft.Wing.THICKNESS_TO_CHORD_DISTRIBUTION, val=[-1.0, 0.125, 0.125, 0.076, 0.076, 0.076, 0.06], ) # TOC prob.set_val( - Aircraft.Wing.LOAD_PATH_SWEEP_DIST, + Aircraft.Wing.LOAD_PATH_SWEEP_DISTRIBUTION, val=[0.0, 0.0, 0.0, 17.0, 17.0, 17.0], ) # SWL prob.set_val(Aircraft.Fuselage.MAX_WIDTH, val=49.77182929) @@ -334,7 +334,7 @@ def test_case3(self): self.aviary_options = AviaryValues() self.aviary_options.set_val(Settings.VERBOSITY, 1, units='unitless') self.aviary_options.set_val( - Aircraft.Wing.INPUT_STATION_DIST, + Aircraft.Wing.INPUT_STATION_DISTRIBUTION, [0.0, 0.0, 0.2075, 0.415, 0.6927, 0.928, 1.0], units='unitless', ) From 80a6d07de0e16d4dd78b4cdb4bcf9b6dd3a286ac Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Mar 2026 17:01:59 -0800 Subject: [PATCH 29/67] Fix variable names for BWB distribution parameters --- .../geometry/flops_based/test/test_wing_detailed_bwb.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py b/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py index 3912052687..809f3d9132 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py +++ b/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py @@ -169,15 +169,15 @@ def test_case2(self): prob.set_val(Aircraft.Wing.ROOT_CHORD, 38.5) prob.run_model() - out1 = prob.get_val('BWB_CHORD_PER_SEMISPAN_DIST') + out1 = prob.get_val('BWB_CHORD_PER_SEMISPAN_DISTRIBUTION') exp1 = [116.57609631, 55.0, 33.2, 18.97, 14.19, 10.2, 2.36127568] assert_near_equal(out1, exp1, tolerance=1e-8) - out2 = prob.get_val('BWB_THICKNESS_TO_CHORD_DIST') + out2 = prob.get_val('BWB_THICKNESS_TO_CHORD_DISTRIBUTION') exp2 = [0.1792, 0.1792, 0.125, 0.076, 0.076, 0.076, 0.06] assert_near_equal(out2, exp2, tolerance=1e-10) - out3 = prob.get_val('BWB_LOAD_PATH_SWEEP_DIST') + out3 = prob.get_val('BWB_LOAD_PATH_SWEEP_DISTRIBUTION') exp3 = [0.0, 0.0, 0.0, 17.0, 17.0, 17.0] assert_near_equal(out3, exp3, tolerance=1e-10) @@ -347,7 +347,7 @@ def test_case3(self): prob.set_val(Aircraft.Wing.GLOVE_AND_BAT, val=1230.5) prob.set_val(Aircraft.Wing.SPAN, val=186.631829293424) prob.set_val( - 'BWB_CHORD_PER_SEMISPAN_DIST', + 'BWB_CHORD_PER_SEMISPAN_DISTRIBUTION', val=[116.57609631, 55.0, 33.2, 18.97, 14.19, 10.2, 2.36127568], ) prob.run_model() From 8e8300f422b806915ea6869c52253eb94f6d74e1 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Mar 2026 17:24:09 -0800 Subject: [PATCH 30/67] Rename wing input parameters for clarity --- .../subsystems/geometry/flops_based/test/test_prep_geom.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py b/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py index c7724a5266..0c3559ae8a 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py +++ b/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py @@ -762,7 +762,7 @@ def test_case2(self): prob = self.prob self.aviary_options = AviaryValues() self.aviary_options.set_val( - Aircraft.Wing.INPUT_STATION_DIST, + Aircraft.Wing.INPUT_STATION_DISTRIBUTION, [0.0, 0.0, 0.2075, 0.415, 0.6927, 0.928, 1.0], units='unitless', ) @@ -770,11 +770,11 @@ def test_case2(self): setup_model_options(self.prob, self.aviary_options) prob.setup(check=False, force_alloc_complex=True) prob.set_val( - 'BWB_CHORD_PER_SEMISPAN_DIST', + 'BWB_CHORD_PER_SEMISPAN_DISTRIBUTION', val=[116.57609631, 55.0, 33.2, 18.97, 14.19, 10.2, 2.36127568], ) prob.set_val( - 'BWB_THICKNESS_TO_CHORD_DIST', + 'BWB_THICKNESS_TO_CHORD_DISTRIBUTION', val=[0.1792, 0.1792, 0.125, 0.076, 0.076, 0.076, 0.06], ) prob.set_val(Aircraft.Fuselage.MAX_WIDTH, val=49.77182929) From c831df34974d985e656feea5eaf9a433fbe30b24 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Mar 2026 19:37:38 -0800 Subject: [PATCH 31/67] Fix typos in wing parameter names in CSV --- .../aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv index c61d28ed12..dc91c7ca5f 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv @@ -144,18 +144,18 @@ aircraft:wing:airfoil_technology,2.0,unitless # aircraft:wing:aspect_ratio,5.4252,unitless aircraft:wing:aspect_ratio_reference,0.0,unitless aircraft:wing:bending_material_mass_scaler,1.0,unitless -aircraft:wing:chord_per_semispan_dist,-1.0,48.25,33.2,18.97,14.19,10.2,3.22,unitless +aircraft:wing:chord_per_semispan_distribution,-1.0,48.25,33.2,18.97,14.19,10.2,3.22,unitless aircraft:wing:composite_fraction,0.85,unitless aircraft:wing:control_surface_area_ratio,0.3,unitless aircraft:wing:detailed_wing,True,unitless aircraft:wing:dihedral,3.0,deg aircraft:wing:glove_and_bat,1230.5,ft**2 -aircraft:wing:input_station_dist,0.0,0.0,0.2075,0.415,0.6927,0.928,1.0,unitless +aircraft:wing:input_station_distribution,0.0,0.0,0.2075,0.415,0.6927,0.928,1.0,unitless aircraft:wing:laminar_flow_lower,0.0,unitless aircraft:wing:laminar_flow_upper,0.0,unitless aircraft:wing:load_distribution_control,2.0,unitless aircraft:wing:load_fraction,1.0,unitless -aircraft:wing:load_path_sweep_dist,0.0,0.0,0.0,17.0,17.0,17.0,deg +aircraft:wing:load_path_sweep_distribution,0.0,0.0,0.0,17.0,17.0,17.0,deg aircraft:wing:mass_scaler,1.0,unitless aircraft:wing:max_camber_at_70_semispan,2.0,unitless aircraft:wing:misc_mass_scaler,1.0,unitless @@ -171,7 +171,7 @@ aircraft:wing:surface_control_mass_scaler,1.0,unitless aircraft:wing:sweep,35.7,deg aircraft:wing:taper_ratio,0.311,unitless aircraft:wing:thickness_to_chord,0.11,unitless -aircraft:wing:thickness_to_chord_dist,-1.0,0.125,0.125,0.076,0.076,0.076,0.06,unitless +aircraft:wing:thickness_to_chord_distribution,-1.0,0.125,0.125,0.076,0.076,0.076,0.06,unitless aircraft:wing:thickness_to_chord_reference,0.0,unitless aircraft:wing:ultimate_load_factor,3.75,unitless aircraft:wing:var_sweep_mass_penalty,0.0,unitless From 9acffe299cc8b5443ba6b11a102370f8333b4ba5 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Mar 2026 19:38:55 -0800 Subject: [PATCH 32/67] Rename variables for wing distribution parameters --- .../blended_wing_body/bwb300_baseline_FLOPS_data.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py index c0270617e9..6fb9a43bcf 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py +++ b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py @@ -220,7 +220,7 @@ inputs.set_val(Aircraft.Wing.LOAD_FRACTION, 1.0) # PCTL inputs.set_val( - Aircraft.Wing.CHORD_PER_SEMISPAN_DIST, + Aircraft.Wing.CHORD_PER_SEMISPAN_DISTRIBUTION, np.array([-1.0, 48.25, 33.20, 18.97, 14.19, 10.20, 3.220]), ) # CHD inputs.set_val(Aircraft.Wing.COMPOSITE_FRACTION, 0.85) # FCOMP @@ -231,14 +231,14 @@ ) # GLOV, it was 0.0 as input and computed inputs.set_val( - Aircraft.Wing.INPUT_STATION_DIST, + Aircraft.Wing.INPUT_STATION_DISTRIBUTION, np.array([0.0, 0.0, 0.2075, 0.415, 0.6927, 0.928, 1.0]), # ETAW ) inputs.set_val(Aircraft.Wing.LOAD_DISTRIBUTION_CONTROL, 2.0) # PDIST inputs.set_val( - Aircraft.Wing.LOAD_PATH_SWEEP_DIST, + Aircraft.Wing.LOAD_PATH_SWEEP_DISTRIBUTION, np.array([0.0, 0.0, 0.0, 17.0, 17.0, 17.0]), 'deg', # SWL ) @@ -256,7 +256,7 @@ inputs.set_val(Aircraft.Wing.THICKNESS_TO_CHORD_REFERENCE, 0.0) # TCREF inputs.set_val( - Aircraft.Wing.THICKNESS_TO_CHORD_DIST, + Aircraft.Wing.THICKNESS_TO_CHORD_DISTRIBUTION, np.array([-1.0, 0.125, 0.125, 0.076, 0.076, 0.076, 0.06]), # TOC ) inputs.set_val(Aircraft.Wing.ULTIMATE_LOAD_FACTOR, 3.75) # ULF From e2b29129107db03746b4ba7c1877a4efa7ff1a94 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Mar 2026 20:06:35 -0800 Subject: [PATCH 33/67] Rename INPUT_STATION_DIST to INPUT_STATION_DISTRIBUTION --- aviary/subsystems/mass/flops_based/test/test_wing_detailed.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py b/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py index 1077be2623..d6024c15ea 100644 --- a/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py +++ b/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py @@ -631,7 +631,7 @@ def test_case2(self): aviary_options.set_val(Aircraft.Engine.NUM_WING_ENGINES, [0], units='unitless') aviary_options.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 0, units='unitless') aviary_options.set_val( - Aircraft.Wing.INPUT_STATION_DIST, + Aircraft.Wing.INPUT_STATION_DISTRIBUTION, [0.0, 0.0, 0.2075, 0.415, 0.6927, 0.928, 1.0], units='unitless', ) From b5ed6caa4b932d9ca285a4197206ebea5024ba95 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Mar 2026 20:07:44 -0800 Subject: [PATCH 34/67] Rename distribution parameters in test_wing_detailed.py --- .../subsystems/mass/flops_based/test/test_wing_detailed.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py b/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py index d6024c15ea..1bf845043f 100644 --- a/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py +++ b/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py @@ -670,17 +670,17 @@ def test_case2(self): prob.set_val(Aircraft.Engine.WING_LOCATIONS, wing_location) prob.set_val( - 'BWB_CHORD_PER_SEMISPAN_DIST', + 'BWB_CHORD_PER_SEMISPAN_DISTRIBUTION', [116.57609631, 55.0, 33.2, 18.97, 14.19, 10.2, 2.36127568], units='unitless', ) prob.set_val( - 'BWB_THICKNESS_TO_CHORD_DIST', + 'BWB_THICKNESS_TO_CHORD_DISTRIBUTION', [0.1792, 0.1792, 0.125, 0.076, 0.076, 0.076, 0.06], units='unitless', ) prob.set_val( - 'BWB_LOAD_PATH_SWEEP_DIST', + 'BWB_LOAD_PATH_SWEEP_DISTRIBUTION', [0.0, 0.0, 0.0, 17.0, 17.0, 17.0], units='deg', ) From 4fb1d0d4596db7f210333eee5a303d91a03ec189 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 6 Mar 2026 17:05:02 -0500 Subject: [PATCH 35/67] minor fixes --- .../geometry/flops_based/wing_detailed_bwb.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py b/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py index f75c813621..8436a1f7e6 100644 --- a/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py +++ b/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py @@ -83,7 +83,7 @@ def setup_partials(self): 'BWB_THICKNESS_TO_CHORD_DISTRIBUTION', [ Aircraft.Wing.THICKNESS_TO_CHORD_DISTRIBUTION, - Aircraft.Wing.THICKNESS_TO_CHORD, + Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, ], ) self.declare_partials( @@ -142,9 +142,9 @@ def compute_partials(self, inputs, J): num_stations = len(self.options[Aircraft.Wing.INPUT_STATION_DISTRIBUTION]) - J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Wing.THICKNESS_TO_CHORD][0] = 1.0 - J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Wing.THICKNESS_TO_CHORD][1] = 1.0 - J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Wing.THICKNESS_TO_CHORD][2:] = 0.0 + J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO][0] = 1.0 + J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO][1] = 1.0 + J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO][2:] = 0.0 diag2_matrix = np.identity(num_stations) J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Wing.THICKNESS_TO_CHORD_DISTRIBUTION] = ( @@ -219,9 +219,6 @@ def setup_partials(self): Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, ], ) - self.declare_partials( - 'BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Wing.THICKNESS_TO_CHORD - ) self.declare_partials( 'BWB_LOAD_PATH_SWEEP_DISTRIBUTION', [ From 75d17a59b90c8d428f0ef639ba4a2b8cef7691df Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 6 Mar 2026 19:12:38 -0500 Subject: [PATCH 36/67] add horizontal tail and vertical tail parameters if they exist --- aviary/subsystems/aerodynamics/aerodynamics_builder.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/aviary/subsystems/aerodynamics/aerodynamics_builder.py b/aviary/subsystems/aerodynamics/aerodynamics_builder.py index f6908645eb..1efc25d209 100644 --- a/aviary/subsystems/aerodynamics/aerodynamics_builder.py +++ b/aviary/subsystems/aerodynamics/aerodynamics_builder.py @@ -731,16 +731,6 @@ def report(self, prob, reports_folder, **kwargs): Aircraft.Fuselage.LAMINAR_FLOW_UPPER, Aircraft.Fuselage.LENGTH_TO_DIAMETER, Aircraft.Fuselage.WETTED_AREA, - Aircraft.HorizontalTail.CHARACTERISTIC_LENGTH, - Aircraft.HorizontalTail.FINENESS, - Aircraft.HorizontalTail.LAMINAR_FLOW_LOWER, - Aircraft.HorizontalTail.LAMINAR_FLOW_UPPER, - Aircraft.HorizontalTail.WETTED_AREA, - Aircraft.VerticalTail.CHARACTERISTIC_LENGTH, - Aircraft.VerticalTail.FINENESS, - Aircraft.VerticalTail.LAMINAR_FLOW_LOWER, - Aircraft.VerticalTail.LAMINAR_FLOW_UPPER, - Aircraft.VerticalTail.WETTED_AREA, Aircraft.Wing.AREA, Aircraft.Wing.ASPECT_RATIO, Aircraft.Wing.CHARACTERISTIC_LENGTH, From c08b8f8d8401ddbb48b3af2e724ea978b7936a1c Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 6 Mar 2026 21:48:27 -0500 Subject: [PATCH 37/67] deal with BWB only in aerodynamics_builder.py --- .../aerodynamics/aerodynamics_builder.py | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/aviary/subsystems/aerodynamics/aerodynamics_builder.py b/aviary/subsystems/aerodynamics/aerodynamics_builder.py index 1efc25d209..d42074d40d 100644 --- a/aviary/subsystems/aerodynamics/aerodynamics_builder.py +++ b/aviary/subsystems/aerodynamics/aerodynamics_builder.py @@ -498,15 +498,17 @@ def get_parameters(self, aviary_inputs=None, **kwargs): design_type = aviary_inputs.get_val(Aircraft.Design.TYPE) except KeyError: design_type = AircraftTypes.TRANSPORT - try: - num_horizontal_tails = aviary_inputs.get_val(Aircraft.HorizontalTail.NUM_TAILS) - except KeyError: - num_horizontal_tails = 1 - try: - num_vertical_tails = aviary_inputs.get_val(Aircraft.VerticalTail.NUM_TAILS) - except KeyError: - num_vertical_tails = 1 if design_type is AircraftTypes.BLENDED_WING_BODY: + try: + num_horizontal_tails = aviary_inputs.get_val( + Aircraft.HorizontalTail.NUM_TAILS + ) + except KeyError: + num_horizontal_tails = 1 + try: + num_vertical_tails = aviary_inputs.get_val(Aircraft.VerticalTail.NUM_TAILS) + except KeyError: + num_vertical_tails = 1 if num_horizontal_tails == 0 and num_vertical_tails == 0: core_inputs_computed = COMPUTED_CORE_INPUTS_BWB elif num_horizontal_tails == 0: @@ -514,12 +516,7 @@ def get_parameters(self, aviary_inputs=None, **kwargs): else: core_inputs_computed = COMPUTED_CORE_INPUTS_BWB + HORIZONTAL_TAIL_INPUTS else: - if num_horizontal_tails == 0 and num_vertical_tails == 0: - core_inputs_computed = COMPUTED_CORE_INPUTS - elif num_horizontal_tails == 0: - core_inputs_computed = COMPUTED_CORE_INPUTS + VERTICAL_TAIL_INPUTS - else: - core_inputs_computed = COMPUTED_CORE_INPUTS + HORIZONTAL_TAIL_INPUTS + core_inputs_computed = COMPUTED_CORE_INPUTS for var in core_inputs_computed: meta = _MetaData[var] @@ -731,6 +728,16 @@ def report(self, prob, reports_folder, **kwargs): Aircraft.Fuselage.LAMINAR_FLOW_UPPER, Aircraft.Fuselage.LENGTH_TO_DIAMETER, Aircraft.Fuselage.WETTED_AREA, + Aircraft.HorizontalTail.CHARACTERISTIC_LENGTH, + Aircraft.HorizontalTail.FINENESS, + Aircraft.HorizontalTail.LAMINAR_FLOW_LOWER, + Aircraft.HorizontalTail.LAMINAR_FLOW_UPPER, + Aircraft.HorizontalTail.WETTED_AREA, + Aircraft.VerticalTail.CHARACTERISTIC_LENGTH, + Aircraft.VerticalTail.FINENESS, + Aircraft.VerticalTail.LAMINAR_FLOW_LOWER, + Aircraft.VerticalTail.LAMINAR_FLOW_UPPER, + Aircraft.VerticalTail.WETTED_AREA, Aircraft.Wing.AREA, Aircraft.Wing.ASPECT_RATIO, Aircraft.Wing.CHARACTERISTIC_LENGTH, From c7dad59037906a1a2636cf7bff80e8d5c7c38228 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 9 Mar 2026 17:34:06 -0400 Subject: [PATCH 38/67] delete test_bwb300_FwFm.py --- .../benchmark_tests/test_bwb300_FwFm.py | 137 ------------------ 1 file changed, 137 deletions(-) delete mode 100644 aviary/validation_cases/benchmark_tests/test_bwb300_FwFm.py diff --git a/aviary/validation_cases/benchmark_tests/test_bwb300_FwFm.py b/aviary/validation_cases/benchmark_tests/test_bwb300_FwFm.py deleted file mode 100644 index b91a0e0bfd..0000000000 --- a/aviary/validation_cases/benchmark_tests/test_bwb300_FwFm.py +++ /dev/null @@ -1,137 +0,0 @@ -import unittest -from copy import deepcopy - -from openmdao.core.problem import _clear_problem_names -from openmdao.utils.assert_utils import assert_near_equal -from openmdao.utils.testing_utils import require_pyoptsparse, use_tempdirs - -from aviary.interface.run_aviary import run_aviary -from aviary.variable_info.variables import Mission - -phase_info = { - 'pre_mission': {'include_takeoff': False, 'optimize_mass': True}, - 'climb': { - 'subsystem_options': {'core_aerodynamics': {'method': 'cruise', 'solve_alpha': 'true'}}, - 'user_options': { - 'num_segments': 5, - 'order': 3, - 'mach_optimize': True, - 'mach_initial': (0.3, 'unitless'), - 'mach_bounds': ((0.3, 0.85), 'unitless'), - 'altitude_optimize': True, - 'altitude_initial': (500.0, 'ft'), - 'altitude_bounds': ((500.0, 35000.0), 'ft'), - 'no_descent': True, - 'mass_ref': (875000, 'lbm'), - 'throttle_enforcement': 'control', - 'time_initial_bounds': ((0.0, 0.0), 'min'), - 'time_duration_bounds': ((24.0, 90.0), 'min'), - }, - 'initial_guesses': { - 'altitude': ([500.5, 35000.0], 'ft'), - 'mach': ([0.3, 0.85], 'unitless'), - }, - }, - 'cruise': { - 'subsystem_options': {'core_aerodynamics': {'method': 'cruise', 'solve_alpha': 'true'}}, - 'user_options': { - 'num_segments': 5, - 'order': 3, - 'mach_optimize': False, - 'mach_initial': (0.85, 'unitless'), - 'mach_bounds': ((0.85, 0.85), 'unitless'), - 'altitude_optimize': False, - 'altitude_initial': (35000.0, 'ft'), - 'altitude_bounds': ((35000.0, 43000.0), 'ft'), - 'mass_ref': (875000, 'lbm'), - 'distance_ref': (7750, 'nmi'), - 'throttle_enforcement': 'control', - 'time_initial_bounds': ((24.0, 180.0), 'min'), - 'time_duration_bounds': ((10.0, 19.0), 'h'), - }, - 'initial_guesses': { - 'altitude': ([35000, 42000.0], 'ft'), - 'mach': ([0.85, 0.85], 'unitless'), - }, - }, - 'descent': { - 'subsystem_options': {'core_aerodynamics': {'method': 'cruise', 'solve_alpha': 'true'}}, - 'user_options': { - 'num_segments': 5, - 'order': 3, - 'mach_optimize': True, - 'mach_initial': (0.85, 'unitless'), - 'mach_final': (0.2, 'unitless'), - 'mach_bounds': ((0.2, 0.85), 'unitless'), - 'altitude_optimize': True, - 'altitude_initial': (42000.0, 'ft'), - 'altitude_final': (500.0, 'ft'), - 'altitude_bounds': ((500.0, 42000.0), 'ft'), - 'mass_ref': (875000, 'lbm'), - 'distance_ref': (7750, 'nmi'), - 'no_climb': True, - 'throttle_enforcement': 'control', - 'time_initial_bounds': ((10, 19.0), 'h'), - 'time_duration_bounds': ((0.15, 1.0), 'h'), - }, - }, - 'post_mission': { - 'include_landing': False, - 'constrain_range': True, - 'target_range': (7750.0, 'nmi'), - }, -} - - -# @use_tempdirs -class BWB300ProblemPhaseTestCase(unittest.TestCase): - """ - Test the setup and run of a BWB aircraft using FLOPS mass and aero method - and HEIGHT_ENERGY mission method. Expected outputs based on - 'models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv' model. - """ - - def setUp(self): - _clear_problem_names() # need to reset these to simulate separate runs - - @require_pyoptsparse(optimizer='SNOPT') - def test_bench_bwb300_FwFm_SNOPT(self): - local_phase_info = deepcopy(phase_info) - prob = run_aviary( - 'models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv', - local_phase_info, - optimizer='SNOPT', - verbosity=1, - max_iter=60, - ) - # prob.model.list_vars(units=True, print_arrays=True) - # prob.list_indep_vars() - # prob.list_problem_vars() - # prob.model.list_outputs() - - rtol = 1e-3 - - # There are no truth values for these. - assert_near_equal( - prob.get_val(Mission.Design.GROSS_MASS, units='lbm'), - 612316.18409159, - tolerance=rtol, - ) - - assert_near_equal( - prob.get_val(Mission.Summary.OPERATING_MASS, units='lbm'), - 322535.11792879, - tolerance=rtol, - ) - - assert_near_equal( - prob.get_val(Mission.Summary.TOTAL_FUEL_MASS, units='lbm'), - 227081.00913178, - tolerance=rtol, - ) - - assert_near_equal(prob.get_val(Mission.Summary.RANGE, units='NM'), 7750.0, tolerance=rtol) - - -if __name__ == '__main__': - unittest.main() From 69a79910c431e226e518968b1e0c7d7bcee72731 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 9 Mar 2026 17:34:47 -0400 Subject: [PATCH 39/67] move bwb300 bench test to test_bwb_FwFm.py --- .../benchmark_tests/test_bwb_FwFm.py | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/aviary/validation_cases/benchmark_tests/test_bwb_FwFm.py b/aviary/validation_cases/benchmark_tests/test_bwb_FwFm.py index d25b340633..abd151a4f8 100644 --- a/aviary/validation_cases/benchmark_tests/test_bwb_FwFm.py +++ b/aviary/validation_cases/benchmark_tests/test_bwb_FwFm.py @@ -167,6 +167,56 @@ def test_bench_bwb_FwFm_SNOPT(self): # assert_near_equal(prob.get_val(Mission.Summary.RANGE, units='NM'), 7750.0, tolerance=rtol) +# @use_tempdirs +class BWB300ProblemPhaseTestCase(unittest.TestCase): + """ + Test the setup and run of a BWB aircraft using FLOPS mass and aero method + and HEIGHT_ENERGY mission method. Expected outputs based on + 'models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv' model. + """ + + def setUp(self): + _clear_problem_names() # need to reset these to simulate separate runs + + @require_pyoptsparse(optimizer='SNOPT') + def test_bench_bwb300_FwFm_SNOPT(self): + local_phase_info = deepcopy(phase_info) + prob = run_aviary( + 'models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv', + local_phase_info, + optimizer='SNOPT', + verbosity=1, + max_iter=60, + ) + # prob.model.list_vars(units=True, print_arrays=True) + # prob.list_indep_vars() + # prob.list_problem_vars() + # prob.model.list_outputs() + + rtol = 1e-3 + + # There are no truth values for these. + assert_near_equal( + prob.get_val(Mission.Design.GROSS_MASS, units='lbm'), + 612316.18409159, + tolerance=rtol, + ) + + assert_near_equal( + prob.get_val(Mission.Summary.OPERATING_MASS, units='lbm'), + 322535.11792879, + tolerance=rtol, + ) + + assert_near_equal( + prob.get_val(Mission.Summary.TOTAL_FUEL_MASS, units='lbm'), + 227081.00913178, + tolerance=rtol, + ) + + assert_near_equal(prob.get_val(Mission.Summary.RANGE, units='NM'), 7750.0, tolerance=rtol) + + if __name__ == '__main__': # unittest.main() test = BWBProblemPhaseTestCase() From 7beeba63feaf316804f0481a0dd7786ce1c00faf Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 9 Mar 2026 18:42:26 -0400 Subject: [PATCH 40/67] update aerodynamics builder in case there is no horizontal tail and/or vertical tail --- .../aerodynamics/aerodynamics_builder.py | 54 +++++++++++-------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/aviary/subsystems/aerodynamics/aerodynamics_builder.py b/aviary/subsystems/aerodynamics/aerodynamics_builder.py index d42074d40d..0995205413 100644 --- a/aviary/subsystems/aerodynamics/aerodynamics_builder.py +++ b/aviary/subsystems/aerodynamics/aerodynamics_builder.py @@ -498,25 +498,35 @@ def get_parameters(self, aviary_inputs=None, **kwargs): design_type = aviary_inputs.get_val(Aircraft.Design.TYPE) except KeyError: design_type = AircraftTypes.TRANSPORT + + try: + num_horizontal_tails = aviary_inputs.get_val(Aircraft.HorizontalTail.NUM_TAILS) + except KeyError: + num_horizontal_tails = 1 + try: + num_vertical_tails = aviary_inputs.get_val(Aircraft.VerticalTail.NUM_TAILS) + except KeyError: + num_vertical_tails = 1 + if design_type is AircraftTypes.BLENDED_WING_BODY: - try: - num_horizontal_tails = aviary_inputs.get_val( - Aircraft.HorizontalTail.NUM_TAILS - ) - except KeyError: - num_horizontal_tails = 1 - try: - num_vertical_tails = aviary_inputs.get_val(Aircraft.VerticalTail.NUM_TAILS) - except KeyError: - num_vertical_tails = 1 if num_horizontal_tails == 0 and num_vertical_tails == 0: core_inputs_computed = COMPUTED_CORE_INPUTS_BWB elif num_horizontal_tails == 0: core_inputs_computed = COMPUTED_CORE_INPUTS_BWB + VERTICAL_TAIL_INPUTS else: - core_inputs_computed = COMPUTED_CORE_INPUTS_BWB + HORIZONTAL_TAIL_INPUTS + core_inputs_computed = ( + COMPUTED_CORE_INPUTS_BWB + HORIZONTAL_TAIL_INPUTS + VERTICAL_TAIL_INPUTS + ) else: - core_inputs_computed = COMPUTED_CORE_INPUTS + if num_horizontal_tails == 0 and num_vertical_tails == 0: + core_inputs_computed = COMPUTED_CORE_INPUTS + elif num_horizontal_tails == 0: + core_inputs_computed = COMPUTED_CORE_INPUTS + VERTICAL_TAIL_INPUTS + else: + core_inputs_computed = ( + COMPUTED_CORE_INPUTS + HORIZONTAL_TAIL_INPUTS + VERTICAL_TAIL_INPUTS + ) + for var in core_inputs_computed: meta = _MetaData[var] @@ -728,16 +738,16 @@ def report(self, prob, reports_folder, **kwargs): Aircraft.Fuselage.LAMINAR_FLOW_UPPER, Aircraft.Fuselage.LENGTH_TO_DIAMETER, Aircraft.Fuselage.WETTED_AREA, - Aircraft.HorizontalTail.CHARACTERISTIC_LENGTH, - Aircraft.HorizontalTail.FINENESS, - Aircraft.HorizontalTail.LAMINAR_FLOW_LOWER, - Aircraft.HorizontalTail.LAMINAR_FLOW_UPPER, - Aircraft.HorizontalTail.WETTED_AREA, - Aircraft.VerticalTail.CHARACTERISTIC_LENGTH, - Aircraft.VerticalTail.FINENESS, - Aircraft.VerticalTail.LAMINAR_FLOW_LOWER, - Aircraft.VerticalTail.LAMINAR_FLOW_UPPER, - Aircraft.VerticalTail.WETTED_AREA, + # Aircraft.HorizontalTail.CHARACTERISTIC_LENGTH, + # Aircraft.HorizontalTail.FINENESS, + # Aircraft.HorizontalTail.LAMINAR_FLOW_LOWER, + # Aircraft.HorizontalTail.LAMINAR_FLOW_UPPER, + # Aircraft.HorizontalTail.WETTED_AREA, + # Aircraft.VerticalTail.CHARACTERISTIC_LENGTH, + # Aircraft.VerticalTail.FINENESS, + # Aircraft.VerticalTail.LAMINAR_FLOW_LOWER, + # Aircraft.VerticalTail.LAMINAR_FLOW_UPPER, + # Aircraft.VerticalTail.WETTED_AREA, Aircraft.Wing.AREA, Aircraft.Wing.ASPECT_RATIO, Aircraft.Wing.CHARACTERISTIC_LENGTH, From d54e0a69eca2dfa825b2ecc9304ad60e1af9cdc9 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 12 Mar 2026 19:30:20 -0400 Subject: [PATCH 41/67] update FLOPS based premission with aerodynamics subsystem for BWB --- .../test/test_flops_based_premission.py | 297 +----------------- 1 file changed, 8 insertions(+), 289 deletions(-) diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index bfa6cc275f..bef2c3af6d 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -404,7 +404,6 @@ def test_case_all_subsystems(self, case_name): Mission.Summary.ZERO_FUEL_MASS, # FuelMass Mission.Summary.FUEL_MASS, - # TODO: test some aero variables ], version=Version.BWB, step=1.01e-40, @@ -701,151 +700,10 @@ def test_case_all_subsystems(self): tol = 1e-4 assert_near_equal(prob[Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST], 70000.0 * 3, tol) - # Geometry - # BWBSimpleCabinLayout - assert_near_equal(prob[Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH], 96.25, tol) - assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 63.96, tol) - assert_near_equal(prob[Aircraft.Fuselage.CABIN_AREA], 5173.187202504683, tol) - assert_near_equal(prob[Aircraft.Fuselage.MAX_HEIGHT], 15.125, tol) - assert_near_equal(prob[Aircraft.BWB.NUM_BAYS], 5.0, tol) - # BWBFuselagePrelim - assert_near_equal(prob[Aircraft.Fuselage.REF_DIAMETER], 39.8525, tol) - assert_near_equal(prob[Aircraft.Fuselage.PLANFORM_AREA], 7390.267432149546, tol) - # BWBWingPrelim - assert_near_equal(prob[Aircraft.Wing.AREA], 16555.972297926455, tol) - assert_near_equal(prob[Aircraft.Wing.ASPECT_RATIO], 3.4488813, tol) - assert_near_equal(prob[Aircraft.Wing.ASPECT_RATIO_REFERENCE], 3.4488813, tol) - assert_near_equal(prob[Aircraft.Wing.LOAD_FRACTION], 0.53107166, tol) - # _BWBWing - assert_near_equal(prob[Aircraft.Wing.WETTED_AREA], 33816.732336575638, tol) - # _Tail - assert_near_equal(prob[Aircraft.HorizontalTail.WETTED_AREA], 0.0, tol) - assert_near_equal(prob[Aircraft.VerticalTail.WETTED_AREA], 0.0, tol) - # _FuselageRatios - assert_near_equal(prob[Aircraft.Fuselage.DIAMETER_TO_WING_SPAN], 0.16739117852998228, tol) - assert_near_equal(prob[Aircraft.Fuselage.LENGTH_TO_DIAMETER], 3.4502226961922089, tol) - # Nacelles - assert_near_equal(prob[Aircraft.Nacelle.WETTED_AREA], 498.26822066, tol) - assert_near_equal(prob[Aircraft.Nacelle.TOTAL_WETTED_AREA], 3 * 498.26822066, tol) - # Canard - assert_near_equal(prob[Aircraft.Canard.WETTED_AREA], 0.0, tol) - # BWBWingCharacteristicLength - assert_near_equal(prob[Aircraft.Wing.CHARACTERISTIC_LENGTH], 69.53953418, tol) - assert_near_equal(prob[Aircraft.Wing.FINENESS], 0.11, tol) - # OtherCharacteristicLengths - assert_near_equal(prob[Aircraft.Canard.CHARACTERISTIC_LENGTH], 0.0, tol) - assert_near_equal(prob[Aircraft.Canard.FINENESS], 0.0, tol) - assert_near_equal(prob[Aircraft.Fuselage.CHARACTERISTIC_LENGTH], 137.5, tol) - assert_near_equal(prob[Aircraft.Fuselage.FINENESS], 3.4502227, tol) - assert_near_equal(prob[Aircraft.HorizontalTail.CHARACTERISTIC_LENGTH], 0.0, tol) - assert_near_equal(prob[Aircraft.HorizontalTail.FINENESS], 0.11, tol) - assert_near_equal(prob[Aircraft.Nacelle.CHARACTERISTIC_LENGTH], [15.68611614], tol) - assert_near_equal(prob[Aircraft.Nacelle.FINENESS], [1.38269353], tol) - assert_near_equal(prob[Aircraft.VerticalTail.CHARACTERISTIC_LENGTH], 0.0, tol) - assert_near_equal(prob[Aircraft.VerticalTail.FINENESS], 0.11, tol) - # TotalWettedArea - assert_near_equal(prob[Aircraft.Design.TOTAL_WETTED_AREA], 35311.53118076, tol) - # Mass - # CargoMass - assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_MASS_TOTAL], 77220.0, tol) - assert_near_equal(prob[Aircraft.CrewPayload.BAGGAGE_MASS], 20592.0, tol) - assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS], 97812.0, tol) - assert_near_equal(prob[Aircraft.CrewPayload.CARGO_MASS], 0.0, tol) - assert_near_equal(prob[Aircraft.CrewPayload.TOTAL_PAYLOAD_MASS], 97812.0, tol) - # TransportCargoContainersMass - assert_near_equal(prob[Aircraft.CrewPayload.CARGO_CONTAINER_MASS], 3850.0, tol) - # TransportEngineCtrlsMass - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS], 206.36860226, tol) - # TransportAvionicsMass - assert_near_equal(prob[Aircraft.Avionics.MASS], 2896.223816950469, tol) - # FuelCapacityGroup - assert_near_equal(prob[Aircraft.Fuel.WING_FUEL_CAPACITY], 2385712.4988316689, tol) - assert_near_equal(prob[Aircraft.Fuel.TOTAL_CAPACITY], 2385712.4988316689, tol) - # EngineMass - assert_near_equal(prob[Aircraft.Engine.MASS], 17825.63336233, tol) - assert_near_equal(prob[Aircraft.Engine.ADDITIONAL_MASS], 0.0, tol) - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 53476.90008698, tol) - # TransportFuelSystemMass - assert_near_equal(prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 8120.2023807944415, tol) - # TransportAirCondMass - assert_near_equal(prob[Aircraft.AirConditioning.MASS], 4383.96064972, tol) - # TransportEngineOilMass - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_OIL_MASS], 346.93557352, tol) - # BWBFurnishingsGroupMass - assert_near_equal(prob[Aircraft.Furnishings.MASS], 61482.097969438299, tol) - # TransportHydraulicsGroupMass - assert_near_equal(prob[Aircraft.Hydraulics.MASS], 7368.5077321194321, tol) - # PassengerServiceMass - assert_near_equal( - prob[Aircraft.CrewPayload.PASSENGER_SERVICE_MASS], 10806.675950702213, tol - ) - # ElectricalMass - assert_near_equal(prob[Aircraft.Electrical.MASS], 4514.28869169, tol) - # AntiIcingMass - assert_near_equal(prob[Aircraft.AntiIcing.MASS], 519.37038003, tol) - # TransportAPUMass - assert_near_equal(prob[Aircraft.APU.MASS], 2148.13002234, tol) - # NonFlightCrewMass - assert_near_equal(prob[Aircraft.CrewPayload.CABIN_CREW_MASS], 3810.0, tol) - # FlightCrewMass - assert_near_equal(prob[Aircraft.CrewPayload.FLIGHT_CREW_MASS], 450.0, tol) - # TransportInstrumentMass - assert_near_equal(prob[Aircraft.Instruments.MASS], 1383.9538229392606, tol) - # EngineMiscMass - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_MISC_MASS], 0.0, tol) - # NacelleMass - assert_near_equal(prob[Aircraft.Nacelle.MASS], 0.0, tol) - # PaintMass - assert_near_equal(prob[Aircraft.Paint.MASS], 0.0, tol) - # ThrustReverserMass - assert_near_equal(prob[Aircraft.Engine.THRUST_REVERSERS_MASS], 0.0, tol) - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_THRUST_REVERSERS_MASS], 0.0, tol) - # LandingMassGroup - assert_near_equal(prob[Aircraft.Design.TOUCHDOWN_MASS], 699279.2, tol) - # SurfaceControlMass - assert_near_equal(prob[Aircraft.Wing.SURFACE_CONTROL_MASS], 14152.3734702, tol) - assert_near_equal(prob[Aircraft.Wing.CONTROL_SURFACE_AREA], 5513.13877521, tol) - # BWBFuselageMass - assert_near_equal(prob[Aircraft.Fuselage.MASS], 152790.66300003964, tol) - # HorizontalTailMass - assert_near_equal(prob[Aircraft.HorizontalTail.MASS], 0.0, tol) - # VerticalTailMass - assert_near_equal(prob[Aircraft.VerticalTail.MASS], 0.0, tol) - # CanardMass - assert_near_equal(prob[Aircraft.Canard.MASS], 0.0, tol) - # FinMass - assert_near_equal(prob[Aircraft.Fins.MASS], 3159.3781042368792, tol) - # WingMassGroup - # BWBDetailedWingBendingFact - assert_near_equal(prob[Aircraft.Wing.BENDING_MATERIAL_FACTOR], 2.68745091, tol) - assert_near_equal(prob[Aircraft.Wing.ENG_POD_INERTIA_FACTOR], 1.0, tol) - # BWBWingMiscMass - assert_near_equal(prob[Aircraft.Wing.MISC_MASS], 21498.83307778, tol) - # WingShearControlMass - assert_near_equal(prob[Aircraft.Wing.SHEAR_CONTROL_MASS], 38779.21499739, tol) - # WingBendingMass - assert_near_equal(prob[Aircraft.Wing.BENDING_MATERIAL_MASS], 6313.44762977, tol) - # BWBAftBodyMass - assert_near_equal(prob[Aircraft.Fuselage.AFTBODY_MASS], 24278.05868511, tol) - assert_near_equal(prob[Aircraft.Wing.BWB_AFTBODY_MASS], 20150.78870864, tol) - # MassSummation - # StructureMass - assert_near_equal(prob[Aircraft.Design.STRUCTURE_MASS], 273591.31917826, tol) - # PropulsionMass - assert_near_equal(prob[Aircraft.Propulsion.MASS], 61597.102467771889, tol) - # SystemsEquipMass - assert_near_equal( - prob[Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS], 98848.9061107412710, tol - ) - # EmptyMass - assert_near_equal(prob[Aircraft.Design.EMPTY_MASS], 434037.32820147, tol) - # OperatingMass - assert_near_equal(prob[Mission.Summary.OPERATING_MASS], 455464.65969526308, tol) - # ZeroFuelMass - assert_near_equal(prob[Mission.Summary.ZERO_FUEL_MASS], 553276.65969526302, tol) - # FuelMass - assert_near_equal(prob[Mission.Summary.FUEL_MASS], 320822.34030473698, tol) - # TODO: test some aero variables + # Aerodynamics + # Design + assert_near_equal(prob[Mission.Design.MACH], 0.91589163, tol) + assert_near_equal(prob[Mission.Design.LIFT_COEFFICIENT], 0.3487563, tol) @use_tempdirs @@ -1081,149 +939,10 @@ def test_case_all_subsystems(self): tol = 1e-4 assert_near_equal(prob[Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST], 70000.0 * 3, tol) - # Geometry - # BWBSimpleCabinLayout - assert_near_equal(prob[Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH], 78.61013558, tol) - assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 38.5, tol) - assert_near_equal(prob[Aircraft.Fuselage.CABIN_AREA], 4697.33181006, tol) - assert_near_equal(prob[Aircraft.Fuselage.MAX_HEIGHT], 12.35302131, tol) - assert_near_equal(prob[Aircraft.BWB.NUM_BAYS], 7.0, tol) - # BWBFuselagePrelim - assert_near_equal(prob[Aircraft.Fuselage.REF_DIAMETER], 46.2868886894979, tol) - assert_near_equal(prob[Aircraft.Fuselage.PLANFORM_AREA], 6710.4740143724875, tol) - # BWBWingPrelim - assert_near_equal(prob[Aircraft.Wing.AREA], 12109.879719468739, tol) - assert_near_equal(prob[Aircraft.Wing.ASPECT_RATIO], 5.36951675, tol) - assert_near_equal(prob[Aircraft.Wing.ASPECT_RATIO_REFERENCE], 5.36951675, tol) - assert_near_equal(prob[Aircraft.Wing.LOAD_FRACTION], 0.46761341784858923, tol) - # _BWBWing - assert_near_equal(prob[Aircraft.Wing.WETTED_AREA], 24713.66129084, tol) - # _Tail - assert_near_equal(prob[Aircraft.HorizontalTail.WETTED_AREA], 0.0, tol) - assert_near_equal(prob[Aircraft.VerticalTail.WETTED_AREA], 0.0, tol) - # _FuselageRatios - assert_near_equal(prob[Aircraft.Fuselage.DIAMETER_TO_WING_SPAN], 0.18243240878599712, tol) - assert_near_equal(prob[Aircraft.Fuselage.LENGTH_TO_DIAMETER], 2.4261771932742167, tol) - # Nacelles - assert_near_equal(prob[Aircraft.Nacelle.WETTED_AREA], 498.26822066, tol) - assert_near_equal(prob[Aircraft.Nacelle.TOTAL_WETTED_AREA], 3 * 498.26822066, tol) - # Canard - assert_near_equal(prob[Aircraft.Canard.WETTED_AREA], 0.0, tol) - # BWBWingCharacteristicLength - assert_near_equal(prob[Aircraft.Wing.CHARACTERISTIC_LENGTH], 47.72916456, tol) - assert_near_equal(prob[Aircraft.Wing.FINENESS], 0.11, tol) - # OtherCharacteristicLengths - assert_near_equal(prob[Aircraft.Canard.CHARACTERISTIC_LENGTH], 0.0, tol) - assert_near_equal(prob[Aircraft.Canard.FINENESS], 0.0, tol) - assert_near_equal(prob[Aircraft.Fuselage.CHARACTERISTIC_LENGTH], 112.3001936860821, tol) - assert_near_equal(prob[Aircraft.Fuselage.FINENESS], 2.4261771932742167, tol) - assert_near_equal(prob[Aircraft.HorizontalTail.CHARACTERISTIC_LENGTH], 0.0, tol) - assert_near_equal(prob[Aircraft.HorizontalTail.FINENESS], 0.11, tol) - assert_near_equal(prob[Aircraft.Nacelle.CHARACTERISTIC_LENGTH], [15.68611614], tol) - assert_near_equal(prob[Aircraft.Nacelle.FINENESS], [1.38269353], tol) - assert_near_equal(prob[Aircraft.VerticalTail.CHARACTERISTIC_LENGTH], 0.0, tol) - assert_near_equal(prob[Aircraft.VerticalTail.FINENESS], 0.11, tol) - # TotalWettedArea - assert_near_equal(prob[Aircraft.Design.TOTAL_WETTED_AREA], 26208.46595187, tol) - # Mass - # CargoMass - assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_MASS_TOTAL], 77220.0, tol) - assert_near_equal(prob[Aircraft.CrewPayload.BAGGAGE_MASS], 20592.0, tol) - assert_near_equal(prob[Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS], 97812.0, tol) - assert_near_equal(prob[Aircraft.CrewPayload.CARGO_MASS], 0.0, tol) - assert_near_equal(prob[Aircraft.CrewPayload.TOTAL_PAYLOAD_MASS], 97812.0, tol) - # TransportCargoContainersMass - assert_near_equal(prob[Aircraft.CrewPayload.CARGO_CONTAINER_MASS], 3850.0, tol) - # TransportEngineCtrlsMass - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS], 206.36860226, tol) - # TransportAvionicsMass - assert_near_equal(prob[Aircraft.Avionics.MASS], 2778.5110590964073, tol) - # FuelCapacityGroup - assert_near_equal(prob[Aircraft.Fuel.WING_FUEL_CAPACITY], 1197720.2419621395, tol) - assert_near_equal(prob[Aircraft.Fuel.TOTAL_CAPACITY], 1197720.2419621395, tol) - # EngineMass - assert_near_equal(prob[Aircraft.Engine.MASS], 17825.63336233, tol) - assert_near_equal(prob[Aircraft.Engine.ADDITIONAL_MASS], 0.0, tol) - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS], 53476.90008698, tol) - # TransportFuelSystemMass - assert_near_equal(prob[Aircraft.Fuel.FUEL_SYSTEM_MASS], 5444.9572934402777, tol) - # TransportAirCondMass - assert_near_equal(prob[Aircraft.AirConditioning.MASS], 3897.6527857555625, tol) - # TransportEngineOilMass - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_ENGINE_OIL_MASS], 346.93557352, tol) - # BWBFurnishingsGroupMass - assert_near_equal(prob[Aircraft.Furnishings.MASS], 57747.97136452, tol) - # TransportHydraulicsGroupMass - assert_near_equal(prob[Aircraft.Hydraulics.MASS], 6200.37391189, tol) - # PassengerServiceMass - assert_near_equal( - prob[Aircraft.CrewPayload.PASSENGER_SERVICE_MASS], 10806.675950702213, tol - ) - # ElectricalMass - assert_near_equal(prob[Aircraft.Electrical.MASS], 4291.4778106479534, tol) - # AntiIcingMass - assert_near_equal(prob[Aircraft.AntiIcing.MASS], 562.09100951165135, tol) - # TransportAPUMass - assert_near_equal(prob[Aircraft.APU.MASS], 2125.8280135763703, tol) - # NonFlightCrewMass - assert_near_equal(prob[Aircraft.CrewPayload.CABIN_CREW_MASS], 3810.0, tol) - # FlightCrewMass - assert_near_equal(prob[Aircraft.CrewPayload.FLIGHT_CREW_MASS], 450.0, tol) - # TransportInstrumentMass - assert_near_equal(prob[Aircraft.Instruments.MASS], 1309.88942193, tol) - # EngineMiscMass - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_MISC_MASS], 0.0, tol) - # NacelleMass - assert_near_equal(prob[Aircraft.Nacelle.MASS], 0.0, tol) - # PaintMass - assert_near_equal(prob[Aircraft.Paint.MASS], 0.0, tol) - # ThrustReverserMass - assert_near_equal(prob[Aircraft.Engine.THRUST_REVERSERS_MASS], 0.0, tol) - assert_near_equal(prob[Aircraft.Propulsion.TOTAL_THRUST_REVERSERS_MASS], 0.0, tol) - # LandingMassGroup - assert_near_equal(prob[Aircraft.Design.TOUCHDOWN_MASS], 699279.2, tol) - # SurfaceControlMass - assert_near_equal(prob[Aircraft.Wing.SURFACE_CONTROL_MASS], 11731.15573539, tol) - assert_near_equal(prob[Aircraft.Wing.CONTROL_SURFACE_AREA], 4032.5967, tol) - # BWBFuselageMass - assert_near_equal(prob[Aircraft.Fuselage.MASS], 137935.30594648936, tol) - # HorizontalTailMass - assert_near_equal(prob[Aircraft.HorizontalTail.MASS], 0.0, tol) - # VerticalTailMass - assert_near_equal(prob[Aircraft.VerticalTail.MASS], 0.0, tol) - # CanardMass - assert_near_equal(prob[Aircraft.Canard.MASS], 0.0, tol) - # FinMass - assert_near_equal(prob[Aircraft.Fins.MASS], 3159.3781042368792, tol) - # WingMassGroup - # BWBDetailedWingBendingFact - assert_near_equal(prob[Aircraft.Wing.BENDING_MATERIAL_FACTOR], 3.93743732, tol) - assert_near_equal(prob[Aircraft.Wing.ENG_POD_INERTIA_FACTOR], 1.0, tol) - # BWBWingMiscMass - assert_near_equal(prob[Aircraft.Wing.MISC_MASS], 9720.4199027685518, tol) - # WingShearControlMass - assert_near_equal(prob[Aircraft.Wing.SHEAR_CONTROL_MASS], 34867.592407371565, tol) - # WingBendingMass - assert_near_equal(prob[Aircraft.Wing.BENDING_MATERIAL_MASS], 8782.85692049, tol) - # BWBAftBodyMass - assert_near_equal(prob[Aircraft.Fuselage.AFTBODY_MASS], 18736.55008878, tol) - assert_near_equal(prob[Aircraft.Wing.BWB_AFTBODY_MASS], 15551.33657368, tol) - # MassSummation - # StructureMass - assert_near_equal(prob[Aircraft.Design.STRUCTURE_MASS], 240915.88664709, tol) - # PropulsionMass - assert_near_equal(prob[Aircraft.Propulsion.MASS], 58921.857380417721, tol) - # SystemsEquipMass - assert_near_equal(prob[Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS], 90644.95111232, tol) - # EmptyMass - assert_near_equal(prob[Aircraft.Design.EMPTY_MASS], 390482.6804821, tol) - # OperatingMass - assert_near_equal(prob[Mission.Summary.OPERATING_MASS], 411479.0724484, tol) - # ZeroFuelMass - assert_near_equal(prob[Mission.Summary.ZERO_FUEL_MASS], 509291.0724484, tol) - # FuelMass - assert_near_equal(prob[Mission.Summary.FUEL_MASS], 364807.9275516, tol) - # TODO: test some aero variables + # Aerodynamics + # Design + assert_near_equal(prob[Mission.Design.MACH], 0.89489036, tol) + assert_near_equal(prob[Mission.Design.LIFT_COEFFICIENT], 0.42836987, tol) @use_tempdirs From 7be1cc56f230a1abfac0e9efc06077295efa0c5f Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 13 Mar 2026 19:41:10 -0400 Subject: [PATCH 42/67] remove Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER because it is preprocessed --- .../aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv | 1 - .../aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py | 3 --- 2 files changed, 4 deletions(-) diff --git a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv index dc91c7ca5f..335f16c32f 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv @@ -16,7 +16,6 @@ aircraft:canard:mass_scaler,1.0,unitless aircraft:canard:taper_ratio,0.0,unitless aircraft:canard:thickness_to_chord,0.0,unitless aircraft:canard:wetted_area_scaler,1.0,unitless -aircraft:crew_and_payload:baggage_mass_per_passenger,44.0,lbm aircraft:crew_and_payload:cabin_crew_mass_scaler,1.0,unitless aircraft:crew_and_payload:cargo_container_mass_scaler,1.0,unitless aircraft:crew_and_payload:cargo_container_mass,23500.0,lbm diff --git a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py index 6fb9a43bcf..820305d3f8 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py +++ b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py @@ -78,9 +78,6 @@ inputs.set_val(Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_SCALER, 1.0) # WSRV inputs.set_val(Aircraft.CrewPayload.MASS_PER_PASSENGER, 165.0, 'lbm') # WPPASS inputs.set_val(Aircraft.CrewPayload.WING_CARGO, 0.0, 'lbm') # CARGOW -inputs.set_val( - Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER, 44.0, 'lbm' -) # BPP, value taken from FLOPS run # Electrical # --------------------------- From 4c90681f7c523895b0423fdcbdbf60bab7f341b7 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 13 Mar 2026 19:44:36 -0400 Subject: [PATCH 43/67] remove Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER if it is negative --- aviary/utils/fortran_to_aviary.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index b920b832bc..07ce03e4a9 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -1151,6 +1151,7 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): (Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH, 'ft'), (Aircraft.Fuselage.LENGTH, 'ft'), (Aircraft.Fuselage.MAX_WIDTH, 'ft'), + (Aircraft.Design.EMPTY_MASS, 'lbm'), ] for var in rem_list: try: @@ -1160,6 +1161,18 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): except: pass + # These variables should be removed if they are negative. + rem_list = [ + (Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER, 'lbm'), + ] + for var in rem_list: + try: + val = input_values.get_val(var[0], var[1])[0] + if val < 0.0: + input_values.delete(var[0]) + except: + pass + if design_type[0] != 3: input_values.delete(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP) From d5b52111284e92591a38135e3d453d1c062f38f2 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 16 Mar 2026 16:03:33 -0400 Subject: [PATCH 44/67] remove num_flight_attendants from model and let preprocessor to take of it --- .../models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv | 1 - .../aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py | 1 - 2 files changed, 2 deletions(-) diff --git a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv index 335f16c32f..e00f218d81 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv @@ -34,7 +34,6 @@ aircraft:crew_and_payload:misc_cargo,0.0,lbm aircraft:crew_and_payload:num_business_class,76,unitless aircraft:crew_and_payload:num_economy_class,200,unitless aircraft:crew_and_payload:num_first_class,24,unitless -aircraft:crew_and_payload:num_flight_attendants,8,unitless aircraft:crew_and_payload:num_flight_crew,2,unitless aircraft:crew_and_payload:num_galley_crew,2,unitless aircraft:crew_and_payload:passenger_service_mass_scaler,1.0,unitless diff --git a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py index 820305d3f8..b4aa80965e 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py +++ b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py @@ -69,7 +69,6 @@ inputs.set_val(Aircraft.CrewPayload.CARGO_CONTAINER_MASS_SCALER, 1.0) # WCON inputs.set_val(Aircraft.CrewPayload.CARGO_CONTAINER_MASS, 23500.0, 'lbm') # WCON -inputs.set_val(Aircraft.CrewPayload.NUM_FLIGHT_ATTENDANTS, 8) # NSTU inputs.set_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW, 2) # NFLCR inputs.set_val(Aircraft.CrewPayload.FLIGHT_CREW_MASS_SCALER, 1.0) # WFLCRB inputs.set_val(Aircraft.CrewPayload.NUM_GALLEY_CREW, 2) # NGALC From a8028d976d75281670126811a5588ce57a638109 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 20 Mar 2026 13:35:19 -0400 Subject: [PATCH 45/67] changes based on Chris' comments: Adding warnings, setting default values, etc. --- .../aerodynamics/aerodynamics_builder.py | 6 ++++++ .../subsystems/mass/flops_based/wing_detailed.py | 16 +++++++++++++++- .../test/test_flops_based_premission.py | 4 +++- aviary/variable_info/variable_meta_data.py | 12 ++++++------ 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/aviary/subsystems/aerodynamics/aerodynamics_builder.py b/aviary/subsystems/aerodynamics/aerodynamics_builder.py index 0995205413..0f2a513df2 100644 --- a/aviary/subsystems/aerodynamics/aerodynamics_builder.py +++ b/aviary/subsystems/aerodynamics/aerodynamics_builder.py @@ -498,15 +498,21 @@ def get_parameters(self, aviary_inputs=None, **kwargs): design_type = aviary_inputs.get_val(Aircraft.Design.TYPE) except KeyError: design_type = AircraftTypes.TRANSPORT + if aviary_inputs.get_val(Settings.VERBOSITY) >= Verbosity.BRIEF: + warnings.warn('Assume the aircraft is a transport.') try: num_horizontal_tails = aviary_inputs.get_val(Aircraft.HorizontalTail.NUM_TAILS) except KeyError: num_horizontal_tails = 1 + if aviary_inputs.get_val(Settings.VERBOSITY) >= Verbosity.BRIEF: + warnings.warn('Assume there is a horizontal tail.') try: num_vertical_tails = aviary_inputs.get_val(Aircraft.VerticalTail.NUM_TAILS) except KeyError: num_vertical_tails = 1 + if aviary_inputs.get_val(Settings.VERBOSITY) >= Verbosity.BRIEF: + warnings.warn('Assume there is a vertical tail.') if design_type is AircraftTypes.BLENDED_WING_BODY: if num_horizontal_tails == 0 and num_vertical_tails == 0: diff --git a/aviary/subsystems/mass/flops_based/wing_detailed.py b/aviary/subsystems/mass/flops_based/wing_detailed.py index 5f9bc7327a..08d78ad9c4 100644 --- a/aviary/subsystems/mass/flops_based/wing_detailed.py +++ b/aviary/subsystems/mass/flops_based/wing_detailed.py @@ -1,9 +1,11 @@ +import warnings import numpy as np import openmdao.api as om from openmdao.components.interp_util.interp import InterpND +from aviary.variable_info.enums import Verbosity from aviary.variable_info.functions import add_aviary_input, add_aviary_option, add_aviary_output -from aviary.variable_info.variables import Aircraft, Mission +from aviary.variable_info.variables import Aircraft, Mission, Settings class DetailedWingBendingFact(om.ExplicitComponent): @@ -289,6 +291,7 @@ def initialize(self): add_aviary_option(self, Aircraft.Wing.LOAD_DISTRIBUTION_CONTROL) add_aviary_option(self, Aircraft.Wing.NUM_INTEGRATION_STATIONS) add_aviary_option(self, Aircraft.BWB.DETAILED_WING_PROVIDED) + add_aviary_option(self, Settings.VERBOSITY) def setup(self): input_station_distribution = self.options[Aircraft.Wing.INPUT_STATION_DISTRIBUTION] @@ -336,6 +339,7 @@ def setup_partials(self): self.declare_partials('*', '*', method='cs') def compute(self, inputs, outputs): + verbosity = self.options[Settings.VERBOSITY] num_integration_stations = self.options[Aircraft.Wing.NUM_INTEGRATION_STATIONS] num_wing_engines = self.options[Aircraft.Engine.NUM_WING_ENGINES] num_engine_type = len(num_wing_engines) @@ -382,6 +386,11 @@ def compute(self, inputs, outputs): arref = inputs[Aircraft.Wing.ASPECT_RATIO_REFERENCE] if arref[0] == 0: arref[0] = ar[0] + if verbosity >= Verbosity.BRIEF: + warnings.warn( + 'Assume Aircraft.Wing.ASPECT_RATIO_REFERENCE is the same ' + 'as Aircraft.Wing.ASPECT_RATIO' + ) chord = inputs['BWB_CHORD_PER_SEMISPAN_DISTRIBUTION'] chord_mod = [] for x in chord: @@ -404,6 +413,11 @@ def compute(self, inputs, outputs): tcref = inputs[Aircraft.Wing.THICKNESS_TO_CHORD_REFERENCE] if tcref == 0.0: tcref = tc + if verbosity >= Verbosity.BRIEF: + warnings.warn( + 'Assume Aircraft.Wing.THICKNESS_TO_CHORD_REFERENCE is the same ' + 'as Aircraft.Wing.THICKNESS_TO_CHORD' + ) thickness_to_chord_mod = [] for x in thickness_to_chord: thickness_to_chord_mod.append(x * tc[0] / tcref[0]) diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index bef2c3af6d..aced77ea96 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -279,6 +279,8 @@ def test_case_all_subsystems(self, case_name): # BWBWingPrelim Aircraft.Wing.AREA, Aircraft.Wing.ASPECT_RATIO, + Aircraft.Wing.ASPECT_RATIO_REFERENCE, + Aircraft.Wing.LOAD_FRACTION, # _BWBWing Aircraft.Wing.WETTED_AREA, # _Tail @@ -316,7 +318,7 @@ def test_case_all_subsystems(self, case_name): Aircraft.CrewPayload.CARGO_MASS, Aircraft.CrewPayload.TOTAL_PAYLOAD_MASS, # TransportCargoContainersMass - # Aircraft.CrewPayload.CARGO_CONTAINER_MASS, + Aircraft.CrewPayload.CARGO_CONTAINER_MASS, # TransportEngineCtrlsMass Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS, # TransportAvionicsMass diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index b3514f611a..0f2a911c0f 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1164,7 +1164,7 @@ meta_data=_MetaData, historical_name={'GASP': None, 'FLOPS': 'FUSEIN.NBABR', 'LEAPS1': None}, units='unitless', - desc='Number of business class passengers abreast. If 0, use default.', + desc='Number of business class seats abreast. If 0, use default.', types=int, option=True, default_value=5, @@ -1175,7 +1175,7 @@ meta_data=_MetaData, historical_name={'GASP': 'INGASP.SAB', 'FLOPS': 'FUSEIN.NTABR', 'LEAPS1': None}, units='unitless', - desc='Number of economy class passengers abreast. If 0, use default.', + desc='Number of economy class seats abreast. If 0, use default.', types=int, option=True, default_value=6, @@ -1186,7 +1186,7 @@ meta_data=_MetaData, historical_name={'GASP': None, 'FLOPS': 'FUSEIN.NFABR', 'LEAPS1': None}, units='unitless', - desc='Number of first class passengers abreast. If 0, use default.', + desc='Number of first class seats abreast. If 0, use default.', types=int, option=True, default_value=4, @@ -1199,7 +1199,7 @@ units='inch', desc='pitch of the business class seats. If 0, use default.', option=True, - default_value=0.0, + default_value=39.0, ) add_meta_data( @@ -1209,7 +1209,7 @@ units='inch', desc='pitch of the economy class seats. If 0, use default.', option=True, - default_value=0.0, + default_value=32.0, ) add_meta_data( @@ -1219,7 +1219,7 @@ units='inch', desc='pitch of the first class seats. If 0, use default.', option=True, - default_value=0.0, + default_value=61.0, ) # _____ _ From b0d2115b4429437c2149e7baf69ac85b9b4c06b5 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 20 Mar 2026 14:29:05 -0400 Subject: [PATCH 46/67] minor update --- aviary/subsystems/aerodynamics/aerodynamics_builder.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/aviary/subsystems/aerodynamics/aerodynamics_builder.py b/aviary/subsystems/aerodynamics/aerodynamics_builder.py index 0f2a513df2..cb88a1cc1b 100644 --- a/aviary/subsystems/aerodynamics/aerodynamics_builder.py +++ b/aviary/subsystems/aerodynamics/aerodynamics_builder.py @@ -494,24 +494,28 @@ def get_parameters(self, aviary_inputs=None, **kwargs): params[Aircraft.Design.LIFT_DEPENDENT_DRAG_POLAR] = opts if method == 'computed': + try: + verbosity = aviary_inputs.get_val(Settings.VERBOSITY) + except KeyError: + verbosity = Verbosity.QUIET try: design_type = aviary_inputs.get_val(Aircraft.Design.TYPE) except KeyError: design_type = AircraftTypes.TRANSPORT - if aviary_inputs.get_val(Settings.VERBOSITY) >= Verbosity.BRIEF: + if verbosity >= Verbosity.BRIEF: warnings.warn('Assume the aircraft is a transport.') try: num_horizontal_tails = aviary_inputs.get_val(Aircraft.HorizontalTail.NUM_TAILS) except KeyError: num_horizontal_tails = 1 - if aviary_inputs.get_val(Settings.VERBOSITY) >= Verbosity.BRIEF: + if verbosity >= Verbosity.BRIEF: warnings.warn('Assume there is a horizontal tail.') try: num_vertical_tails = aviary_inputs.get_val(Aircraft.VerticalTail.NUM_TAILS) except KeyError: num_vertical_tails = 1 - if aviary_inputs.get_val(Settings.VERBOSITY) >= Verbosity.BRIEF: + if verbosity >= Verbosity.BRIEF: warnings.warn('Assume there is a vertical tail.') if design_type is AircraftTypes.BLENDED_WING_BODY: From 9db8720176736407b23f16febb3255970186f6fe Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 20 Mar 2026 14:40:01 -0400 Subject: [PATCH 47/67] update test values due to the chnage of defaults of seat pitch --- aviary/subsystems/geometry/flops_based/test/test_fuselage.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/test/test_fuselage.py b/aviary/subsystems/geometry/flops_based/test/test_fuselage.py index 9ac95b21d0..9c329a8349 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_fuselage.py +++ b/aviary/subsystems/geometry/flops_based/test/test_fuselage.py @@ -66,9 +66,9 @@ def test_case1(self): prob.run_model() pax_compart_length = prob.get_val(Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH) - assert_near_equal(pax_compart_length, 107.53947222, tolerance=1e-9) + assert_near_equal(pax_compart_length, 108.37731944, tolerance=1e-9) fuselage_length = prob.get_val(Aircraft.Fuselage.LENGTH) - assert_near_equal(fuselage_length, 147.53947222, tolerance=1e-9) + assert_near_equal(fuselage_length, 148.37731944, tolerance=1e-9) fuselage_width = prob.get_val(Aircraft.Fuselage.MAX_WIDTH) assert_near_equal(fuselage_width, 14.84, tolerance=1e-9) From 6ae3a81cccc2cda77b3fb41df7a6944ac8b79a56 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 20 Mar 2026 19:57:40 -0400 Subject: [PATCH 48/67] fix conflicts --- aviary/subsystems/test/test_flops_based_premission.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index 5a5251caf0..3382c4a136 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -1110,8 +1110,7 @@ def test_case_geom_mass(self): assert_near_equal(prob[Aircraft.Engine.THRUST_REVERSERS_MASS], 0.0, tol) assert_near_equal(prob[Aircraft.Propulsion.TOTAL_THRUST_REVERSERS_MASS], 0.0, tol) # LandingMassGroup - assert_near_equal(prob[Aircraft.Design.TOUCHDOWN_MASS], 420000.0, tol) - assert_near_equal(prob[Aircraft.Design.LANDING_MASS], 699279.2, tol) + assert_near_equal(prob[Aircraft.Design.LANDING_MASS], 420000.0, tol) # SurfaceControlMass assert_near_equal(prob[Aircraft.Wing.SURFACE_CONTROL_MASS], 8093.1997108029764, tol) assert_near_equal(prob[Aircraft.Wing.CONTROL_SURFACE_AREA], 2526.5144041515805, tol) From 95093796bfe747f4ff60a785faac4b1728474cf9 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 20 Mar 2026 21:31:43 -0400 Subject: [PATCH 49/67] create a new variable Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD for WTIN.TCSOB --- .../bwb300_baseline_FLOPS.csv | 2 +- .../bwb300_baseline_FLOPS_data.py | 2 +- .../blended_wing_body/bwb_detailed_FLOPS.csv | 2 +- .../bwb_detailed_FLOPS_data.py | 2 +- .../blended_wing_body/bwb_simple_FLOPS.csv | 2 +- .../bwb_simple_FLOPS_data.py | 2 +- .../geometry/flops_based/fuselage.py | 14 ++++---- .../flops_based/test/test_fuselage.py | 6 ++-- .../geometry/flops_based/wing_detailed_bwb.py | 36 +++++++++++-------- aviary/variable_info/variable_meta_data.py | 9 +++++ aviary/variable_info/variables.py | 1 + 11 files changed, 47 insertions(+), 31 deletions(-) diff --git a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv index e00f218d81..62ecbf26bc 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv @@ -88,7 +88,7 @@ aircraft:fuel:wing_ref_capacity,0.0,lbm aircraft:fuel:wing_ref_capacity_term_a,0.0,unitless aircraft:fuel:wing_ref_capacity_term_b,0.0,unitless aircraft:furnishings:mass_scaler,1.118,unitless -aircraft:fuselage:height_to_width_ratio,0.1792,unitless +aircraft:fuselage:sidebody_thickness_to_chord,0.1792,unitless aircraft:fuselage:laminar_flow_lower,0.0,unitless aircraft:fuselage:laminar_flow_upper,0.0,unitless aircraft:fuselage:mass_scaler,1.0,unitless diff --git a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py index b4aa80965e..b91dbaab00 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py +++ b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py @@ -113,7 +113,7 @@ inputs.set_val(Aircraft.Fuselage.MILITARY_CARGO_FLOOR, False) # CARGF inputs.set_val(Aircraft.Fuselage.MASS_SCALER, 1.0) # FRFU inputs.set_val(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, 60.0, 'deg') # SWPLE -inputs.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, 0.1792) # TCF +inputs.set_val(Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, 0.1792) # TCF inputs.set_val(Aircraft.Fuselage.WETTED_AREA_SCALER, 1.0) # SWETF inputs.set_val(Aircraft.Fuselage.LAMINAR_FLOW_LOWER, 0.0) # TRLB inputs.set_val(Aircraft.Fuselage.LAMINAR_FLOW_UPPER, 0.0) # TRUB diff --git a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv index 20a9a1b662..02cabf986d 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv @@ -91,7 +91,7 @@ aircraft:fuel:fuselage_fuel_capacity,0.0,lbm aircraft:fuel:wing_fuel_fraction,0.68835495693,unitless aircraft:fuel:unusable_fuel_mass_scaler,1.0,unitless aircraft:furnishings:mass_scaler,1.0,unitless -aircraft:fuselage:height_to_width_ratio,0.11,unitless +aircraft:fuselage:sidebody_thickness_to_chord,0.11,unitless aircraft:fuselage:mass_scaler,1.0,unitless aircraft:fuselage:military_cargo_floor,False,unitless aircraft:fuselage:num_fuselages,1,unitless diff --git a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py index 57d8b94fce..a242247581 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py @@ -104,7 +104,7 @@ inputs.set_val(Aircraft.Fuselage.MILITARY_CARGO_FLOOR, False) # CARGF inputs.set_val(Aircraft.Fuselage.MASS_SCALER, 1.0) # FRFU inputs.set_val(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, 45.0, 'deg') # SWPLE -inputs.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, 0.11) # TCF +inputs.set_val(Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, 0.11) # TCSOB inputs.set_val(Aircraft.Fuselage.WETTED_AREA_SCALER, 1.0) # SWETF # Horizontal Tail diff --git a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv index c272e0652a..e695cb9d37 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv @@ -91,7 +91,7 @@ aircraft:fuel:fuselage_fuel_capacity,0.0,lbm aircraft:fuel:wing_fuel_fraction,0.68835495693,unitless aircraft:fuel:unusable_fuel_mass_scaler,1.0,unitless aircraft:furnishings:mass_scaler,1.0,unitless -aircraft:fuselage:height_to_width_ratio,0.11,unitless +aircraft:fuselage:sidebody_thickness_to_chord,0.11,unitless aircraft:fuselage:length,137.5,ft aircraft:fuselage:mass_scaler,1.0,unitless aircraft:fuselage:max_width,64.58,ft diff --git a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py index 573ebabeae..fe3248789a 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py @@ -106,7 +106,7 @@ inputs.set_val(Aircraft.Fuselage.MASS_SCALER, 1.0) # FRFU inputs.set_val(Aircraft.Fuselage.MAX_WIDTH, 64.58, 'ft') # WF inputs.set_val(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, 45.0, 'deg') # SWPLE -inputs.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, 0.11) # TCF +inputs.set_val(Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, 0.11) # TCF inputs.set_val(Aircraft.Fuselage.WETTED_AREA_SCALER, 1.0) # SWETF # Horizontal Tail diff --git a/aviary/subsystems/geometry/flops_based/fuselage.py b/aviary/subsystems/geometry/flops_based/fuselage.py index 8122fbff68..e1a9395ee3 100644 --- a/aviary/subsystems/geometry/flops_based/fuselage.py +++ b/aviary/subsystems/geometry/flops_based/fuselage.py @@ -404,7 +404,7 @@ def setup(self): add_aviary_input(self, Aircraft.Fuselage.LENGTH, units='ft') add_aviary_input(self, Aircraft.Fuselage.MAX_WIDTH, units='ft') add_aviary_input(self, Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, units='deg') - add_aviary_input(self, Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, units='unitless') + add_aviary_input(self, Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, units='unitless') self.add_input( 'Rear_spar_percent_chord', 0.7, units='unitless', desc='RSPCHD at fuselage centerline' ) @@ -445,7 +445,7 @@ def setup_partials(self): of=[Aircraft.Fuselage.MAX_HEIGHT], wrt=[ Aircraft.Fuselage.LENGTH, - Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, + Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, ], ) @@ -455,7 +455,7 @@ def compute(self, inputs, outputs): length = inputs[Aircraft.Fuselage.LENGTH] rear_spar_percent_chord = inputs['Rear_spar_percent_chord'] max_width = inputs[Aircraft.Fuselage.MAX_WIDTH][0] - height_to_width = inputs[Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO] + height_to_width = inputs[Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD] bay_width_nom = 12.0 # ft if length <= 0.0: @@ -494,7 +494,7 @@ def compute_partials(self, inputs, J): sweep = inputs[Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP] tan_sweep = np.tan(sweep / 57.296) pax_compart_length = rear_spar_percent_chord * length - height_to_width = inputs[Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO] + height_to_width = inputs[Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD] J[Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH, Aircraft.Fuselage.LENGTH] = ( rear_spar_percent_chord @@ -520,7 +520,7 @@ def compute_partials(self, inputs, J): ) J[Aircraft.Fuselage.MAX_HEIGHT, Aircraft.Fuselage.LENGTH] = height_to_width - J[Aircraft.Fuselage.MAX_HEIGHT, Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO] = length + J[Aircraft.Fuselage.MAX_HEIGHT, Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD] = length class BWBDetailedCabinLayout(om.ExplicitComponent): @@ -541,7 +541,7 @@ def initialize(self): def setup(self): add_aviary_input(self, Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, units='deg') - add_aviary_input(self, Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, units='unitless') + add_aviary_input(self, Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, units='unitless') self.add_input( 'Rear_spar_percent_chord', 0.7, units='unitless', desc='RSPCHD at fuselage centerline' ) @@ -560,7 +560,7 @@ def setup_partials(self): def compute(self, inputs, outputs): rear_spar_percent_chord = inputs['Rear_spar_percent_chord'] sweep = inputs[Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP] - height_to_width = inputs[Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO] + height_to_width = inputs[Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD] tan_sweep = np.tan(sweep / 57.296) bay_width_nom = 12.0 # ft diff --git a/aviary/subsystems/geometry/flops_based/test/test_fuselage.py b/aviary/subsystems/geometry/flops_based/test/test_fuselage.py index 9c329a8349..4ee4d97de4 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_fuselage.py +++ b/aviary/subsystems/geometry/flops_based/test/test_fuselage.py @@ -94,7 +94,7 @@ def test_case1(self): prob.set_val(Aircraft.Fuselage.LENGTH, val=137.5, units='ft') prob.set_val(Aircraft.Fuselage.MAX_WIDTH, val=64.58, units='ft') prob.set_val(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, val=45.0, units='deg') - prob.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, val=0.11, units='unitless') + prob.set_val(Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, val=0.11, units='unitless') prob.run_model() num_bays = prob.get_val(Aircraft.BWB.NUM_BAYS) @@ -141,7 +141,7 @@ def test_case1(self): setup_model_options(self.prob, options) prob.setup(check=False, force_alloc_complex=True) prob.set_val(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, val=45.0, units='deg') - prob.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, val=0.11, units='unitless') + prob.set_val(Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, val=0.11, units='unitless') prob.set_val('Rear_spar_percent_chord', val=0.7, units='unitless') prob.run_model() @@ -189,7 +189,7 @@ def test_case2(self): setup_model_options(self.prob, options) prob.setup(check=False, force_alloc_complex=True) prob.set_val(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, val=60.0, units='deg') - prob.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, val=0.11, units='unitless') + prob.set_val(Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, val=0.11, units='unitless') # prob.set_val(Aircraft.Fuselage.MAX_WIDTH, val=50.0, units='ft') prob.set_val('Rear_spar_percent_chord', val=0.7, units='unitless') prob.run_model() diff --git a/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py b/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py index 8436a1f7e6..c1012d3b3f 100644 --- a/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py +++ b/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py @@ -40,7 +40,7 @@ def setup(self): add_aviary_input(self, Aircraft.Fuselage.LENGTH, units='ft') add_aviary_input(self, Aircraft.Fuselage.MAX_WIDTH, units='ft') add_aviary_input(self, Aircraft.Wing.OUTBOARD_SEMISPAN, units='ft') - add_aviary_input(self, Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, units='unitless') + add_aviary_input(self, Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, units='unitless') add_aviary_input(self, Aircraft.Wing.ROOT_CHORD, units='ft') self.add_input( 'rear_spar_percent_chord_side', @@ -83,7 +83,7 @@ def setup_partials(self): 'BWB_THICKNESS_TO_CHORD_DISTRIBUTION', [ Aircraft.Wing.THICKNESS_TO_CHORD_DISTRIBUTION, - Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, + Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, ], ) self.declare_partials( @@ -99,7 +99,7 @@ def compute(self, inputs, outputs): outputs[Aircraft.Wing.SPAN] = wingspan rate_span = (wingspan - width) / wingspan length = inputs[Aircraft.Fuselage.LENGTH][0] - hw = inputs[Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO][0] + side_tc = inputs[Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD][0] root_chord = inputs[Aircraft.Wing.ROOT_CHORD][0] rear_spar_percent_chord_side = inputs['rear_spar_percent_chord_side'][0] if rear_spar_percent_chord_side <= 0.0: @@ -117,8 +117,8 @@ def compute(self, inputs, outputs): outputs['BWB_CHORD_PER_SEMISPAN_DISTRIBUTION'][0] = length outputs['BWB_CHORD_PER_SEMISPAN_DISTRIBUTION'][1] = xl_out - outputs['BWB_THICKNESS_TO_CHORD_DISTRIBUTION'][0] = hw - outputs['BWB_THICKNESS_TO_CHORD_DISTRIBUTION'][1] = hw + outputs['BWB_THICKNESS_TO_CHORD_DISTRIBUTION'][0] = side_tc + outputs['BWB_THICKNESS_TO_CHORD_DISTRIBUTION'][1] = side_tc outputs['BWB_THICKNESS_TO_CHORD_DISTRIBUTION'][2:] = inputs[ Aircraft.Wing.THICKNESS_TO_CHORD_DISTRIBUTION ][2:] @@ -132,7 +132,7 @@ def compute_partials(self, inputs, J): # wingspan = width + 2 * osspan # rate_span = (wingspan - width) / wingspan # length = inputs[Aircraft.Fuselage.LENGTH][0] - # hw = inputs[Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO][0] + # side_tc = inputs[Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD][0] # root_chord = inputs[Aircraft.Wing.ROOT_CHORD][0] # rear_spar_percent_chord_side = inputs['rear_spar_percent_chord_side'][0] # xl_out = root_chord / rear_spar_percent_chord_side @@ -142,9 +142,15 @@ def compute_partials(self, inputs, J): num_stations = len(self.options[Aircraft.Wing.INPUT_STATION_DISTRIBUTION]) - J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO][0] = 1.0 - J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO][1] = 1.0 - J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO][2:] = 0.0 + J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD][ + 0 + ] = 1.0 + J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD][ + 1 + ] = 1.0 + J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD][ + 2: + ] = 0.0 diag2_matrix = np.identity(num_stations) J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Wing.THICKNESS_TO_CHORD_DISTRIBUTION] = ( @@ -179,7 +185,7 @@ def setup(self): add_aviary_input(self, Aircraft.Fuselage.LENGTH, units='ft') add_aviary_input(self, Aircraft.Wing.OUTBOARD_SEMISPAN, units='ft') add_aviary_input(self, Aircraft.Wing.ROOT_CHORD, units='ft') - add_aviary_input(self, Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, units='unitless') + add_aviary_input(self, Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, units='unitless') add_aviary_input(self, Aircraft.Wing.THICKNESS_TO_CHORD, units='unitless') add_aviary_input(self, Aircraft.Wing.SWEEP, units='deg') self.add_input( @@ -216,7 +222,7 @@ def setup_partials(self): 'BWB_THICKNESS_TO_CHORD_DISTRIBUTION', [ Aircraft.Wing.THICKNESS_TO_CHORD, - Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, + Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, ], ) self.declare_partials( @@ -254,7 +260,7 @@ def compute(self, inputs, outputs): ) xl_out = root_chord / rear_spar_percent_chord_side wing_tip_chord = 0.06 * wingspan - hw = inputs[Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO][0] + side_tc = inputs[Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD][0] tc = inputs[Aircraft.Wing.THICKNESS_TO_CHORD][0] sweep = inputs[Aircraft.Wing.SWEEP][0] tr_out = wing_tip_chord / xl_out @@ -267,8 +273,8 @@ def compute(self, inputs, outputs): outputs['BWB_CHORD_PER_SEMISPAN_DISTRIBUTION'][1] = xl_out outputs['BWB_CHORD_PER_SEMISPAN_DISTRIBUTION'][2] = wing_tip_chord - outputs['BWB_THICKNESS_TO_CHORD_DISTRIBUTION'][0] = hw - outputs['BWB_THICKNESS_TO_CHORD_DISTRIBUTION'][1] = hw + outputs['BWB_THICKNESS_TO_CHORD_DISTRIBUTION'][0] = side_tc + outputs['BWB_THICKNESS_TO_CHORD_DISTRIBUTION'][1] = side_tc outputs['BWB_THICKNESS_TO_CHORD_DISTRIBUTION'][2] = tc outputs['BWB_LOAD_PATH_SWEEP_DISTRIBUTION'][0] = 0.0 @@ -308,7 +314,7 @@ def compute_partials(self, inputs, J): J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Wing.THICKNESS_TO_CHORD] = [0.0, 0.0, 1.0] - J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO] = [ + J['BWB_THICKNESS_TO_CHORD_DISTRIBUTION', Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD] = [ 1.0, 1.0, 0.0, diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 3ef9a69d78..d4334b4725 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -3706,6 +3706,15 @@ default_value=0.0, ) +add_meta_data( + Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, + meta_data=_MetaData, + historical_name={'GASP': None, 'FLOPS': 'WTIN.TCSOB', 'LEAPS1': None}, + units='unitless', + desc='fuselage thickness/chord ratio at side of body', + default_value=0.0, +) + add_meta_data( Aircraft.Fuselage.SIMPLE_LAYOUT, meta_data=_MetaData, diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index 551fdaffcd..387202ef7d 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -321,6 +321,7 @@ class Fuselage: PRESSURIZED_WIDTH_ADDITIONAL = 'aircraft:fuselage:pressurized_width_additional' REF_DIAMETER = 'aircraft:fuselage:ref_diameter' SEAT_WIDTH = 'aircraft:fuselage:seat_width' + SIDEBODY_THICKNESS_TO_CHORD = 'aircraft:fuselage:sidebody_thickness_to_chord' SIMPLE_LAYOUT = 'aircraft:fuselage:simple_layout' TAIL_FINENESS = 'aircraft:fuselage:tail_fineness' WETTED_AREA = 'aircraft:fuselage:wetted_area' From e0445efdc4557696501a54d37cc20962d5fe5727 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 20 Mar 2026 22:07:23 -0400 Subject: [PATCH 50/67] minor updates --- .../subsystems/geometry/flops_based/test/test_prep_geom.py | 4 +++- .../geometry/flops_based/test/test_wing_detailed_bwb.py | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py b/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py index 9e9b3b61d4..b698e2a867 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py +++ b/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py @@ -767,7 +767,9 @@ def test_case2(self): [0.0, 0.0, 0.2075, 0.415, 0.6927, 0.928, 1.0], units='unitless', ) - prob.model.add_subsystem('wing', _BWBWing(), promotes_outputs=['*'], promotes_inputs=['*']) + prob.model.add_subsystem( + 'wing', BWBWingWettedArea(), promotes_outputs=['*'], promotes_inputs=['*'] + ) setup_model_options(self.prob, self.aviary_options) prob.setup(check=False, force_alloc_complex=True) prob.set_val( diff --git a/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py b/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py index 809f3d9132..ca487f72bc 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py +++ b/aviary/subsystems/geometry/flops_based/test/test_wing_detailed_bwb.py @@ -84,7 +84,7 @@ def test_case1(self): prob.set_val(Aircraft.Fuselage.MAX_WIDTH, val=80.220756073526772) prob.set_val(Aircraft.Wing.OUTBOARD_SEMISPAN, val=86.75) prob.set_val(Aircraft.Fuselage.LENGTH, val=112.3001936860821) - prob.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, val=0.11) + prob.set_val(Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, val=0.11) prob.set_val(Aircraft.Wing.ROOT_CHORD, 38.5) prob.run_model() @@ -165,7 +165,7 @@ def test_case2(self): prob.set_val(Aircraft.Fuselage.MAX_WIDTH, val=49.77182929) prob.set_val(Aircraft.Wing.OUTBOARD_SEMISPAN, val=68.43) prob.set_val(Aircraft.Fuselage.LENGTH, val=116.57609631) - prob.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, val=0.1792) + prob.set_val(Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, val=0.1792) prob.set_val(Aircraft.Wing.ROOT_CHORD, 38.5) prob.run_model() @@ -216,7 +216,7 @@ def test_case1(self): prob.set_val(Aircraft.Wing.OUTBOARD_SEMISPAN, val=86.75) prob.set_val(Aircraft.Fuselage.LENGTH, val=137.5) prob.set_val(Aircraft.Wing.THICKNESS_TO_CHORD, val=0.11) - prob.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, val=0.11) + prob.set_val(Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, val=0.11) prob.set_val(Aircraft.Wing.ROOT_CHORD, 63.96) prob.set_val(Aircraft.Wing.SWEEP, 35.7, units='deg') prob.run_model() From 73cf3321198e2bcc6ec7e65ca62358afd1f19ad0 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 20 Mar 2026 22:23:37 -0400 Subject: [PATCH 51/67] try again --- .../geometry/flops_based/test/test_prep_geom.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py b/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py index b698e2a867..bdc8f95bc6 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py +++ b/aviary/subsystems/geometry/flops_based/test/test_prep_geom.py @@ -822,7 +822,7 @@ def setUp(self): prob.set_val(Aircraft.Fuselage.LENGTH, 137.5, units='ft') prob.set_val(Aircraft.Fuselage.MAX_WIDTH, 64.58, units='ft') prob.set_val(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, 45.0, units='deg') - prob.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, 0.11, units='unitless') + prob.set_val(Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, 0.11, units='unitless') prob.set_val('Rear_spar_percent_chord', 0.7, units='unitless') # BWBComputeDetailedWingDist prob.set_val(Aircraft.Wing.OUTBOARD_SEMISPAN, val=86.75) @@ -1072,7 +1072,7 @@ def setUp(self): # BWBDetailedCabinLayout prob.set_val(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, val=45.0, units='deg') - prob.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, val=0.11, units='unitless') + prob.set_val(Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, val=0.11, units='unitless') prob.set_val('Rear_spar_percent_chord', val=0.7, units='unitless') # BWBUpdateDetailedWingDist prob.set_val( @@ -1360,7 +1360,4 @@ def test_case1(self): if __name__ == '__main__': - # unittest.main() - test = BWBWingTest() - test.setUp() - test.test_case2() + unittest.main() From 35501f2af3d6766babce393fc318a0aac8aeaa4f Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 30 Mar 2026 13:58:29 -0400 Subject: [PATCH 52/67] height_energy is replaced by energy_state --- .../models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv index 62ecbf26bc..2ec34e6898 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv @@ -194,7 +194,7 @@ mission:takeoff:spoiler_drag_coefficient,0.0,unitless mission:takeoff:spoiler_lift_coefficient,0.0,unitless mission:takeoff:thrust_incidence,4.0,deg settings:aerodynamics_method,FLOPS,unitless -settings:equations_of_motion,height_energy,unitless +settings:equations_of_motion,energy_state,unitless settings:mass_method,FLOPS,unitless # Unconverted Values From 04555e44c3ecf6be47739e181dd90f8d14edc565 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 30 Mar 2026 13:59:31 -0400 Subject: [PATCH 53/67] remove Mission.Summary.FUEL_MASS from unit test because it is removed --- aviary/subsystems/test/test_flops_based_premission.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index ae72b0f7d6..968360b930 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -402,8 +402,6 @@ def test_case_all_subsystems(self, case_name): Mission.Summary.OPERATING_MASS, # ZeroFuelMass Mission.Summary.ZERO_FUEL_MASS, - # FuelMass - Mission.Summary.FUEL_MASS, ], version=Version.BWB, step=1.01e-40, @@ -1144,8 +1142,6 @@ def test_case_geom_mass(self): assert_near_equal(prob[Mission.Summary.OPERATING_MASS], 321171.82272983, tol) # ZeroFuelMass assert_near_equal(prob[Mission.Summary.ZERO_FUEL_MASS], 383871.82272983, tol) - # FuelMass - assert_near_equal(prob[Mission.Summary.FUEL_MASS], 216128.17727017, tol) def test_case_all_subsystems(self): """ From c020f4cc112f6f215750f90cf7c479d8f4a88d0b Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 30 Mar 2026 20:24:22 -0400 Subject: [PATCH 54/67] preprocess Aircraft.Wing.ASPECT_RATIO_REFERENCE and Aircraft.Wing.THICKNESS_TO_CHORD_REFERENCE --- aviary/utils/preprocessors.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index 287507ed37..6b4d5e695f 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -49,6 +49,30 @@ def preprocess_options(aviary_options: AviaryValues, meta_data=_MetaData, verbos if engine_models is not None: preprocess_propulsion(aviary_options, engine_models, meta_data, verbosity) + if Aircraft.Wing.ASPECT_RATIO_REFERENCE in aviary_options: + arref = aviary_options.get_val(Aircraft.Wing.ASPECT_RATIO_REFERENCE) + if (np.isscalar(arref) and arref == 0) or (not np.isscalar(arref) and arref[0] == 0): + if Aircraft.Wing.ASPECT_RATIO in aviary_options: + ar = aviary_options.get_val(Aircraft.Wing.ASPECT_RATIO) + aviary_options.set_val(Aircraft.Wing.ASPECT_RATIO_REFERENCE, ar, 'unitless') + if verbosity >= Verbosity.BRIEF: + warnings.warn( + 'Assume Aircraft.Wing.ASPECT_RATIO_REFERENCE is the same ' + 'as Aircraft.Wing.ASPECT_RATIO.' + ) + + if Aircraft.Wing.THICKNESS_TO_CHORD_REFERENCE in aviary_options: + tcref = aviary_options.get_val(Aircraft.Wing.THICKNESS_TO_CHORD_REFERENCE) + if (np.isscalar(tcref) and tcref == 0) or (not np.isscalar(tcref) and tcref[0] == 0): + if Aircraft.Wing.THICKNESS_TO_CHORD in aviary_options: + tc = aviary_options.get_val(Aircraft.Wing.THICKNESS_TO_CHORD) + aviary_options.set_val(Aircraft.Wing.THICKNESS_TO_CHORD_REFERENCE, tc, 'unitless') + if verbosity >= Verbosity.BRIEF: + warnings.warn( + 'Assume Aircraft.Wing.THICKNESS_TO_CHORD_REFERENCE is the same ' + 'as Aircraft.Wing.THICKNESS_TO_CHORD.' + ) + # this function is not used def remove_preprocessed_options(aviary_options): From 455353abfa26170b3973edf6e02af528f293e906 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 30 Mar 2026 20:25:52 -0400 Subject: [PATCH 55/67] still check if arref[0] == 0 because it could happen when Aircraft.Wing.ASPECT_RATIO is an output. But remove the check if tcref == 0.0 --- aviary/subsystems/mass/flops_based/wing_detailed.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/aviary/subsystems/mass/flops_based/wing_detailed.py b/aviary/subsystems/mass/flops_based/wing_detailed.py index 08d78ad9c4..dde8dd16ca 100644 --- a/aviary/subsystems/mass/flops_based/wing_detailed.py +++ b/aviary/subsystems/mass/flops_based/wing_detailed.py @@ -384,7 +384,7 @@ def compute(self, inputs, outputs): ar = inputs[Aircraft.Wing.ASPECT_RATIO] arref = inputs[Aircraft.Wing.ASPECT_RATIO_REFERENCE] - if arref[0] == 0: + if arref[0] == 0: # this could happen if Aircraft.Wing.ASPECT_RATIO is not an input arref[0] = ar[0] if verbosity >= Verbosity.BRIEF: warnings.warn( @@ -411,13 +411,6 @@ def compute(self, inputs, outputs): thickness_to_chord = inputs['BWB_THICKNESS_TO_CHORD_DISTRIBUTION'] tc = inputs[Aircraft.Wing.THICKNESS_TO_CHORD] tcref = inputs[Aircraft.Wing.THICKNESS_TO_CHORD_REFERENCE] - if tcref == 0.0: - tcref = tc - if verbosity >= Verbosity.BRIEF: - warnings.warn( - 'Assume Aircraft.Wing.THICKNESS_TO_CHORD_REFERENCE is the same ' - 'as Aircraft.Wing.THICKNESS_TO_CHORD' - ) thickness_to_chord_mod = [] for x in thickness_to_chord: thickness_to_chord_mod.append(x * tc[0] / tcref[0]) From 0494abf65d37aeb42fef998e5a9b799b899c4557 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 30 Mar 2026 21:26:59 -0400 Subject: [PATCH 56/67] minor update --- aviary/subsystems/mass/flops_based/test/test_wing_detailed.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py b/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py index 1bf845043f..0cd62cbf19 100644 --- a/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py +++ b/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py @@ -655,7 +655,7 @@ def test_case2(self): ) prob.model.set_input_defaults(Aircraft.Wing.THICKNESS_TO_CHORD, 0.11, units='unitless') prob.model.set_input_defaults( - Aircraft.Wing.THICKNESS_TO_CHORD_REFERENCE, 0.0, units='unitless' + Aircraft.Wing.THICKNESS_TO_CHORD_REFERENCE, 0.11, units='unitless' ) setup_model_options(self.prob, aviary_options) From 2171f6ad369d05e6c0ffe235e3cb19938f2267e4 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 2 Apr 2026 12:25:35 -0400 Subject: [PATCH 57/67] remove Mission.Design.GROSS_MASS --- .../subsystems/mass/flops_based/test/test_wing_detailed.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py b/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py index 3072560bb8..74d70403bc 100644 --- a/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py +++ b/aviary/subsystems/mass/flops_based/test/test_wing_detailed.py @@ -646,7 +646,6 @@ def test_case2(self): promotes_outputs=['*'], ) - prob.model.set_input_defaults(Mission.Design.GROSS_MASS, val=600000.0, units='lbm') prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO, 5.4252, units='unitless') prob.model.set_input_defaults(Aircraft.Wing.ASPECT_RATIO_REFERENCE, 0.0, units='unitless') prob.model.set_input_defaults(Aircraft.Wing.STRUT_BRACING_FACTOR, 0.0, units='unitless') @@ -699,7 +698,4 @@ def test_case2(self): if __name__ == '__main__': - # unittest.main() - test = BWBDetailedWingBendingTest() - test.setUp() - test.test_case2() + unittest.main() From 1a03684cd37a151ad9d8db4cc9835bf300bfd9d3 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 2 Apr 2026 13:48:49 -0400 Subject: [PATCH 58/67] change variable names due to Aviary update --- .../bwb300_baseline_FLOPS.csv | 10 +++--- .../bwb300_baseline_FLOPS_data.py | 8 ++--- .../test/test_flops_based_premission.py | 36 ++++++++++++------- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv index 2ec34e6898..ddfb7c4b27 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS.csv @@ -175,15 +175,15 @@ aircraft:wing:ultimate_load_factor,3.75,unitless aircraft:wing:var_sweep_mass_penalty,0.0,unitless aircraft:wing:wetted_area_scaler,0.61,unitless mission:constraints:max_mach,0.9,unitless -mission:design:gross_mass,600000.0,lbm -mission:design:range,7500.0,NM -mission:design:thrust_takeoff_per_eng,0.0,lbf +aircraft:design:gross_mass,600000.0,lbm +aircraft:design:range,7500.0,NM +aircraft:design:thrust_takeoff_per_eng,0.0,lbf mission:landing:drag_coefficient_min,0.0,unitless mission:landing:flare_rate,3.0,deg/s mission:landing:initial_velocity,150.0,ft/s mission:landing:lift_coefficient_max,3.0,unitless -mission:summary:cruise_mach,0.85,unitless -mission:summary:fuel_flow_scaler,1.0,unitless +aircraft:design:cruise_mach,0.85,unitless +mission:fuel_flow_scaler,1.0,unitless mission:takeoff:angle_of_attack_runway,4.0,deg mission:takeoff:braking_friction_coefficient,0.35,unitless mission:takeoff:drag_coefficient_min,0.035258,unitless diff --git a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py index b91dbaab00..df0963aa39 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py +++ b/aviary/models/aircraft/blended_wing_body/bwb300_baseline_FLOPS_data.py @@ -14,7 +14,7 @@ inputs.set_val(Aircraft.Design.BASE_AREA, 0.0, 'ft**2') # SBASE inputs.set_val(Aircraft.Design.EMPTY_MASS_MARGIN_SCALER, 0.0) # EWMARG inputs.set_val( - Mission.Design.GROSS_MASS, 600000.0, 'lbm' + Aircraft.Design.GROSS_MASS, 600000.0, 'lbm' ) # DGW, value taken from GW which is not in Aviary inputs.set_val(Aircraft.Design.USE_ALT_MASS, False) inputs.set_val(Aircraft.Design.LIFT_DEPENDENT_DRAG_COEFF_FACTOR, 1.0) # FCDI @@ -271,7 +271,7 @@ # --------------------------- inputs.set_val(Mission.Summary.CRUISE_MACH, 0.85) # VCMN inputs.set_val(Mission.Summary.FUEL_FLOW_SCALER, 1.0) # FACT -inputs.set_val(Mission.Design.RANGE, 7500.0, 'NM') # DESRNG +inputs.set_val(Aircraft.Design.RANGE, 7500.0, 'NM') # DESRNG inputs.set_val(Mission.Constraints.MAX_MACH, 0.9) # VMMO inputs.set_val(Mission.Landing.LIFT_COEFFICIENT_MAX, 3.0) # CLLDM @@ -279,7 +279,7 @@ inputs.set_val(Aircraft.Design.LANDING_TO_TAKEOFF_MASS_RATIO, 0.7) # WRATIO inputs.set_val(Mission.Landing.INITIAL_VELOCITY, 150.0, 'ft/s') # VAPPR inputs.set_val(Mission.Takeoff.ROLLING_FRICTION_COEFFICIENT, 0.025) # ROLLMU -inputs.set_val(Mission.Design.THRUST_TAKEOFF_PER_ENG, 0.0, 'lbf') # THROFF +inputs.set_val(Aircraft.Design.THRUST_TAKEOFF_PER_ENG, 0.0, 'lbf') # THROFF inputs.set_val(Mission.Takeoff.ANGLE_OF_ATTACK_RUNWAY, 4.0, 'deg') # ALPRUN inputs.set_val(Mission.Takeoff.THRUST_INCIDENCE, 4.0, 'deg') # TINC inputs.set_val(Mission.Takeoff.BRAKING_FRICTION_COEFFICIENT, 0.35) # BRAKMU @@ -425,7 +425,7 @@ outputs.set_val(Mission.Summary.USEFUL_LOAD, 20996.3933862, 'lbm') -# outputs.set_val(Mission.Design.MACH, 0.800) # FMDES +# outputs.set_val(Aircraft.Design.MACH, 0.800) # FMDES outputs.set_val(Mission.Summary.OPERATING_MASS, 321171.82272983, 'lbm') # DOWE outputs.set_val(Mission.Summary.ZERO_FUEL_MASS, 383871.82272983, 'lbm') # WZF outputs.set_val(Mission.Summary.FUEL_MASS, 216128.17727028, 'lbm') # FUELM diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index b706aa8f86..f059fce037 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -417,7 +417,7 @@ def test_case_all_subsystems(self, case_name): # OperatingMass Mission.OPERATING_MASS, # ZeroFuelMass - Mission.Summary.ZERO_FUEL_MASS, + Mission.ZERO_FUEL_MASS, ], version=Version.BWB, step=1.01e-40, @@ -728,8 +728,8 @@ def test_case_all_subsystems(self): assert_near_equal(prob[Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST], 70000.0 * 3, tol) # Aerodynamics # Design - assert_near_equal(prob[Mission.Design.MACH], 0.91589163, tol) - assert_near_equal(prob[Mission.Design.LIFT_COEFFICIENT], 0.3487563, tol) + assert_near_equal(prob[Aircraft.Design.MACH], 0.91589163, tol) + assert_near_equal(prob[Aircraft.Design.LIFT_COEFFICIENT], 0.3487563, tol) @use_tempdirs @@ -975,8 +975,8 @@ def test_case_all_subsystems(self): assert_near_equal(prob[Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST], 70000.0 * 3, tol) # Aerodynamics # Design - assert_near_equal(prob[Mission.Design.MACH], 0.89489036, tol) - assert_near_equal(prob[Mission.Design.LIFT_COEFFICIENT], 0.42836987, tol) + assert_near_equal(prob[Aircraft.Design.MACH], 0.89489036, tol) + assert_near_equal(prob[Aircraft.Design.LIFT_COEFFICIENT], 0.42836987, tol) @use_tempdirs @@ -1003,7 +1003,11 @@ def test_case_geom(self): prob.model.add_subsystem( 'pre_mission', - CorePreMission(aviary_options=self.flops_inputs, subsystems=geom_subsystem), + CorePreMission( + aviary_options=self.flops_inputs, + subsystems=geom_subsystem, + subsystem_options={}, + ), promotes_inputs=['*'], promotes_outputs=['*'], ) @@ -1074,7 +1078,11 @@ def test_case_geom_mass(self): prob.model.add_subsystem( 'pre_mission', - CorePreMission(aviary_options=self.flops_inputs, subsystems=geom_mass_subsystems), + CorePreMission( + aviary_options=self.flops_inputs, + subsystems=geom_mass_subsystems, + subsystem_options={}, + ), promotes_inputs=['*'], promotes_outputs=['*'], ) @@ -1142,7 +1150,7 @@ def test_case_geom_mass(self): assert_near_equal(prob[Aircraft.Engine.THRUST_REVERSERS_MASS], 0.0, tol) assert_near_equal(prob[Aircraft.Propulsion.TOTAL_THRUST_REVERSERS_MASS], 0.0, tol) # LandingMassGroup - assert_near_equal(prob[Aircraft.Design.LANDING_MASS], 420000.0, tol) + assert_near_equal(prob[Aircraft.Design.TOUCHDOWN_MASS_MAX], 420000.0, tol) # SurfaceControlMass assert_near_equal(prob[Aircraft.Wing.SURFACE_CONTROL_MASS], 8093.1997108029764, tol) assert_near_equal(prob[Aircraft.Wing.CONTROL_SURFACE_AREA], 2526.5144041515805, tol) @@ -1179,9 +1187,9 @@ def test_case_geom_mass(self): # EmptyMass assert_near_equal(prob[Aircraft.Design.EMPTY_MASS], 286969.99768419, tol) # OperatingMass - assert_near_equal(prob[Mission.Summary.OPERATING_MASS], 321171.82272983, tol) + assert_near_equal(prob[Mission.OPERATING_MASS], 321171.82272983, tol) # ZeroFuelMass - assert_near_equal(prob[Mission.Summary.ZERO_FUEL_MASS], 383871.82272983, tol) + assert_near_equal(prob[Mission.ZERO_FUEL_MASS], 383871.82272983, tol) def test_case_all_subsystems(self): """ @@ -1197,7 +1205,9 @@ def test_case_all_subsystems(self): prob.model.add_subsystem( 'pre_mission', CorePreMission( - aviary_options=self.flops_inputs, subsystems=default_premission_subsystems + aviary_options=self.flops_inputs, + subsystems=default_premission_subsystems, + subsystem_options={}, ), promotes_inputs=['*'], promotes_outputs=['*'], @@ -1211,8 +1221,8 @@ def test_case_all_subsystems(self): tol = 1e-4 # Design - assert_near_equal(prob[Mission.Design.MACH], 0.89939238, tol) - assert_near_equal(prob[Mission.Design.LIFT_COEFFICIENT], 0.40810915, tol) + assert_near_equal(prob[Aircraft.Design.MACH], 0.89939238, tol) + assert_near_equal(prob[Aircraft.Design.LIFT_COEFFICIENT], 0.40810915, tol) if __name__ == '__main__': From 7bf08a53ff0c1471bd6cff1906059f94236909cb Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 3 Apr 2026 13:51:46 -0400 Subject: [PATCH 59/67] fixed a typo --- aviary/docs/theory_guide/gasp_based_bwb.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/docs/theory_guide/gasp_based_bwb.ipynb b/aviary/docs/theory_guide/gasp_based_bwb.ipynb index edc3b22942..2b715a71a5 100644 --- a/aviary/docs/theory_guide/gasp_based_bwb.ipynb +++ b/aviary/docs/theory_guide/gasp_based_bwb.ipynb @@ -439,7 +439,7 @@ "- Aviary does not have winglet geometry.\n", "- In GASP, a pilot weight is 170 lb and in Aviary it is 198 lb. In GASP, each attendant weights 130 lb and in Aviary it is 177 lb.\n", "- GASP has fuselage acoustic treatment.\n", - "- GASP conputes tip tank weight.\n", + "- GASP computes tip tank weight.\n", "- GASP allows canard configurations.\n" ] } From b5268dc3953be6591e7e536ec1d457d32202564e Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 9 Apr 2026 19:21:18 -0400 Subject: [PATCH 60/67] added a new variable Aircraft.BWB.MAX_BAY_WIDTH --- aviary/variable_info/variable_meta_data.py | 14 ++++++++++++++ aviary/variable_info/variables.py | 1 + 2 files changed, 15 insertions(+) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 106e57cc69..7e61a72bfc 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -353,6 +353,20 @@ default_value=True, ) +add_meta_data( + Aircraft.BWB.MAX_BAY_WIDTH, + meta_data=_MetaData, + historical_name={ + 'GASP': None, + 'FLOPS': 'FUSEIN.BAYWMX', + 'LEAPS1': None, + }, + units='ft', + desc='maximum bay width', + types=float, + default_value=0, +) + add_meta_data( Aircraft.BWB.MAX_NUM_BAYS, meta_data=_MetaData, diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index e2365c3003..020eba402d 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -37,6 +37,7 @@ class Battery: class BWB: DETAILED_WING_PROVIDED = 'aircraft:blended_wing_body_design:detailed_wing_provided' + MAX_BAY_WIDTH = 'aircraft:blended_wing_body_design:max_bay_width' MAX_NUM_BAYS = 'aircraft:blended_wing_body_design:max_num_bays' NUM_BAYS = 'aircraft:blended_wing_body_design:num_bays' PASSENGER_LEADING_EDGE_SWEEP = ( From e5f50803a3d9b1f4d5bf543eee603d243bbe3948 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 9 Apr 2026 19:22:12 -0400 Subject: [PATCH 61/67] modified some warning messages --- .../aerodynamics/aerodynamics_builder.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/aviary/subsystems/aerodynamics/aerodynamics_builder.py b/aviary/subsystems/aerodynamics/aerodynamics_builder.py index 57fff063dc..ec1c568d50 100644 --- a/aviary/subsystems/aerodynamics/aerodynamics_builder.py +++ b/aviary/subsystems/aerodynamics/aerodynamics_builder.py @@ -486,20 +486,29 @@ def get_parameters(self, aviary_inputs=None, user_options=None, subsystem_option except KeyError: design_type = AircraftTypes.TRANSPORT if verbosity >= Verbosity.BRIEF: - warnings.warn('Assume the aircraft is a transport.') + warnings.warn( + 'No input value found for Aircraft.Design.TYPE. ' + 'Assuming the aircraft is of type: AircraftTypes.TRANSPORT.' + ) try: num_horizontal_tails = aviary_inputs.get_val(Aircraft.HorizontalTail.NUM_TAILS) except KeyError: num_horizontal_tails = 1 if verbosity >= Verbosity.BRIEF: - warnings.warn('Assume there is a horizontal tail.') + warnings.warn( + 'No input value found for Aircraft.HorizontalTail.NUM_TAILS. ' + 'Assuming there is 1 horizontal tail.' + ) try: num_vertical_tails = aviary_inputs.get_val(Aircraft.VerticalTail.NUM_TAILS) except KeyError: num_vertical_tails = 1 if verbosity >= Verbosity.BRIEF: - warnings.warn('Assume there is a vertical tail.') + warnings.warn( + 'No inpuit value found for Aircraft.VerticalTail.NUM_TAILS. ' + 'Assuming there is 1 vertical tail.' + ) if design_type is AircraftTypes.BLENDED_WING_BODY: if num_horizontal_tails == 0 and num_vertical_tails == 0: From 35aa5430b42236df3013dd91491d77d3e008c04d Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 9 Apr 2026 19:23:01 -0400 Subject: [PATCH 62/67] added a couple notes --- aviary/subsystems/test/test_flops_based_premission.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index f059fce037..0e364c6137 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -1095,6 +1095,7 @@ def test_case_geom_mass(self): prob.run_model() + # Only masses are checked because geometry is checked in test_case_geom() already. tol = 1e-4 # Mass # CargoMass @@ -1219,6 +1220,7 @@ def test_case_all_subsystems(self): prob.run_model() + # Only aero parameters are checked because geometry and mass are checked in test_case_geom() already. tol = 1e-4 # Design assert_near_equal(prob[Aircraft.Design.MACH], 0.89939238, tol) From 02ccefe2f9ce3f94f09d06aafed30cf4f88ff0bd Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 9 Apr 2026 19:24:21 -0400 Subject: [PATCH 63/67] added constraint max_bay_width to BWBDetailedCabinLayout() and added a unit test. --- .../geometry/flops_based/fuselage.py | 8 ++- .../flops_based/test/test_fuselage.py | 57 ++++++++++++++++++- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/fuselage.py b/aviary/subsystems/geometry/flops_based/fuselage.py index 5ed97719e1..968b87018a 100644 --- a/aviary/subsystems/geometry/flops_based/fuselage.py +++ b/aviary/subsystems/geometry/flops_based/fuselage.py @@ -545,6 +545,7 @@ def setup(self): self.add_input( 'Rear_spar_percent_chord', 0.7, units='unitless', desc='RSPCHD at fuselage centerline' ) + add_aviary_input(self, Aircraft.BWB.MAX_BAY_WIDTH, units='ft') add_aviary_output(self, Aircraft.Fuselage.LENGTH, units='ft') add_aviary_output(self, Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH, units='ft') @@ -553,6 +554,7 @@ def setup(self): add_aviary_output(self, Aircraft.Fuselage.MAX_HEIGHT, units='ft') add_aviary_output(self, Aircraft.Wing.ROOT_CHORD, units='ft') add_aviary_output(self, Aircraft.BWB.NUM_BAYS, units='unitless') + self.add_output('bay_width', units='ft', desc='BAYW') def setup_partials(self): self.declare_partials('*', '*', method='cs') @@ -564,8 +566,7 @@ def compute(self, inputs, outputs): tan_sweep = np.tan(sweep / 57.296) bay_width_nom = 12.0 # ft - # Do not set max bay width for now. Later can create an Aviary variable for BAYWMX - bay_width_max = 0.0 + bay_width_max = inputs[Aircraft.BWB.MAX_BAY_WIDTH] num_bays = 0 num_bays_loc = num_bays num_bays_max = self.options[Aircraft.BWB.MAX_NUM_BAYS] @@ -669,7 +670,7 @@ def compute(self, inputs, outputs): num_bays_tmp = 0.999 + max_width / bay_width if num_bays_tmp.real > num_bays_max and num_bays_max > 0: num_bays = num_bays_max - max_width = bay_width_max * bay_width + max_width = num_bays_max * bay_width pax_compart_length = area_cabin / max_width + tan_sweep * max_width / 4.0 root_chord = pax_compart_length - tan_sweep * max_width / 2.0 else: @@ -687,6 +688,7 @@ def compute(self, inputs, outputs): outputs[Aircraft.Fuselage.MAX_WIDTH] = max_width outputs[Aircraft.Fuselage.MAX_HEIGHT] = max_height outputs[Aircraft.Wing.ROOT_CHORD] = root_chord + outputs['bay_width'] = bay_width # TODO: For the int calls, I see that those are part of a while loop that solves # a nonlinear equation by Gauss-Siedel until it converges. The interesting part is diff --git a/aviary/subsystems/geometry/flops_based/test/test_fuselage.py b/aviary/subsystems/geometry/flops_based/test/test_fuselage.py index 4ee4d97de4..20245c29f0 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_fuselage.py +++ b/aviary/subsystems/geometry/flops_based/test/test_fuselage.py @@ -146,7 +146,7 @@ def test_case1(self): prob.run_model() num_bays = prob.get_val(Aircraft.BWB.NUM_BAYS) - assert_near_equal(num_bays, [7], tolerance=1e-9) + assert_near_equal(num_bays, 7, tolerance=1e-9) fuselage_length = prob.get_val(Aircraft.Fuselage.LENGTH) assert_near_equal(fuselage_length, 112.30019369, tolerance=1e-9) @@ -198,7 +198,7 @@ def test_case2(self): assert_near_equal(fuselage_width, 49.77182929, tolerance=1e-9) num_bays = prob.get_val(Aircraft.BWB.NUM_BAYS) - assert_near_equal(num_bays, [4], tolerance=1e-9) + assert_near_equal(num_bays, 4, tolerance=1e-9) fuselage_length = prob.get_val(Aircraft.Fuselage.LENGTH) assert_near_equal(fuselage_length, 116.57609631, tolerance=1e-9) @@ -215,6 +215,59 @@ def test_case2(self): root_chord = prob.get_val(Aircraft.Wing.ROOT_CHORD) assert_near_equal(root_chord, 38.5, tolerance=1e-9) + def test_case3(self): + """bwb300_baseline, MAX_NUM_BAYS=4, MAX_BAY_WIDTH=10.0""" + prob = self.prob + options = self.aviary_options = AviaryValues() + options.set_val(Settings.VERBOSITY, 1, units='unitless') + + options.set_val(Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS, 76, units='unitless') + options.set_val(Aircraft.CrewPayload.Design.NUM_FIRST_CLASS, 24, units='unitless') + options.set_val(Aircraft.CrewPayload.Design.NUM_ECONOMY_CLASS, 200, units='unitless') + options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_BUSINESS, 0, units='unitless') + options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_FIRST, 0, units='unitless') + options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 0, units='unitless') + options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_BUSINESS, 0.0, units='inch') + options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST, 0.0, units='inch') + options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 0.0, units='inch') + options.set_val(Aircraft.BWB.MAX_NUM_BAYS, 4, units='unitless') + + prob.model.add_subsystem( + 'layout', BWBDetailedCabinLayout(), promotes_outputs=['*'], promotes_inputs=['*'] + ) + setup_model_options(self.prob, options) + prob.setup(check=False, force_alloc_complex=True) + prob.set_val(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, val=60.0, units='deg') + prob.set_val(Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, val=0.11, units='unitless') + # prob.set_val(Aircraft.Fuselage.MAX_WIDTH, val=50.0, units='ft') + prob.set_val(Aircraft.BWB.MAX_BAY_WIDTH, val=10.0, units='ft') + prob.set_val('Rear_spar_percent_chord', val=0.7, units='unitless') + prob.run_model() + + bay_width = prob.get_val('bay_width') + assert_near_equal(bay_width, 10.0, tolerance=1e-9) + + fuselage_width = prob.get_val(Aircraft.Fuselage.MAX_WIDTH) + assert_near_equal(fuselage_width, 40.0, tolerance=1e-9) + + num_bays = prob.get_val(Aircraft.BWB.NUM_BAYS) + assert_near_equal(num_bays, 4.0, tolerance=1e-9) + + fuselage_length = prob.get_val(Aircraft.Fuselage.LENGTH) + assert_near_equal(fuselage_length, 131.4890549, tolerance=1e-9) + + pax_compart_length = prob.get_val(Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH) + assert_near_equal(pax_compart_length, 92.04233843, tolerance=1e-9) + + fuselage_height = prob.get_val(Aircraft.Fuselage.MAX_HEIGHT) + assert_near_equal(fuselage_height, 14.46379604, tolerance=1e-9) + + cabin_area = prob.get_val(Aircraft.Fuselage.CABIN_AREA) + assert_near_equal(cabin_area, 2988.87966179, tolerance=1e-9) + + root_chord = prob.get_val(Aircraft.Wing.ROOT_CHORD) + assert_near_equal(root_chord, 57.40164466, tolerance=1e-9) + @use_tempdirs class BWBFuselagePrelimTest(unittest.TestCase): From f8d57aab3fdd4693f763e3660d192eaa1a6189eb Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 9 Apr 2026 23:20:05 -0400 Subject: [PATCH 64/67] minor change --- aviary/subsystems/geometry/flops_based/fuselage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/subsystems/geometry/flops_based/fuselage.py b/aviary/subsystems/geometry/flops_based/fuselage.py index 968b87018a..2dfac0f1dd 100644 --- a/aviary/subsystems/geometry/flops_based/fuselage.py +++ b/aviary/subsystems/geometry/flops_based/fuselage.py @@ -554,7 +554,7 @@ def setup(self): add_aviary_output(self, Aircraft.Fuselage.MAX_HEIGHT, units='ft') add_aviary_output(self, Aircraft.Wing.ROOT_CHORD, units='ft') add_aviary_output(self, Aircraft.BWB.NUM_BAYS, units='unitless') - self.add_output('bay_width', units='ft', desc='BAYW') + self.add_output('bay_width', units='ft', desc='BAYW') # for testing purpose def setup_partials(self): self.declare_partials('*', '*', method='cs') From 6f5bffbe02f6594aef33aae2ca2f33d78b8e0552 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 10 Apr 2026 13:34:01 -0400 Subject: [PATCH 65/67] run while loop at least once --- aviary/subsystems/geometry/flops_based/fuselage.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/fuselage.py b/aviary/subsystems/geometry/flops_based/fuselage.py index 2dfac0f1dd..3e0ed8c030 100644 --- a/aviary/subsystems/geometry/flops_based/fuselage.py +++ b/aviary/subsystems/geometry/flops_based/fuselage.py @@ -568,7 +568,6 @@ def compute(self, inputs, outputs): bay_width_nom = 12.0 # ft bay_width_max = inputs[Aircraft.BWB.MAX_BAY_WIDTH] num_bays = 0 - num_bays_loc = num_bays num_bays_max = self.options[Aircraft.BWB.MAX_NUM_BAYS] root_chord_min = 38.5 # ft width_lava = 36.0 # inch @@ -637,7 +636,8 @@ def compute(self, inputs, outputs): if num_bays > num_bays_max and num_bays_max > 0: num_bays = num_bays_max - while num_bays_loc != num_bays: + num_bays_loc = num_bays + while True: num_bays_loc = num_bays # Cabin area wasted due to slanted != side wall area_waste = num_bays * tan_sweep * (bay_width_nom / 2.0) ** 2 @@ -677,6 +677,8 @@ def compute(self, inputs, outputs): num_bays = smooth_int_tanh(num_bays_tmp, mu=40.0) # If number of bays has changed, recalculate cabin area + if num_bays_loc == num_bays: + break length = pax_compart_length / rear_spar_percent_chord max_height = height_to_width * length From 0939f78f38b118dbba53ce2eddd5cf1d9e2cf15b Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 10 Apr 2026 14:07:12 -0400 Subject: [PATCH 66/67] added an iteration counter --- aviary/subsystems/geometry/flops_based/fuselage.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/aviary/subsystems/geometry/flops_based/fuselage.py b/aviary/subsystems/geometry/flops_based/fuselage.py index 3e0ed8c030..616d262373 100644 --- a/aviary/subsystems/geometry/flops_based/fuselage.py +++ b/aviary/subsystems/geometry/flops_based/fuselage.py @@ -637,6 +637,7 @@ def compute(self, inputs, outputs): num_bays = num_bays_max num_bays_loc = num_bays + iter = 0 while True: num_bays_loc = num_bays # Cabin area wasted due to slanted != side wall @@ -676,8 +677,10 @@ def compute(self, inputs, outputs): else: num_bays = smooth_int_tanh(num_bays_tmp, mu=40.0) + iter = iter + 1 # If number of bays has changed, recalculate cabin area - if num_bays_loc == num_bays: + if num_bays_loc == num_bays or iter > 100: + warnings.warn(f'Number of iteration exceeded 100.') break length = pax_compart_length / rear_spar_percent_chord From a7e1603b86c13c9802b2cf248acab4899fcf228e Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 10 Apr 2026 15:17:54 -0400 Subject: [PATCH 67/67] set Aircraft.BWB.MAX_BAY_WIDTH as an option --- aviary/subsystems/geometry/flops_based/fuselage.py | 4 ++-- aviary/subsystems/geometry/flops_based/test/test_fuselage.py | 2 +- aviary/variable_info/variable_meta_data.py | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/fuselage.py b/aviary/subsystems/geometry/flops_based/fuselage.py index 616d262373..c7128c3149 100644 --- a/aviary/subsystems/geometry/flops_based/fuselage.py +++ b/aviary/subsystems/geometry/flops_based/fuselage.py @@ -538,6 +538,7 @@ def initialize(self): add_aviary_option(self, Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST) add_aviary_option(self, Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY) add_aviary_option(self, Aircraft.BWB.MAX_NUM_BAYS) + add_aviary_option(self, Aircraft.BWB.MAX_BAY_WIDTH) def setup(self): add_aviary_input(self, Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, units='deg') @@ -545,7 +546,6 @@ def setup(self): self.add_input( 'Rear_spar_percent_chord', 0.7, units='unitless', desc='RSPCHD at fuselage centerline' ) - add_aviary_input(self, Aircraft.BWB.MAX_BAY_WIDTH, units='ft') add_aviary_output(self, Aircraft.Fuselage.LENGTH, units='ft') add_aviary_output(self, Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH, units='ft') @@ -566,7 +566,7 @@ def compute(self, inputs, outputs): tan_sweep = np.tan(sweep / 57.296) bay_width_nom = 12.0 # ft - bay_width_max = inputs[Aircraft.BWB.MAX_BAY_WIDTH] + bay_width_max, _ = self.options[Aircraft.BWB.MAX_BAY_WIDTH] num_bays = 0 num_bays_max = self.options[Aircraft.BWB.MAX_NUM_BAYS] root_chord_min = 38.5 # ft diff --git a/aviary/subsystems/geometry/flops_based/test/test_fuselage.py b/aviary/subsystems/geometry/flops_based/test/test_fuselage.py index 20245c29f0..3983328a91 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_fuselage.py +++ b/aviary/subsystems/geometry/flops_based/test/test_fuselage.py @@ -231,6 +231,7 @@ def test_case3(self): options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST, 0.0, units='inch') options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 0.0, units='inch') options.set_val(Aircraft.BWB.MAX_NUM_BAYS, 4, units='unitless') + options.set_val(Aircraft.BWB.MAX_BAY_WIDTH, 10.0, units='ft') prob.model.add_subsystem( 'layout', BWBDetailedCabinLayout(), promotes_outputs=['*'], promotes_inputs=['*'] @@ -240,7 +241,6 @@ def test_case3(self): prob.set_val(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, val=60.0, units='deg') prob.set_val(Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, val=0.11, units='unitless') # prob.set_val(Aircraft.Fuselage.MAX_WIDTH, val=50.0, units='ft') - prob.set_val(Aircraft.BWB.MAX_BAY_WIDTH, val=10.0, units='ft') prob.set_val('Rear_spar_percent_chord', val=0.7, units='unitless') prob.run_model() diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 7e61a72bfc..0203d5da9f 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -364,6 +364,7 @@ units='ft', desc='maximum bay width', types=float, + option=True, default_value=0, )