Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
363a42e
renamed Aircraft.Fuselage.SEAT_WIDTH to Aircraft.Fuselage.SEAT_WIDTH_…
xjjiang Jun 26, 2026
a00038e
renamed Aircraft.Fuselage.SEAT_WIDTH to Aircraft.Fuselage.SEAT_WIDTH_…
xjjiang Jun 26, 2026
1ba5541
added Aircraft.Fuselage.SEAT_WIDTH_FIRST and Aircraft.Fuselage.SEAT_W…
xjjiang Jun 26, 2026
17997a0
minor update
xjjiang Jun 26, 2026
bb2fb13
try again
xjjiang Jun 26, 2026
df38d4a
try again 2
xjjiang Jun 26, 2026
9f24c4c
minor update
xjjiang Jun 26, 2026
d9c7d5d
minor mix
xjjiang Jun 26, 2026
2c47b5e
fixed wrong order
xjjiang Jun 26, 2026
9476478
update sizing_results_for_test.json
xjjiang Jun 26, 2026
769eb24
Merge branch 'main' into fuselage_layout
xjjiang Jun 26, 2026
6f972aa
update DetailedCabinLayout
xjjiang Jun 29, 2026
df14090
Merge branch 'OpenMDAO:main' into fuselage_layout
xjjiang Jun 29, 2026
303a3a8
added a unit test with business class
xjjiang Jun 29, 2026
01d6ebf
renamed Aircraft.Fuselage.SEAT_WIDTH to Aircraft.Fuselage.SEAT_WIDTH_…
xjjiang Jun 30, 2026
cd4295a
put LEAPS1 tag back
xjjiang Jun 30, 2026
5e7fd7f
preprocessed Aircraft.Fuselage.SEAT_WIDTH_ECONOMY and Aircraft.Fusela…
xjjiang Jun 30, 2026
1deece1
added business class to GASP based fuselage layout
xjjiang Jun 30, 2026
1b2c2b7
removed one tag of LEAPS1
xjjiang Jun 30, 2026
3206ad0
removed one LEAPS1.
xjjiang Jul 1, 2026
0b3355b
removed another LEAPS1
xjjiang Jul 1, 2026
c6a9c87
removed the last LEAPS1
xjjiang Jul 1, 2026
c30fa28
put LEAPS1 back
xjjiang Jul 1, 2026
8b10ad2
added and fine tune business class layout.
xjjiang Jul 1, 2026
f53ed86
update doc for GASP based BWB
xjjiang Jul 1, 2026
1de0fde
blended_wing_body_GASP.ipynb
xjjiang Jul 1, 2026
f608b9c
minor update
xjjiang Jul 1, 2026
ec1f18d
added a warning message when business class seats are included for tr…
xjjiang Jul 2, 2026
eb1df71
Merge branch 'OpenMDAO:main' into fuselage_layout
xjjiang Jul 2, 2026
8691551
Merge branch 'OpenMDAO:main' into fuselage_layout
xjjiang Jul 2, 2026
ed479e1
Merge branch 'OpenMDAO:main' into fuselage_layout
xjjiang Jul 6, 2026
c165efa
added a m=warning message when business class is included that may af…
xjjiang Jul 6, 2026
2942a08
work in progress: adding a unit test for the case when detailed layou…
xjjiang Jul 6, 2026
3803d7d
Merge branch 'OpenMDAO:main' into fuselage_layout
xjjiang Jul 7, 2026
bacf737
XMerge branch 'fuselage_layout' of github.com:xjjiang/om-Aviary into …
xjjiang Jul 7, 2026
1544895
added a unit test for detailed layout in FLOPS based geometry
xjjiang Jul 7, 2026
8686233
minor update
xjjiang Jul 7, 2026
33c4c26
minor update to test_flops_based_premission.py
xjjiang Jul 7, 2026
170eede
Merge branch 'OpenMDAO:main' into fuselage_layout
xjjiang Jul 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,12 @@
"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.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",
Expand Down Expand Up @@ -71,8 +73,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",
Expand All @@ -85,10 +85,12 @@
"\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.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",
Expand All @@ -104,6 +106,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",
Expand Down Expand Up @@ -217,7 +223,8 @@
"\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",
Expand Down Expand Up @@ -347,7 +354,7 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"display_name": "base",
"language": "python",
"name": "python3"
},
Expand All @@ -361,7 +368,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.3"
"version": "3.12.9"
}
},
"nbformat": 4,
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions aviary/interface/test/sizing_results_for_test.json
Original file line number Diff line number Diff line change
Expand Up @@ -1124,6 +1124,18 @@
"unitless",
"<class 'float'>"
],
[
"aircraft:fuselage:seat_width_economy",
20.0,
"inch",
"<class 'float'>"
],
[
"aircraft:fuselage:seat_width_first",
25.0,
"inch",
"<class 'float'>"
],
[
"mission:gross_mass",
175400.0,
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
117 changes: 100 additions & 17 deletions aviary/subsystems/geometry/flops_based/fuselage.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -191,13 +191,20 @@ 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)
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)
add_aviary_option(self, Settings.VERBOSITY)

def setup(self):
add_aviary_input(self, Aircraft.Design.RANGE, units='NM')
Expand All @@ -210,36 +217,80 @@ 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]
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
]

# 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(
'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(
'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(
'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(
'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(
'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
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.
# 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(
'Set Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY = '
f'{num_seat_abreast_economy}'
)
aisle_width_economy_class = 15.0

if num_seat_abreast_economy > 6:
Expand All @@ -252,18 +303,29 @@ 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
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_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
Expand Down Expand Up @@ -311,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
Expand All @@ -325,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
Expand All @@ -339,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_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))
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

Expand All @@ -358,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
Expand All @@ -378,17 +446,32 @@ 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
) / 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 * 25.0
num_aisles * aisle_width_economy_class + num_seat_abreast_economy * seat_width_economy
) / 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

Expand Down Expand Up @@ -460,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(
Expand Down
Loading
Loading