Source code for RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_fuselage
# RCAIDE/Library/Methods/Aerodynamics/Common/Drag/subsonic_parasite_drag_fuselage.py
# (c) Copyright 2023 Aerospace Research Community LLC
#
# Created: Jun 2024, M. Clarke
# ----------------------------------------------------------------------------------------------------------------------
# IMPORT
# ----------------------------------------------------------------------------------------------------------------------
# RCAIDE import
import RCAIDE
from RCAIDE.Framework.Core import Data
from RCAIDE.Library.Methods.Aerodynamics.Common.Drag.compressible_turbulent_flat_plate import compressible_turbulent_flat_plate
from RCAIDE.Library.Methods.Utilities import Cubic_Spline_Blender
# python imports
import numpy as np
# ----------------------------------------------------------------------------------------------------------------------
# Parasite Drag Fuselage
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def parasite_drag_fuselage(state,settings,fuselage):
"""Computes the parasite drag due the a fuselage (or boom)
Assumptions:
None
Source:
Stanford AA241 A/B Course Notes
Args:
state.conditions.freestream.
mach_number (numpy.ndarray): mach_number [Unitless]
temperature (numpy.ndarray): temperature [K]
reynolds_number (numpy.ndarray): Reynolds number [Unitless]
settings.fuselage_parasite_drag_form_factor (numpy.ndarray): form factor [Unitless]
geometry.fuselage.
areas.front_projected (float): projected front area [m^2]
areas.wetted (float): wetted area [m^2]
lengths.total (float): length [m]
effective_diameter (float): effective diamater [m]
Returns:
None
"""
if type(fuselage) == RCAIDE.Library.Components.Fuselages.Blended_Wing_Body_Fuselage:
# Store data
results = Data(
wetted_area = 0.0 ,
reference_area = 1.0,
total = 0.0,
skin_friction = 0.0,
compressibility_factor = 0.0,
reynolds_factor = 0.0,
form_factor = 0.0,
)
state.conditions.aerodynamics.coefficients.drag.parasite[fuselage.tag] = results
return
# unpack inputs
Sref = fuselage.areas.front_projected
Swet = fuselage.areas.wetted
l_fus = fuselage.lengths.total
d_fus = fuselage.effective_diameter
form_factor = settings.fuselage_parasite_drag_form_factor
low_cutoff = settings.supersonic.fuselage_parasite_drag_begin_blend_mach
high_cutoff = settings.supersonic.fuselage_parasite_drag_end_blend_mach
Mach = state.conditions.freestream.mach_number
T = state.conditions.freestream.temperature
Re = state.conditions.freestream.reynolds_number
# Reynolds number
Re_fus = Re*(l_fus)
# skin friction coefficient
cf_fus, k_comp, k_reyn = compressible_turbulent_flat_plate(Re_fus,Mach,T)
d_d = float(d_fus)/float(l_fus)
if np.all((Mach<=1.0) == True):
# compute form factor for cylindrical bodies
D = np.zeros_like(Mach)
D[Mach < 0.95] = np.sqrt(1 - (1-Mach[Mach < 0.95]**2) * d_d**2)
D[Mach >= 0.95] = np.sqrt(1 - d_d**2)
a = np.zeros_like(Mach)
a[Mach < 0.95] = 2 * (1-Mach[Mach < 0.95]**2) * (d_d**2) *(np.arctanh(D[Mach < 0.95])-D[Mach < 0.95]) / (D[Mach < 0.95]**3)
a[Mach >= 0.95] = 2 * (d_d**2) *(np.arctanh(D[Mach >= 0.95])-D[Mach >= 0.95]) / (D[Mach >= 0.95]**3)
du_max_u = np.zeros_like(Mach)
du_max_u[Mach < 0.95] = a[Mach < 0.95] / ( (2-a[Mach < 0.95]) * (1-Mach[Mach < 0.95]**2)**0.5 )
du_max_u[Mach >= 0.95] = a[Mach >= 0.95] / ( (2-a[Mach >= 0.95]) )
k_fus = (1 + form_factor*du_max_u)**2
fuselage_parasite_drag = k_fus * cf_fus * Swet / Sref
else:
# supersonic condition
D_low = np.zeros_like(Mach)
a_low = np.zeros_like(Mach)
du_max_u_low = np.zeros_like(Mach)
D_high = np.zeros_like(Mach)
a_high = np.zeros_like(Mach)
du_max_u_high = np.zeros_like(Mach)
k_fus = np.zeros_like(Mach)
low_inds = Mach < high_cutoff
high_inds = Mach > low_cutoff
D_low[low_inds] = np.sqrt(1 - (1-Mach[low_inds]**2) * d_d**2)
a_low[low_inds] = 2 * (1-Mach[low_inds]**2) * (d_d**2) *(np.arctanh(D_low[low_inds])-D_low[low_inds]) / (D_low[low_inds]**3)
du_max_u_low[low_inds] = a_low[low_inds] / ( (2-a_low[low_inds]) * (1-Mach[low_inds]**2)**0.5 )
D_high[high_inds] = np.sqrt(1 - d_d**2)
a_high[high_inds] = 2 * (d_d**2) *(np.arctanh(D_high[high_inds])-D_high[high_inds]) / (D_high[high_inds]**3)
du_max_u_high[high_inds] = a_high[high_inds] / ( (2-a_high[high_inds]) )
spline = Cubic_Spline_Blender(low_cutoff,high_cutoff)
h00 = lambda M:spline.compute(M)
du_max_u = du_max_u_low*(h00(Mach)) + du_max_u_high*(1-h00(Mach))
k_fus = (1 + form_factor*du_max_u)**2
fuselage_parasite_drag = k_fus * cf_fus * Swet / Sref
# Store data
results = Data(
wetted_area = Swet ,
reference_area = Sref ,
total = fuselage_parasite_drag ,
skin_friction = cf_fus ,
compressibility_factor = k_comp ,
reynolds_factor = k_reyn ,
form_factor = k_fus ,
)
state.conditions.aerodynamics.coefficients.drag.parasite[fuselage.tag] = results
return