Example #1
0
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
Example #2
0
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
Example #3
0
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
Example #4
0
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
Example #5
0
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