Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
c5fc8ff
fixed a typo
xjjiang Apr 1, 2026
2d24374
remove FormFactorAndSIWB from AeroSetup
xjjiang Apr 1, 2026
7d5c06a
move FormFactorAndSIWB and BWBFormFactorAndSIWB to premissionaero fro…
xjjiang Apr 1, 2026
49ab22a
Merge branch 'OpenMDAO:main' into GASP_aero_premission
xjjiang Apr 2, 2026
736f77b
Merge branch 'OpenMDAO:main' into GASP_aero_premission
xjjiang Apr 2, 2026
33e6444
Merge branch 'OpenMDAO:main' into GASP_aero_premission
xjjiang Apr 3, 2026
ea4133e
Merge branch 'OpenMDAO:main' into GASP_aero_premission
xjjiang Apr 3, 2026
17eb4c3
roll back to main
xjjiang Apr 3, 2026
c7fe268
add use_tempdirs
xjjiang Apr 3, 2026
ebfdcde
separate FormFactor and SIWB components
xjjiang Apr 3, 2026
1187696
remove FormFactor from setup
xjjiang Apr 3, 2026
2e563ba
add FormFactor to premission
xjjiang Apr 3, 2026
28d0d74
split FormFactorAndSIWB to FormFactor and SIWB
xjjiang Apr 3, 2026
465b4a7
work in progress
xjjiang Apr 3, 2026
dbd2ab7
work in progress
xjjiang Apr 3, 2026
7f1d79a
work in progress
xjjiang Apr 3, 2026
3bce50a
add Aircraft.Fuselage.FORM_FACTOR to premission
xjjiang Apr 3, 2026
9e4fba1
add Aircraft.Fuselage.FORM_FACTOR to aero builder
xjjiang Apr 3, 2026
410cb77
add Aircraft.Fuselage.FORM_FACTOR
xjjiang Apr 4, 2026
2071c4d
set Aircraft.Fuselage.FORM_FACTOR
xjjiang Apr 4, 2026
d6a41ea
remove Aircraft.Fuselage.FORM_FACTOR from individual unit tests becau…
xjjiang Apr 4, 2026
68aa423
set aircraft:fuselage:form_factor
xjjiang Apr 4, 2026
24fe162
update fuselage form factor
xjjiang Apr 6, 2026
fe44f64
move FormFactor and BWBFormFactor to gasp_aero_coeffs.py
xjjiang Apr 6, 2026
bc8e341
move BWBFormFactor
xjjiang Apr 6, 2026
b9142dd
Merge branch 'OpenMDAO:main' into GASP_aero_premission
xjjiang Apr 9, 2026
54204d3
Merge branch 'OpenMDAO:main' into GASP_aero_premission
xjjiang Apr 9, 2026
2b47045
removed aircraft:fuselage:form_factor,1.05557953,unitless
xjjiang Apr 10, 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
9 changes: 6 additions & 3 deletions aviary/docs/theory_guide/gasp_based_bwb.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -319,18 +319,20 @@
" AeroGeom,\n",
" BWBAeroSetup,\n",
" BWBBodyLiftCurveSlope,\n",
" BWBFormFactorAndSIWB,\n",
" BWBSIWB,\n",
" BWBLiftCoeff,\n",
" BWBLiftCoeffClean,\n",
" CruiseAero,\n",
" LowSpeedAero,\n",
" Xlifts,\n",
")\n",
"from aviary.subsystems.aerodynamics.gasp_based.gasp_aero_coeffs import BWBFormFactor\n",
"from aviary.subsystems.aerodynamics.gasp_based.table_based import TabularCruiseAero\n",
"from aviary.utils.doctape import get_all_non_aviary_names, get_variable_name, glue_variable\n",
"\n",
"glue_variable(get_variable_name(BWBBodyLiftCurveSlope), md_code=True)\n",
"glue_variable(get_variable_name(BWBFormFactorAndSIWB), md_code=True)\n",
"glue_variable(get_variable_name(BWBFormFactor), md_code=True)\n",
"glue_variable(get_variable_name(BWBSIWB), md_code=True)\n",
"glue_variable(get_variable_name(BWBAeroSetup), md_code=True)\n",
"glue_variable(get_variable_name(BWBLiftCoeff), md_code=True)\n",
"glue_variable(get_variable_name(BWBLiftCoeffClean), md_code=True)\n",
Expand Down Expand Up @@ -366,7 +368,8 @@
"This feature implements GASP aerodynamics subsystems for BWB aircraft. Five new components are added:\n",
"\n",
"- {glue:md}`BWBBodyLiftCurveSlope`\n",
"- {glue:md}`BWBFormFactorAndSIWB`\n",
"- {glue:md}`BWBFormFactor`\n",
"- {glue:md}`BWBSIWB`\n",
"- {glue:md}`BWBAeroSetup`\n",
"- {glue:md}`BWBLiftCoeff`\n",
"- {glue:md}`BWBLiftCoeffClean`\n",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@
" BWBBodyLiftCurveSlope,\n",
" AeroGeom,\n",
" AeroSetup,\n",
" FormFactorAndSIWB,\n",
" SIWB,\n",
" UFac,\n",
" BWBBodyLiftCurveSlope,\n",
")\n",
Expand All @@ -240,7 +240,7 @@
"[cl, cd] = get_all_non_aviary_names(AeroForces, include_in_out='in')\n",
"glue_variable('CL', cl, md_code=True)\n",
"glue_variable('CD', cd, md_code=True)\n",
"siwb = get_all_non_aviary_names(FormFactorAndSIWB)[0]\n",
"siwb = get_all_non_aviary_names(SIWB)[0]\n",
"glue_variable('siwb', siwb, md_code=True)\n",
"ufac = get_all_non_aviary_names(UFac, include_in_out='out')[0]\n",
"glue_variable('ufac', ufac, md_code=True)\n",
Expand Down
2 changes: 1 addition & 1 deletion aviary/mission/two_dof/ode/params.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ def promote_params(sys, trajs=None, phases=None):
Aircraft.Wing.VERTICAL_MOUNT_LOCATION: dict(units='unitless', val=0),
Aircraft.Design.STATIC_MARGIN: dict(units='unitless', val=0.03),
Aircraft.Design.CG_DELTA: dict(units='unitless', val=0.25),
Aircraft.Fuselage.FORM_FACTOR: dict(units='unitless', val=1.25),
Aircraft.Fuselage.FORM_FACTOR: dict(units='unitless', val=1.05557953),
Aircraft.Nacelle.FORM_FACTOR: dict(units='unitless', val=1.5),
Aircraft.Wing.FUSELAGE_INTERFERENCE_FACTOR: dict(units='unitless', val=1.1),
Aircraft.Design.DRAG_COEFFICIENT_INCREMENT: dict(units='unitless', val=0.00175),
Expand Down
1 change: 1 addition & 0 deletions aviary/mission/two_dof/ode/test/test_breguet_cruise_ode.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ def test_cruise(self):
self.prob.set_val(Aircraft.Wing.FORM_FACTOR, 1.25)
self.prob.set_val(Aircraft.VerticalTail.FORM_FACTOR, 1.25)
self.prob.set_val(Aircraft.HorizontalTail.FORM_FACTOR, 1.25)
self.prob.set_val(Aircraft.Fuselage.FORM_FACTOR, 1.05557953)

