Source code for RCAIDE.Library.Methods.Noise.Correlation_Buildup.Airframe.airframe_noise

# RCAIDE/Methods/Noise/Correlation_Buildup/Airframe/airframe_noise.py
# 
# 
# Created:  Jul 2023, M. Clarke  

# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ----------------------------------------------------------------------------------------------------------------------

# RCAIDE Imports
import  RCAIDE
from RCAIDE.Framework.Core                 import Data  
from .clean_wing_noise                     import clean_wing_noise
from .landing_gear_noise                   import landing_gear_noise 
from .trailing_edge_flap_noise             import trailing_edge_flap_noise 
from RCAIDE.Library.Methods.Noise.Metrics  import A_weighting_metric  
from RCAIDE.Library.Methods.Noise.Common   import SPL_arithmetic 

# python imports 
import numpy as np

# ----------------------------------------------------------------------
#  Airframe Noise 
# ----------------------------------------------------------------------
[docs] def airframe_noise(microphone_locations,segment,config,settings): """ This computes the noise from different sources of the airframe for a given vehicle for a constant altitude flight. Assumptions: Correlation based Source: Fink, Martin R. "Noise component method for airframe noise." Journal of aircraft 16.10 (1979): 659-665. Inputs: vehicle - RCAIDE type vehicle includes these fields: S - Wing Area bw - Wing Span Sht - Horizontal tail area bht - Horizontal tail span Svt - Vertical tail area bvt - Vertical tail span deltaf - Flap deflection Sf - Flap area cf - Flap chord slots - Number of slots (Flap type) Dp - Main landing gear tyre diameter Hp - Main lading gear strut length Dn - Nose landing gear tyre diameter Hn - Nose landing gear strut length wheels - Number of wheels noise segment - flight path data, containing: distance_vector - distance from the source location to observer angle - polar angle from the source to the observer phi - azimuthal angle from the source to the observer Outputs: One Third Octave Band SPL [dB] SPL_wing - Sound Pressure Level of the clean wing SPLht - Sound Pressure Level of the horizontal tail SPLvt - Sound Pressure Level of the vertical tail SPL_flap - Sound Pressure Level of the flaps trailing edge SPL_slat - Sound Pressure Level of the slat leading edge SPL_main_landing_gear - Sound Pressure Level og the main landing gear SPL_nose_landing_gear - Sound Pressure Level of the nose landing gear Properties Used: N/A """ # Unpack conditions velocity = segment.conditions.freestream.velocity # aircraft velocity noise_time = segment.conditions.frames.inertial.time[:,0] # time discretization # Generate array with the One Third Octave Band Center Frequencies frequency = settings.center_frequencies[5:] num_f = len(frequency) n_cpts = len(noise_time) n_mic = len(microphone_locations) # Unpack Geometry slots = 0 for wing in config.wings: if type(wing) == RCAIDE.Library.Components.Wings.Main_Wing: taper = wing.taper Sw = wing.areas.reference bw = wing.spans.projected for cs in wing.control_surfaces: if type(cs) == RCAIDE.Library.Components.Wings.Control_Surfaces.Flap: deltaf = cs.deflection flap_span = (cs.span_fraction_end - cs.span_fraction_start) * bw chord_root = 2*Sw/bw/(1+taper) chord_tip = taper * chord_root delta_chord = chord_tip - chord_root wing_chord_flap_start = chord_root + delta_chord * cs.span_fraction_start wing_chord_flap_end = chord_root + delta_chord * cs.span_fraction_end flap_chord_start = wing_chord_flap_start* cs.chord_fraction flap_chord_end = wing_chord_flap_end* cs.chord_fraction cf = (flap_chord_start +flap_chord_end) /2 Sf = flap_span * cf # determining flap slot number if cs.configuration_type == 'single_slotted': slots = 1 elif cs.configuration_type == 'double_slotted': slots = 2 elif cs.configuration_type == 'triple_slotted': slots = 3 elif type(wing) == RCAIDE.Library.Components.Wings.Horizontal_Tail: Sht = wing.areas.reference # horizontal tail area, sq.ft bht = wing.spans.projected # horizontal tail span, ft elif type(wing) == RCAIDE.Library.Components.Wings.Vertical_Tail: Svt = wing.areas.reference # vertical tail area, sq.ft bvt = wing.spans.projected # vertical tail span, ft Dp = 0 Dn = 0 main_wheels = 0 main_units = 0 Hp = 0 Hn = 0 nose_wheels = 0 main_gear_extended = False nose_gear_extended = False for landing_gear in config.landing_gears: if isinstance(landing_gear,RCAIDE.Library.Components.Landing_Gear.Main_Landing_Gear): Dp = landing_gear.tire_diameter # MLG tyre diameter Dn = landing_gear.strut_length # NLG tyre diameter main_wheels = landing_gear.wheels # Number of wheels main_gear_extended = landing_gear.gear_extended # Gear up or gear down main_units = landing_gear.units # Number of main units elif isinstance(landing_gear,RCAIDE.Library.Components.Landing_Gear.Nose_Landing_Gear): Hp = landing_gear.tire_diameter # MLG strut length Hn = landing_gear.strut_length # NLG strut length nose_gear_extended = landing_gear.gear_extended # Gear up or gear down nose_wheels = landing_gear.wheels # Number of wheels viscosity = segment.conditions.freestream.kinematic_viscosity[:,0] M = segment.conditions.freestream.mach_number SPL_total_history = np.zeros((n_cpts,n_mic,num_f)) SPLt_dBA_history = np.zeros((n_cpts,n_mic,num_f)) # Distance vector from the aircraft position in relation to the microphone coordinates [meters] distance = np.linalg.norm(microphone_locations,axis = 1) altitude = abs(microphone_locations[:,2]) sideline_distance = microphone_locations[:,1] # Polar angle emission vector relatively to the aircraft to the microphone coordinates, [rad] theta = np.zeros(n_mic) bool_1 = (microphone_locations[:,1] > 0) & (microphone_locations[:,0] > 0) bool_2 = (microphone_locations[:,1] > 0) & (microphone_locations[:,0] < 0) bool_3 = (microphone_locations[:,1] < 0) & (microphone_locations[:,0] < 0) bool_4 = (microphone_locations[:,1] < 0) & (microphone_locations[:,0] > 0) theta[bool_1] = np.pi - np.arctan(microphone_locations[:,1]/microphone_locations[:,0])[bool_1] theta[bool_2] = np.arctan(microphone_locations[:,1]/ abs(microphone_locations[:,0]))[bool_2] theta[bool_3] = np.arctan(abs(microphone_locations[:,1])/ abs(microphone_locations[:,0]))[bool_3] theta[bool_4] = np.pi - np.arctan(abs(microphone_locations[:,1])/ microphone_locations[:,0])[bool_4] # Azimuthal (sideline) angle emission vector relatively to the aircraft to the microphone coordinates, [rad] phi = np.arctan(sideline_distance/altitude) # START LOOP FOR EACH POSITION OF AIRCRAFT for i in range(n_cpts): for j in range(n_mic): SPL_wing = clean_wing_noise(Sw,bw,0,1, velocity[i,0],viscosity[i],M[i],phi[j],theta[j],distance[j],frequency) # Wing Noise SPLht = clean_wing_noise(Sht,bht,0,1, velocity[i,0],viscosity[i],M[i],phi[j],theta[j],distance[j],frequency) # Horizontal Tail Noise SPLvt = clean_wing_noise(Svt,bvt,0,0,velocity[i,0],viscosity[i],M[i],phi[j],theta[j],distance[j],frequency) # Vertical Tail Noise # Flap noise if deltaf==0: SPL_flap = np.zeros(num_f) else: SPL_flap = trailing_edge_flap_noise(Sf,cf,deltaf,slots,velocity[i,0],M[i],phi[j],theta[j],distance[j],frequency) # Main landing gear noise if main_gear_extended == False: SPL_main_landing_gear = np.zeros(num_f) else: SPL_main_landing_gear = landing_gear_noise(Dp,Hp,main_wheels,M[i],velocity[i,0],phi[j],theta[j],distance[j],frequency) if main_units>1: # Incoherent summation of each main landing gear unit SPL_main_landing_gear = SPL_main_landing_gear+3*(main_units-1) # Nose landing gear noise if nose_gear_extended == False: SPL_nose_landing_gear = np.zeros(num_f) else: SPL_nose_landing_gear = landing_gear_noise(Dn,Hn,nose_wheels,M[i],velocity[i,0],phi[j],theta[j],distance[j],frequency) # Total Airframe Noise SPL_total = 10.*np.log10( 10.0**(0.1*SPL_wing)+ 10.0**(0.1*SPLht) + 10.0**(0.1*SPLvt) + 10.0**(0.1*SPL_flap) + 10.0**(0.1*SPL_main_landing_gear)+ 10.0**(0.1*SPL_nose_landing_gear)) SPL_total_history[i,j,:] = SPL_total # Calculation of dBA based on the sound pressure time history SPLt_dBA_history[i,j,:] = A_weighting_metric(SPL_total,frequency) # Pack Airframe Noise airframe_noise = Data() airframe_noise.SPL = SPL_arithmetic(SPL_total_history, sum_axis= 2) airframe_noise.SPL_1_3_spectrum = SPL_total_history airframe_noise.SPL_dBA = SPL_arithmetic(np.atleast_2d(SPLt_dBA_history), sum_axis= 2) airframe_noise.noise_time = noise_time return airframe_noise