Data Structures#

class tuduam.data_structures.Aerodynamics(*, cL_alpha: float | None = None, alpha_zero_lift: float | None = None, cd0: float | None = None, spanwise_points: int | None = None)[source]#

Bases: Parent

alpha_zero_lift: float | None#
cL_alpha: float | None#
cd0: float | None#

“Zero lift drag coefficient

model_config = {'extra': 'forbid', 'validate_assignment': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

spanwise_points: int | None#

“The spanwise points used in the Weissinger-L/Lifiting line method. Odd integer

class tuduam.data_structures.Airfoil(*, cl_alpha: Annotated[float, Gt(gt=2)], thickness_to_chord: float | None = None)[source]#

Bases: Parent

cl_alpha: float#
model_config = {'extra': 'forbid', 'validate_assignment': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

thickness_to_chord: float | None#
class tuduam.data_structures.Engine(*, n_engines: Annotated[int, Gt(gt=0)], diameter: float | None = None, thrust: float | None = None, mass: float | None = None, power_grav_density: float | None = None, power_vol_density: float | None = None, x_rotor_loc: List | None = None, x_rotor_rel_loc: List | None = None, y_rotor_loc: List | None = None, ignore_loc: List | None = None)[source]#

Bases: Parent

diameter: float | None#
ignore_loc: List | None#

“Index of which engne positions to ignore in the wingbox analysis. For example when the engine is placed on the fuselage

mass: float | None#
model_config = {'extra': 'forbid', 'validate_assignment': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

n_engines: int#
power_grav_density: float | None#
power_vol_density: float | None#
thrust: float | None#
x_rotor_loc: List | None#

“A list of the x coordinates of your engines for both sides. Thus if you have 4 engines in total, the list must be 4 elements long. eg [2,4,4,2]. See section about coordinate systems if you have questions regardign this.

x_rotor_rel_loc: List | None#

“Same as x_rotor_locations but relative to the wing, that is the leading edge of the spanwise location of the engine. Negative values are infront the wing

y_rotor_loc: List | None#

“A list of the y coordinates of your engines for both sides. Thus if you have 4 engines in total, the list must be 4 elements long and correspond to the elements x_rotor_locations. eg [-6,-3,3,6]. See section about coordinate systems if you have questions regardign this.

class tuduam.data_structures.FlightPerformance(*, wingloading: float | None = None, cL_cruise: float | None = None, mission_energy: float | None = None, n_ult: float | None = None, v_cruise: float | None = None, h_cruise: float | None = None)[source]#

Bases: Parent

cL_cruise: float | None#
h_cruise: float | None#

“cruise altitude

mission_energy: float | None#
model_config = {'extra': 'forbid', 'validate_assignment': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

n_ult: float | None#
v_cruise: float | None#
wingloading: float | None#
class tuduam.data_structures.Fuselage(*, length_fuselage: float | None = None, width_fuselage: float | None = None, height_fuselage: float | None = None, mass: float | None = None)[source]#

Bases: Parent

height_fuselage: float | None#
length_fuselage: float | None#
mass: float | None#
model_config = {'extra': 'forbid', 'validate_assignment': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

width_fuselage: float | None#
class tuduam.data_structures.HybridPowertrain(*, fuel_cell_mass: float | None = None, battery_mass: float | None = None)[source]#

Bases: Parent

battery_mass: float | None#
fuel_cell_mass: float | None#
model_config = {'extra': 'forbid', 'validate_assignment': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tuduam.data_structures.Material(*, safety_factor: float, post_buckling_ratio: float | None = None, young_modulus: float | None = None, load_factor: float | None = None, shear_modulus: float | None = None, poisson: float | None = None, density: float | None = None, sigma_yield: float | None = None, sigma_ultimate: float | None = None, shear_strength: float | None = None, beta_crippling: float | None = None, m_crippling: float | None = None, g_crippling: float | None = None)[source]#

Bases: Parent

beta_crippling: float | None#

Material constant specific for crippling

density: float | None#
g_crippling: float | None#

Material constant specific for crippling Source

[1] T.H.G.Megson. Aerospace Structural Design an Analysis, 4th ed. Oxford, UK: Elsevier, 2007. isbn: -13: 978-0-75066-7395.

load_factor: float | None#
m_crippling: float | None#

Material constant specific for crippling

model_config = {'extra': 'forbid', 'validate_assignment': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

poisson: float | None#
post_buckling_ratio: float | None#

(PB) The ratio of the applied load to the bucklingload and, for post-buckled structures is greater than 1

Source

[1] Kassapoglou, C. (2010). page 145, Design and analysis of composite structures: With applications to aerospace structures. John Wiley & Sons.

safety_factor: float#
shear_modulus: float | None#
shear_strength: float | None#
sigma_ultimate: float | None#
sigma_yield: float | None#
young_modulus: float | None#
class tuduam.data_structures.Parent[source]#

Bases: BaseModel

classmethod load_from_json(file_path: Annotated[Path, PathType(path_type=file)])[source]#
model_config = {'extra': 'forbid', 'validate_assignment': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tuduam.data_structures.Propeller(*, n_blades: float, r_prop: float, rpm_cruise: float, xi_0: float, chord_arr: list | None = None, rad_arr: list | None = None, pitch_arr: list | None = None, tc_ratio: float | None = None)[source]#

Bases: Parent

chord_arr: list | None#

“Array with the chords at each station

model_config = {'extra': 'forbid', 'validate_assignment': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

n_blades: float#

The number of blades on the propellor

pitch_arr: list | None#

“Array with the pitch at each station

r_prop: float#

“Propeller radius

rad_arr: list | None#

“Radial coordinates for each station

rpm_cruise: float#

“The rotations per minute during cruise flight

tc_ratio: float | None#

Thickness over chord ratio of the airfoil

xi_0: float#

“Non-dimensional hub radius (r_hub/R) [-]

class tuduam.data_structures.SingleWing(*, aspect_ratio: Annotated[float, Gt(gt=0), Le(le=20)], taper: Annotated[float, Gt(gt=0), Le(le=1)], quarterchord_sweep: float, washout: float, x_le_root_global: float | None = None, surface: float | None = None, span: float | None = None, chord_root: float | None = None, chord_tip: float | None = None, chord_mac: float | None = None, sweep_le: float | None = None, x_lemac_local: float | None = None, y_mac: float | None = None, mass: float | None = None, wingbox_start: float | None = None, wingbox_end: float | None = None, n_ribs: int | None = None, n_str: int | None = None, t_rib: float | None = None, spar_thickness: float | None = None, fl_thickness: float | None = None, stringer_height: float | None = None, stringer_width: float | None = None, stringer_thickness: float | None = None, skin_thickness: float | None = None, rib_loc: List | None = None)[source]#

Bases: Parent

aspect_ratio: float#
chord_mac: float | None#
chord_root: float | None#
chord_tip: float | None#
fl_thickness: float | None#
mass: float | None#
model_config = {'extra': 'forbid', 'validate_assignment': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

n_ribs: int | None#
n_str: int | None#

“The amount of stringers on one flange

quarterchord_sweep: float#
rib_loc: List | None#

“A list of the spanwise position of the ribs. Can be left to None as it will be automatically created. Howeve if pre-defined it will keep this list

skin_thickness: float | None#
span: float | None#
spar_thickness: float | None#
stringer_height: float | None#
stringer_thickness: float | None#
stringer_width: float | None#
surface: float | None#
sweep_le: float | None#
t_rib: float | None#
taper: float#
washout: float#

“The geometric twist between the tip and root chord in radians. Negative value indicates washin i.e the tip is at a higher AoA.

wingbox_end: float | None#
wingbox_start: float | None#
x_le_root_global: float | None#

“The coordinate of the leading edge of the root chord. Defines the positioning of the wing

x_lemac_local: float | None#
y_mac: float | None#
class tuduam.data_structures.VTOL(*, mtom: float | None = None, oem: float | None = None)[source]#

Bases: Parent

model_config = {'extra': 'forbid', 'validate_assignment': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

mtom: float | None#
oem: float | None#
class tuduam.data_structures.Wingbox(*, n_cell: int, spar_loc_nondim: list, str_cell: list | None = None, t_sk_cell: list | None = None, t_sp: float | None = None, area_str: float | None = None, t_st: float | None = None, w_st: float | None = None, h_st: float | None = None)[source]#

Bases: Parent

area_str: float | None#

“Area of the stringer. Note that if you define area of the stringer. You can’t define stringers dimensions. The reason both options exists is a result of how the API developped over time and the requirement for stringer geometry for constraints.

h_st: float | None#

“ Thickness of the stringer

model_config = {'extra': 'forbid', 'validate_assignment': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

n_cell: int#

“The amount of cells in the wingbox structure

spar_loc_nondim: list#

“The location of the spar over the chord so dimensionless. Length should be n_cell - 1

str_cell: list | None#

“List of stringers (both top and bottom) per cell. Length should be n_cell. Due to the discretization it also required to be an even number

t_sk_cell: list | None#

The thickness of the skin in each cell, length should be equal to n_cell

t_sp: float | None#

The thickness of the spars

t_st: float | None#

“ Thickness of the stringer

w_st: float | None#

“ Thickness of the stringer