Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
170 commits
Select commit Hold shift + click to select a range
e5c400b
Add files via upload
szoppelt Jan 14, 2025
bf0331e
Merge pull request #1 from szoppelt/szoppelt-examples-typos
szoppelt Jan 14, 2025
f5403a2
Merge branch 'main' into main
jkirk5 Jan 16, 2025
1b09ca1
Merge branch 'main' into main
jkirk5 Jan 16, 2025
3a07d3d
Merge branch 'szoppelt-examples-typos' into examples-typos
Jan 16, 2025
6874eb8
removed jupyter output cells
Jan 16, 2025
bc14ba6
Merge pull request #2 from jkirk5/examples-typos
szoppelt Jan 16, 2025
28386bd
Add files via upload
szoppelt Jan 21, 2025
ed26f0c
Add files via upload
szoppelt Jan 21, 2025
a8cb4a4
Add files via upload
szoppelt Jan 21, 2025
03ee664
Add files via upload
szoppelt Jan 21, 2025
afa6928
Merge pull request #3 from szoppelt/fixing-files
szoppelt Jan 21, 2025
98ce55a
Rename additional_flight_phases.ipynb to aviary/docs/examples/additio…
szoppelt Jan 21, 2025
f255033
Create .gitattributes
szoppelt Jan 21, 2025
ad19bb0
Delete aviary/docs/examples/additional_flight_phases.ipynb
szoppelt Jan 21, 2025
d8f6667
Delete aviary/docs/examples/additional_flight_phases_2.ipynb
szoppelt Jan 21, 2025
74049aa
Add files via upload
szoppelt Jan 21, 2025
b579a38
Delete coupled_aircraft_mission_optimization.ipynb
szoppelt Jan 21, 2025
544306b
Delete aviary/docs/examples/coupled_aircraft_mission_optimization.ipynb
szoppelt Jan 21, 2025
1a586cd
Add files via upload
szoppelt Jan 21, 2025
92700d7
Delete aviary/docs/examples/additional_flight_phases.ipynb
szoppelt Jan 21, 2025
e342df6
Add files via upload
szoppelt Jan 21, 2025
6e0e6b8
Add files via upload
szoppelt Jan 22, 2025
ec9ee45
Delete aviary/docs/examples/additional_flight_phases.ipynb
szoppelt Jan 22, 2025
0304988
Rename additional_flight_phases-2.ipynb to additional_flight_phases.i…
szoppelt Jan 22, 2025
f6ac6d2
Add files via upload
szoppelt Jan 22, 2025
b8185c1
Delete aviary/docs/examples/coupled_aircraft_mission_optimization.ipynb
szoppelt Jan 22, 2025
19332cc
Rename coupled_aircraft_mission_optimization-3.ipynb to coupled_aircr…
szoppelt Jan 22, 2025
8ef6163
removed local-only filters
Jan 22, 2025
6d7468a
Merge branch 'main' into main
jkirk5 Jan 22, 2025
31406d3
Testing adding this file for later use.
szoppelt Mar 4, 2025
98ce522
Another test.
szoppelt Mar 4, 2025
381f662
Test.
szoppelt Mar 4, 2025
3164009
Test
szoppelt Mar 4, 2025
9a67145
Test.
szoppelt Mar 4, 2025
11bf0e0
Merge pull request #4 from szoppelt/new-mass-branch
szoppelt Mar 4, 2025
dbdee9a
test
szoppelt Mar 4, 2025
93dc6ae
Merge pull request #5 from szoppelt/new-mass-branch
szoppelt Mar 4, 2025
5080065
Create __init__.py
szoppelt Mar 4, 2025
a6fe374
new file: aviary/subsystems/mass/simple_mass/__init__.py
szoppelt Mar 4, 2025
133de7b
new file: aviary/subsystems/mass/simple_mass/test_fuselage.py
szoppelt Mar 5, 2025
d079930
test
szoppelt Mar 5, 2025
4bb9b25
Merge pull request #6 from szoppelt/new-mass-branch
szoppelt Mar 5, 2025
823228d
renamed: aviary/subsystems/mass/simple_mass/test_fuselage.py -> a…
szoppelt Mar 5, 2025
5dac1cd
Merge pull request #7 from szoppelt/new-mass-branch
szoppelt Mar 5, 2025
5b54053
new file: aviary/subsystems/mass/simple_mass/test/__init__.py
szoppelt Mar 5, 2025
ffb0e92
Merge pull request #8 from szoppelt/new-mass-branch
szoppelt Mar 5, 2025
a25a59f
Commit.
szoppelt Apr 1, 2025
254547a
Merge pull request #9 from szoppelt/new-mass-branch
szoppelt Apr 1, 2025
0f2bf51
Delete aviary/subsystems/mass/simple_mass/C:UsersszoppeltDesktopwingN2
szoppelt Apr 1, 2025
f694d35
Delete aviary/subsystems/mass/simple_mass/# New lump sum payments: $1…
szoppelt Apr 1, 2025
3bcfdf0
Delete aviary/subsystems/mass/simple_mass/import numpy as np.py
szoppelt Apr 1, 2025
f89307c
Delete aviary/subsystems/mass/simple_mass/test_quad.py
szoppelt Apr 1, 2025
ca8d07d
Delete aviary/subsystems/mass/simple_mass/wingN2
szoppelt Apr 1, 2025
2fb633e
Merge branch 'OpenMDAO:main' into new-mass-branch
szoppelt May 12, 2025
476aea3
Merge branch 'main' into new-mass-branch
szoppelt May 12, 2025
5d1c940
Merge pull request #10 from szoppelt/new-mass-branch
szoppelt May 12, 2025
ab07ae7
Merge remote-tracking branch 'upstream/main' into new-mass-branch
szoppelt May 12, 2025
fabc45b
commit.
szoppelt May 12, 2025
3a28290
Merge branch 'main' of https://github.com/szoppelt/Aviary into new-ma…
szoppelt May 12, 2025
0f54a13
Merge pull request #11 from szoppelt/new-mass-branch
szoppelt May 12, 2025
5b08b4f
Delete aviary/subsystems/mass/simple_mass/test/import os.py
szoppelt May 12, 2025
a752575
Delete aviary/docs/examples/wingN2.html
szoppelt May 12, 2025
8d5d6c7
Delete aviary/docs/examples/wing.py
szoppelt May 12, 2025
3a95cf0
Delete aviary/docs/examples/test_wing.py
szoppelt May 12, 2025
d988607
Delete aviary/docs/examples/tail.py
szoppelt May 12, 2025
018d8de
Delete aviary/docs/examples/test_mass_summation.py
szoppelt May 12, 2025
c9fa3f4
Delete aviary/docs/examples/materials_database.py
szoppelt May 12, 2025
53d3016
Delete aviary/docs/examples/Clark_Y.dat
szoppelt May 12, 2025
bf165f8
Delete aviary/docs/examples/Clark_Y.yaml
szoppelt May 12, 2025
2bca1b9
Delete aviary/docs/examples/C:UsersszoppeltDesktop
szoppelt May 12, 2025
07004e7
Delete aviary/docs/examples/C:UsersszoppeltDesktoptest.py
szoppelt May 12, 2025
3ce8adf
Delete aviary/docs/examples/Custom_Fuselage.dat
szoppelt May 12, 2025
a0d2e41
Delete aviary/docs/examples/airfoil_data_test.dat
szoppelt May 12, 2025
6dfd2d2
Delete aviary/docs/examples/mass_builder.py
szoppelt May 12, 2025
860756a
Delete aviary/docs/examples/mass_premission.py
szoppelt May 12, 2025
da228e4
Delete aviary/docs/examples/fuselage.py
szoppelt May 12, 2025
41962bd
Delete aviary/docs/examples/mass_summation.py
szoppelt May 12, 2025
33484ad
commit.
szoppelt May 12, 2025
a13ef2e
Commit.
szoppelt May 13, 2025
d2ca94c
commit
szoppelt May 13, 2025
1b40693
First draft of force resolver.
szoppelt May 13, 2025
dac43c3
Updates.
szoppelt May 14, 2025
2966467
updates.
szoppelt May 14, 2025
58eeee6
updates
szoppelt May 14, 2025
efb7b3c
updates
szoppelt May 14, 2025
cf33f82
updates.
szoppelt May 15, 2025
66d9313
updates.
szoppelt May 19, 2025
5cd215d
updates.
szoppelt May 21, 2025
6b12740
updates.
szoppelt Jun 9, 2025
886a1ab
Merge remote-tracking branch 'upstream/main' into new-mass-branch
szoppelt Jun 12, 2025
27ae9e7
updates.
szoppelt Jun 16, 2025
b514fec
updates.
szoppelt Jun 18, 2025
86a07c4
updates.
szoppelt Jun 18, 2025
6acdcde
updates.
szoppelt Jun 18, 2025
63097e4
updates. test
szoppelt Jun 23, 2025
bd62739
test
szoppelt Jun 23, 2025
ff491ad
Final updates.
szoppelt Jul 2, 2025
1e44c6a
Final updates.
szoppelt Jul 3, 2025
807a229
Final Updates.
szoppelt Jul 3, 2025
b2c9fd3
Delete aviary/subsystems/mass/simple_mass/Clark_Y.dat
szoppelt Jul 3, 2025
966232c
Delete aviary/subsystems/mass/simple_mass/Custom_Fuselage.dat
szoppelt Jul 3, 2025
0abf857
Delete aviary/subsystems/mass/simple_mass/airfoil_data_test.dat
szoppelt Jul 3, 2025
faa5486
Delete aviary/subsystems/mass/simple_mass/six_dof_EOM.py
szoppelt Jul 3, 2025
ae7b218
Delete aviary/mission/sixdof directory
szoppelt Jul 3, 2025
38c67c5
Updates.
szoppelt Jul 3, 2025
a376108
Delete aviary/docs/examples/fuselage_out directory
szoppelt Jul 3, 2025
38e8226
Delete aviary/docs/examples/tail_out directory
szoppelt Jul 3, 2025
1d91038
Delete aviary/docs/examples/wing_out directory
szoppelt Jul 3, 2025
46bc71f
Delete aviary/docs/examples/test_out directory
szoppelt Jul 3, 2025
dc00191
Delete aviary/docs/examples/test_wing_out directory
szoppelt Jul 3, 2025
efaa013
Delete aviary/docs/examples/test_wing2_out directory
szoppelt Jul 3, 2025
55753ed
Delete aviary/docs/examples/test_fuselage_out directory
szoppelt Jul 3, 2025
8a7bfa9
Delete aviary/docs/examples/test_tail_out directory
szoppelt Jul 3, 2025
fa47930
Delete aviary/docs/examples/test_fuselage_dbf_out directory
szoppelt Jul 3, 2025
9560935
Delete aviary/docs/examples/test_tail2_out directory
szoppelt Jul 3, 2025
6205792
Delete aviary/docs/examples/test_fuselage2_out directory
szoppelt Jul 3, 2025
13d3b17
Delete aviary/docs/examples/six_dof_ODE.py
szoppelt Jul 3, 2025
a0c5cbe
Delete pyproject_renamed
szoppelt Jul 3, 2025
f16ceea
Delete aviary/subsystems/mass/simple_mass/test/test_mass_subsystem.py
szoppelt Jul 3, 2025
35960b8
Delete aviary/subsystems/mass/simple_mass/test/test.py
szoppelt Jul 3, 2025
0a0fbf3
Delete out.txt
szoppelt Jul 3, 2025
9dc278e
Update aviary/subsystems/mass/simple_mass/fuselage.py
szoppelt Jul 8, 2025
5ba6b5b
Update aviary/subsystems/mass/simple_mass/fuselage.py
szoppelt Jul 8, 2025
a374579
Update aviary/subsystems/mass/simple_mass/wing.py
szoppelt Jul 8, 2025
b8eb933
Update aviary/subsystems/mass/simple_mass/fuselage.py
szoppelt Jul 8, 2025
3ff430b
Update aviary/subsystems/mass/simple_mass/tail.py
szoppelt Jul 8, 2025
feaeb88
Update aviary/subsystems/mass/simple_mass/fuselage.py
szoppelt Jul 8, 2025
67f5f76
Update fuselage.py
szoppelt Jul 8, 2025
9e9b1d0
Update aviary/subsystems/mass/simple_mass/mass_summation.py
szoppelt Jul 8, 2025
6fd0d81
Update mass_summation.py
szoppelt Jul 8, 2025
093baa0
Update aviary/subsystems/mass/simple_mass/mass_premission.py
szoppelt Jul 8, 2025
555d280
Update mass_premission.py
szoppelt Jul 8, 2025
e3ceffb
Update test_fuselage.py
szoppelt Jul 8, 2025
8c23aab
Update test_mass_summation.py
szoppelt Jul 8, 2025
1a6cc35
Update test_tail.py
szoppelt Jul 8, 2025
aff52f2
Update test_wing.py
szoppelt Jul 8, 2025
39f392b
Update aviary/subsystems/mass/simple_mass/mass_builder.py
szoppelt Jul 8, 2025
a5baed2
Update aviary/subsystems/mass/simple_mass/mass_builder.py
szoppelt Jul 8, 2025
80c6ffb
Update aviary/subsystems/mass/simple_mass/mass_builder.py
szoppelt Jul 8, 2025
40ad053
Update tail.py
szoppelt Jul 8, 2025
ada3042
Update tail.py
szoppelt Jul 8, 2025
8e58ad7
Update tail.py
szoppelt Jul 8, 2025
98de1a2
Update aviary/subsystems/mass/simple_mass/fuselage.py
szoppelt Jul 8, 2025
792327f
Update wing.py
szoppelt Jul 8, 2025
40384a2
Update test_mass_summation.py
szoppelt Jul 8, 2025
d2cb426
Update test_tail.py
szoppelt Jul 8, 2025
1f84990
Update fuselage.py
szoppelt Jul 8, 2025
24bf21e
Update tail.py
szoppelt Jul 8, 2025
f2123a2
Update wing.py
szoppelt Jul 9, 2025
f85f178
Update test_wing.py
szoppelt Jul 9, 2025
cc7f7e0
Update tail.py
szoppelt Jul 9, 2025
dbce6e6
Update test_tail.py
szoppelt Jul 9, 2025
02308f5
Update test_mass_summation.py
szoppelt Jul 9, 2025
695ec83
Update tail.py
szoppelt Jul 9, 2025
4e6eb13
Update fuselage.py
szoppelt Jul 9, 2025
cff723b
Update fuselage.py
szoppelt Jul 9, 2025
bbf5b48
Update fuselage.py
szoppelt Jul 9, 2025
96fe4f2
Update tail.py
szoppelt Jul 9, 2025
2aa92ab
Update wing.py
szoppelt Jul 9, 2025
3f0336c
Merge branch 'main' into final_mass_branch_updated
jkirk5 Jul 18, 2025
77ab18f
WIP code fixes
jkirk5 Jul 18, 2025
9c5c9a6
WIP fixes 2
jkirk5 Jul 18, 2025
e0d6530
more bulk fixes
jkirk5 Jul 18, 2025
3ccaf6b
docs fixes
jkirk5 Jul 18, 2025
dc61d1d
additional docs fix
jkirk5 Jul 18, 2025
0c2be8a
more updates to simple_mass components
jkirk5 Jul 21, 2025
187410a
wing cleanup
jkirk5 Jul 21, 2025
37cd55e
Merge branch 'main' into final_mass_branch_updated
jkirk5 Jul 21, 2025
4446a85
Merge branch 'OpenMDAO:main' into final_mass_branch_updated
szoppelt Aug 4, 2025
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 @@ -582,7 +582,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.3"
"version": "3.12.2"
}
},
"nbformat": 4,
Expand Down
1 change: 1 addition & 0 deletions aviary/subsystems/mass/simple_mass/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