set_params_for_unit_tests(self.prob)

Expand Down
3 changes: 3 additions & 0 deletions aviary/mission/two_dof/ode/test/test_flight_ode.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ def test_start_of_climb(self):
self.prob.set_val(Aircraft.HorizontalTail.FORM_FACTOR, 1.25)

set_params_for_unit_tests(self.prob)
self.prob.set_val(Aircraft.Fuselage.FORM_FACTOR, 1.05557953)

self.prob.run_model()

Expand Down Expand Up @@ -107,6 +108,7 @@ def test_end_of_climb(self):
self.prob.set_val(Aircraft.HorizontalTail.FORM_FACTOR, 1.25)

set_params_for_unit_tests(self.prob)
self.prob.set_val(Aircraft.Fuselage.FORM_FACTOR, 1.05557953)

self.prob.run_model()

Expand Down Expand Up @@ -217,6 +219,7 @@ def test_low_alt(self):
self.prob.set_val(Aircraft.HorizontalTail.FORM_FACTOR, 1.25)

set_params_for_unit_tests(self.prob)
self.prob.set_val(Aircraft.Fuselage.FORM_FACTOR, 1.05557953)

self.prob.run_model()

Expand Down
1 change: 1 addition & 0 deletions aviary/mission/two_dof/ode/test/test_flight_path_ode.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ def test_case1(self):
self.prob.set_val(Aircraft.Wing.FORM_FACTOR, 1.25)
self.prob.set_val(Aircraft.VerticalTail.FORM_FACTOR, 1.25)
self.prob.set_val(Aircraft.HorizontalTail.FORM_FACTOR, 1.25)
self.prob.set_val(Aircraft.Fuselage.FORM_FACTOR, 1.05557953)

