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

# RCAIDE/Library/Methods/Aerodynamics/Common/Drag/supersonic_wave_drag_volume_raymer.py
# (c) Copyright 2023 Aerospace Research Community LLC
# 
# Created:  Jun 2024, M. Clarke 

# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ---------------------------------------------------------------------------------------------------------------------- 
import RCAIDE
from RCAIDE.Framework.Core                    import    Units 
from RCAIDE.Library.Components.Wings          import Main_Wing
from RCAIDE.Library.Methods.Utilities         import Cubic_Spline_Blender   
from RCAIDE.Library.Methods.Geometry.Planform.convert_sweep import convert_sweep 

# package imports
import numpy as np

# ---------------------------------------------------------------------------------------------------------------------- 
#  Supersonic Wave Drag Due to Volume - Raymer Method 
# ---------------------------------------------------------------------------------------------------------------------- 
[docs] def supersonic_wave_drag_volume_raymer(vehicle,mach,scaling_factor): """Computes the volume drag Assumptions: Basic fit Source: D. Raymer, Aircraft Design: A Conceptual Approach, Fifth Ed. pg. 448-449 Args: vehicle. wings.main_wing.sweeps.leading_edge [rad] total_length [m] maximum_cross_sectional_area [m^2] reference_area [m^2] Returns: vehicle_wave_drag [Unitless] """ L = 0 for wing in vehicle.wings: if isinstance(wing,Main_Wing): main_wing = wing L = wing.chords.root main_wing = vehicle.wings.main_wing # estimation of leading edge sweep if not defined if main_wing.sweeps.leading_edge == None: main_wing.sweeps.leading_edge = convert_sweep(main_wing,old_ref_chord_fraction = 0.25 ,new_ref_chord_fraction = 0.0) for fuselage in vehicle.fuselages: if type(fuselage) == RCAIDE.Library.Components.Fuselages.Blended_Wing_Body_Fuselage: pass else: L = np.maximum(L, fuselage.lengths.total) LE_sweep = main_wing.sweeps.leading_edge / Units.deg Ae = vehicle.maximum_cross_sectional_area S = vehicle.reference_area # Compute sears-hack D/q Dq_SH = 9*np.pi/2*(Ae/L)*(Ae/L) spline = Cubic_Spline_Blender(1.2,1.3) h00 = lambda M:spline.compute(M) # Compute full vehicle D/q Dq_vehicle = np.zeros_like(mach) Dq_vehicle_simpified = np.zeros_like(mach) Dq_vehicle[mach>=1.2] = scaling_factor*(1-0.2*(mach[mach>=1.2]-1.2)**0.57*(1-np.pi*LE_sweep**.77/100))*Dq_SH Dq_vehicle_simpified = scaling_factor*Dq_SH Dq_vehicle = Dq_vehicle_simpified*h00(mach) + Dq_vehicle*(1-h00(mach)) CD_c_vehicle = Dq_vehicle/S return CD_c_vehicle