184 changes: 184 additions & 0 deletions aviary/subsystems/mass/simple_mass/fuselage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
from pathlib import Path

import jax
import jax.numpy as jnp
import jax.scipy.interpolate as jinterp
import numpy as np
import openmdao.api as om
import openmdao.jax as omj

from aviary.subsystems.mass.simple_mass.materials_database import materials
from aviary.utils.named_values import get_keys
from aviary.variable_info.functions import add_aviary_input, add_aviary_output
from aviary.variable_info.variables import Aircraft


class FuselageMass(om.JaxExplicitComponent):
def initialize(self):
self.options.declare('num_sections', types=int, default=10)

self.options.declare('material', default='Aluminum Oxide', values=list(get_keys(materials)))

self.options.declare(
'fuselage_data_file',
types=(Path, str),
default=None,
allow_none=True,
desc='optional data file of fuselage geometry',
)

self.options.declare(
'hollow_fuselage',
default=True,
desc='flag for if the fuselage should be hollow (wall thickness is not used if False)',
)

# TODO FunctionType is not defined?
# self.options.declare(
# 'custom_fuselage_function',
# types=FunctionType,
# default=None,
# allow_none=True,
# desc='optional custom function generation for fuselage geometry',
# )

def setup(self):
# Inputs
add_aviary_input(self, Aircraft.Fuselage.LENGTH, units='m')

