Source code for RCAIDE.Library.Methods.Aerodynamics.Common.Drag.asymmetry_drag
# ----------------------------------------------------------------------
# Imports
# ----------------------------------------------------------------------
# RCAIDE Imports
from RCAIDE import *
from RCAIDE.Library.Components import Wings
# ----------------------------------------------------------------------
# Compute asymmetry drag due to engine failure
# ----------------------------------------------------------------------
[docs]
def asymmetry_drag(state, geometry, engine_out_location = 0, single_engine_thrust = 0, windmilling_drag_coefficient = 0.):
"""Computes asymmetry drag due to engine failure
Assumptions:
Two engine aircraft
Source:
Unknown source
Inputs:
state.conditions.freestream.dynamic_pressure [Pa]
state.conditions.aerodynamics.drag_breakdown.windmilling_drag.windmilling_drag_coefficient [Unitless]
geometry.
mass_properties.center_of_gravity [m]
networks.
number_of_engines [Unitless]
wings.
tag
sref (this function probably doesn't run) [m^2]
spans.projected [m]
reference_area [m^2]
Outputs:
asymm_trim_drag_coefficient [Unitless]
(packed in state.conditions.aerodynamics.drag_breakdown.asymmetry_trim_coefficient)
Properties Used:
N/A
"""
# ==============================================
# Unpack
# ==============================================
vehicle = geometry
wings = vehicle.wings
dyn_press = state.conditions.freestream.dynamic_pressure
# Defining reference area
if vehicle.reference_area:
reference_area = vehicle.reference_area
else:
n_wing = 0
for wing in wings:
if not isinstance(wing,Wings.Main_Wing): continue
n_wing = n_wing + 1
reference_area = wing.sref
if n_wing > 1:
print(' More than one Main_Wing in the vehicle. Last one will be considered.')
elif n_wing == 0:
print('No Main_Wing defined! Using the 1st wing found')
for wing in wings:
if not isinstance(wing,Wings.Wing): continue
reference_area = wing.sref
break
# getting cg x position
xcg = vehicle.mass_properties.center_of_gravity[0]
# finding vertical tail
for idx,wing in enumerate(wings):
if not wing.vertical: continue
vertical_idx = wing.tag
break
# if vertical tail not found, raise error
try:
vertical_idx
except AttributeError:
print(' No vertical tail found! Error calculating one engine inoperative drag')
# getting vertical tail data (span, distance to cg)
vertical_height = wings[vertical_idx].spans.projected
vertical_dist = wings[vertical_idx].aerodynamic_center[0] + wings[vertical_idx].origin[0][0] - xcg[0]
# colculating windmilling drag
if windmilling_drag_coefficient == 0:
try:
windmilling_drag_coefficient = state.conditions.aerodynamics.coefficients.drag.windmilling.total
except: pass
windmilling_drag = windmilling_drag_coefficient * dyn_press * reference_area
# calculating Drag force due to trim
trim_drag = (engine_out_location**2 * (single_engine_thrust+windmilling_drag)**2 ) / \
(dyn_press * 3.141593* (vertical_height*vertical_dist)**2)
# Compute asymmetry trim drag coefficient
asymm_trim_drag_coefficient = trim_drag / dyn_press / reference_area
# dump data to state
state.conditions.aerodynamics.coefficients.drag.asymmetry_trim.total = asymm_trim_drag_coefficient
return asymm_trim_drag_coefficient