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 coefficient due to engine failure and resulting trim requirements. Parameters ---------- state : Data Flight conditions and aerodynamic state containing: - conditions.freestream.dynamic_pressure : float Freestream dynamic pressure [Pa] - conditions.aerodynamics.coefficients.drag.windmilling.total : float, optional Windmilling drag coefficient [unitless] geometry : Data Vehicle geometry containing: - reference_area : float, optional Reference area for drag coefficient calculation [m²] - mass_properties.center_of_gravity : array Center of gravity location [m] - networks : list List of propulsion networks containing: - number_of_engines : int Total number of engines [unitless] - wings : list List of wing objects containing: - tag : str Unique identifier for the wing - sref : float Reference area of the wing [m²] - spans.projected : float Projected span of the wing [m] - aerodynamic_center : array Aerodynamic center location [m] - origin : array Wing origin location [m] - vertical : bool Flag indicating if wing is vertical tail engine_out_location : float, optional Lateral distance of failed engine from aircraft centerline [m] single_engine_thrust : float, optional Thrust produced by remaining operational engine [N] windmilling_drag_coefficient : float, optional Windmilling drag coefficient for failed engine [unitless] Returns ------- asymm_trim_drag_coefficient : float Asymmetry trim drag coefficient [unitless] Notes ----- This function calculates the additional drag required to trim the aircraft when one engine fails, creating an asymmetric thrust condition. The calculation accounts for the drag caused by yawing moment created by the asymmetric thrust and the counteracting moment from the vertical tail. **Major Assumptions** * Two-engine aircraft configuration * Vertical tail provides the primary yawing moment for trim * Linear relationship between trim drag and asymmetric thrust moment * Windmilling drag contributes to the asymmetric moment **Theory** The asymmetry drag is calculated from the trim requirement to balance the yawing moment: :math:`D_{trim} = \\frac{(y_{engine})^2 (T_{single} + D_{windmilling})^2}{q_{\\infty} \\pi (h_{vt} \\cdot l_{vt})^2}` where: - :math:`y_{engine}` is the lateral distance of the failed engine [m] - :math:`T_{single}` is the thrust of the remaining engine [N] - :math:`D_{windmilling}` is the windmilling drag force [N] - :math:`q_{\\infty}` is the freestream dynamic pressure [Pa] - :math:`h_{vt}` is the vertical tail height [m] - :math:`l_{vt}` is the moment arm of the vertical tail [m] The windmilling drag force is: :math:`D_{windmilling} = C_{D,windmilling} \\cdot q_{\\infty} \\cdot S_{ref}` The asymmetry drag coefficient is: :math:`C_{D,asymmetry} = \\frac{D_{trim}}{q_{\\infty} \\cdot S_{ref}}` **Definitions** 'Asymmetry Drag' Additional drag required to trim the aircraft when thrust is asymmetric due to engine failure. 'Windmilling Drag' Drag produced by a failed engine that continues to rotate due to incoming airflow. 'Trim Drag' Drag increment required to maintain aircraft equilibrium in asymmetric flight conditions. References ---------- [1] Unknown source See Also -------- RCAIDE.Library.Components.Wings.Main_Wing RCAIDE.Library.Methods.Aerodynamics.Common.Drag.windmilling_drag """ # ============================================== # 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) or isinstance(wing,Wings.Blended_Wing_Body)): 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