self.add_input('base_diameter', val=0.4, units='m') # no aviary input
self.add_input('tip_diameter', val=0.2, units='m') # no aviary input
self.add_input('curvature', val=0.0, units='m') # 0 for straight, positive for upward curve
self.add_input('thickness', val=0.05, units='m') # Wall thickness of the fuselage
# Allow for asymmetry in the y and z axes -- this value acts as a slope for linear variation along these axes
self.add_input('y_offset', val=0.0, units='m')
self.add_input('z_offset', val=0.0, units='m')

# Outputs
add_aviary_output(self, Aircraft.Fuselage.MASS, units='kg')

def compute_primal(
self,
aircraft__fuselage__length,
base_diameter,
tip_diameter,
curvature,
thickness,
y_offset,
z_offset,
):
is_hollow = self.options['hollow_fuselage']

self.validate_inputs(
aircraft__fuselage__length, base_diameter, tip_diameter, thickness, is_hollow
)

custom_fuselage_data_file = self.options['fuselage_data_file']
material = self.options['material']
num_sections = self.options['num_sections']

density = materials.get_val(material, 'kg/m**3')

section_locations = jnp.linspace(0, aircraft__fuselage__length, num_sections)

aircraft__fuselage__mass = 0
total_moment_x = 0
total_moment_y = 0
total_moment_z = 0

