Source code for RCAIDE.Library.Methods.Mass_Properties.Weight_Buildups.Conventional.Transport.Raymer.compute_horizontal_tail_weight

# RCAIDE/Library/Methods/Weights/Correlation_Buildups/Raymer/compute_horizontal_tail_weight.py
# 
# Created:  Sep 2024, M. Clarke

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

# RCAIDE
import RCAIDE 
from RCAIDE.Framework.Core    import Units

# python imports 
import  numpy as  np
 
# ----------------------------------------------------------------------------------------------------------------------
#  Horizontal Tail Weight 
# ----------------------------------------------------------------------------------------------------------------------
[docs] def compute_horizontal_tail_weight(vehicle, wing, settings,elevator_fraction=0.4): """ Calculates horizontal tail weight based on Raymer's empirical method. Parameters ---------- vehicle : RCAIDE.Vehicle() Vehicle data structure containing: - mass_properties.max_takeoff : float Maximum takeoff weight [kg] - flight_envelope.ultimate_load : float Ultimate load factor - wings['main_wing'] : Data() Main wing properties including origin and aerodynamic center - fuselages['fuselage'].width : float Width of the fuselage [m] wing : RCAIDE.Component() Horizontal tail component containing: - areas.reference : float Tail surface area [m^2] - origin : array Location of tail measured from nose [m] - aerodynamic_center : array Location of ac measured from leading edge [m] - sweeps.quarter_chord : float Quarter chord sweep angle [rad] - thickness_to_chord : float Thickness-to-chord ratio - spans.projected : float Projected span [m] - aspect_ratio : float Aspect ratio elevator_fraction : float, optional Fraction of horizontal tail area that is elevator, defaults to 0.4 settings.advanced_composites : bool, optional True if advanced composites are used, False otherwise Returns ------- tail_weight : float Weight of the horizontal tail [kg] Notes ----- This method implements Raymer's correlation for horizontal tail weight estimation, accounting for geometry, loads, and configuration effects. **Major Assumptions** * Not an all-moving horizontal tail (Kuht = 1.0) * Elevator comprises 40% of tail area by default * Correlation based on transport category aircraft data * If advanced composites are used, the tail weight is reduced by 15% **Theory** The horizontal tail weight is calculated using: .. math:: W_{ht} = 0.0379K_{uht}(1 + \frac{F_w}{B_h})^{-0.25}W_{dg}^{0.639}N_{ult}^{0.1}S_{ht}^{0.75}L_t^{-1}K_y^{0.704}\cos(\Lambda)^{-1}AR^{0.166}(1 + \frac{S_e}{S_{ht}})^{0.1} where: * :math:`K_{uht}` is 1.0 for fixed tails, 1.143 for all-moving * :math:`F_w` is fuselage width * :math:`B_h` is horizontal tail span * :math:`L_t` is tail arm length * :math:`K_y` is a function of tail arm length * :math:`\Lambda` is quarter-chord sweep angle References ---------- [1] Raymer, D., "Aircraft Design: A Conceptual Approach", AIAA Education Series, 2018. See Also -------- RCAIDE.Library.Methods.Weights.Correlation_Buildups.Raymer.compute_vertical_tail_weight RCAIDE.Library.Methods.Weights.Correlation_Buildups.Raymer.compute_operating_empty_weight """ ref_wing = None for wing in vehicle.wings: if isinstance(wing, RCAIDE.Library.Components.Wings.Main_Wing): ref_wing = wing S = 0 if ref_wing == None: for wing in vehicle.wings: if S < wing.areas.reference: ref_wing = wing L_fuselage = 0 for fuselage in vehicle.fuselages: if L_fuselage < fuselage.lengths.total: ref_fuselage = fuselage L_fuselage = ref_fuselage.lengths.total diff =[] names = [] horiz_tail_location = vehicle.wings.horizontal_stabilizer.origin[0][0] for segment in ref_fuselage.segments: segment_loc = segment.percent_x_location * ref_fuselage.lengths.total diff.append(np.abs(segment_loc - horiz_tail_location)) names.append(segment.tag) min_value = min(diff) min_index = diff.index(min_value) Kuht = 1 # not an all-moving unit horizontal tail Fw = ref_fuselage.segments[names[min_index]].width / Units.ft Bh = wing.spans.projected / Units.ft DG = vehicle.mass_properties.max_takeoff / Units.lbs Sht = wing.areas.reference / Units.ft ** 2 Lt = (wing.origin[0][0] + wing.aerodynamic_center[0] - ref_wing.origin[0][0] - ref_wing.aerodynamic_center[0]) / Units.ft Ky = 0.3 * Lt sweep = wing.sweeps.quarter_chord Ah = wing.aspect_ratio Se = elevator_fraction * Sht tail_weight = 0.0379 * Kuht * (1 + Fw / Bh) ** (-0.25) * DG ** 0.639 *\ vehicle.flight_envelope.ultimate_load ** 0.1 * Sht ** 0.75 * Lt ** -1 *\ Ky ** 0.704 * np.cos(sweep) ** (-1) * Ah ** 0.166 * (1 + Se / Sht) ** 0.1 if settings.advanced_composites: tail_weight *= 0.85 return tail_weight * Units.lbs