self.prob.run_model()
testvals = {
Expand Down
2 changes: 2 additions & 0 deletions aviary/mission/two_dof/ode/test/test_takeoff_ode.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ def test_groundroll_partials(self):
self.prob.set_val(Aircraft.Wing.FORM_FACTOR, 1.25)
self.prob.set_val(Aircraft.VerticalTail.FORM_FACTOR, 1.25)
self.prob.set_val(Aircraft.HorizontalTail.FORM_FACTOR, 1.25)
self.prob.set_val(Aircraft.Fuselage.FORM_FACTOR, 1.05557953)
self.prob.set_val(Dynamic.Mission.VELOCITY, [75, 150], units='kn')
self.prob.set_val(Dynamic.Vehicle.MASS, [100000, 100000], units='lbm')

Expand Down Expand Up @@ -105,6 +106,7 @@ def test_rotation_partials(self):
self.prob.set_val(Aircraft.Wing.FORM_FACTOR, 1.25)
self.prob.set_val(Aircraft.VerticalTail.FORM_FACTOR, 1.25)
self.prob.set_val(Aircraft.HorizontalTail.FORM_FACTOR, 1.25)
self.prob.set_val(Aircraft.Fuselage.FORM_FACTOR, 1.05557953)

set_params_for_unit_tests(self.prob)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ aircraft:fuel:wing_fuel_fraction,0.6,unitless
aircraft:fuselage:aisle_width,24,inch
aircraft:fuselage:delta_diameter,4.5,ft
aircraft:fuselage:flat_plate_area_increment,0.25,ft**2
aircraft:fuselage:form_factor,1.25,unitless
aircraft:fuselage:form_factor,1.05557953,unitless
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What did the fuselage form factor change in the csv file? I am guessing that the new value is the value we are calculating now, and the old value was never used because this couldn't be overriden.

In which case, we can probably just take this line out of these csv files, since it is being calculated.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You are right. Now, I removed this line. There might be other lines that are not used in the models.

aircraft:fuselage:mass_coefficient,128,unitless
aircraft:fuselage:nose_fineness,1,unitless
aircraft:fuselage:num_aisles,1,unitless
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ aircraft:furnishings:mass,11192,lbm
aircraft:fuselage:aisle_width,24,inch
aircraft:fuselage:delta_diameter,4.5,ft
aircraft:fuselage:flat_plate_area_increment,0.25,ft**2
aircraft:fuselage:form_factor,1.25,unitless
aircraft:fuselage:mass_coefficient,128,unitless
aircraft:fuselage:nose_fineness,1,unitless
aircraft:fuselage:num_aisles,1,unitless
Expand Down
1 change: 1 addition & 0 deletions aviary/subsystems/aerodynamics/aerodynamics_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -786,6 +786,7 @@ def report(self, prob, reports_folder, **kwargs):
Aircraft.Fuselage.FLAT_PLATE_AREA_INCREMENT,
Aircraft.Fuselage.LENGTH,
Aircraft.Fuselage.WETTED_AREA,
Aircraft.Fuselage.FORM_FACTOR,
Aircraft.HorizontalTail.AREA,
Aircraft.HorizontalTail.AVERAGE_CHORD,
Aircraft.HorizontalTail.FORM_FACTOR,
Expand Down
124 changes: 122 additions & 2 deletions aviary/subsystems/aerodynamics/gasp_based/gasp_aero_coeffs.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import warnings
import numpy as np
import openmdao.api as om

from aviary.variable_info.functions import add_aviary_input, add_aviary_output
from aviary.variable_info.variables import Aircraft, Mission
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, Settings

SWETFCT = 1.02

Expand Down Expand Up @@ -181,3 +183,121 @@ def compute_partials(self, inputs, J):

J[Aircraft.Nacelle.FORM_FACTOR, Aircraft.Nacelle.AVG_DIAMETER] = 1.5 * 0.35 / xln
J[Aircraft.Nacelle.FORM_FACTOR, Aircraft.Nacelle.AVG_LENGTH] = -1.5 * 0.35 * dbarn / xln**2


class FormFactor(om.ExplicitComponent):
"""
Compute body form factor
Incompressible form factor for streamlined bodies. From Hoerner's "Fluid Dynamic Drag", p. 6-17.
"""

def initialize(self):
add_aviary_option(self, Settings.VERBOSITY)

def setup(self):
add_aviary_input(self, Aircraft.Fuselage.AVG_DIAMETER, units='ft', desc='SWF')
add_aviary_input(self, Aircraft.Fuselage.LENGTH, units='ft', desc='ELF')

add_aviary_output(
self,
Aircraft.Fuselage.FORM_FACTOR,
units='unitless',
desc='FFFUS: fuselage form factor',
)

def setup_partials(self):
self.declare_partials(
Aircraft.Fuselage.FORM_FACTOR,
[
Aircraft.Fuselage.AVG_DIAMETER,
Aircraft.Fuselage.LENGTH,
],
)

def compute(self, inputs, outputs):
verbosity = self.options[Settings.VERBOSITY]

fus_len = inputs[Aircraft.Fuselage.LENGTH]
cabin_width = inputs[Aircraft.Fuselage.AVG_DIAMETER]

if fus_len == 0.0:
if verbosity > Verbosity.BRIEF:
warnings.warn('Aircraft.Fuselage.LENGTH should not be 0.0 in FormFactor.')

# fuselage form drag factor
fffus = 1 + 1.5 * (cabin_width / fus_len) ** 1.5 + 7 * (cabin_width / fus_len) ** 3
outputs[Aircraft.Fuselage.FORM_FACTOR] = fffus

def compute_partials(self, inputs, J):
fus_len = inputs[Aircraft.Fuselage.LENGTH]
cabin_width = inputs[Aircraft.Fuselage.AVG_DIAMETER]

dfffus_dcabin_width = (
2.25 * (cabin_width / fus_len) ** 0.5 / fus_len
+ 21 * (cabin_width / fus_len) ** 2.0 / fus_len
)
dfffus_dfus_len = (
-2.25 * (cabin_width / fus_len) ** 0.5 * cabin_width / fus_len**2.0
- 21.0 * (cabin_width / fus_len) ** 2.0 * cabin_width / fus_len**2.0
)

J[Aircraft.Fuselage.FORM_FACTOR, Aircraft.Fuselage.AVG_DIAMETER] = dfffus_dcabin_width
J[Aircraft.Fuselage.FORM_FACTOR, Aircraft.Fuselage.LENGTH] = dfffus_dfus_len


class BWBFormFactor(om.ExplicitComponent):
"""
Compute body form factor and SIWB for BWB aircraft
Incompressible form factor for streamlined bodies. From Hoerner's "Fluid Dynamic Drag", p. 6-17.
"""

def initialize(self):
add_aviary_option(self, Settings.VERBOSITY)

def setup(self):
add_aviary_input(self, Aircraft.Fuselage.HYDRAULIC_DIAMETER, units='ft', desc='DHYDRAL')
add_aviary_input(self, Aircraft.Fuselage.LENGTH, units='ft', desc='ELF')

self.add_output(
Aircraft.Fuselage.FORM_FACTOR,
units='unitless',
desc='FFFUS: fuselage form factor',
)

def setup_partials(self):
self.declare_partials(
Aircraft.Fuselage.FORM_FACTOR,
[
Aircraft.Fuselage.HYDRAULIC_DIAMETER,
Aircraft.Fuselage.LENGTH,
],
)

def compute(self, inputs, outputs):
verbosity = self.options[Settings.VERBOSITY]

fus_len = inputs[Aircraft.Fuselage.LENGTH]
diam = inputs[Aircraft.Fuselage.HYDRAULIC_DIAMETER]

if fus_len == 0.0:
if verbosity > Verbosity.BRIEF:
warnings.warn('Aircraft.Fuselage.LENGTH should not be 0.0 in BWBFormFactor.')

# fuselage form drag factor
fffus = 1 + 1.5 * (diam / fus_len) ** 1.5 + 7 * (diam / fus_len) ** 3
outputs[Aircraft.Fuselage.FORM_FACTOR] = fffus

def compute_partials(self, inputs, J):
fus_len = inputs[Aircraft.Fuselage.LENGTH]
diam = inputs[Aircraft.Fuselage.HYDRAULIC_DIAMETER]

dfffus_ddiam = (
2.25 * (diam / fus_len) ** 0.5 / fus_len + 21 * (diam / fus_len) ** 2.0 / fus_len
)
dfffus_dfus_len = (
-2.25 * (diam / fus_len) ** 0.5 * diam / fus_len**2.0
- 21.0 * (diam / fus_len) ** 2.0 * diam / fus_len**2.0
)

J[Aircraft.Fuselage.FORM_FACTOR, Aircraft.Fuselage.HYDRAULIC_DIAMETER] = dfffus_ddiam
J[Aircraft.Fuselage.FORM_FACTOR, Aircraft.Fuselage.LENGTH] = dfffus_dfus_len
Loading
Loading