# Load fuselage data file if present
if custom_fuselage_data_file:
try:
# Load the file
custom_data = np.loadtxt(custom_fuselage_data_file)
except FileNotFoundError as e:
raise FileNotFoundError(f'Fuselage data file {e}')
else:
fuselage_locations = custom_data[:, 0]
fuselage_diameters = custom_data[:, 1]
# TODO: OM interp is much more performant than scipy, use metamodel here
interpolate_diameter = jinterp.RegularGridInterpolator(
fuselage_locations, fuselage_diameters, method='linear'
)
else:
interpolate_diameter = None

# Loop through each section
for location in section_locations:
# FunctionType is not defined, so "custom_fuselage_function" is currently broken
# if self.options['custom_fuselage_function'] is not None:
# section_diameter = self.options['custom_fuselage_function'](location)
# should be elif below once fixed
if self.options['fuselage_data_file'] is not None and interpolate_diameter is not None:
section_diameter = interpolate_diameter(location)
else:
section_diameter = (
base_diameter
+ ((tip_diameter - base_diameter) / aircraft__fuselage__length) * location
)

outer_radius = section_diameter / 2.0
inner_radius = jnp.where(is_hollow, omj.smooth_max(0, outer_radius - thickness), 0)

section_volume = (
jnp.pi
* (outer_radius**2 - inner_radius**2)
* (aircraft__fuselage__length / num_sections)
)
section_weight = density * section_volume

