def eval_pre_design_vtp(aircraft): """ VTP predesign """ design_driver = aircraft.design_driver fuselage = aircraft.fuselage nacelle = aircraft.turbofan_nacelle engine = aircraft.turbofan_engine vtp = aircraft.vertical_tail vtp.taper_ratio = 0.40 # Design rule vtp.aspect_ratio = 1.7 # Design rule vtp.t_o_c = 0.10 # Design rule wing_sweep = 1.6 * max(0, (design_driver.cruise_mach - 0.5)) # Empirical law vtp.sweep = wing_sweep + unit.rad_deg(10) # Design rule # if(HQsizing==0): # Statistical sizing vtp.volume = 0.4 # Design rule vtp.lever_arm = 3.4e-4 * fuselage.length**2 + 0.42 * fuselage.length vtp.area = vtp.volume * (1e-3 * engine.reference_thrust * nacelle.y_ext) / vtp.lever_arm # else: # HQ sizing # vtp.lever_arm = VtpLarm0 - dXwing ; # vtp.area = VtpArea0 + dVtpArea ; # vtp.volume = (vtp.area*vtp.lever_arm)/(1e-3*aircraft.reference_thrust*nac_y_ext_i) ; vtp.net_wetted_area = 2.01 * vtp.area # Factor 2.01 accounts for carmans vtp.height = numpy.sqrt(vtp.aspect_ratio * vtp.area) vtp.c_root = 2 * vtp.area / (vtp.height * (1 + vtp.taper_ratio)) vtp.c_tip = vtp.taper_ratio * vtp.c_root vtp_x_wise_anchor = 0.825 # Locate VTP versus end fuselage length vtp.x_root = fuselage.length * ( 1 - fuselage.tail_cone_length / fuselage.length * (1 - vtp_x_wise_anchor)) - vtp.c_root vtp.x_tip = vtp.x_root + 0.25 * ( vtp.c_root - vtp.c_tip) + vtp.height * numpy.tan(vtp.sweep) vtp.z_root = fuselage.height vtp.z_tip = vtp.z_root + vtp.height vtp.mac = vtp.height * (vtp.c_root**2 + vtp.c_tip**2 + vtp.c_root * vtp.c_tip) / (3 * vtp.area) vtp.x_mac = vtp.x_root + (vtp.x_tip - vtp.x_root) * vtp.height * ( 2 * vtp.c_tip + vtp.c_root) / (6 * vtp.area) return
def vtp_aero_data(aircraft): """ WARNING : output values are in Wing reference area """ vtp = aircraft.vertical_tail # Helmbold formula cyb_vtp = vtp_lift_gradiant( aircraft ) # (numpy.pi*vtp.aspect_ratio)/(1+numpy.sqrt(1+(vtp.aspect_ratio/2)**2))*(vtp.area/wing.area) # Position of VTP center of lift xlc_vtp = vtp.x_mac + 0.25 * vtp.mac # Maximum angle of attack allowed for VTP aoa_max_vtp = unit.rad_deg(35) # VTP induced drag coefficient ki_vtp = 1.3 / (numpy.pi * vtp.aspect_ratio) return cyb_vtp, xlc_vtp, aoa_max_vtp, ki_vtp
def htp_aero_data(aircraft): """ WARNING : output values are in Wing reference area """ wing = aircraft.wing htp = aircraft.horizontal_tail # Helmbold formula cza_htp = (numpy.pi * htp.aspect_ratio) / ( 1 + numpy.sqrt(1 + (htp.aspect_ratio / 2)**2)) * (htp.area / wing.area) # Position of HTP center of lift xlc_htp = htp.x_mac + 0.25 * htp.mac # Maximum angle of attack allowed for HTP aoa_max_htp = unit.rad_deg(9) # HTP induced drag coefficient ki_htp = 1.2 / (numpy.pi * htp.aspect_ratio) return cza_htp, xlc_htp, aoa_max_htp, ki_htp
def eval_pre_design_wing(aircraft): """ Wing predesign """ design_driver = aircraft.design_driver fuselage = aircraft.fuselage vtp = aircraft.vertical_tail nacelle = aircraft.turbofan_nacelle weights = aircraft.weights wing = aircraft.wing wing.t_o_c_t = 0.10 wing.t_o_c_k = wing.t_o_c_t + 0.01 wing.t_o_c_r = wing.t_o_c_k + 0.03 wing.sweep = 1.6 * max(0, (design_driver.cruise_mach - 0.5)) # Empirical law wing.dihedral = unit.rad_deg(5) if (wing.morphing == 1): # Aspect ratio is driving parameter wing.span = numpy.sqrt(wing.aspect_ratio * wing.area) elif (wing.morphing == 2): # Span is driving parameter wing.aspect_ratio = wing.span**2 / wing.area else: print("geometry_predesign_, wing_morphing index is unkown") # Correlation between span loading and tapper ratio wing.taper_ratio = 0.3 - 0.025 * (1e-3 * weights.mtow / wing.span) # Factor 1.64 accounts for the part of HTP ref area hidden in the fuselage wing.net_wetted_area = 1.64 * wing.area wing.y_kink = nacelle.y_ext wing.y_root = 0.5 * fuselage.width wing.y_tip = 0.5 * wing.span if (15 < unit.deg_rad(wing.sweep)): # With kink Phi100intTE = max(0, 2 * (wing.sweep - unit.rad_deg(32))) tan_phi100 = numpy.tan(Phi100intTE) A = ((1 - 0.25 * wing.taper_ratio) * wing.y_kink + 0.25 * wing.taper_ratio * wing.y_root - wing.y_tip) / ( 0.75 * wing.y_kink + 0.25 * wing.y_root - wing.y_tip) B = (numpy.tan(wing.sweep) - tan_phi100) * ( (wing.y_tip - wing.y_kink) * (wing.y_kink - wing.y_root)) / (0.25 * wing.y_root + 0.75 * wing.y_kink - wing.y_tip) wing.c_root = (wing.area - B * (wing.y_tip - wing.y_root)) / ( wing.y_root + wing.y_kink + A * (wing.y_tip - wing.y_root) + wing.taper_ratio * (wing.y_tip - wing.y_kink)) wing.c_kink = A * wing.c_root + B wing.c_tip = wing.taper_ratio * wing.c_root else: # Without kink wing.c_root = 2 * wing.area / ( 2 * wing.y_root * (1 - wing.taper_ratio) + (1 + wing.taper_ratio) * numpy.sqrt(wing.aspect_ratio * wing.area)) wing.c_tip = wing.taper_ratio * wing.c_root wing.c_kink = ((wing.y_tip - wing.y_kink) * wing.c_root + (wing.y_kink - wing.y_root) * wing.c_tip) / ( wing.y_tip - wing.y_root) tan_phi0 = 0.25 * (wing.c_kink - wing.c_tip) / ( wing.y_tip - wing.y_kink) + numpy.tan(wing.sweep) wing.mac = 2.*(3*wing.y_root*wing.c_root**2 \ +(wing.y_kink-wing.y_root)*(wing.c_root**2+wing.c_kink**2+wing.c_root*wing.c_kink) \ +(wing.y_tip-wing.y_kink)*(wing.c_kink**2+wing.c_tip**2+wing.c_kink*wing.c_tip) \ )/(3*wing.area) wing.y_mac = ( 3*wing.c_root*wing.y_root**2 \ +(wing.y_kink-wing.y_root)*(wing.c_kink*(wing.y_root+wing.y_kink*2.)+wing.c_root*(wing.y_kink+wing.y_root*2.)) \ +(wing.y_tip-wing.y_kink)*(wing.c_tip*(wing.y_kink+wing.y_tip*2.)+wing.c_kink*(wing.y_tip+wing.y_kink*2.)) \ )/(3*wing.area) x_mac_local = ( (wing.y_kink-wing.y_root)*tan_phi0*((wing.y_kink-wing.y_root)*(wing.c_kink*2.+wing.c_root) \ +(wing.y_tip-wing.y_kink)*(wing.c_kink*2.+wing.c_tip))+(wing.y_tip-wing.y_root)*tan_phi0*(wing.y_tip-wing.y_kink)*(wing.c_tip*2.+wing.c_kink) \ )/(3*wing.area) wing.x_root = vtp.x_mac + 0.25 * vtp.mac - vtp.lever_arm - 0.25 * wing.mac - x_mac_local wing.x_kink = wing.x_root + (wing.y_kink - wing.y_root) * tan_phi0 wing.x_tip = wing.x_root + (wing.y_tip - wing.y_root) * tan_phi0 wing.x_mac = wing.x_root+( (wing.x_kink-wing.x_root)*((wing.y_kink-wing.y_root)*(wing.c_kink*2.+wing.c_root) \ +(wing.y_tip-wing.y_kink)*(wing.c_kink*2.+wing.c_tip))+(wing.x_tip-wing.x_root)*(wing.y_tip-wing.y_kink)*(wing.c_tip*2.+wing.c_kink) \ )/(wing.area*3.) if (wing.attachment == 1): wing.z_root = 0 else: wing.z_root = fuselage.height - 0.5 * wing.t_o_c_r * wing.c_root wing.z_kink = wing.z_root + (wing.y_kink - wing.y_root) * numpy.tan( wing.dihedral) wing.z_tip = wing.z_root + (wing.y_tip - wing.y_root) * numpy.tan( wing.dihedral) # Wing setting #----------------------------------------------------------------------------------------------------------- g = earth.gravity() gam = earth.heat_ratio() disa = 0 rca = design_driver.ref_cruise_altp mach = design_driver.cruise_mach mass = 0.95 * weights.mtow pamb, tamb, tstd, dtodz = earth.atmosphere(rca, disa) cza_wo_htp = frame_aero.cza_wo_htp(mach, fuselage.width, wing.aspect_ratio, wing.span, wing.sweep) # AoA = 2.5° at cruise start wing.setting = (0.97 * mass * g) / (0.5 * gam * pamb * mach**2 * wing.area * cza_wo_htp) - unit.rad_deg(2.5) return
def eval_pre_design_htp(aircraft): """ HTP predesign """ design_driver = aircraft.design_driver fuselage = aircraft.fuselage wing = aircraft.wing vtp = aircraft.vertical_tail htp = aircraft.horizontal_tail htp.taper_ratio = 0.35 # Design rule htp.aspect_ratio = 5 # Design rule htp.t_o_c = 0.10 # Design rule wing_sweep = 1.6 * max(0, (design_driver.cruise_mach - 0.5)) # Empirical law htp.sweep = wing_sweep + unit.rad_deg(5) # Design rule htp.dihedral = unit.rad_deg(5) # HTP dihedral # if(HQsizing==0): # Statistical sizing htp.volume = 0.94 # Design rule if (htp.attachment == 1): # Classical htp.lever_arm = vtp.lever_arm - 0.20 * numpy.tan( vtp.sweep) * vtp.height elif (htp.attachment == 2): # T-tail htp.lever_arm = vtp.lever_arm + 0.80 * numpy.tan( vtp.sweep) * vtp.height else: print("airframe_predesign_, HtpType value is out of range") htp.area = htp.volume * (wing.area * wing.mac / htp.lever_arm) # else: # HQ sizing # htp.area = HtpArea0 + dHtpArea ; # htp.lever_arm = HtpLarm0 - dXwing ; # htp.volume = (htp.area*htp.lever_arm)/(wing.area*wing.mac) if (htp.attachment == 1): # Classical htp.net_wetted_area = 1.63 * htp.area elif (htp.attachment == 2): # T-tail htp.net_wetted_area = 2.01 * htp.area else: print("airframe_predesign_, htp.attachment value is out of range") htp.span = numpy.sqrt(htp.aspect_ratio * htp.area) htp.c_axe = 2 * htp.area / (htp.span * (1 + htp.taper_ratio)) htp.c_tip = htp.taper_ratio * htp.c_axe htp.y_tip = 0.5 * htp.span htp.mac = htp.span * (htp.c_axe**2 + htp.c_tip**2 + htp.c_axe * htp.c_tip) / (3 * htp.area) htp.y_mac = htp.y_tip**2 * (2 * htp.c_tip + htp.c_axe) / (3 * htp.area) x_tip_local = 0.25 * (htp.c_axe - htp.c_tip) + htp.y_tip * numpy.tan( htp.sweep) x_mac_local = htp.y_tip * x_tip_local * (htp.c_tip * 2. + htp.c_axe) / (3 * htp.area) htp.x_mac = vtp.x_mac + 0.25 * vtp.mac - vtp.lever_arm + htp.lever_arm - 0.25 * htp.mac htp.x_axe = htp.x_mac - x_mac_local htp.x_tip = htp.x_axe + x_tip_local htp_z_wise_anchor = 0.80 # Locate HTP versus end fuselage height if (htp.attachment == 1): # Classical htp.z_axe = htp_z_wise_anchor * fuselage.height elif (htp.attachment == 2): # T-tail htp.z_axe = fuselage.height + vtp.height else: print("airframe_predesign_, htp.attachment value is out of range") htp.z_tip = htp.z_axe + htp.y_tip * math.tan(htp.dihedral) return