Example #1
0
def air_path(aircraft, nei, altp, disa, speed_mode, speed, mass, rating):
    """
    Retrieves air path in various conditions
    """

    g = earth.gravity()

    [pamb, tamb, tstd, dtodz] = earth.atmosphere(altp, disa)

    mach = get_mach(pamb, speed_mode, speed)

    fn, data = propu.thrust(aircraft, pamb, tamb, mach, rating, nei)

    cz = lift_from_speed(aircraft, pamb, mach, mass)

    [cx, lod] = aero.drag(aircraft, pamb, tamb, mach, cz)

    if (nei > 0):
        dcx = propu.oei_drag(aircraft, pamb, mach)
        cx = cx + dcx * nei
        lod = cz / cx

    acc_factor = earth.climb_mode(speed_mode, dtodz, tstd, disa, mach)

    slope = (fn / (mass * g) - 1 / lod) / acc_factor

    vsnd = earth.sound_speed(tamb)

    v_z = mach * vsnd * slope

    return slope, v_z
Example #2
0
def acceleration(aircraft, nei, altp, disa, speed_mode, speed, mass, rating):
    """
    Aircraft acceleration on level flight
    """

    wing = aircraft.wing
    gam = earth.heat_ratio()

    [pamb, tamb, tstd, dtodz] = earth.atmosphere(altp, disa)

    mach = get_mach(pamb, speed_mode, speed)

    fn, Data = propu.thrust(aircraft, pamb, tamb, mach, rating, nei)

    cz = lift_from_speed(aircraft, pamb, mach, mass)

    cx, lod = aero.drag(aircraft, pamb, tamb, mach, cz)

    if (nei > 0):
        dcx = propu.oei_drag(aircraft, pamb, mach)
        cx = cx + dcx * nei

    acc = (fn - 0.5 * gam * pamb * mach**2 * wing.area * cx) / mass

    return acc
Example #3
0
def fct_thrust(aircraft, state, rating, nei):

    xg = state[state_dict["xg"]]
    zg = state[state_dict["zg"]]

    xg_d = state[state_dict["vgnd"]] * numpy.cos(state[state_dict["path"]])
    zg_d = state[state_dict["vgnd"]] * numpy.sin(state[state_dict["path"]])

    pamb, pamb_d, tamb, tamb_d, disa, disa_d, wx, wx_d, wz, wz_d = air(
        xg, zg, xg_d, zg_d)

    vsnd, vsnd_d = g_earth.sound_speed_grad(tamb, tamb_d)

    vair = numpy.sqrt((xg_d - wx)**2 + (zg_d - wz)**2)

    mach = vair / vsnd

    fn, prop_data = propu.thrust(aircraft, pamb, tamb, mach, rating, nei)

    return fn
Example #4
0
def take_off(aircraft, kvs1g, altp, disa, mass, hld_conf):
    """
    Take off field length and climb path at 35 ft depending on stall margin (kVs1g)
    """

    wing = aircraft.wing
    propulsion = aircraft.propulsion

    (MTO, MCN, MCL, MCR, FID) = propulsion.rating_code

    czmax, cz_0 = airplane_aero.high_lift(wing, hld_conf)

    rating = MTO

    [pamb, tamb, tstd, dtodz] = earth.atmosphere(altp, disa)

    [rho, sig] = earth.air_density(pamb, tamb)

    cz_to = czmax / kvs1g**2

    mach = flight.speed_from_lift(aircraft, pamb, cz_to, mass)

    nei = 0  # For Magic Line factor computation

    fn, trash = propu.thrust(aircraft, pamb, tamb, mach, rating, nei)

    ml_factor = mass**2 / (cz_to * fn * wing.area * sig**0.8
                           )  # Magic Line factor

    tofl = 15.5 * ml_factor + 100.

    nei = 1  # For 2nd segment computation
    speed_mode = 1
    speed = flight.get_speed(pamb, speed_mode, mach)

    seg2path, vz = flight.air_path(aircraft, nei, altp, disa, speed_mode,
                                   speed, mass, rating)

    return seg2path, tofl