centroid_x = jnp.where(tip_diameter / base_diameter != 1, (3 / 4) * location, location)
centroid_y = y_offset * (1 - location / aircraft__fuselage__length)
centroid_z = (
z_offset * (1 - location / aircraft__fuselage__length)
+ curvature * location**2 / aircraft__fuselage__length
)

aircraft__fuselage__mass += section_weight
total_moment_x += centroid_x * section_weight
total_moment_y += centroid_y * section_weight
total_moment_z += centroid_z * section_weight

return aircraft__fuselage__mass

def validate_inputs(self, length, base_diameter, tip_diameter, thickness, is_hollow):
jax.lax.cond(
length[0] <= 0,
lambda: jax.debug.callback(
raise_error, om.AnalysisError('Length must be a positive value.')
),
lambda: None,
)
jax.lax.cond(
base_diameter[0] <= 0,
lambda: jax.debug.callback(
raise_error, om.AnalysisError('Base Diameter must be a positive value.')
),
lambda: None,
)
jax.lax.cond(
tip_diameter[0] <= 0,
lambda: jax.debug.callback(
raise_error, om.AnalysisError('Tip Diameter must be a positive value.')
),
lambda: None,
)
jax.lax.cond(
thickness[0] <= 0,
lambda: jax.debug.callback(
raise_error, om.AnalysisError('Thickness must be a positive value.')
),
lambda: None,
)

