Source code for RCAIDE.Library.Methods.Aerodynamics.Common.Drag.compressibility_drag

# RCAIDE/Library/Methods/Aerodynamics/Common/Drag/compressibility_drag_total.py
# (c) Copyright 2023 Aerospace Research Community LLC
# 
# Created:  Jul 2024, RCAIDE Team 

# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ---------------------------------------------------------------------------------------------------------------------- 
   
from RCAIDE.Library.Components.Wings          import Main_Wing
from RCAIDE.Library.Methods.Utilities         import Cubic_Spline_Blender  
from .wave_drag                               import wave_drag
from .drag_divergence                         import drag_divergence 
from .supersonic_wave_drag_volume_raymer      import supersonic_wave_drag_volume_raymer
from .supersonic_wave_drag_volume_sears_haack import supersonic_wave_drag_volume_sears_haack

# package imports
import numpy as np

# ---------------------------------------------------------------------------------------------------------------------- 
#  Compressibility Drag Total
# ----------------------------------------------------------------------------------------------------------------------  
[docs] def compressibility_drag(state,settings,geometry): """Computes compressibility drag for full aircraft including volume drag Assumptions: None Source: None Args: settings. begin_drag_rise_mach_number [Unitless] end_drag_rise_mach_number [Unitless] peak_mach_number [Unitless] transonic_drag_multiplier [Unitless] volume_wave_drag_scaling [Unitless] state.conditions.aerodynamics.lift_breakdown.compressible_wings [Unitless] state.conditions.freestream.mach_number [Unitless] geometry.maximum_cross_sectional_area [m^2] (used in subfunctions) geometry.total_length [m] (used in subfunctions) geometry.reference_area [m^2] geometry.wings Returns: total_compressibility_drag [Unitless] Properties Used: None """ # Unpack conditions = state.conditions Mach = conditions.freestream.mach_number Cl = conditions.aerodynamics.coefficients.lift.total # supersonic low_mach_cutoff = settings.supersonic.begin_drag_rise_mach_number high_mach_cutoff = settings.supersonic.end_drag_rise_mach_number peak_mach = settings.supersonic.peak_mach_number peak_factor = settings.supersonic.transonic_drag_multiplier scaling_factor = settings.supersonic.volume_wave_drag_scaling if settings.supersonic.wave_drag_type == 'Raymer': wave_drag_volume = supersonic_wave_drag_volume_raymer elif settings.supersonic.wave_drag_type == 'Sears-Haack': wave_drag_volume = supersonic_wave_drag_volume_sears_haack else: raise NotImplementedError if settings.supersonic.cross_sectional_area_calculation_type != 'Fixed': raise NotImplementedError low_cutoff_volume_total = np.zeros_like(Mach) high_cutoff_volume_total = np.zeros_like(Mach) low_cutoff_volume_total = drag_divergence(low_mach_cutoff*np.ones_like(Mach), geometry,Cl) high_cutoff_volume_total = wave_drag_volume(geometry,low_mach_cutoff*np.ones_like(Mach),scaling_factor) peak_volume_total = high_cutoff_volume_total*peak_factor # subsonic side smoothing function a1 = (low_cutoff_volume_total-peak_volume_total)/(low_mach_cutoff-peak_mach)/(low_mach_cutoff-peak_mach) # supersonic side smoothing function a2 = (high_cutoff_volume_total-peak_volume_total)/(high_mach_cutoff-peak_mach)/(high_mach_cutoff-peak_mach) # Shorten cubic Hermite spline sub_spline = Cubic_Spline_Blender(low_mach_cutoff, peak_mach-(peak_mach-low_mach_cutoff)*3/4) sup_spline = Cubic_Spline_Blender(peak_mach,high_mach_cutoff) sub_h00 = lambda M:sub_spline.compute(M) sup_h00 = lambda M:sup_spline.compute(M) low_inds = Mach[:,0]<peak_mach hi_inds = Mach[:,0]>=peak_mach cd_c_v_base = np.zeros_like(Mach) cd_c_v_base[low_inds] = drag_divergence(Mach[low_inds], geometry,Cl[low_inds]) cd_c_l_base = lift_wave_drag(conditions, settings, geometry) cd_c_v_base[Mach>=peak_mach] = wave_drag_volume(geometry, Mach[Mach>=peak_mach], scaling_factor) cd_c_v = np.zeros_like(Mach) cd_c_v[low_inds] = cd_c_v_base[low_inds]*(sub_h00(Mach[low_inds])) + transonic_drag_function(Mach[low_inds],a1[low_inds], peak_mach, peak_volume_total[low_inds])*(1-sub_h00(Mach[low_inds])) cd_c_v[hi_inds] = transonic_drag_function(Mach[hi_inds],a2[hi_inds], peak_mach, peak_volume_total[hi_inds])*(sup_h00(Mach[hi_inds])) + cd_c_v_base[hi_inds]*(1-sup_h00(Mach[hi_inds])) if peak_mach<1.01: print('Warning: a peak Mach number of less than 1.01 will cause a small discontinuity in lift wave drag') cd_c_l = cd_c_l_base*(1-sup_h00(Mach)) cd_c = cd_c_v + cd_c_l # Save drag breakdown drag = conditions.aerodynamics.coefficients.drag.compressible.total = cd_c return
# ---------------------------------------------------------------------------------------------------------------------- # transonic_drag_function # ----------------------------------------------------------------------------------------------------------------------
[docs] def transonic_drag_function(Mach,a_vertex, peak_mach, peak_volume_total): """ parabolic approximation of drag rise in the transonic region Assumptions: Basic fit Source: None Args: Mach a_vertex peak_mach peak_volume_total Returns: transonic_drag """ transonic_drag = a_vertex*(Mach-peak_mach)*(Mach-peak_mach)+peak_volume_total transonic_drag = transonic_drag.reshape(np.shape(Mach)) return transonic_drag
# ---------------------------------------------------------------------------------------------------------------------- # lift_wave_drag # ----------------------------------------------------------------------------------------------------------------------
[docs] def lift_wave_drag(conditions,configuration,geometry): """Determine lift wave drag for supersonic speeds Assumptions: Basic fit Source: http://aerodesign.stanford.edu/aircraftdesign/aircraftdesign.html (Stanford AA241 A/B Course Notes) Args: conditions.freestream.mach_number [-] configuration (passed to another function) wing.areas.reference [m^2] Sref_main [m^2] Main reference area Returns: cd_c_l [-] Wave drag CD due to lift """ for wing in geometry.wings: if isinstance(wing, Main_Wing): # Unpack Mach number Mach = conditions.freestream.mach_number # Initalize cd arrays cd_c_l = np.zeros_like(Mach) # Calculate wing values at all Mach numbers cd_lift_wave = wave_drag(conditions,wing) # Pack supersonic results into correct elements cd_c_l[Mach >= 1.01] = cd_lift_wave[0:len(Mach[Mach >= 1.01]),0] return cd_c_l