From 363a42e785c9ccb3eb84bc5269970b4d266940ef Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 26 Jun 2026 12:31:40 -0400 Subject: [PATCH 01/31] renamed Aircraft.Fuselage.SEAT_WIDTH to Aircraft.Fuselage.SEAT_WIDTH_ECONOMY --- .../subsystems/blended_wing_body_GASP.ipynb | 4 ++-- .../blended_wing_body/generic_BWB_GASP.csv | 2 +- .../large_single_aisle_1_GASP.csv | 2 +- .../large_turboprop_freighter_GASP.csv | 2 +- .../small_single_aisle_GASP.csv | 2 +- .../flops_based/test/test_fuselage.py | 4 ++-- .../geometry/gasp_based/fuselage.py | 16 +++++++------ .../geometry/gasp_based/test/test_fuselage.py | 24 ++++++++++++------- .../gasp_based/test/test_size_group.py | 10 ++++---- .../gasp_based/test/test_mass_premission.py | 18 +++++++------- aviary/utils/fortran_to_aviary.py | 2 +- .../test/data/converter_test_BWB_GASP.csv | 2 +- .../converter_test_configuration_GASP.csv | 2 +- ...nverter_test_large_single_aisle_1_GASP.csv | 2 +- ...converter_test_small_single_aisle_GASP.csv | 2 +- .../test_data/V3_bug_fixed_IO.py | 2 +- .../test_models/aircraft_for_bench_FwGm.csv | 2 +- .../test_models/aircraft_for_bench_GwFm.csv | 2 +- .../test_models/aircraft_for_bench_GwGm.csv | 2 +- .../test_models/configuration_test_GASP.csv | 2 +- aviary/variable_info/variable_meta_data.py | 2 +- aviary/variable_info/variables.py | 2 +- 22 files changed, 58 insertions(+), 50 deletions(-) diff --git a/aviary/docs/user_guide_unreviewed/subsystems/blended_wing_body_GASP.ipynb b/aviary/docs/user_guide_unreviewed/subsystems/blended_wing_body_GASP.ipynb index a175d75377..316806fc45 100644 --- a/aviary/docs/user_guide_unreviewed/subsystems/blended_wing_body_GASP.ipynb +++ b/aviary/docs/user_guide_unreviewed/subsystems/blended_wing_body_GASP.ipynb @@ -38,7 +38,7 @@ "from aviary.utils.doctape import get_variable_name, glue_variable\n", "\n", "glue_variable(get_variable_name(Aircraft.Wing.MAX_CAMBER_AT_70_SEMISPAN), md_code=True)\n", - "glue_variable(get_variable_name(Aircraft.Fuselage.SEAT_WIDTH), md_code=False)\n", + "glue_variable(get_variable_name(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY), md_code=False)\n", "glue_variable(get_variable_name(Aircraft.Fuselage.NUM_AISLES), md_code=False)\n", "glue_variable(get_variable_name(Aircraft.Fuselage.AISLE_WIDTH), md_code=False)\n", "glue_variable(get_variable_name(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY), md_code=False)\n", @@ -85,7 +85,7 @@ "\n", "| Parameters | Units |\n", "| ---------- | ----- |\n", - "| {glue:md}`Aircraft.Fuselage.SEAT_WIDTH` | inch |\n", + "| {glue:md}`Aircraft.Fuselage.SEAT_WIDTH_ECONOMY` | inch |\n", "| {glue:md}`Aircraft.Fuselage.NUM_AISLES` | unitless |\n", "| {glue:md}`Aircraft.Fuselage.AISLE_WIDTH` | inch |\n", "| {glue:md}`Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY` | inch |\n", diff --git a/aviary/models/aircraft/blended_wing_body/generic_BWB_GASP.csv b/aviary/models/aircraft/blended_wing_body/generic_BWB_GASP.csv index 8ad3688b2e..87d14a05b2 100644 --- a/aviary/models/aircraft/blended_wing_body/generic_BWB_GASP.csv +++ b/aviary/models/aircraft/blended_wing_body/generic_BWB_GASP.csv @@ -71,7 +71,7 @@ aircraft:fuselage:num_aisles,3,unitless aircraft:fuselage:pilot_compartment_length,7.5,ft aircraft:fuselage:pressure_differential,10,psi aircraft:fuselage:pressurized_width_additional,0,ft -aircraft:fuselage:seat_width,21,inch +aircraft:fuselage:seat_width_economy,21,inch aircraft:fuselage:tail_fineness,1.75,unitless aircraft:fuselage:wetted_area_ratio_aftbody_to_total,0.2,unitless aircraft:fuselage:wetted_area_scaler,1.0001,unitless diff --git a/aviary/models/aircraft/large_single_aisle_1/large_single_aisle_1_GASP.csv b/aviary/models/aircraft/large_single_aisle_1/large_single_aisle_1_GASP.csv index dc7697ca88..dd070e1497 100644 --- a/aviary/models/aircraft/large_single_aisle_1/large_single_aisle_1_GASP.csv +++ b/aviary/models/aircraft/large_single_aisle_1/large_single_aisle_1_GASP.csv @@ -56,7 +56,7 @@ aircraft:fuselage:nose_fineness,1,unitless aircraft:fuselage:num_aisles,1,unitless aircraft:fuselage:pilot_compartment_length,9.5,ft aircraft:fuselage:pressure_differential,7.5,psi -aircraft:fuselage:seat_width,20.2,inch +aircraft:fuselage:seat_width_economy,20.2,inch aircraft:fuselage:tail_fineness,3,unitless aircraft:fuselage:wetted_area,4000,ft**2 aircraft:horizontal_tail:aspect_ratio,4.75,unitless diff --git a/aviary/models/aircraft/large_turboprop_freighter/large_turboprop_freighter_GASP.csv b/aviary/models/aircraft/large_turboprop_freighter/large_turboprop_freighter_GASP.csv index ce731fc60f..1802b3aa4f 100644 --- a/aviary/models/aircraft/large_turboprop_freighter/large_turboprop_freighter_GASP.csv +++ b/aviary/models/aircraft/large_turboprop_freighter/large_turboprop_freighter_GASP.csv @@ -96,7 +96,7 @@ aircraft:fuselage:nose_fineness, 1, unitless aircraft:fuselage:num_aisles, 1, unitless aircraft:fuselage:pilot_compartment_length, 10.6, ft aircraft:fuselage:pressure_differential, 6.55, psi -aircraft:fuselage:seat_width, 18, inch +aircraft:fuselage:seat_width_economy, 18, inch aircraft:fuselage:tail_fineness, 2.9, unitless aircraft:fuselage:wetted_area_scaler, 1, unitless diff --git a/aviary/models/aircraft/small_single_aisle/small_single_aisle_GASP.csv b/aviary/models/aircraft/small_single_aisle/small_single_aisle_GASP.csv index 270cb826e2..da2b662cb0 100644 --- a/aviary/models/aircraft/small_single_aisle/small_single_aisle_GASP.csv +++ b/aviary/models/aircraft/small_single_aisle/small_single_aisle_GASP.csv @@ -56,7 +56,7 @@ aircraft:fuselage:nose_fineness,0.845,unitless aircraft:fuselage:num_aisles,1,unitless aircraft:fuselage:pilot_compartment_length,11.7,ft aircraft:fuselage:pressure_differential,7.5,psi -aircraft:fuselage:seat_width,24,inch +aircraft:fuselage:seat_width_economy,24,inch aircraft:fuselage:tail_fineness,3.368,unitless aircraft:fuselage:wetted_area_scaler,1,unitless aircraft:horizontal_tail:aspect_ratio,4.26,unitless diff --git a/aviary/subsystems/geometry/flops_based/test/test_fuselage.py b/aviary/subsystems/geometry/flops_based/test/test_fuselage.py index 3983328a91..876a4fd1bc 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_fuselage.py +++ b/aviary/subsystems/geometry/flops_based/test/test_fuselage.py @@ -71,10 +71,10 @@ def test_case1(self): 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) + assert_near_equal(fuselage_width, 12.19, tolerance=1e-9) fuselage_height = prob.get_val(Aircraft.Fuselage.MAX_HEIGHT) - assert_near_equal(fuselage_height, 15.74, tolerance=1e-9) + assert_near_equal(fuselage_height, 13.09, tolerance=1e-9) class BWBSimpleCabinLayoutTest(unittest.TestCase): diff --git a/aviary/subsystems/geometry/gasp_based/fuselage.py b/aviary/subsystems/geometry/gasp_based/fuselage.py index 08d592f2df..5c9ee9c9db 100644 --- a/aviary/subsystems/geometry/gasp_based/fuselage.py +++ b/aviary/subsystems/geometry/gasp_based/fuselage.py @@ -16,7 +16,7 @@ def initialize(self): add_aviary_option(self, Aircraft.Fuselage.NUM_AISLES) add_aviary_option(self, Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY) add_aviary_option(self, Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, units='inch') - add_aviary_option(self, Aircraft.Fuselage.SEAT_WIDTH, units='inch') + add_aviary_option(self, Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, units='inch') add_aviary_option(self, Settings.VERBOSITY) def setup(self): @@ -44,7 +44,7 @@ def compute(self, inputs, outputs): options = self.options verbosity = options[Settings.VERBOSITY] seats_abreast = options[Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY] - seat_width, _ = options[Aircraft.Fuselage.SEAT_WIDTH] + seat_width, _ = options[Aircraft.Fuselage.SEAT_WIDTH_ECONOMY] num_aisle = options[Aircraft.Fuselage.NUM_AISLES] aisle_width, _ = options[Aircraft.Fuselage.AISLE_WIDTH] PAX = options[Aircraft.CrewPayload.Design.NUM_PASSENGERS] @@ -262,7 +262,7 @@ def initialize(self): add_aviary_option(self, Aircraft.Fuselage.AISLE_WIDTH, units='inch') add_aviary_option(self, Aircraft.Fuselage.NUM_AISLES) add_aviary_option(self, Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY) - add_aviary_option(self, Aircraft.Fuselage.SEAT_WIDTH, units='inch') + add_aviary_option(self, Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, units='inch') add_aviary_option(self, Settings.VERBOSITY) def setup(self): @@ -318,7 +318,7 @@ def compute(self, inputs, outputs): verbosity = options[Settings.VERBOSITY] seats_abreast = options[Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY] - seat_width, _ = options[Aircraft.Fuselage.SEAT_WIDTH] + seat_width, _ = options[Aircraft.Fuselage.SEAT_WIDTH_ECONOMY] num_aisle = options[Aircraft.Fuselage.NUM_AISLES] aisle_width, _ = options[Aircraft.Fuselage.AISLE_WIDTH] PAX = options[Aircraft.CrewPayload.Design.NUM_PASSENGERS] @@ -347,7 +347,7 @@ def compute_partials(self, inputs, J): options = self.options seats_abreast = options[Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY] - seat_width, _ = options[Aircraft.Fuselage.SEAT_WIDTH] + seat_width, _ = options[Aircraft.Fuselage.SEAT_WIDTH_ECONOMY] num_aisle = options[Aircraft.Fuselage.NUM_AISLES] aisle_width, _ = options[Aircraft.Fuselage.AISLE_WIDTH] additional_width = inputs[Aircraft.Fuselage.PRESSURIZED_WIDTH_ADDITIONAL] @@ -384,7 +384,9 @@ class BWBCabinLayout(om.ExplicitComponent): """layout of passenger cabin for BWB.""" def initialize(self): - add_aviary_option(self, Aircraft.Fuselage.SEAT_WIDTH, units='inch', desc='INGASP.WS') + add_aviary_option( + self, Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, units='inch', desc='INGASP.WS' + ) add_aviary_option(self, Aircraft.Fuselage.NUM_AISLES, units='unitless', desc='INGASP.AS') add_aviary_option(self, Aircraft.Fuselage.AISLE_WIDTH, units='inch', desc='INGASP.WAS') add_aviary_option( @@ -437,7 +439,7 @@ def compute(self, inputs, outputs): # If there is no first class cabin, please set NUM_FIRST_CLASS = 0. TC_seat_pitch, _ = options[Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY] - seat_width, _ = options[Aircraft.Fuselage.SEAT_WIDTH] + seat_width, _ = options[Aircraft.Fuselage.SEAT_WIDTH_ECONOMY] if seat_width <= 0.0: raise ValueError('fuselage seat width must be positive.') aisle_width, _ = options[Aircraft.Fuselage.AISLE_WIDTH] diff --git a/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py b/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py index efae73adb8..5d735cf3df 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py @@ -30,7 +30,7 @@ def setUp(self): options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') self.prob = om.Problem() self.prob.model.add_subsystem( @@ -66,7 +66,7 @@ def setUp(self): options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 1) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') self.prob = om.Problem() self.prob.model.add_subsystem( @@ -179,7 +179,7 @@ def setUp(self): options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') self.prob = om.Problem() self.prob.model.add_subsystem( @@ -230,7 +230,9 @@ def setUp(self): options.set_val( Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch' ) # not actual GASP value - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') # not actual GASP value + options.set_val( + Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch' + ) # not actual GASP value self.prob = om.Problem() self.prob.model.add_subsystem( @@ -287,7 +289,9 @@ def setUp(self): options.set_val( Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch' ) # not actual GASP value - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') # not actual GASP value + options.set_val( + Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch' + ) # not actual GASP value self.prob = om.Problem() self.prob.model.add_subsystem( @@ -344,7 +348,9 @@ def setUp(self): options.set_val( Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch' ) # not actual GASP value - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') # not actual GASP value + options.set_val( + Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch' + ) # not actual GASP value self.prob = om.Problem() self.prob.model.add_subsystem( @@ -395,7 +401,7 @@ def setUp(self): self.aviary_options = AviaryValues() self.aviary_options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 18) - self.aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 21, units='inch') + self.aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 21, units='inch') self.aviary_options.set_val(Aircraft.Fuselage.NUM_AISLES, 3) self.aviary_options.set_val(Aircraft.Fuselage.AISLE_WIDTH, 22, units='inch') self.aviary_options.set_val( @@ -444,7 +450,7 @@ def setUp(self): self.aviary_options = AviaryValues() self.aviary_options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 18) - self.aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 21, units='inch') + self.aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 21, units='inch') self.aviary_options.set_val(Aircraft.Fuselage.NUM_AISLES, 3) self.aviary_options.set_val(Aircraft.Fuselage.AISLE_WIDTH, 22, units='inch') self.aviary_options.set_val( @@ -611,7 +617,7 @@ class BWBFuselageGroupTestCase(unittest.TestCase): def setUp(self): options = get_option_defaults() options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 18) - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 21, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 21, units='inch') options.set_val(Aircraft.Fuselage.NUM_AISLES, 3) options.set_val(Aircraft.Fuselage.AISLE_WIDTH, 22, units='inch') options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 32, units='inch') diff --git a/aviary/subsystems/geometry/gasp_based/test/test_size_group.py b/aviary/subsystems/geometry/gasp_based/test/test_size_group.py index 598b11b3d4..427f9efef3 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_size_group.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_size_group.py @@ -22,7 +22,7 @@ def setUp(self): options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, val=0.0003097, units='unitless') self.prob = om.Problem() @@ -144,7 +144,7 @@ def setUp(self): options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 6) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, val=0.00030975, units='unitless') self.prob = om.Problem() @@ -279,7 +279,7 @@ def setUp(self): options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 1) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=True, units='unitless') options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, val=0.00030975, units='unitless') @@ -412,7 +412,7 @@ def setUp(self): options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 1) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, val=0.00030975, units='unitless') self.prob = om.Problem() @@ -548,7 +548,7 @@ def setUp(self): options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 18) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST, 36, units='inch') options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 32, units='inch') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 21, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 21, units='inch') options.set_val(Aircraft.CrewPayload.Design.NUM_FIRST_CLASS, 11) self.prob = om.Problem() diff --git a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py index 12d027d0c4..bbcf50f1f2 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py +++ b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py @@ -146,7 +146,7 @@ def setUp(self): options.set_val(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.00030975, units='unitless') @@ -498,7 +498,7 @@ def setUp(self): options.set_val(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.00030975, units='unitless') @@ -841,7 +841,7 @@ def setUp(self): options.set_val(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.00030975, units='unitless') @@ -1192,7 +1192,7 @@ def setUp(self): options.set_val(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.00030975, units='unitless') @@ -1538,7 +1538,7 @@ def setUp(self): options.set_val(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.14, units='unitless') options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.00030975, units='unitless') @@ -1885,7 +1885,7 @@ def setUp(self): options.set_val(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 29, units='inch') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.165, units='unitless') options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.0003482075, units='unitless') @@ -2257,7 +2257,7 @@ def setUp(self): options.set_val(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 44.2, units='inch') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.163, units='unitless') options.set_val(Aircraft.Engine.INLET_AREA_COEFFICIENT, 0.000474, units='unitless') @@ -2625,7 +2625,7 @@ def setUp(self): options.set_val(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') options.set_val(Aircraft.Fuselage.NUM_AISLES, 1) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 44.2, units='inch') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') options.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.163, units='unitless') options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=True, units='unitless') @@ -3011,7 +3011,7 @@ def setUp(self): options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 18) options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST, 36, units='inch') options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 32, units='inch') - options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 21, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 21, units='inch') options.set_val(Aircraft.CrewPayload.Design.NUM_FIRST_CLASS, 11) # options from MassPremission options.set_val(Aircraft.Design.CRUISE_ALTITUDE, val=41000, units='ft') diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 6767f56b4c..1607e4537b 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -965,7 +965,7 @@ def update_gasp_options(vehicle_data, verbosity=Verbosity.BRIEF): missing_vars.append('VMLFSL') if Aircraft.Fuselage.AISLE_WIDTH not in input_values: missing_vars.append('WAS') - if Aircraft.Fuselage.SEAT_WIDTH not in input_values: + if Aircraft.Fuselage.SEAT_WIDTH_ECONOMY not in input_values: missing_vars.append('WS') if Aircraft.LandingGear.MAIN_GEAR_LOCATION not in input_values: missing_vars.append('YMG') diff --git a/aviary/utils/test/data/converter_test_BWB_GASP.csv b/aviary/utils/test/data/converter_test_BWB_GASP.csv index 0991d9b560..5d8cfde3a2 100644 --- a/aviary/utils/test/data/converter_test_BWB_GASP.csv +++ b/aviary/utils/test/data/converter_test_BWB_GASP.csv @@ -80,7 +80,7 @@ aircraft:fuselage:num_aisles,3,unitless aircraft:fuselage:pilot_compartment_length,7.5,ft aircraft:fuselage:pressure_differential,10.0,psi aircraft:fuselage:pressurized_width_additional,0.0,ft -aircraft:fuselage:seat_width,21.0,inch +aircraft:fuselage:seat_width_economy,21.0,inch aircraft:fuselage:tail_fineness,1.75,unitless aircraft:fuselage:wetted_area_ratio_aftbody_to_total,0.2,unitless aircraft:fuselage:wetted_area_scaler,1.0001,unitless diff --git a/aviary/utils/test/data/converter_test_configuration_GASP.csv b/aviary/utils/test/data/converter_test_configuration_GASP.csv index 0944ecc29d..155f88b6a2 100644 --- a/aviary/utils/test/data/converter_test_configuration_GASP.csv +++ b/aviary/utils/test/data/converter_test_configuration_GASP.csv @@ -67,7 +67,7 @@ aircraft:fuselage:nose_fineness,1.0,unitless aircraft:fuselage:num_aisles,1,unitless aircraft:fuselage:pilot_compartment_length,6.85,ft aircraft:fuselage:pressure_differential,7.5,psi -aircraft:fuselage:seat_width,20.2,inch +aircraft:fuselage:seat_width_economy,20.2,inch aircraft:fuselage:tail_fineness,1.18,unitless aircraft:fuselage:wetted_area_scaler,1.0,unitless aircraft:horizontal_tail:aspect_ratio,4.025,unitless diff --git a/aviary/utils/test/data/converter_test_large_single_aisle_1_GASP.csv b/aviary/utils/test/data/converter_test_large_single_aisle_1_GASP.csv index 8c6e915e7d..bb523086a8 100644 --- a/aviary/utils/test/data/converter_test_large_single_aisle_1_GASP.csv +++ b/aviary/utils/test/data/converter_test_large_single_aisle_1_GASP.csv @@ -67,7 +67,7 @@ aircraft:fuselage:nose_fineness,1.0,unitless aircraft:fuselage:num_aisles,1,unitless aircraft:fuselage:pilot_compartment_length,9.5,ft aircraft:fuselage:pressure_differential,7.5,psi -aircraft:fuselage:seat_width,20.2,inch +aircraft:fuselage:seat_width_economy,20.2,inch aircraft:fuselage:tail_fineness,3.0,unitless aircraft:fuselage:wetted_area,4000.0,ft**2 aircraft:horizontal_tail:aspect_ratio,4.75,unitless diff --git a/aviary/utils/test/data/converter_test_small_single_aisle_GASP.csv b/aviary/utils/test/data/converter_test_small_single_aisle_GASP.csv index aa2a47500f..197fff8719 100644 --- a/aviary/utils/test/data/converter_test_small_single_aisle_GASP.csv +++ b/aviary/utils/test/data/converter_test_small_single_aisle_GASP.csv @@ -67,7 +67,7 @@ aircraft:fuselage:nose_fineness,0.845,unitless aircraft:fuselage:num_aisles,1,unitless aircraft:fuselage:pilot_compartment_length,11.7,ft aircraft:fuselage:pressure_differential,7.5,psi -aircraft:fuselage:seat_width,24.0,inch +aircraft:fuselage:seat_width_economy,24.0,inch aircraft:fuselage:tail_fineness,3.368,unitless aircraft:fuselage:wetted_area_scaler,1.0,unitless aircraft:horizontal_tail:aspect_ratio,4.26,unitless diff --git a/aviary/validation_cases/validation_data/test_data/V3_bug_fixed_IO.py b/aviary/validation_cases/validation_data/test_data/V3_bug_fixed_IO.py index 963a8deea3..5b73720872 100644 --- a/aviary/validation_cases/validation_data/test_data/V3_bug_fixed_IO.py +++ b/aviary/validation_cases/validation_data/test_data/V3_bug_fixed_IO.py @@ -58,7 +58,7 @@ Aircraft.HorizontalTail.VOLUME_COEFFICIENT, val=1.189, units='unitless' ) V3_bug_fixed_options.set_val(Aircraft.VerticalTail.VOLUME_COEFFICIENT, 0.145, units='unitless') -V3_bug_fixed_options.set_val(Aircraft.Fuselage.SEAT_WIDTH, 20.2, units='inch') +V3_bug_fixed_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.2, units='inch') V3_bug_fixed_options.set_val(Aircraft.Fuselage.NUM_AISLES, 1, units='unitless') V3_bug_fixed_options.set_val(Aircraft.Fuselage.AISLE_WIDTH, 24, units='inch') V3_bug_fixed_options.set_val( diff --git a/aviary/validation_cases/validation_data/test_models/aircraft_for_bench_FwGm.csv b/aviary/validation_cases/validation_data/test_models/aircraft_for_bench_FwGm.csv index 8211a3eed2..9ee4d7ecfc 100644 --- a/aviary/validation_cases/validation_data/test_models/aircraft_for_bench_FwGm.csv +++ b/aviary/validation_cases/validation_data/test_models/aircraft_for_bench_FwGm.csv @@ -55,7 +55,7 @@ aircraft:fuselage:nose_fineness,1,unitless aircraft:fuselage:num_aisles,1,unitless aircraft:fuselage:pilot_compartment_length,9.5,ft aircraft:fuselage:pressure_differential,7.5,psi -aircraft:fuselage:seat_width,20.2,inch +aircraft:fuselage:seat_width_economy,20.2,inch aircraft:fuselage:tail_fineness,3,unitless aircraft:fuselage:wetted_area,4000,ft**2 aircraft:horizontal_tail:aspect_ratio,6.0,unitless diff --git a/aviary/validation_cases/validation_data/test_models/aircraft_for_bench_GwFm.csv b/aviary/validation_cases/validation_data/test_models/aircraft_for_bench_GwFm.csv index bd32de2b00..26a08427b7 100644 --- a/aviary/validation_cases/validation_data/test_models/aircraft_for_bench_GwFm.csv +++ b/aviary/validation_cases/validation_data/test_models/aircraft_for_bench_GwFm.csv @@ -59,7 +59,7 @@ aircraft:fuselage:nose_fineness,1,unitless aircraft:fuselage:num_aisles,1,unitless aircraft:fuselage:pilot_compartment_length,9.5,ft aircraft:fuselage:pressure_differential,7.5,psi -aircraft:fuselage:seat_width,20.2,inch +aircraft:fuselage:seat_width_economy,20.2,inch aircraft:fuselage:tail_fineness,3,unitless aircraft:fuselage:wetted_area,4000,ft**2 aircraft:horizontal_tail:aspect_ratio,4.75,unitless diff --git a/aviary/validation_cases/validation_data/test_models/aircraft_for_bench_GwGm.csv b/aviary/validation_cases/validation_data/test_models/aircraft_for_bench_GwGm.csv index c5058d0fea..457e43ca4b 100644 --- a/aviary/validation_cases/validation_data/test_models/aircraft_for_bench_GwGm.csv +++ b/aviary/validation_cases/validation_data/test_models/aircraft_for_bench_GwGm.csv @@ -59,7 +59,7 @@ aircraft:fuselage:nose_fineness,1,unitless aircraft:fuselage:num_aisles,1,unitless aircraft:fuselage:pilot_compartment_length,9.5,ft aircraft:fuselage:pressure_differential,7.5,psi -aircraft:fuselage:seat_width,20.2,inch +aircraft:fuselage:seat_width_economy,20.2,inch aircraft:fuselage:tail_fineness,3,unitless aircraft:fuselage:wetted_area,4000,ft**2 aircraft:horizontal_tail:aspect_ratio,4.75,unitless diff --git a/aviary/validation_cases/validation_data/test_models/configuration_test_GASP.csv b/aviary/validation_cases/validation_data/test_models/configuration_test_GASP.csv index 9009449456..c5d1f04446 100644 --- a/aviary/validation_cases/validation_data/test_models/configuration_test_GASP.csv +++ b/aviary/validation_cases/validation_data/test_models/configuration_test_GASP.csv @@ -56,7 +56,7 @@ aircraft:fuselage:nose_fineness,1,unitless aircraft:fuselage:num_aisles,1,unitless aircraft:fuselage:pilot_compartment_length,6.85,ft aircraft:fuselage:pressure_differential,7.5,psi -aircraft:fuselage:seat_width,20.2,inch +aircraft:fuselage:seat_width_economy,20.2,inch aircraft:fuselage:tail_fineness,1.18,unitless aircraft:fuselage:wetted_area_scaler,1,unitless aircraft:horizontal_tail:aspect_ratio,4.025,unitless diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 9d84cd5d6f..68161ed3cc 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -3578,7 +3578,7 @@ ) add_meta_data( - Aircraft.Fuselage.SEAT_WIDTH, + Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, meta_data=_MetaData, historical_name={'GASP': 'INGASP.WS', 'FLOPS': None}, units='inch', diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index 95e45fa049..a1436a7c04 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -335,7 +335,7 @@ class Fuselage: PRESSURE_DIFFERENTIAL = 'aircraft:fuselage:pressure_differential' PRESSURIZED_WIDTH_ADDITIONAL = 'aircraft:fuselage:pressurized_width_additional' REF_DIAMETER = 'aircraft:fuselage:ref_diameter' - SEAT_WIDTH = 'aircraft:fuselage:seat_width' + SEAT_WIDTH_ECONOMY = 'aircraft:fuselage:seat_width_economy' SIDEBODY_THICKNESS_TO_CHORD = 'aircraft:fuselage:sidebody_thickness_to_chord' SIMPLE_LAYOUT = 'aircraft:fuselage:simple_layout' TAIL_FINENESS = 'aircraft:fuselage:tail_fineness' From a00038e50b6a7aef43c863360945657dd8dc9f62 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 26 Jun 2026 12:36:27 -0400 Subject: [PATCH 02/31] renamed Aircraft.Fuselage.SEAT_WIDTH to Aircraft.Fuselage.SEAT_WIDTH_ECONOMY. Fixed a bug DetailedCabinLayout. Added business class to DetailedCabinLayout --- .../geometry/flops_based/fuselage.py | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/fuselage.py b/aviary/subsystems/geometry/flops_based/fuselage.py index efc0aa749d..3678ab4a20 100644 --- a/aviary/subsystems/geometry/flops_based/fuselage.py +++ b/aviary/subsystems/geometry/flops_based/fuselage.py @@ -191,10 +191,13 @@ class DetailedCabinLayout(om.ExplicitComponent): """ def initialize(self): + add_aviary_option(self, Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS) add_aviary_option(self, Aircraft.CrewPayload.Design.NUM_FIRST_CLASS) add_aviary_option(self, Aircraft.CrewPayload.Design.NUM_ECONOMY_CLASS) + add_aviary_option(self, Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_BUSINESS) add_aviary_option(self, Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_FIRST) add_aviary_option(self, Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY) + add_aviary_option(self, Aircraft.CrewPayload.Design.SEAT_PITCH_BUSINESS) 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.Engine.NUM_ENGINES) @@ -211,10 +214,14 @@ def setup(self): def compute(self, inputs, outputs): num_first_class_pax = self.options[Aircraft.CrewPayload.Design.NUM_FIRST_CLASS] + num_business_class_pax = self.options[Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS] num_economy_class_pax = self.options[Aircraft.CrewPayload.Design.NUM_ECONOMY_CLASS] fuselage_multiplier = 1.0 num_seat_abreast_first = self.options[Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_FIRST] + num_seat_abreast_business = self.options[ + Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_BUSINESS + ] num_seat_abreast_economy = self.options[ Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY ] @@ -232,6 +239,7 @@ def compute(self, inputs, outputs): # Though these are not user definable, the values here are typical for most transport aisle_width_first_class = 20.0 # inch + aisle_width_business_class = 19.0 # inch aisle_width_economy_class = 18.0 # inch # If there are less than 60 passengers on board, then the aisle should be slightly narrow. @@ -252,18 +260,23 @@ def compute(self, inputs, outputs): # 4 or 6 as shown below that we are working with a widebody aircraft. if num_seat_abreast_first > 4: aisle_width_first_class = 18.0 + if num_seat_abreast_business > 5: + aisle_width_first_class = 17.0 if num_seat_abreast_economy > 6: aisle_width_economy_class = 15.0 seat_pitch_first = self.options[Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST][0] if seat_pitch_first <= 0 and num_first_class_pax > 0: seat_pitch_first = 38.0 # inch + seat_pitch_business = self.options[Aircraft.CrewPayload.Design.SEAT_PITCH_BUSINESS][0] + if seat_pitch_business <= 0 and num_business_class_pax > 0: + seat_pitch_business = 36.0 # inch seat_pitch_economy = self.options[Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY][0] if seat_pitch_economy <= 0 and num_economy_class_pax > 0: seat_pitch_economy = 34.0 # inch # set maximum number of galleys based on statistics (this block is not from FLOPS) - num_pax = num_first_class_pax + num_economy_class_pax + num_pax = num_first_class_pax + num_business_class_pax + num_economy_class_pax if num_pax < 80: max_galleys = 1 max_lav = 1 @@ -343,7 +356,7 @@ def compute(self, inputs, outputs): fuselage_multiplier = 0.95 # Calculate the number of galleys, lavatories and closets - num_galleys = int(1 + ((num_first_class_pax + num_economy_class_pax) / 100)) + num_galleys = int(1 + (num_pax / 100)) if num_galleys > max_galleys: num_galleys = max_galleys num_lavas = int(1 + (num_economy_class_pax / 60)) + int(1 + (num_first_class_pax / 100)) @@ -378,17 +391,22 @@ def compute(self, inputs, outputs): # Calculate the number of rows of each class of passenger (not needed) if num_first_class_pax > 0: num_rows_first = int(np.ceil(num_first_class_pax / num_seat_abreast_first)) + if num_business_class_pax > 0: + num_rows_business = int(np.ceil(num_business_class_pax / num_seat_abreast_business)) if num_economy_class_pax > 0: num_rows_economy = int(np.ceil(num_economy_class_pax / num_seat_abreast_economy)) # Calculate the fuselage width of the passenger seats width_first_class = ( - num_aisles * aisle_width_first_class + num_seat_abreast_first * 20.0 + num_aisles * aisle_width_first_class + num_seat_abreast_first * 25.0 + ) / 12.0 + width_business_class = ( + num_aisles * aisle_width_business_class + num_seat_abreast_business * 20.0 ) / 12.0 width_economy_class = ( - num_aisles * aisle_width_economy_class + num_seat_abreast_economy * 25.0 + num_aisles * aisle_width_economy_class + num_seat_abreast_economy * 20.0 ) / 12.0 - width_fuselage = np.maximum(width_first_class, width_economy_class) * 1.06 + width_fuselage = max(width_first_class, width_economy_class, width_business_class) * 1.06 outputs[Aircraft.Fuselage.MAX_WIDTH] = width_fuselage outputs[Aircraft.Fuselage.MAX_HEIGHT] = width_fuselage + 0.9 From 1ba5541156c1e7bbff6d86442ebdbdc5c75e14e7 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 26 Jun 2026 15:23:32 -0400 Subject: [PATCH 03/31] added Aircraft.Fuselage.SEAT_WIDTH_FIRST and Aircraft.Fuselage.SEAT_WIDTH_BUSINESS --- .../geometry/flops_based/fuselage.py | 29 ++++++++++++++----- .../flops_based/test/test_fuselage.py | 2 ++ aviary/utils/preprocessors.py | 21 ++++++++++++++ aviary/variable_info/variable_meta_data.py | 21 +++++++++++++- aviary/variable_info/variables.py | 2 ++ 5 files changed, 66 insertions(+), 9 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/fuselage.py b/aviary/subsystems/geometry/flops_based/fuselage.py index 3678ab4a20..8027cbaec6 100644 --- a/aviary/subsystems/geometry/flops_based/fuselage.py +++ b/aviary/subsystems/geometry/flops_based/fuselage.py @@ -7,7 +7,7 @@ from aviary.utils.math import smooth_int_tanh, d_smooth_int_tanh 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, Settings +from aviary.variable_info.variables import Aircraft, Settings class FuselagePrelim(om.ExplicitComponent): @@ -191,6 +191,9 @@ class DetailedCabinLayout(om.ExplicitComponent): """ def initialize(self): + add_aviary_option(self, Aircraft.Fuselage.SEAT_WIDTH_BUSINESS) + add_aviary_option(self, Aircraft.Fuselage.SEAT_WIDTH_FIRST) + add_aviary_option(self, Aircraft.Fuselage.SEAT_WIDTH_ECONOMY) add_aviary_option(self, Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS) add_aviary_option(self, Aircraft.CrewPayload.Design.NUM_FIRST_CLASS) add_aviary_option(self, Aircraft.CrewPayload.Design.NUM_ECONOMY_CLASS) @@ -397,14 +400,24 @@ def compute(self, inputs, outputs): num_rows_economy = int(np.ceil(num_economy_class_pax / num_seat_abreast_economy)) # Calculate the fuselage width of the passenger seats - width_first_class = ( - num_aisles * aisle_width_first_class + num_seat_abreast_first * 25.0 - ) / 12.0 - width_business_class = ( - num_aisles * aisle_width_business_class + num_seat_abreast_business * 20.0 - ) / 12.0 + seat_width_first = self.options[Aircraft.Fuselage.SEAT_WIDTH_FIRST][0] + seat_width_business = self.options[Aircraft.Fuselage.SEAT_WIDTH_BUSINESS][0] + seat_width_economy = self.options[Aircraft.Fuselage.SEAT_WIDTH_ECONOMY][0] + if num_first_class_pax > 0: + width_first_class = ( + num_aisles * aisle_width_first_class + num_seat_abreast_first * seat_width_first + ) / 12.0 + else: + width_first_class = 0.0 + if num_business_class_pax > 0: + width_business_class = ( + num_aisles * aisle_width_business_class + + num_seat_abreast_business * seat_width_business + ) / 12.0 + else: + width_business_class = 0.0 width_economy_class = ( - num_aisles * aisle_width_economy_class + num_seat_abreast_economy * 20.0 + num_aisles * aisle_width_economy_class + num_seat_abreast_economy * seat_width_economy ) / 12.0 width_fuselage = max(width_first_class, width_economy_class, width_business_class) * 1.06 outputs[Aircraft.Fuselage.MAX_WIDTH] = width_fuselage diff --git a/aviary/subsystems/geometry/flops_based/test/test_fuselage.py b/aviary/subsystems/geometry/flops_based/test/test_fuselage.py index 876a4fd1bc..68ce10f3d9 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_fuselage.py +++ b/aviary/subsystems/geometry/flops_based/test/test_fuselage.py @@ -57,6 +57,8 @@ def test_case1(self): # options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST, units='unitless') # options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, units='unitless') options.set_val(Aircraft.Engine.NUM_ENGINES, [2], units='unitless') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_FIRST, 25, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20, units='inch') prob.model.add_subsystem( 'layout', DetailedCabinLayout(), promotes_outputs=['*'], promotes_inputs=['*'] diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index cc4fefbe36..d082f1f705 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -92,6 +92,27 @@ def preprocess_options( ): aviary_options.set_val(Aircraft.Design.PERCENT_EXCRESCENCE_DRAG, 0.06) + if Settings.MASS_METHOD in aviary_options: + mass_method = aviary_options.get_val(Settings.MASS_METHOD) + else: + raise UserWarning('MASS_METHOD not specified. Cannot preprocess inputs.') + + if Aircraft.Fuselage.SEAT_WIDTH_ECONOMY not in aviary_options: + if mass_method == LegacyCode.FLOPS: + if aviary_options.get_val(Aircraft.Design.TYPE) == AircraftTypes.TRANSPORT: + aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.0) + else: + if verbosity >= Verbosity.BRIEF: + raise UserWarning('Aircraft.Fuselage.SEAT_WIDTH_ECONOMY is not set.') + + if Aircraft.Fuselage.SEAT_WIDTH_FIRST not in aviary_options: + if mass_method == LegacyCode.FLOPS: + if aviary_options.get_val(Aircraft.Design.TYPE) == AircraftTypes.TRANSPORT: + aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_FIRST, 25.0) + else: + if verbosity >= Verbosity.BRIEF: + raise UserWarning('Aircraft.Fuselage.SEAT_WIDTH_FIRST is not set.') + def preprocess_crewpayload(aviary_options: AviaryValues, meta_data=CoreMetaData, verbosity=None): """ diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 68161ed3cc..01ea6c5154 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -3577,6 +3577,26 @@ default_value=0.0, ) +add_meta_data( + Aircraft.Fuselage.SEAT_WIDTH_BUSINESS, + meta_data=_MetaData, + historical_name={'GASP': 'INGASP.WS', 'FLOPS': None}, + units='inch', + desc='width of the business class seats', + option=True, + default_value=0.0, +) + +add_meta_data( + Aircraft.Fuselage.SEAT_WIDTH_FIRST, + meta_data=_MetaData, + historical_name={'GASP': 'INGASP.WS', 'FLOPS': None}, + units='inch', + desc='width of the first class seats', + option=True, + default_value=0.0, +) + add_meta_data( Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, meta_data=_MetaData, @@ -3586,7 +3606,6 @@ option=True, default_value=0.0, ) - add_meta_data( Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, meta_data=_MetaData, diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index a1436a7c04..772916d20c 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -335,6 +335,8 @@ class Fuselage: PRESSURE_DIFFERENTIAL = 'aircraft:fuselage:pressure_differential' PRESSURIZED_WIDTH_ADDITIONAL = 'aircraft:fuselage:pressurized_width_additional' REF_DIAMETER = 'aircraft:fuselage:ref_diameter' + SEAT_WIDTH_BUSINESS = 'aircraft:fuselage:seat_width_business' + SEAT_WIDTH_FIRST = 'aircraft:fuselage:seat_width_first' SEAT_WIDTH_ECONOMY = 'aircraft:fuselage:seat_width_economy' SIDEBODY_THICKNESS_TO_CHORD = 'aircraft:fuselage:sidebody_thickness_to_chord' SIMPLE_LAYOUT = 'aircraft:fuselage:simple_layout' From 17997a0966aa04610610109f9382e9721f359e9d Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 26 Jun 2026 15:32:20 -0400 Subject: [PATCH 04/31] minor update --- aviary/utils/preprocessors.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index d082f1f705..080a2c8c1d 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -97,9 +97,14 @@ def preprocess_options( else: raise UserWarning('MASS_METHOD not specified. Cannot preprocess inputs.') + if Aircraft.Design.TYPE in aviary_options: + design_type = aviary_options.get_val(Aircraft.Design.TYPE) + else: + design_type = AircraftTypes.TRANSPORT + if Aircraft.Fuselage.SEAT_WIDTH_ECONOMY not in aviary_options: if mass_method == LegacyCode.FLOPS: - if aviary_options.get_val(Aircraft.Design.TYPE) == AircraftTypes.TRANSPORT: + if design_type == AircraftTypes.TRANSPORT: aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.0) else: if verbosity >= Verbosity.BRIEF: From bb2fb13abe99d24f6aaceb626cd17e9c36cd9612 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 26 Jun 2026 15:38:52 -0400 Subject: [PATCH 05/31] try again --- aviary/utils/preprocessors.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index 080a2c8c1d..f023c77f2e 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -105,7 +105,7 @@ def preprocess_options( if Aircraft.Fuselage.SEAT_WIDTH_ECONOMY not in aviary_options: if mass_method == LegacyCode.FLOPS: if design_type == AircraftTypes.TRANSPORT: - aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.0) + aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.0, 'inch') else: if verbosity >= Verbosity.BRIEF: raise UserWarning('Aircraft.Fuselage.SEAT_WIDTH_ECONOMY is not set.') @@ -113,7 +113,7 @@ def preprocess_options( if Aircraft.Fuselage.SEAT_WIDTH_FIRST not in aviary_options: if mass_method == LegacyCode.FLOPS: if aviary_options.get_val(Aircraft.Design.TYPE) == AircraftTypes.TRANSPORT: - aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_FIRST, 25.0) + aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_FIRST, 25.0, 'inch') else: if verbosity >= Verbosity.BRIEF: raise UserWarning('Aircraft.Fuselage.SEAT_WIDTH_FIRST is not set.') From df38d4aca8e69976a680a754ab7d451d51d71440 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 26 Jun 2026 15:44:25 -0400 Subject: [PATCH 06/31] try again 2 --- aviary/utils/preprocessors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index f023c77f2e..84914f9fc2 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -112,7 +112,7 @@ def preprocess_options( if Aircraft.Fuselage.SEAT_WIDTH_FIRST not in aviary_options: if mass_method == LegacyCode.FLOPS: - if aviary_options.get_val(Aircraft.Design.TYPE) == AircraftTypes.TRANSPORT: + if design_type == AircraftTypes.TRANSPORT: aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_FIRST, 25.0, 'inch') else: if verbosity >= Verbosity.BRIEF: From 9f24c4c62e38d766b090a093becc8f24aaacab13 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 26 Jun 2026 16:45:29 -0400 Subject: [PATCH 07/31] minor update --- aviary/utils/preprocessors.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index 84914f9fc2..47a5c273a0 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -107,16 +107,19 @@ def preprocess_options( if design_type == AircraftTypes.TRANSPORT: aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 20.0, 'inch') else: - if verbosity >= Verbosity.BRIEF: - raise UserWarning('Aircraft.Fuselage.SEAT_WIDTH_ECONOMY is not set.') + if design_type == AircraftTypes.BLENDED_WING_BODY: + if verbosity >= Verbosity.BRIEF: + raise UserWarning('Aircraft.Fuselage.SEAT_WIDTH_ECONOMY is not set.') if Aircraft.Fuselage.SEAT_WIDTH_FIRST not in aviary_options: if mass_method == LegacyCode.FLOPS: if design_type == AircraftTypes.TRANSPORT: aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_FIRST, 25.0, 'inch') else: - if verbosity >= Verbosity.BRIEF: - raise UserWarning('Aircraft.Fuselage.SEAT_WIDTH_FIRST is not set.') + if design_type == AircraftTypes.BLENDED_WING_BODY: + if verbosity >= Verbosity.BRIEF: + # raise UserWarning('Aircraft.Fuselage.SEAT_WIDTH_FIRST is not set.') + pass def preprocess_crewpayload(aviary_options: AviaryValues, meta_data=CoreMetaData, verbosity=None): From d9c7d5d4426d9957b410efd983fc0c0bcf3c52bd Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 26 Jun 2026 18:15:26 -0400 Subject: [PATCH 08/31] minor mix --- aviary/variable_info/variable_meta_data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 01ea6c5154..e4d9fcf923 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -3580,7 +3580,7 @@ add_meta_data( Aircraft.Fuselage.SEAT_WIDTH_BUSINESS, meta_data=_MetaData, - historical_name={'GASP': 'INGASP.WS', 'FLOPS': None}, + historical_name={'GASP': None, 'FLOPS': None}, units='inch', desc='width of the business class seats', option=True, @@ -3590,7 +3590,7 @@ add_meta_data( Aircraft.Fuselage.SEAT_WIDTH_FIRST, meta_data=_MetaData, - historical_name={'GASP': 'INGASP.WS', 'FLOPS': None}, + historical_name={'GASP': None, 'FLOPS': None}, units='inch', desc='width of the first class seats', option=True, From 2c47b5ec2299e811deffce23a1118198105726a0 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 26 Jun 2026 18:26:29 -0400 Subject: [PATCH 09/31] fixed wrong order --- aviary/variable_info/variable_meta_data.py | 13 +++++++------ aviary/variable_info/variables.py | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index e4d9fcf923..5bef2a6e7e 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -3588,24 +3588,25 @@ ) add_meta_data( - Aircraft.Fuselage.SEAT_WIDTH_FIRST, + Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, meta_data=_MetaData, - historical_name={'GASP': None, 'FLOPS': None}, + historical_name={'GASP': 'INGASP.WS', 'FLOPS': None}, units='inch', - desc='width of the first class seats', + desc='width of the economy class seats', option=True, default_value=0.0, ) add_meta_data( - Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, + Aircraft.Fuselage.SEAT_WIDTH_FIRST, meta_data=_MetaData, - historical_name={'GASP': 'INGASP.WS', 'FLOPS': None}, + historical_name={'GASP': None, 'FLOPS': None}, units='inch', - desc='width of the economy class seats', + desc='width of the first class seats', option=True, default_value=0.0, ) + add_meta_data( Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, meta_data=_MetaData, diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index 772916d20c..0d548af185 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -336,8 +336,8 @@ class Fuselage: PRESSURIZED_WIDTH_ADDITIONAL = 'aircraft:fuselage:pressurized_width_additional' REF_DIAMETER = 'aircraft:fuselage:ref_diameter' SEAT_WIDTH_BUSINESS = 'aircraft:fuselage:seat_width_business' - SEAT_WIDTH_FIRST = 'aircraft:fuselage:seat_width_first' SEAT_WIDTH_ECONOMY = 'aircraft:fuselage:seat_width_economy' + SEAT_WIDTH_FIRST = 'aircraft:fuselage:seat_width_first' SIDEBODY_THICKNESS_TO_CHORD = 'aircraft:fuselage:sidebody_thickness_to_chord' SIMPLE_LAYOUT = 'aircraft:fuselage:simple_layout' TAIL_FINENESS = 'aircraft:fuselage:tail_fineness' From 9476478b1bf36192c4b50338a1c946393251f48b Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 26 Jun 2026 18:55:06 -0400 Subject: [PATCH 10/31] update sizing_results_for_test.json --- aviary/interface/test/sizing_results_for_test.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/aviary/interface/test/sizing_results_for_test.json b/aviary/interface/test/sizing_results_for_test.json index 760aa600f8..061da7c55b 100644 --- a/aviary/interface/test/sizing_results_for_test.json +++ b/aviary/interface/test/sizing_results_for_test.json @@ -1124,6 +1124,18 @@ "unitless", "" ], + [ + "aircraft:fuselage:seat_width_economy", + 20.0, + "inch", + "" + ], + [ + "aircraft:fuselage:seat_width_first", + 25.0, + "inch", + "" + ], [ "mission:gross_mass", 175400.0, From 6f972aa76ee525bb795ba47fa2cf8e709750eed7 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 29 Jun 2026 17:09:01 -0400 Subject: [PATCH 11/31] update DetailedCabinLayout --- .../geometry/flops_based/fuselage.py | 68 ++++++++++++++++--- 1 file changed, 60 insertions(+), 8 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/fuselage.py b/aviary/subsystems/geometry/flops_based/fuselage.py index 8027cbaec6..82f2872731 100644 --- a/aviary/subsystems/geometry/flops_based/fuselage.py +++ b/aviary/subsystems/geometry/flops_based/fuselage.py @@ -204,6 +204,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.Engine.NUM_ENGINES) + add_aviary_option(self, Settings.VERBOSITY) def setup(self): add_aviary_input(self, Aircraft.Design.RANGE, units='NM') @@ -216,6 +217,8 @@ def setup(self): self.declare_partials('*', '*', method='fd', form='forward') def compute(self, inputs, outputs): + verbosity = self.options[Settings.VERBOSITY] + num_first_class_pax = self.options[Aircraft.CrewPayload.Design.NUM_FIRST_CLASS] num_business_class_pax = self.options[Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS] num_economy_class_pax = self.options[Aircraft.CrewPayload.Design.NUM_ECONOMY_CLASS] @@ -228,17 +231,49 @@ def compute(self, inputs, outputs): num_seat_abreast_economy = self.options[ Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY ] + # The 200 was derived from B757 - the largest single aisle western desig. if num_economy_class_pax > 200: if num_seat_abreast_economy <= 0: num_seat_abreast_economy = 8 - if num_seat_abreast_first > 0 and num_seat_abreast_first <= 0: + if verbosity > Verbosity.BRIEF: + print('Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY = 8') + if num_first_class_pax > 0 and num_seat_abreast_first <= 0: num_seat_abreast_first = num_seat_abreast_economy - 2 + if verbosity > Verbosity.BRIEF: + print( + f'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_FIRST = ' + '{num_seat_abreast_first}' + ) + if num_business_class_pax > 0 and num_seat_abreast_business <= 0: + num_seat_abreast_business = num_seat_abreast_economy - 2 + if verbosity > Verbosity.BRIEF: + print( + f'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_BASINESS = ' + '{num_seat_abreast_business}' + ) if num_seat_abreast_first <= 0 and num_first_class_pax > 0: num_seat_abreast_first = 4 + if verbosity > Verbosity.BRIEF: + print( + f'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_FIRST = ' + '{num_seat_abreast_first}' + ) if num_seat_abreast_economy <= 0 and num_economy_class_pax > 0: num_seat_abreast_economy = 6 + if verbosity > Verbosity.BRIEF: + print( + f'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY = ' + '{num_seat_abreast_economy}' + ) + if num_seat_abreast_business <= 0 and num_business_class_pax > 0: + num_seat_abreast_business = 5 + if verbosity > Verbosity.BRIEF: + print( + f'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_BUSINESS = ' + '{num_seat_abreast_business}' + ) # Though these are not user definable, the values here are typical for most transport aisle_width_first_class = 20.0 # inch @@ -246,11 +281,16 @@ def compute(self, inputs, outputs): aisle_width_economy_class = 18.0 # inch # If there are less than 60 passengers on board, then the aisle should be slightly narrow. - # Also, if the number of passengers abreast was not specified, then set it to 5 as 6 is too much - # for a typical short range transport. + # Also, if the number of passengers abreast was not specified, then set it to 5 because 6 + # is too much for a typical short range transport. if num_economy_class_pax < 60: if num_seat_abreast_economy <= 0: num_seat_abreast_economy = 5 + if verbosity > Verbosity.BRIEF: + print( + f'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY = ' + '{num_seat_abreast_economy}' + ) aisle_width_economy_class = 15.0 if num_seat_abreast_economy > 6: @@ -271,12 +311,18 @@ def compute(self, inputs, outputs): seat_pitch_first = self.options[Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST][0] if seat_pitch_first <= 0 and num_first_class_pax > 0: seat_pitch_first = 38.0 # inch + if verbosity > Verbosity.BRIEF: + print('Set Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST = 38.0 inches') seat_pitch_business = self.options[Aircraft.CrewPayload.Design.SEAT_PITCH_BUSINESS][0] if seat_pitch_business <= 0 and num_business_class_pax > 0: seat_pitch_business = 36.0 # inch + if verbosity > Verbosity.BRIEF: + print('Set Aircraft.CrewPayload.Design.SEAT_PITCH_BUSINESS = 36.0 inches') seat_pitch_economy = self.options[Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY][0] if seat_pitch_economy <= 0 and num_economy_class_pax > 0: seat_pitch_economy = 34.0 # inch + if verbosity > Verbosity.BRIEF: + print('Set Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY = 34.0 inches') # set maximum number of galleys based on statistics (this block is not from FLOPS) num_pax = num_first_class_pax + num_business_class_pax + num_economy_class_pax @@ -327,10 +373,12 @@ def compute(self, inputs, outputs): # The above settings are necessary because FLOPS didn't cover all the scenarios. # They will be over written if FLOPS covered a particular scenario as we see below. + num_first_business_pax = num_first_class_pax + num_business_class_pax + # Set constraints on the maximum number of galleys and other items so that we don't have # a flying kitchen or closet or whatever. # Note: Some of these may need relaxing for larger aircraft. - if num_first_class_pax == 0: + if num_first_business_pax == 0: design_range = inputs[Aircraft.Design.RANGE] if design_range < 1250.0: max_lav = 2 @@ -341,7 +389,7 @@ def compute(self, inputs, outputs): max_galleys = 2 max_closets = 2 - if num_first_class_pax == 0 and num_economy_class_pax < 110: + if num_first_business_pax == 0 and num_economy_class_pax < 110: max_lav = 1 max_galleys = 1 max_closets = 1 @@ -355,17 +403,17 @@ def compute(self, inputs, outputs): max_galleys = 8 max_closets = 8 - if num_first_class_pax > 0 and num_seat_abreast_economy < 8: + if num_first_business_pax > 0 and num_seat_abreast_economy < 8: fuselage_multiplier = 0.95 # Calculate the number of galleys, lavatories and closets num_galleys = int(1 + (num_pax / 100)) if num_galleys > max_galleys: num_galleys = max_galleys - num_lavas = int(1 + (num_economy_class_pax / 60)) + int(1 + (num_first_class_pax / 100)) + num_lavas = int(1 + (num_economy_class_pax / 60)) + int(1 + (num_first_business_pax / 100)) if num_lavas > max_lav: num_lavas = max_lav - num_closets = int(1 + (num_first_class_pax / 30)) + int(1 + (num_economy_class_pax / 60)) + num_closets = int(1 + (num_first_business_pax / 30)) + int(1 + (num_economy_class_pax / 60)) if num_closets > max_closets: num_closets = max_closets @@ -374,9 +422,13 @@ def compute(self, inputs, outputs): num_engines = self.options[Aircraft.Engine.NUM_ENGINES][0] eng_flag = num_engines - 2 * int(num_engines / 2) # a center mounted engine if 1. first_class_len = num_first_class_pax * seat_pitch_first / num_seat_abreast_first + business_class_len = ( + num_business_class_pax * seat_pitch_business / num_seat_abreast_business + ) economy_class_len = num_economy_class_pax * seat_pitch_economy / num_seat_abreast_economy pax_compart_length = ( first_class_len + + business_class_len + (num_galleys + num_lavas) * 36.0 + economy_class_len + num_closets * 12.0 From 303a3a8bb18fb1f825e81c63a725929cfdc66277 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 29 Jun 2026 17:55:39 -0400 Subject: [PATCH 12/31] added a unit test with business class --- .../flops_based/test/test_fuselage.py | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/aviary/subsystems/geometry/flops_based/test/test_fuselage.py b/aviary/subsystems/geometry/flops_based/test/test_fuselage.py index 68ce10f3d9..a0c56b9b9c 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_fuselage.py +++ b/aviary/subsystems/geometry/flops_based/test/test_fuselage.py @@ -78,6 +78,46 @@ def test_case1(self): fuselage_height = prob.get_val(Aircraft.Fuselage.MAX_HEIGHT) assert_near_equal(fuselage_height, 13.09, tolerance=1e-9) + def test_case2(self): + """with business class (modeled from Boeing 777-300ER)""" + prob = self.prob + options = self.aviary_options = AviaryValues() + options.set_val(Settings.VERBOSITY, 1, units='unitless') + + options.set_val(Aircraft.CrewPayload.Design.NUM_FIRST_CLASS, 56) + options.set_val(Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS, 78) + options.set_val(Aircraft.CrewPayload.Design.NUM_ECONOMY_CLASS, 330) + options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_FIRST, 4) + options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_BUSINESS, 6) + options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 10) + options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST, 83, units='inch') + options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST, 62, units='inch') + options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, 32, units='inch') + options.set_val(Aircraft.Engine.NUM_ENGINES, [2], units='unitless') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_FIRST, 22, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_BUSINESS, 21, units='inch') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 18, units='inch') + + prob.model.add_subsystem( + 'layout', DetailedCabinLayout(), promotes_outputs=['*'], promotes_inputs=['*'] + ) + setup_model_options(self.prob, options) + prob.setup(check=False, force_alloc_complex=True) + prob.set_val(Aircraft.Design.RANGE, val=7370.0, units='NM') + prob.run_model() + + pax_compart_length = prob.get_val(Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH) + assert_near_equal(pax_compart_length, 254.26333333, tolerance=1e-9) + + fuselage_length = prob.get_val(Aircraft.Fuselage.LENGTH) + assert_near_equal(fuselage_length, 294.26333333, tolerance=1e-9) + + fuselage_width = prob.get_val(Aircraft.Fuselage.MAX_WIDTH) + assert_near_equal(fuselage_width, 18.55, tolerance=1e-9) + + fuselage_height = prob.get_val(Aircraft.Fuselage.MAX_HEIGHT) + assert_near_equal(fuselage_height, 19.45, tolerance=1e-9) + class BWBSimpleCabinLayoutTest(unittest.TestCase): """Test simple cabin layout computation.""" @@ -304,4 +344,7 @@ def test_case1(self): if __name__ == '__main__': - unittest.main() + # unittest.main() + test = DetailedCabinLayoutTest() + test.setUp() + test.test_case2() From 01d6ebfa694fc9591fceabb460330cd7a7980127 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 30 Jun 2026 18:09:58 -0400 Subject: [PATCH 13/31] renamed Aircraft.Fuselage.SEAT_WIDTH to Aircraft.Fuselage.SEAT_WIDTH_ECONOMY. added Aircraft.Fuselage.SEAT_WIDTH_BUSINESS and Aircraft.Fuselage.SEAT_WIDTH_FIRST. removed LEAPS1. --- aviary/variable_info/variable_meta_data.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 7a6b79ec27..3fc5775783 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -332,11 +332,7 @@ add_meta_data( Aircraft.BWB.MAX_BAY_WIDTH, meta_data=_MetaData, - historical_name={ - 'GASP': None, - 'FLOPS': 'FUSEIN.BAYWMX', - 'LEAPS1': None, - }, + historical_name={'GASP': None, 'FLOPS': 'FUSEIN.BAYWMX'}, units='ft', desc='maximum bay width', types=float, @@ -2153,7 +2149,7 @@ add_meta_data( Aircraft.Engine.INLET_AREA_COEFFICIENT, meta_data=_MetaData, - historical_name={'GASP': None, 'FLOPS': None, 'LEAPS1': None}, + historical_name={'GASP': None, 'FLOPS': None}, units='unitless', option=True, default_value=0.0002, # default in GASP @@ -2663,7 +2659,7 @@ Aircraft.Engine.Propeller.MASS, meta_data=_MetaData, # TODO Check if GASP has a variable for this - historical_name={'GASP': None, 'FLOPS': None, 'LEAPS1': None}, + historical_name={'GASP': None, 'FLOPS': None}, units='lbm', desc='mass of propellers on engine (sum of all blades)', option=False, @@ -3610,7 +3606,7 @@ add_meta_data( Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, meta_data=_MetaData, - historical_name={'GASP': None, 'FLOPS': 'WTIN.TCSOB', 'LEAPS1': None}, + historical_name={'GASP': None, 'FLOPS': 'WTIN.TCSOB'}, units='unitless', desc='fuselage thickness/chord ratio at side of body', default_value=0.0, From cd4295a8ac882a5a586b6e2c88e059f10519a58f Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 30 Jun 2026 18:29:46 -0400 Subject: [PATCH 14/31] put LEAPS1 tag back --- aviary/variable_info/variable_meta_data.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 3fc5775783..7a6b79ec27 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -332,7 +332,11 @@ add_meta_data( Aircraft.BWB.MAX_BAY_WIDTH, meta_data=_MetaData, - historical_name={'GASP': None, 'FLOPS': 'FUSEIN.BAYWMX'}, + historical_name={ + 'GASP': None, + 'FLOPS': 'FUSEIN.BAYWMX', + 'LEAPS1': None, + }, units='ft', desc='maximum bay width', types=float, @@ -2149,7 +2153,7 @@ add_meta_data( Aircraft.Engine.INLET_AREA_COEFFICIENT, meta_data=_MetaData, - historical_name={'GASP': None, 'FLOPS': None}, + historical_name={'GASP': None, 'FLOPS': None, 'LEAPS1': None}, units='unitless', option=True, default_value=0.0002, # default in GASP @@ -2659,7 +2663,7 @@ Aircraft.Engine.Propeller.MASS, meta_data=_MetaData, # TODO Check if GASP has a variable for this - historical_name={'GASP': None, 'FLOPS': None}, + historical_name={'GASP': None, 'FLOPS': None, 'LEAPS1': None}, units='lbm', desc='mass of propellers on engine (sum of all blades)', option=False, @@ -3606,7 +3610,7 @@ add_meta_data( Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, meta_data=_MetaData, - historical_name={'GASP': None, 'FLOPS': 'WTIN.TCSOB'}, + historical_name={'GASP': None, 'FLOPS': 'WTIN.TCSOB', 'LEAPS1': None}, units='unitless', desc='fuselage thickness/chord ratio at side of body', default_value=0.0, From 5e7fd7fee790b28a5bf2eea302f80a62faea32bc Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 30 Jun 2026 18:59:16 -0400 Subject: [PATCH 15/31] preprocessed Aircraft.Fuselage.SEAT_WIDTH_ECONOMY and Aircraft.Fuselage.SEAT_WIDTH_FIRST --- aviary/utils/preprocessors.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index 47a5c273a0..0ca9a9781e 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -118,8 +118,7 @@ def preprocess_options( else: if design_type == AircraftTypes.BLENDED_WING_BODY: if verbosity >= Verbosity.BRIEF: - # raise UserWarning('Aircraft.Fuselage.SEAT_WIDTH_FIRST is not set.') - pass + aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_FIRST, 28.0, 'inch') def preprocess_crewpayload(aviary_options: AviaryValues, meta_data=CoreMetaData, verbosity=None): From 1deece1385a82c1c134bde69b669c2160467bc86 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 30 Jun 2026 19:27:22 -0400 Subject: [PATCH 16/31] added business class to GASP based fuselage layout --- .../geometry/gasp_based/fuselage.py | 127 +++++++++++++----- .../geometry/gasp_based/test/test_fuselage.py | 32 +++-- .../gasp_based/test/test_size_group.py | 1 + .../gasp_based/test/test_mass_premission.py | 1 + 4 files changed, 115 insertions(+), 46 deletions(-) diff --git a/aviary/subsystems/geometry/gasp_based/fuselage.py b/aviary/subsystems/geometry/gasp_based/fuselage.py index 5c9ee9c9db..36da5e4ff0 100644 --- a/aviary/subsystems/geometry/gasp_based/fuselage.py +++ b/aviary/subsystems/geometry/gasp_based/fuselage.py @@ -384,6 +384,8 @@ class BWBCabinLayout(om.ExplicitComponent): """layout of passenger cabin for BWB.""" def initialize(self): + add_aviary_option(self, Aircraft.Fuselage.SEAT_WIDTH_FIRST, units='inch', desc='WS_FC') + add_aviary_option(self, Aircraft.Fuselage.SEAT_WIDTH_BUSINESS, units='inch') add_aviary_option( self, Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, units='inch', desc='INGASP.WS' ) @@ -392,18 +394,13 @@ def initialize(self): add_aviary_option( self, Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST, units='inch', desc='PS_FC' ) + add_aviary_option(self, Aircraft.CrewPayload.Design.SEAT_PITCH_BUSINESS, units='inch') add_aviary_option( self, Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY, units='inch', desc='INGASP.PS' ) - add_aviary_option( - self, Aircraft.CrewPayload.Design.NUM_PASSENGERS, units='unitless', desc='INGASP.PAX' - ) - add_aviary_option( - self, - Aircraft.CrewPayload.Design.NUM_FIRST_CLASS, - units='unitless', - desc='equiv INGASP.PCT_FC', - ) + add_aviary_option(self, Aircraft.CrewPayload.Design.NUM_PASSENGERS, desc='INGASP.PAX') + add_aviary_option(self, Aircraft.CrewPayload.Design.NUM_FIRST_CLASS, desc='INGASP.PCT_FC') + add_aviary_option(self, Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS) add_aviary_option(self, Settings.VERBOSITY) def setup(self): @@ -427,20 +424,24 @@ def compute(self, inputs, outputs): rad2deg = 180.0 / np.pi # Hard code variables in GASP: - FC_lav_galley_length = 8.0 # EL_FLGC: length of first class lav, galley & closet, ft - FC_seat_width = 28.0 # WS_FC: first class seat width, inch - FC_seat_pitch, _ = options[Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST] + FC_lav_galley_length = 8.0 # EL_FLGC: length of first class lavatory, galley & closet, ft FC_num_aisles = 2 # AS_FC: num of aisles in first class FC_aisle_width = 24.0 # WAS_FC: First class aisle width, inch - length_FC_to_TC = 5.0 # Length of first class/economy class aisle, ft - TC_num_pax_per_lav = 78 # NLAVTC: economy class passengers per lav - TC_lav_width = 42.0 # WIDLAV: Lav width, inches, in FLOPS, WIDTHL + FC_seat_width, _ = options[Aircraft.Fuselage.SEAT_WIDTH_FIRST] + FC_seat_pitch, _ = options[Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST] + + BC_lav_galley_length = 8.0 + BC_seat_pitch, _ = options[Aircraft.CrewPayload.Design.SEAT_PITCH_BUSINESS] + BC_seat_width, _ = options[Aircraft.Fuselage.SEAT_WIDTH_BUSINESS] + + TC_num_pax_per_lav = 78 # NLAVTC: economy class passengers per lavatory + TC_lav_width = 42.0 # WIDLAV: lavatory width, inches, in FLOPS, WIDTHL TC_galley_area_per_pax = 0.15 # AGAL_TC: economy class galley area per passenger, ft**2 # If there is no first class cabin, please set NUM_FIRST_CLASS = 0. TC_seat_pitch, _ = options[Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY] - seat_width, _ = options[Aircraft.Fuselage.SEAT_WIDTH_ECONOMY] - if seat_width <= 0.0: + TC_seat_width, _ = options[Aircraft.Fuselage.SEAT_WIDTH_ECONOMY] + if TC_seat_width <= 0.0: raise ValueError('fuselage seat width must be positive.') aisle_width, _ = options[Aircraft.Fuselage.AISLE_WIDTH] num_aisles = options[Aircraft.Fuselage.NUM_AISLES] @@ -452,19 +453,25 @@ def compute(self, inputs, outputs): sweep_FB = inputs[Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP][0] pax = options[Aircraft.CrewPayload.Design.NUM_PASSENGERS] pax_FC = options[Aircraft.CrewPayload.Design.NUM_FIRST_CLASS] + pax_BC = options[Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS] if pax_FC <= 0: - if verbosity > Verbosity.BRIEF: + if verbosity > Verbosity.DEBUG: print('Warning: No first class passengers or cabins are included.') - if pax_FC > pax: + if pax_BC <= 0: + if verbosity > Verbosity.DEBUG: + print('Warning: No business class passengers or cabins are included.') + if (pax_FC + pax_BC) > pax: raise ValueError( 'Number of first class passengers must not exceed the total number of passengers.' ) - pax_TC = pax - pax_FC + pax_TC = pax - pax_FC - pax_BC nose_length = inputs['nose_length'][0] pilot_com_length = inputs[Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH][0] if pax_FC > 0: fwd_pax_fuselage_station = nose_length + pilot_com_length + FC_lav_galley_length + if pax_BC > 0: + fwd_pax_fuselage_station = fwd_pax_fuselage_station + BC_lav_galley_length else: fwd_pax_fuselage_station = nose_length + pilot_com_length @@ -500,22 +507,78 @@ def compute(self, inputs, outputs): EL_FC_last_row = length_FC_by_row[Idx_row_FC - 1] EL_FC_ptr = length_FC_by_row[Idx_row_FC - 1] - sum_num_seats_FC = pax_FC + # sum_num_seats_FC = pax_FC else: - # If not first class - EL_FC_last_row = 0 + # If no first class + # EL_FC_last_row = 0 + pass - # First Class/Economy Class Aisle + # First Class/Business Class Aisle if pax_FC > 0: - EL_TC_ptr = EL_FC_last_row + FC_seat_pitch / 12.0 + EL_BC_ptr = EL_FC_last_row + FC_seat_pitch / 12.0 else: - EL_TC_ptr = fwd_pax_fuselage_station + EL_BC_ptr = fwd_pax_fuselage_station - # Economy Class - if pax_FC > 0: - EL_TC_ptr = EL_TC_ptr + length_FC_to_TC - TC_seat_pitch / 12.0 + # Business Class + length_FC_to_BC = 5.0 # Length of first class/business class aisle, ft + + if pax_BC > 0: + EL_BC_ptr = EL_BC_ptr + length_FC_to_BC - BC_seat_pitch / 12.0 else: - EL_TC_ptr = EL_TC_ptr - TC_seat_pitch / 12.0 + # EL_BC_ptr = EL_BC_ptr - BC_seat_pitch / 12.0 + pass + + if pax_BC > 0: + length_BC_by_row = [] # length in business class, ft + width_BC_by_row = [] # width in business class, ft + num_seats_BC_by_row = [] # num of seats in business class + sum_num_seats_BC = 0 + Idx_row_BC = -1 + while sum_num_seats_BC < pax_BC: + Idx_row_BC = Idx_row_BC + 1 + len = EL_BC_ptr + BC_seat_pitch / 12.0 + length_BC_by_row.append(len) + wid = 2.0 * length_BC_by_row[Idx_row_BC] / np.tan(sweep_FB / rad2deg) + wid = np.minimum(wid, cabin_width) + width_BC_by_row.append(wid) + width_aisle = num_aisles * aisle_width / 12.0 + num = int((width_BC_by_row[Idx_row_BC] - width_aisle) / (BC_seat_width / 12.0)) + num_seats_BC_by_row.append(num) + prev_sum_num_seats_BC = sum_num_seats_BC + sum_num_seats_BC = sum_num_seats_BC + num_seats_BC_by_row[Idx_row_BC] + EL_BC_ptr = length_BC_by_row[Idx_row_BC] + + # Last row of business class + EL_BC_last_row = length_BC_by_row[Idx_row_BC] + num_seats_last_row = pax_BC - prev_sum_num_seats_BC + # If only one seat in last row, delete last row & assume seat located forward + if num_seats_last_row < 2: + EL_BC_last_row = length_BC_by_row[Idx_row_BC - 1] + EL_BC_ptr = length_BC_by_row[Idx_row_BC - 1] + + # sum_num_seats_BC = pax_BC + else: + # If no business class + # EL_BC_last_row = 0 + pass + + # Business Class/economy Class Aisle + if pax_BC > 0: + EL_TC_ptr = EL_BC_last_row + BC_seat_pitch / 12.0 + else: + EL_TC_ptr = EL_BC_ptr + + length_BC_to_TC = 5.0 # Length of business class/economy class aisle, ft + + if pax_BC > 0: + EL_TC_ptr = EL_BC_ptr + length_BC_to_TC - TC_seat_pitch / 12.0 + else: + if pax_FC > 0: + EL_TC_ptr = EL_TC_ptr + length_FC_to_BC - TC_seat_pitch / 12.0 + else: + EL_TC_ptr = EL_TC_ptr - TC_seat_pitch / 12.0 + + # Economy Class length_TC_by_row = [] # length in economy class, ft width_TC_by_row = [] # width in economy class, ft num_seats_TC_by_row = [] # num of seats in economy class @@ -529,7 +592,7 @@ def compute(self, inputs, outputs): wid = np.minimum(wid, cabin_width) width_TC_by_row.append(wid) width_aisle = num_aisles * aisle_width / 12.0 - num = int((width_TC_by_row[Idx_row_TC] - width_aisle) / (seat_width / 12.0)) + num = int((width_TC_by_row[Idx_row_TC] - width_aisle) / (TC_seat_width / 12.0)) num_seats_TC_by_row.append(num) prev_num_seats_TC = sum_num_seats_TC sum_num_seats_TC = sum_num_seats_TC + num_seats_TC_by_row[Idx_row_TC] @@ -539,7 +602,7 @@ def compute(self, inputs, outputs): # last row in economy class: find number of seats in last row num_seats_last_row = sum_num_seats_TC - prev_num_seats_TC # find width available for last row for lavs/galleys (Assumes Steward's seat in TC aisle) - width_last_row = num_seats_last_row * seat_width / 12.0 + width_last_row = num_seats_last_row * TC_seat_width / 12.0 width_aisle = num_aisles * aisle_width / 12.0 wid_last_row_avail = cabin_width - width_last_row - width_aisle # find number of economy class lavs and aft galley (galley width = lav width) diff --git a/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py b/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py index 5d735cf3df..61ee6c849a 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py @@ -443,14 +443,15 @@ def test_case1(self): assert_check_partials(partial_data, atol=1e-5, rtol=1e-5) +@use_tempdirs class BWBLayoutTestCase(unittest.TestCase): def setUp(self): self.prob = om.Problem() self.aviary_options = AviaryValues() - self.aviary_options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 18) - self.aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 21, units='inch') + self.aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 21.0, units='inch') + self.aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_FIRST, 28.0, units='inch') self.aviary_options.set_val(Aircraft.Fuselage.NUM_AISLES, 3) self.aviary_options.set_val(Aircraft.Fuselage.AISLE_WIDTH, 22, units='inch') self.aviary_options.set_val( @@ -480,7 +481,7 @@ def setUp(self): self.prob.setup() def test_case1(self): - """Testing GASP data case.""" + """Testing GASP data case: first class + economy class""" self.prob.run_model() tol = 1e-7 @@ -499,7 +500,7 @@ def test_case1(self): assert_check_partials(partial_data, atol=1e-5, rtol=1e-5) def test_case2(self): - """Testing 0 First Class case.""" + """Testing case: economy class only""" self.aviary_options.set_val( Aircraft.CrewPayload.Design.NUM_FIRST_CLASS, val=0, @@ -513,17 +514,19 @@ def test_case2(self): tol = 1e-7 assert_near_equal(self.prob['fuselage_station_aft'], 51.25449, tol) - partial_data = self.prob.check_partials( - out_stream=None, - compact_print=True, - show_only_incorrect=True, - form='central', - method='fd', - minimum_step=1e-12, - abs_err_tol=5.0e-4, - rel_err_tol=5.0e-5, + def test_case3(self): + """Testing case: first class + business class + economy class""" + self.aviary_options.set_val( + Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS, val=16, units='unitless' ) - assert_check_partials(partial_data, atol=1e-5, rtol=1e-5) + self.aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_BUSINESS, val=25, units='inch') + setup_model_options(self.prob, self.aviary_options) + self.prob.setup() + + self.prob.run_model() + + tol = 1e-7 + assert_near_equal(self.prob['fuselage_station_aft'], 67.83782665, tol) class BWBFuselageParameters2TestCase(unittest.TestCase): @@ -617,6 +620,7 @@ class BWBFuselageGroupTestCase(unittest.TestCase): def setUp(self): options = get_option_defaults() options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 18) + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_FIRST, 28, units='inch') options.set_val(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY, 21, units='inch') options.set_val(Aircraft.Fuselage.NUM_AISLES, 3) options.set_val(Aircraft.Fuselage.AISLE_WIDTH, 22, units='inch') diff --git a/aviary/subsystems/geometry/gasp_based/test/test_size_group.py b/aviary/subsystems/geometry/gasp_based/test/test_size_group.py index 427f9efef3..00197cfacb 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_size_group.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_size_group.py @@ -543,6 +543,7 @@ def setUp(self): ) options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=150, units='unitless') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_FIRST, 28, units='inch') options.set_val(Aircraft.Fuselage.AISLE_WIDTH, 22, units='inch') options.set_val(Aircraft.Fuselage.NUM_AISLES, 3) options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 18) diff --git a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py index bbcf50f1f2..4dacf2625c 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py +++ b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py @@ -3006,6 +3006,7 @@ def setUp(self): options.set_val(Aircraft.Electrical.HAS_HYBRID_SYSTEM, val=False, units='unitless') options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, val=150, units='unitless') options.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, val=150, units='unitless') + options.set_val(Aircraft.Fuselage.SEAT_WIDTH_FIRST, 28, units='inch') options.set_val(Aircraft.Fuselage.AISLE_WIDTH, 22, units='inch') options.set_val(Aircraft.Fuselage.NUM_AISLES, 3) options.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY, 18) From 1b2c2b736fdfcbfabe2a76e27b87009217fbba47 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 30 Jun 2026 19:53:56 -0400 Subject: [PATCH 17/31] removed one tag of LEAPS1 --- aviary/variable_info/variable_meta_data.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 7a6b79ec27..57930c4c7c 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -332,11 +332,7 @@ add_meta_data( Aircraft.BWB.MAX_BAY_WIDTH, meta_data=_MetaData, - historical_name={ - 'GASP': None, - 'FLOPS': 'FUSEIN.BAYWMX', - 'LEAPS1': None, - }, + historical_name={'GASP': None, 'FLOPS': 'FUSEIN.BAYWMX'}, units='ft', desc='maximum bay width', types=float, From 3206ad0dd85525e795861fae3b9dd0a32c8c9b62 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 1 Jul 2026 11:21:40 -0400 Subject: [PATCH 18/31] removed one LEAPS1. --- aviary/variable_info/variable_meta_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 57930c4c7c..11d2b1f1cd 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -3606,7 +3606,7 @@ add_meta_data( Aircraft.Fuselage.SIDEBODY_THICKNESS_TO_CHORD, meta_data=_MetaData, - historical_name={'GASP': None, 'FLOPS': 'WTIN.TCSOB', 'LEAPS1': None}, + historical_name={'GASP': None, 'FLOPS': 'WTIN.TCSOB'}, units='unitless', desc='fuselage thickness/chord ratio at side of body', default_value=0.0, From 0b3355b37b0eefe47c895ac22e9061dac70e30c2 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 1 Jul 2026 12:12:41 -0400 Subject: [PATCH 19/31] removed another LEAPS1 --- aviary/variable_info/variable_meta_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 11d2b1f1cd..91e3893c20 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -2149,7 +2149,7 @@ add_meta_data( Aircraft.Engine.INLET_AREA_COEFFICIENT, meta_data=_MetaData, - historical_name={'GASP': None, 'FLOPS': None, 'LEAPS1': None}, + historical_name={'GASP': None, 'FLOPS': None}, units='unitless', option=True, default_value=0.0002, # default in GASP From c6a9c87b46a82175422f62bb50c7b72bc70470f1 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 1 Jul 2026 12:53:54 -0400 Subject: [PATCH 20/31] removed the last LEAPS1 --- aviary/variable_info/variable_meta_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 91e3893c20..3fc5775783 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -2659,7 +2659,7 @@ Aircraft.Engine.Propeller.MASS, meta_data=_MetaData, # TODO Check if GASP has a variable for this - historical_name={'GASP': None, 'FLOPS': None, 'LEAPS1': None}, + historical_name={'GASP': None, 'FLOPS': None}, units='lbm', desc='mass of propellers on engine (sum of all blades)', option=False, From c30fa286f524df6d66e2943a658628b1e309e54b Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 1 Jul 2026 13:07:39 -0400 Subject: [PATCH 21/31] put LEAPS1 back --- aviary/variable_info/variable_meta_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 3fc5775783..91e3893c20 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -2659,7 +2659,7 @@ Aircraft.Engine.Propeller.MASS, meta_data=_MetaData, # TODO Check if GASP has a variable for this - historical_name={'GASP': None, 'FLOPS': None}, + historical_name={'GASP': None, 'FLOPS': None, 'LEAPS1': None}, units='lbm', desc='mass of propellers on engine (sum of all blades)', option=False, From 8b10ad2a8beeed6ff60cbdf4afb81802dc3134bc Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 1 Jul 2026 13:35:53 -0400 Subject: [PATCH 22/31] added and fine tune business class layout. --- .../geometry/gasp_based/fuselage.py | 30 +++++++++++++++---- .../geometry/gasp_based/test/test_fuselage.py | 8 ++--- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/aviary/subsystems/geometry/gasp_based/fuselage.py b/aviary/subsystems/geometry/gasp_based/fuselage.py index 36da5e4ff0..94b2fd71d7 100644 --- a/aviary/subsystems/geometry/gasp_based/fuselage.py +++ b/aviary/subsystems/geometry/gasp_based/fuselage.py @@ -455,10 +455,10 @@ def compute(self, inputs, outputs): pax_FC = options[Aircraft.CrewPayload.Design.NUM_FIRST_CLASS] pax_BC = options[Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS] if pax_FC <= 0: - if verbosity > Verbosity.DEBUG: + if verbosity >= Verbosity.DEBUG: print('Warning: No first class passengers or cabins are included.') if pax_BC <= 0: - if verbosity > Verbosity.DEBUG: + if verbosity >= Verbosity.DEBUG: print('Warning: No business class passengers or cabins are included.') if (pax_FC + pax_BC) > pax: raise ValueError( @@ -470,10 +470,11 @@ def compute(self, inputs, outputs): pilot_com_length = inputs[Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH][0] if pax_FC > 0: fwd_pax_fuselage_station = nose_length + pilot_com_length + FC_lav_galley_length - if pax_BC > 0: - fwd_pax_fuselage_station = fwd_pax_fuselage_station + BC_lav_galley_length else: - fwd_pax_fuselage_station = nose_length + pilot_com_length + if pax_BC > 0: + fwd_pax_fuselage_station = nose_length + pilot_com_length + BC_lav_galley_length + else: + fwd_pax_fuselage_station = nose_length + pilot_com_length # First Class length_FC_by_row = [] # length in first class, ft @@ -508,6 +509,12 @@ def compute(self, inputs, outputs): EL_FC_ptr = length_FC_by_row[Idx_row_FC - 1] # sum_num_seats_FC = pax_FC + if sum_num_seats_FC > pax_FC: + if verbosity >= Verbosity.DEBUG: + print( + f'Number of seats in first class {sum_num_seats_FC} ' + f'is above the design limit {pax_FC}.' + ) else: # If no first class # EL_FC_last_row = 0 @@ -557,6 +564,12 @@ def compute(self, inputs, outputs): EL_BC_ptr = length_BC_by_row[Idx_row_BC - 1] # sum_num_seats_BC = pax_BC + if sum_num_seats_BC > pax_BC: + if verbosity >= Verbosity.DEBUG: + print( + f'Number of seats in business class {sum_num_seats_BC} ' + f'is above the design limit {pax_BC}.' + ) else: # If no business class # EL_BC_last_row = 0 @@ -617,6 +630,13 @@ def compute(self, inputs, outputs): # add additional row for lavs & galleys to last row EL_AFT = length_TC_by_row[Idx_row_TC] + TC_seat_pitch / 12.0 + TC_lav_width / 12.0 + if sum_num_seats_TC > pax_TC: + if verbosity >= Verbosity.DEBUG: + print( + f'Number of seats in economy class {sum_num_seats_TC} ' + f'is above the design limit {pax_TC}.' + ) + outputs['fuselage_station_aft'] = EL_AFT diff --git a/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py b/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py index 61ee6c849a..0a34708be1 100644 --- a/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py +++ b/aviary/subsystems/geometry/gasp_based/test/test_fuselage.py @@ -460,7 +460,7 @@ def setUp(self): self.aviary_options.set_val(Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST, 36, units='inch') self.aviary_options.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, 150) self.aviary_options.set_val(Aircraft.CrewPayload.Design.NUM_FIRST_CLASS, 11) - self.aviary_options.set_val(Settings.VERBOSITY, 1, units='unitless') + self.aviary_options.set_val(Settings.VERBOSITY, 3, units='unitless') self.prob.model.add_subsystem('bwb_cabin_layout', BWBCabinLayout(), promotes=['*']) @@ -517,16 +517,16 @@ def test_case2(self): def test_case3(self): """Testing case: first class + business class + economy class""" self.aviary_options.set_val( - Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS, val=16, units='unitless' + Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS, val=20, units='unitless' ) - self.aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_BUSINESS, val=25, units='inch') + self.aviary_options.set_val(Aircraft.Fuselage.SEAT_WIDTH_BUSINESS, val=25.0, units='inch') setup_model_options(self.prob, self.aviary_options) self.prob.setup() self.prob.run_model() tol = 1e-7 - assert_near_equal(self.prob['fuselage_station_aft'], 67.83782665, tol) + assert_near_equal(self.prob['fuselage_station_aft'], 59.83782665, tol) class BWBFuselageParameters2TestCase(unittest.TestCase): From f53ed86e2a10fd142b94ea7db9e21e30966e5019 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 1 Jul 2026 14:21:31 -0400 Subject: [PATCH 23/31] update doc for GASP based BWB --- .../subsystems/blended_wing_body_GASP.ipynb | 712 +++++++++++++++++- .../images/BWB_GASP_Fuselage_Geometry.png | Bin 128417 -> 98957 bytes 2 files changed, 701 insertions(+), 11 deletions(-) diff --git a/aviary/docs/user_guide_unreviewed/subsystems/blended_wing_body_GASP.ipynb b/aviary/docs/user_guide_unreviewed/subsystems/blended_wing_body_GASP.ipynb index 316806fc45..904c229031 100644 --- a/aviary/docs/user_guide_unreviewed/subsystems/blended_wing_body_GASP.ipynb +++ b/aviary/docs/user_guide_unreviewed/subsystems/blended_wing_body_GASP.ipynb @@ -23,14 +23,253 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "1ad70480", "metadata": { "tags": [ "remove-cell" ] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/markdown": [ + "`Aircraft.Wing.MAX_CAMBER_AT_70_SEMISPAN`" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Wing.MAX_CAMBER_AT_70_SEMISPAN" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.Fuselage.SEAT_WIDTH_ECONOMY" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Fuselage.SEAT_WIDTH_ECONOMY" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.Fuselage.NUM_AISLES" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Fuselage.NUM_AISLES" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.Fuselage.AISLE_WIDTH" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Fuselage.AISLE_WIDTH" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.Fuselage.SEAT_WIDTH_FIRST" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Fuselage.SEAT_WIDTH_FIRST" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.CrewPayload.Design.NUM_PASSENGERS" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.CrewPayload.Design.NUM_PASSENGERS" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.CrewPayload.Design.NUM_FIRST_CLASS" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.CrewPayload.Design.NUM_FIRST_CLASS" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.Fuselage.AVG_DIAMETER" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Fuselage.AVG_DIAMETER" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.Fuselage.PRESSURIZED_WIDTH_ADDITIONAL" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Fuselage.PRESSURIZED_WIDTH_ADDITIONAL" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "`Aircraft.Nacelle.PERCENT_DIAM_BURIED_IN_FUSELAGE`" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Nacelle.PERCENT_DIAM_BURIED_IN_FUSELAGE" + } + }, + "output_type": "display_data" + } + ], "source": [ "# Testing Cell\n", "\n", @@ -41,7 +280,9 @@ "glue_variable(get_variable_name(Aircraft.Fuselage.SEAT_WIDTH_ECONOMY), md_code=False)\n", "glue_variable(get_variable_name(Aircraft.Fuselage.NUM_AISLES), md_code=False)\n", "glue_variable(get_variable_name(Aircraft.Fuselage.AISLE_WIDTH), md_code=False)\n", + "glue_variable(get_variable_name(Aircraft.Fuselage.SEAT_WIDTH_FIRST), md_code=False)\n", "glue_variable(get_variable_name(Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY), md_code=False)\n", + "glue_variable(get_variable_name(Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST), md_code=False)\n", "glue_variable(get_variable_name(Aircraft.CrewPayload.Design.NUM_PASSENGERS), md_code=False)\n", "glue_variable(get_variable_name(Aircraft.CrewPayload.Design.NUM_FIRST_CLASS), md_code=False)\n", "glue_variable(get_variable_name(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP), md_code=False)\n", @@ -71,8 +312,6 @@ "| Parameters | Values | Units |\n", "| ---------- | ------ | ----- |\n", "| length of first class lav, galley & closet | 8.0 | ft |\n", - "| first class seat width | 28.0 | inch |\n", - "| first class seat pitch | 36.0 | inch |\n", "| Number of aisles in first class | 2 | unitless |\n", "| First class aisle width | 24.0 | inch |\n", "| Length of first class/economy class aisle | 5.0 | ft |\n", @@ -88,7 +327,9 @@ "| {glue:md}`Aircraft.Fuselage.SEAT_WIDTH_ECONOMY` | inch |\n", "| {glue:md}`Aircraft.Fuselage.NUM_AISLES` | unitless |\n", "| {glue:md}`Aircraft.Fuselage.AISLE_WIDTH` | inch |\n", + "| {glue:md}`Aircraft.Fuselage.SEAT_WIDTH_FIRST` | inch |\n", "| {glue:md}`Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY` | inch |\n", + "| {glue:md}`Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST` | inch |\n", "| {glue:md}`Aircraft.CrewPayload.Design.NUM_PASSENGERS` | unitless |\n", "| {glue:md}`Aircraft.CrewPayload.Design.NUM_FIRST_CLASS` | unitless |\n", "| {glue:md}`Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP` | deg |\n", @@ -104,6 +345,10 @@ "\n", "![Fuselage size](./images/BWB_GASP_Fuselage_Geometry.png)\n", "\n", + "Different from GASP, we allow business class between first class and economy class.\n", + "\n", + "The layout algorithm is just an estimate. The output layout may not obey all the constraints (e.g. the number of first class passengers) but should not be too far away.\n", + "\n", "### Wing Fuel Volume Computation\n", "\n", "For the wing fuel volume, we first compute its value assuming no wing fold structure. In\n", @@ -112,14 +357,253 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "19502cf3", "metadata": { "tags": [ "remove-cell" ] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/markdown": [ + "`Aircraft.Wing.VERTICAL_MOUNT_LOCATION`" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Wing.VERTICAL_MOUNT_LOCATION" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.Wing.SPAN" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Wing.SPAN" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.Wing.TAPER_RATIO" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Wing.TAPER_RATIO" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.Wing.AREA" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Wing.AREA" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.Wing.ASPECT_RATIO" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Wing.ASPECT_RATIO" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.Wing.SWEEP" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Wing.SWEEP" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.Wing.THICKNESS_TO_CHORD_ROOT" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Wing.THICKNESS_TO_CHORD_ROOT" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.Wing.THICKNESS_TO_CHORD_TIP" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Wing.THICKNESS_TO_CHORD_TIP" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.LandingGear.MAIN_GEAR_LOCATION" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.LandingGear.MAIN_GEAR_LOCATION" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.Fuel.WING_FUEL_FRACTION" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Fuel.WING_FUEL_FRACTION" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Aircraft.Wing.FOLDED_SPAN" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Wing.FOLDED_SPAN" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "`WingFoldArea`" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "WingFoldArea" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "`BWBWingFoldVolume`" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "BWBWingFoldVolume" + } + }, + "output_type": "display_data" + } + ], "source": [ "# Testing Cell\n", "\n", @@ -204,20 +688,226 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "75b0faa1", "metadata": { "tags": [ "remove-cell" ] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/markdown": [ + "`Aircraft.Fuselage.HYDRAULIC_DIAMETER`" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Fuselage.HYDRAULIC_DIAMETER" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "`Aircraft.Fuselage.LIFT_CURVE_SLOPE_MACH0`" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Fuselage.LIFT_CURVE_SLOPE_MACH0" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "`Aircraft.Fuselage.FORM_FACTOR`" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Aircraft.Fuselage.FORM_FACTOR" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "`BWBBodyLiftCurveSlope`" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "BWBBodyLiftCurveSlope" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "`TabularCruiseAero`" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "TabularCruiseAero" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "`AeroGeom`" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "AeroGeom" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "`AeroSetup`" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "AeroSetup" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "`Dynamic.Vehicle.LIFT_COEFFICIENT`" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Dynamic.Vehicle.LIFT_COEFFICIENT" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "`Dynamic.Vehicle.DRAG_COEFFICIENT`" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "Dynamic.Vehicle.DRAG_COEFFICIENT" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "`siwb`" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "siwb" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "`ufac`" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "ufac" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "`body_lift_curve_slope`" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "scrapbook": { + "mime_prefix": "", + "name": "body_lift_curve_slope" + } + }, + "output_type": "display_data" + } + ], "source": [ "# Testing Cell\n", "\n", "from aviary.api import Aircraft, Dynamic\n", "from aviary.utils.doctape import get_all_non_aviary_names, get_variable_name, glue_variable\n", - "from aviary.subsystems.aerodynamics.gasp_based.common import AeroForces\n", + "\n", + "# from aviary.subsystems.aerodynamics.gasp_based.common import AeroForces\n", "from aviary.subsystems.aerodynamics.gasp_based.table_based import TabularCruiseAero\n", "from aviary.subsystems.aerodynamics.gasp_based.gaspaero import (\n", " BWBBodyLiftCurveSlope,\n", @@ -347,7 +1037,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "base", "language": "python", "name": "python3" }, @@ -361,7 +1051,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.3" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/aviary/docs/user_guide_unreviewed/subsystems/images/BWB_GASP_Fuselage_Geometry.png b/aviary/docs/user_guide_unreviewed/subsystems/images/BWB_GASP_Fuselage_Geometry.png index 717e7a7b633fea0ff778dbf18fa837350db845fd..6a158ec38d3dd2369778524371c3f8162553192c 100644 GIT binary patch literal 98957 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 literal 128417 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 Date: Wed, 1 Jul 2026 14:25:51 -0400 Subject: [PATCH 24/31] blended_wing_body_GASP.ipynb --- .../subsystems/blended_wing_body_GASP.ipynb | 695 +----------------- 1 file changed, 6 insertions(+), 689 deletions(-) diff --git a/aviary/docs/user_guide_unreviewed/subsystems/blended_wing_body_GASP.ipynb b/aviary/docs/user_guide_unreviewed/subsystems/blended_wing_body_GASP.ipynb index 904c229031..bd7e38d460 100644 --- a/aviary/docs/user_guide_unreviewed/subsystems/blended_wing_body_GASP.ipynb +++ b/aviary/docs/user_guide_unreviewed/subsystems/blended_wing_body_GASP.ipynb @@ -23,253 +23,14 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "1ad70480", "metadata": { "tags": [ "remove-cell" ] }, - "outputs": [ - { - "data": { - "text/markdown": [ - "`Aircraft.Wing.MAX_CAMBER_AT_70_SEMISPAN`" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Wing.MAX_CAMBER_AT_70_SEMISPAN" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.Fuselage.SEAT_WIDTH_ECONOMY" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Fuselage.SEAT_WIDTH_ECONOMY" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.Fuselage.NUM_AISLES" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Fuselage.NUM_AISLES" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.Fuselage.AISLE_WIDTH" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Fuselage.AISLE_WIDTH" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.Fuselage.SEAT_WIDTH_FIRST" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Fuselage.SEAT_WIDTH_FIRST" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.CrewPayload.Design.SEAT_PITCH_FIRST" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.CrewPayload.Design.NUM_PASSENGERS" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.CrewPayload.Design.NUM_PASSENGERS" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.CrewPayload.Design.NUM_FIRST_CLASS" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.CrewPayload.Design.NUM_FIRST_CLASS" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Fuselage.PILOT_COMPARTMENT_LENGTH" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.Fuselage.AVG_DIAMETER" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Fuselage.AVG_DIAMETER" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.Fuselage.PRESSURIZED_WIDTH_ADDITIONAL" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Fuselage.PRESSURIZED_WIDTH_ADDITIONAL" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "`Aircraft.Nacelle.PERCENT_DIAM_BURIED_IN_FUSELAGE`" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Nacelle.PERCENT_DIAM_BURIED_IN_FUSELAGE" - } - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Testing Cell\n", "\n", @@ -357,253 +118,14 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "19502cf3", "metadata": { "tags": [ "remove-cell" ] }, - "outputs": [ - { - "data": { - "text/markdown": [ - "`Aircraft.Wing.VERTICAL_MOUNT_LOCATION`" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Wing.VERTICAL_MOUNT_LOCATION" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.Wing.SPAN" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Wing.SPAN" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.Wing.TAPER_RATIO" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Wing.TAPER_RATIO" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.Wing.AREA" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Wing.AREA" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.Wing.ASPECT_RATIO" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Wing.ASPECT_RATIO" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.Wing.SWEEP" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Wing.SWEEP" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.Wing.THICKNESS_TO_CHORD_ROOT" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Wing.THICKNESS_TO_CHORD_ROOT" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.Wing.THICKNESS_TO_CHORD_TIP" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Wing.THICKNESS_TO_CHORD_TIP" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.LandingGear.MAIN_GEAR_LOCATION" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.LandingGear.MAIN_GEAR_LOCATION" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.Fuel.WING_FUEL_FRACTION" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Fuel.WING_FUEL_FRACTION" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "Aircraft.Wing.FOLDED_SPAN" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Wing.FOLDED_SPAN" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "`WingFoldArea`" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "WingFoldArea" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "`BWBWingFoldVolume`" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "BWBWingFoldVolume" - } - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Testing Cell\n", "\n", @@ -688,219 +210,14 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "75b0faa1", "metadata": { "tags": [ "remove-cell" ] }, - "outputs": [ - { - "data": { - "text/markdown": [ - "`Aircraft.Fuselage.HYDRAULIC_DIAMETER`" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Fuselage.HYDRAULIC_DIAMETER" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "`Aircraft.Fuselage.LIFT_CURVE_SLOPE_MACH0`" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Fuselage.LIFT_CURVE_SLOPE_MACH0" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "`Aircraft.Fuselage.FORM_FACTOR`" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Aircraft.Fuselage.FORM_FACTOR" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "`BWBBodyLiftCurveSlope`" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "BWBBodyLiftCurveSlope" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "`TabularCruiseAero`" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "TabularCruiseAero" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "`AeroGeom`" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "AeroGeom" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "`AeroSetup`" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "AeroSetup" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "`Dynamic.Vehicle.LIFT_COEFFICIENT`" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Dynamic.Vehicle.LIFT_COEFFICIENT" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "`Dynamic.Vehicle.DRAG_COEFFICIENT`" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "Dynamic.Vehicle.DRAG_COEFFICIENT" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "`siwb`" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "siwb" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "`ufac`" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "ufac" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "`body_lift_curve_slope`" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "scrapbook": { - "mime_prefix": "", - "name": "body_lift_curve_slope" - } - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Testing Cell\n", "\n", From f608b9cd20ba68f0220259c1faa080f6eb2664f1 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 1 Jul 2026 16:05:19 -0400 Subject: [PATCH 25/31] minor update --- .../geometry/flops_based/fuselage.py | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/fuselage.py b/aviary/subsystems/geometry/flops_based/fuselage.py index 82f2872731..a88448d1ac 100644 --- a/aviary/subsystems/geometry/flops_based/fuselage.py +++ b/aviary/subsystems/geometry/flops_based/fuselage.py @@ -242,37 +242,37 @@ def compute(self, inputs, outputs): num_seat_abreast_first = num_seat_abreast_economy - 2 if verbosity > Verbosity.BRIEF: print( - f'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_FIRST = ' - '{num_seat_abreast_first}' + 'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_FIRST = ' + f'{num_seat_abreast_first}' ) if num_business_class_pax > 0 and num_seat_abreast_business <= 0: num_seat_abreast_business = num_seat_abreast_economy - 2 if verbosity > Verbosity.BRIEF: print( - f'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_BASINESS = ' - '{num_seat_abreast_business}' + 'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_BASINESS = ' + f'{num_seat_abreast_business}' ) if num_seat_abreast_first <= 0 and num_first_class_pax > 0: num_seat_abreast_first = 4 if verbosity > Verbosity.BRIEF: print( - f'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_FIRST = ' - '{num_seat_abreast_first}' + 'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_FIRST = ' + f'{num_seat_abreast_first}' ) if num_seat_abreast_economy <= 0 and num_economy_class_pax > 0: num_seat_abreast_economy = 6 if verbosity > Verbosity.BRIEF: print( - f'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY = ' - '{num_seat_abreast_economy}' + 'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY = ' + f'{num_seat_abreast_economy}' ) if num_seat_abreast_business <= 0 and num_business_class_pax > 0: num_seat_abreast_business = 5 if verbosity > Verbosity.BRIEF: print( - f'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_BUSINESS = ' - '{num_seat_abreast_business}' + 'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_BUSINESS = ' + f'{num_seat_abreast_business}' ) # Though these are not user definable, the values here are typical for most transport @@ -288,8 +288,8 @@ def compute(self, inputs, outputs): num_seat_abreast_economy = 5 if verbosity > Verbosity.BRIEF: print( - f'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY = ' - '{num_seat_abreast_economy}' + 'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY = ' + f'{num_seat_abreast_economy}' ) aisle_width_economy_class = 15.0 @@ -543,7 +543,7 @@ def compute(self, inputs, outputs): if length <= 0.0: raise ValueError( - f'Aircraft.Fuselage.LENGTH must be positive to use simple cabin layout.' + 'Aircraft.Fuselage.LENGTH must be positive to use simple cabin layout.' ) if max_width <= 0.0: raise ValueError( From ec1f18d2212a7588260ce683e8e5eb5716054bd7 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 1 Jul 2026 20:32:41 -0400 Subject: [PATCH 26/31] added a warning message when business class seats are included for transporters --- .../advanced_single_aisle_FLOPS.csv | 1 + aviary/utils/fortran_to_aviary.py | 10 ++++++++-- .../converter_test_advanced_single_aisle_FLOPS.csv | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/aviary/models/aircraft/advanced_single_aisle/advanced_single_aisle_FLOPS.csv b/aviary/models/aircraft/advanced_single_aisle/advanced_single_aisle_FLOPS.csv index 63544bdfd8..473ff7612a 100644 --- a/aviary/models/aircraft/advanced_single_aisle/advanced_single_aisle_FLOPS.csv +++ b/aviary/models/aircraft/advanced_single_aisle/advanced_single_aisle_FLOPS.csv @@ -1,5 +1,6 @@ # created unknown date # FLOPS-derived aircraft input deck converted from N3CC_generic_low_speed_polars_FLOPSinp.txt +# business class seats are included. Fuselage layout will be different from FLOPS. # Input Values aircraft:air_conditioning:mass_scaler,0.98094,unitless diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 1607e4537b..7b51875001 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -125,7 +125,7 @@ def fortran_to_aviary( if legacy_code is GASP: vehicle_data = update_gasp_options(vehicle_data, verbosity) elif legacy_code is FLOPS: - vehicle_data = update_flops_options(vehicle_data, verbosity) + vehicle_data = update_flops_options(vehicle_data, comments, verbosity) vehicle_data = update_aviary_options(vehicle_data) # Add settings and engine data file @@ -982,7 +982,7 @@ def update_gasp_options(vehicle_data, verbosity=Verbosity.BRIEF): return vehicle_data -def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): +def update_flops_options(vehicle_data, cmts, verbosity=Verbosity.BRIEF): """Handles variables that are affected by the values of others.""" input_values: NamedValues = vehicle_data['input_values'] @@ -1267,6 +1267,12 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): ARHT = input_values.get_val(Aircraft.HorizontalTail.ASPECT_RATIO)[0] input_values.set_val(Aircraft.VerticalTail.ASPECT_RATIO, [ARHT / 2.0], 'unitless') + if Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS in input_values and design_type[0] != 3: + if input_values.get_val(Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS)[0] > 0: + cmts.append( + '# business class seats are included. Fuselage layout will be different from FLOPS.' + ) + # if mission-wide fuel flow factor provided, combine into sub and supersonic fuel flow factors if 'MISSIN.fact' in vehicle_data['unused_values']: FACT = vehicle_data['unused_values'].get_item('MISSIN.fact')[0][0] diff --git a/aviary/utils/test/data/converter_test_advanced_single_aisle_FLOPS.csv b/aviary/utils/test/data/converter_test_advanced_single_aisle_FLOPS.csv index e7df6bc290..1186f29d9f 100644 --- a/aviary/utils/test/data/converter_test_advanced_single_aisle_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_advanced_single_aisle_FLOPS.csv @@ -1,4 +1,5 @@ # FLOPS-derived aircraft input deck converted from N3CC_generic_low_speed_polars_FLOPS.txt +# business class seats are included. Fuselage layout will be different from FLOPS. # Input Values aircraft:air_conditioning:mass_scaler,0.98094,unitless From c165efaff01b81f2c29d4b0d0193e47459f223ba Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 6 Jul 2026 11:38:45 -0400 Subject: [PATCH 27/31] added a m=warning message when business class is included that may affect fuselage layout --- aviary/utils/fortran_to_aviary.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 7b51875001..38e6a22747 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -1270,7 +1270,7 @@ def update_flops_options(vehicle_data, cmts, verbosity=Verbosity.BRIEF): if Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS in input_values and design_type[0] != 3: if input_values.get_val(Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS)[0] > 0: cmts.append( - '# business class seats are included. Fuselage layout will be different from FLOPS.' + '# business class seats are included. Fuselage layout may be different from FLOPS.' ) # if mission-wide fuel flow factor provided, combine into sub and supersonic fuel flow factors From 2942a08219ed6864e372b275cfc016e4740270f3 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 6 Jul 2026 11:41:37 -0400 Subject: [PATCH 28/31] work in progress: adding a unit test for the case when detailed layout is used for transporter aircraft using FLOPS based geometry. --- .../test/test_flops_based_premission.py | 74 ++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index bfec5bda3e..17564058d4 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -210,6 +210,75 @@ def test_mass_aero_only(self): flops_outputs=flops_outputs, ) + def test_detailed_layout(self): + case_name = 'LargeSingleAisle1FLOPS' + flops_inputs = get_flops_inputs(case_name) + flops_outputs = get_flops_outputs(case_name) + flops_inputs.set_val( + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, + flops_outputs.get_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES), + ) + flops_inputs.set_val(Aircraft.Fuselage.SIMPLE_LAYOUT, True) + flops_inputs.set_val(Settings.VERBOSITY, 0) + + engines = [build_engine_deck(flops_inputs)] + preprocess_options(flops_inputs, engine_models=engines) + default_premission_subsystems = get_default_premission_subsystems('FLOPS', engines) + + prob = self.prob + + prob.model.add_subsystem( + 'pre_mission', + CorePreMission( + aviary_options=flops_inputs, + subsystems=default_premission_subsystems, + subsystem_options={}, + ), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) + + setup_model_options(prob, flops_inputs) + + prob.setup(check=False, force_alloc_complex=True) + prob.set_solver_print(2) + + # Initial guess for gross weight. + # We set it to an unconverged value to test convergence. + prob.set_val(Aircraft.Design.GROSS_MASS, val=1000.0) + + set_aviary_initial_values(prob, flops_inputs) + + # We set these so that their derivatives are defined. + # The ref values are not set in our test models. + prob[Aircraft.Wing.ASPECT_RATIO_REFERENCE] = prob[Aircraft.Wing.ASPECT_RATIO] + prob[Aircraft.Wing.THICKNESS_TO_CHORD_REFERENCE] = prob[Aircraft.Wing.THICKNESS_TO_CHORD] + + prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS] = flops_outputs.get_val( + Aircraft.Propulsion.TOTAL_ENGINE_MASS, units='lbm' + ) + prob[Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS] = flops_outputs.get_val( + Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS, units='lbm' + ) + + flops_validation_test( + self, + prob, + case_name, + input_keys=[], + output_keys=[ + Aircraft.Design.STRUCTURE_MASS, + Aircraft.Propulsion.MASS, + Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS, + Aircraft.Design.EMPTY_MASS, + Mission.OPERATING_MASS, + Mission.ZERO_FUEL_MASS, + ], + step=1.01e-40, + atol=1e-8, + rtol=1e-10, + ) + @use_tempdirs class BWBPreMissionGroupTest(unittest.TestCase): @@ -1233,4 +1302,7 @@ def test_case_all_subsystems(self): if __name__ == '__main__': - unittest.main() + # unittest.main() + test = PreMissionGroupTest() + test.setUp() + test.test_detailed_layout() From 154489528925e402e8b58e2674de3213564edb96 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 7 Jul 2026 13:21:03 -0400 Subject: [PATCH 29/31] added a unit test for detailed layout in FLOPS based geometry --- .../test/test_flops_based_premission.py | 50 ++++++++----------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index 17564058d4..d8f8ba0c4e 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -8,6 +8,7 @@ from aviary.core.aviary_problem import AviaryProblem from aviary.subsystems.premission import CorePreMission from aviary.subsystems.propulsion.utils import build_engine_deck +from aviary.utils.aviary_values import AviaryValues from aviary.utils.functions import set_aviary_initial_values from aviary.utils.preprocessors import preprocess_options from aviary.utils.test_utils.default_subsystems import ( @@ -218,9 +219,15 @@ def test_detailed_layout(self): Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, flops_outputs.get_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES), ) - flops_inputs.set_val(Aircraft.Fuselage.SIMPLE_LAYOUT, True) + flops_inputs.set_val(Aircraft.Fuselage.SIMPLE_LAYOUT, False) flops_inputs.set_val(Settings.VERBOSITY, 0) + # do not override these variables which are outputs from DetailedCabinLayout + flops_inputs.delete(Aircraft.Fuselage.LENGTH) + flops_inputs.delete(Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH) + flops_inputs.delete(Aircraft.Fuselage.MAX_WIDTH) + flops_inputs.delete(Aircraft.Fuselage.MAX_HEIGHT) + engines = [build_engine_deck(flops_inputs)] preprocess_options(flops_inputs, engine_models=engines) default_premission_subsystems = get_default_premission_subsystems('FLOPS', engines) @@ -249,35 +256,20 @@ def test_detailed_layout(self): set_aviary_initial_values(prob, flops_inputs) - # We set these so that their derivatives are defined. - # The ref values are not set in our test models. - prob[Aircraft.Wing.ASPECT_RATIO_REFERENCE] = prob[Aircraft.Wing.ASPECT_RATIO] - prob[Aircraft.Wing.THICKNESS_TO_CHORD_REFERENCE] = prob[Aircraft.Wing.THICKNESS_TO_CHORD] - - prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS] = flops_outputs.get_val( - Aircraft.Propulsion.TOTAL_ENGINE_MASS, units='lbm' - ) - prob[Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS] = flops_outputs.get_val( - Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS, units='lbm' - ) + prob.run_model() - flops_validation_test( - self, - prob, - case_name, - input_keys=[], - output_keys=[ - Aircraft.Design.STRUCTURE_MASS, - Aircraft.Propulsion.MASS, - Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS, - Aircraft.Design.EMPTY_MASS, - Mission.OPERATING_MASS, - Mission.ZERO_FUEL_MASS, - ], - step=1.01e-40, - atol=1e-8, - rtol=1e-10, - ) + tol = 1e-5 + expected_values = { + # geometry subsystem, DetailedCabinLayout component + Aircraft.Fuselage.LENGTH: 148.37731944, + Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH: 108.37731944, + Aircraft.Fuselage.MAX_WIDTH: 12.19, + Aircraft.Fuselage.MAX_HEIGHT: 13.09, + } + + for var_name, expected in expected_values.items(): + with self.subTest(var=var_name): + assert_near_equal(prob[var_name], expected, tol) @use_tempdirs From 8686233b1649422b6a9a2d25b9ad112383422e45 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 7 Jul 2026 13:33:26 -0400 Subject: [PATCH 30/31] minor update --- .../test/data/converter_test_advanced_single_aisle_FLOPS.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/utils/test/data/converter_test_advanced_single_aisle_FLOPS.csv b/aviary/utils/test/data/converter_test_advanced_single_aisle_FLOPS.csv index 1186f29d9f..3f4ece7fd8 100644 --- a/aviary/utils/test/data/converter_test_advanced_single_aisle_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_advanced_single_aisle_FLOPS.csv @@ -1,5 +1,5 @@ # FLOPS-derived aircraft input deck converted from N3CC_generic_low_speed_polars_FLOPS.txt -# business class seats are included. Fuselage layout will be different from FLOPS. +# business class seats are included. Fuselage layout may be different from FLOPS. # Input Values aircraft:air_conditioning:mass_scaler,0.98094,unitless From 33c4c26ec7b3df75290e72b40905cd5626b3a0e6 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 7 Jul 2026 15:30:48 -0400 Subject: [PATCH 31/31] minor update to test_flops_based_premission.py --- .../test/test_flops_based_premission.py | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index d8f8ba0c4e..b7aa629ec4 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -8,7 +8,6 @@ from aviary.core.aviary_problem import AviaryProblem from aviary.subsystems.premission import CorePreMission from aviary.subsystems.propulsion.utils import build_engine_deck -from aviary.utils.aviary_values import AviaryValues from aviary.utils.functions import set_aviary_initial_values from aviary.utils.preprocessors import preprocess_options from aviary.utils.test_utils.default_subsystems import ( @@ -212,13 +211,9 @@ def test_mass_aero_only(self): ) def test_detailed_layout(self): + """Test DetailedCabinLayout component.""" case_name = 'LargeSingleAisle1FLOPS' flops_inputs = get_flops_inputs(case_name) - flops_outputs = get_flops_outputs(case_name) - flops_inputs.set_val( - Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, - flops_outputs.get_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES), - ) flops_inputs.set_val(Aircraft.Fuselage.SIMPLE_LAYOUT, False) flops_inputs.set_val(Settings.VERBOSITY, 0) @@ -230,7 +225,8 @@ def test_detailed_layout(self): engines = [build_engine_deck(flops_inputs)] preprocess_options(flops_inputs, engine_models=engines) - default_premission_subsystems = get_default_premission_subsystems('FLOPS', engines) + # get geom subsystem only + default_premission_subsystems = [get_default_premission_subsystems('FLOPS', engines)[1]] prob = self.prob @@ -246,19 +242,10 @@ def test_detailed_layout(self): ) setup_model_options(prob, flops_inputs) - prob.setup(check=False, force_alloc_complex=True) - prob.set_solver_print(2) - - # Initial guess for gross weight. - # We set it to an unconverged value to test convergence. - prob.set_val(Aircraft.Design.GROSS_MASS, val=1000.0) - set_aviary_initial_values(prob, flops_inputs) - prob.run_model() - tol = 1e-5 expected_values = { # geometry subsystem, DetailedCabinLayout component Aircraft.Fuselage.LENGTH: 148.37731944, @@ -267,6 +254,7 @@ def test_detailed_layout(self): Aircraft.Fuselage.MAX_HEIGHT: 13.09, } + tol = 1e-5 for var_name, expected in expected_values.items(): with self.subTest(var=var_name): assert_near_equal(prob[var_name], expected, tol)