jax.lax.cond(
is_hollow and thickness[0] >= base_diameter[0] / 2,
lambda: jax.debug.callback(
raise_error, om.AnalysisError('Wall thickness is too large for a hollow fuselage.')
),
lambda: None,
)


def raise_error(exception):
raise exception
25 changes: 25 additions & 0 deletions aviary/subsystems/mass/simple_mass/mass_builder.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from aviary.subsystems.mass.mass_builder import MassBuilderBase
from aviary.subsystems.mass.simple_mass.mass_premission import SimpleMassPremission

"""
Define subsystem builder for Aviary simple mass.

Classes
--------
SimpleMassBuilderBase: the interface for the simple mass subsystem builder.
"""

_default_name = 'simple_mass'


class SimpleMassBuilder(MassBuilderBase):
"""Base mass builder."""

def __init__(self, name=None):
if name is None:
name = _default_name

super().__init__(name=name)

def build_pre_mission(self, aviary_inputs):
return SimpleMassPremission()
30 changes: 30 additions & 0 deletions aviary/subsystems/mass/simple_mass/mass_premission.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import openmdao.api as om

from aviary.subsystems.mass.simple_mass.fuselage import FuselageMass
from aviary.subsystems.mass.simple_mass.mass_summation import SimpleMassSummation
from aviary.subsystems.mass.simple_mass.tail import HorizontalTailMass, VerticalTailMass
from aviary.subsystems.mass.simple_mass.wing import WingMass


class SimpleMassPremission(om.Group):
"""
Pre-mission group of top-level mass estimation groups and components for
the simple small-scale aircraft mass build-up.
"""

def setup(self):
self.add_subsystem('Wing', WingMass(), promotes_inputs=['*'], promotes_outputs=['*'])

self.add_subsystem(
'Fuselage', FuselageMass(), promotes_inputs=['*'], promotes_outputs=['*']
)

self.add_subsystem(
'HorizontalTail', HorizontalTailMass(), promotes_inputs=['*'], promotes_outputs=['*']
)

self.add_subsystem(
'VerticalTail', VerticalTailMass(), promotes_inputs=['*'], promotes_outputs=['*']
)

self.add_subsystem('mass_summation', SimpleMassSummation(), promotes=['*'])
44 changes: 44 additions & 0 deletions aviary/subsystems/mass/simple_mass/mass_summation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import openmdao.api as om

from aviary.variable_info.functions import add_aviary_input
from aviary.variable_info.variables import Aircraft


class SimpleMassSummation(om.Group):
"""

Group to compute various design masses for this mass group.

This group will be expanded greatly as more subsystems are created.

"""

def setup(self):
self.add_subsystem(
'structure_mass', StructureMass(), promotes_inputs=['*'], promotes_outputs=['*']
)


class StructureMass(om.ExplicitComponent):
def setup(self):
add_aviary_input(self, Aircraft.Wing.MASS, val=0.0, units='kg')
add_aviary_input(self, Aircraft.Fuselage.MASS, val=0.0, units='kg')
add_aviary_input(self, Aircraft.HorizontalTail.MASS, val=0.0, units='kg')
add_aviary_input(self, Aircraft.VerticalTail.MASS, val=0.0, units='kg')

# More masses can be added, i.e., tail, spars, flaps, etc. as needed

self.add_output(Aircraft.Design.STRUCTURE_MASS, val=0.0, units='kg')