Example #5
0
def vertical_tail_sizing(aircraft):
    """
    Computes necessary VTP area variation to meet engine failure case constraint
    Influence of CG position is ignored
    """

    design_driver = aircraft.design_driver
    propulsion = aircraft.propulsion
    wing = aircraft.wing
    vtp = aircraft.vertical_tail
    aerodynamics = aircraft.aerodynamics
    payload = aircraft.payload
    c_of_g = aircraft.center_of_gravity

    (MTO, MCN, MCL, MCR, FID) = propulsion.rating_code

    cyb_vtp, xlc_vtp, aoa_max_vtp, ki_vtp = frame_aero.vtp_aero_data(aircraft)

    payload = 0.5 * payload.nominal  # Light payload
    range = design_driver.design_range / 15  # Short mission
    altp = design_driver.ref_cruise_altp
    mach = design_driver.cruise_mach
    disa = 30  # Hot condition

    tow, block_fuel, block_time, total_fuel = sub_proc.mission_tow(
        aircraft, payload, range, altp, mach, disa)

    altp = 0
    disa = 15

    pamb, tamb, tstd, dtodz = earth.atmosphere(altp, disa)

    stall_margin = regul.kvs1g_min_take_off()

    czmax_to = aerodynamics.cz_max_to

    mach_s1g = flight.speed_from_lift(aircraft, pamb, czmax_to, tow)

    mach_35ft = stall_margin * mach_s1g  # V2 speed

    mach_mca = mach_35ft / 1.1  #Approximation of required VMCA

    altp = 0
    disa = 15

    nei = 1

    pamb, tamb, tstd, dtodz = earth.atmosphere(altp, disa)

    fn, data = propu.thrust(aircraft, pamb, tamb, mach_mca, MTO, nei)

    dcx_oei = propu.oei_drag(aircraft, pamb, tamb)

    cn_prop = propu.thrust_yaw_moment(aircraft, fn, pamb, mach_mca, dcx_oei)

    max_bwd_req_cg = xlc_vtp - (cn_prop * wing.mac) / (cyb_vtp * aoa_max_vtp)

    c_of_g.max_bwd_oei_req_cg = c_of_g.max_bwd_req_cg
    c_of_g.max_bwd_oei_cg = max_bwd_req_cg
    c_of_g.max_bwd_oei_mass = tow

    return
Example #6
0
def eval_propulsion_design(aircraft):
    """
    Propulsion architecture design
    """

    propulsion = aircraft.propulsion

    propulsion.rating_code = (0,1,2,3,4)

    if (propulsion.architecture==1):

        engine = aircraft.turbofan_engine

        eval_turbofan_engine_design(aircraft)
        eval_turbofan_nacelle_design(aircraft)

    elif (propulsion.architecture==2):

        engine = aircraft.turbofan_engine

        eval_turbofan_engine_design(aircraft)
        eval_hybrid_engine_design(aircraft)
        eval_hybrid_nacelle_design(aircraft)

    else:
        raise Exception("propulsion.architecture index is out of range")


    (MTO,MCN,MCL,MCR,FID) = propulsion.rating_code

    disa = 15.
    altp = 0.
    mach = 0.25
    nei = 0.

    (pamb,tamb,tstd,dtodz) = earth.atmosphere(altp,disa)

    (Fn,Data) = propu.thrust(aircraft,pamb,tamb,mach,MTO,nei)

    propulsion.reference_thrust_effective = (Fn/engine.n_engine)/0.80
    propulsion.mto_thrust_ref = Fn/engine.n_engine


    disa = aircraft.low_speed.disa_oei
    altp = aircraft.low_speed.req_oei_altp
    mach = 0.5*aircraft.design_driver.cruise_mach
    nei = 1.

    (pamb,tamb,tstd,dtodz) = earth.atmosphere(altp,disa)

    (Fn,Data) = propu.thrust(aircraft,pamb,tamb,mach,MCN,nei)

    propulsion.mcn_thrust_ref = Fn/(engine.n_engine-nei)


    disa = 0.
    altp = aircraft.design_driver.ref_cruise_altp
    mach = aircraft.design_driver.cruise_mach
    nei = 0.

    (pamb,tamb,tstd,dtodz) = earth.atmosphere(altp,disa)

    propulsion.sfc_cruise_ref = propu.sfc(aircraft,pamb,tamb,mach,MCR,nei)

    if (propulsion.architecture==1):

        sec = 0.

    elif (propulsion.architecture==2):

        fn,sec,data = propu.hybrid_thrust(aircraft,pamb,tamb,mach,MCR,nei)

    else:
        raise Exception("propulsion.architecture index is out of range")

    propulsion.sec_cruise_ref = sec

    (Fn,Data) = propu.thrust(aircraft,pamb,tamb,mach,FID,nei)

    propulsion.fid_thrust_ref = Fn/engine.n_engine


    disa = 0.
    altp = aircraft.design_driver.top_of_climb_altp
    mach = aircraft.design_driver.cruise_mach
    nei = 0.

    (pamb,tamb,tstd,dtodz) = earth.atmosphere(altp,disa)

    (Fn,Data) = propu.thrust(aircraft,pamb,tamb,mach,MCL,nei)

    propulsion.mcl_thrust_ref = Fn/engine.n_engine

    (Fn,Data) = propu.thrust(aircraft,pamb,tamb,mach,MCR,nei)

    propulsion.mcr_thrust_ref = Fn/engine.n_engine

    return