def setup_partials(self):
self.declare_partials(Aircraft.Design.STRUCTURE_MASS, '*', val=1)

def compute(self, inputs, outputs):
wing_mass = inputs[Aircraft.Wing.MASS]
fuselage_mass = inputs[Aircraft.Fuselage.MASS]
htail_mass = inputs[Aircraft.HorizontalTail.MASS]
vtail_mass = inputs[Aircraft.VerticalTail.MASS]

structure_mass = wing_mass + fuselage_mass + htail_mass + vtail_mass

outputs[Aircraft.Design.STRUCTURE_MASS] = structure_mass
72 changes: 72 additions & 0 deletions aviary/subsystems/mass/simple_mass/materials_database.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
"""
Database for various material densities that are to be used for mass calculations for small aircraft in particular.

This database will be expanded as needed.

"""

from aviary.utils.named_values import NamedValues

materials = NamedValues()

"""
All densities below came from https://tpsx.arc.nasa.gov/MaterialsDatabase

"""

# Wood
materials.set_val('Balsa', 130, units='kg/m**3')
materials.set_val('Cypress', 460, units='kg/m**3')
materials.set_val('Mahogany', 540, units='kg/m**3')
materials.set_val('Maple', 710, units='kg/m**3')
materials.set_val('Teak', 640, units='kg/m**3')

# Aluminum Compounds and Alloys
materials.set_val('Aluminum Oxide', 3400, units='kg/m**3')
materials.set_val('2024-T8XX', 2800, units='kg/m**3') # aircraft-grade strength Aluminum alloy
materials.set_val('2219-T8XX', 2810, units='kg/m**3') # Exceptionally strong Aluminum alloy
materials.set_val('2024-T6', 2770, units='kg/m**3') # Another Aluminum alloy
materials.set_val('Aluminum Foam', 1300, units='kg/m**3')

# Steel
materials.set_val('Stainless Steel 17-4 PH', 7830, units='kg/m**3') # 17-4 PH stainless steel
materials.set_val('Stainless Steel-AISI 302', 8060, units='kg/m**3') # AISI 302
materials.set_val('Stainless Steel-AISI 304', 7900, units='kg/m**3') # AISI 304
materials.set_val('Steel Alloy Cast', 7830, units='kg/m**3') # General steel alloy cast
materials.set_val('Steel 321', 8030, units='kg/m**3') # Steel type 321

# Carbon Fibers / Carbon - Silicon Fibers
materials.set_val('Carbon/Silicon-Carbide', 2080, units='kg/m**3') # Carbon fiber reinforced SiC
materials.set_val(
'Silicon-Carbide/Silicon-Carbide', 2400, units='kg/m**3'
) # SiC fiber reinforced SiC matrix
materials.set_val('Advanced Carbon-Carbon Composite', 1600, units='kg/m**3') # ACC
materials.set_val('Reinforced Carbon-Carbon', 1580, units='kg/m**3')
materials.set_val(
'Reinforced Carbon-Carbon Composite', 1580, units='kg/m**3'
) # Generally, ACC is better, but RCC is slightly cheaper

"""
Below are miscellaneous values that could be of importance, particularly for small aircraft.

These values were found from a variety of sources, and depending on the source/brand, the density
could be slightly different. For some cases, temperature of the material also matters (typically
the values are provided as a relative density). If there is a temperature dependence from the source,
it will be noted as a comment next to the line where the material value is set. Below are some sources
for various values.

The values below were not explicity listed from the above source.

Wood glue: https://www.gorillatough.com/wp-content/uploads/Gorilla-Wood-Glue-v1.2.pdf

EPS Foam: https://www.abtfoam.com/wp-content/uploads/2020/05/EPS-Standard-Sheet-Sizes-Densities-and-R-values.pdf
Note that there is a density range given, along with different types. The density value used is for Type I,
and the value given is the average of the minimum and maximum within the range provided. The base unit in
this document is pcf for the density. It was converted to kg/m^3 for the actual value input.

"""

materials.set_val(
'Wood Glue', 1080, units='kg/m**3'
) # Relative density value -- corresponds to 25 C (77 F)
materials.set_val('EPS Foam', 16.3388, units='kg/m**3')
Loading