Пример #1
0
def nominal_mission(aircraft):
    """
    Compute nominal mission with range as input
    """

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

    aircraft.nominal_mission.payload = aircraft.payload.nominal
    aircraft.nominal_mission.range = aircraft.design_driver.design_range
    aircraft.nominal_mission.tow = aircraft.weights.mtow

    (MTO, MCN, MCL, MCR, FID) = aircraft.propulsion.rating_code
    pamb, tamb, tstd, dtodz = earth.atmosphere(altp, disa)
    lod_max, _ = craft_aero.lod_max(aircraft, pamb, tamb, mach)
    sfc = propu.sfc(aircraft, pamb, tamb, mach, MCR, nei)

    aircraft.high_speed.cruise_lod = lod_max
    aircraft.high_speed.cruise_sfc = sfc

    payload = aircraft.nominal_mission.payload
    range = aircraft.nominal_mission.range
    tow = aircraft.nominal_mission.tow

    block_fuel, block_time, total_fuel = perfo.mission(aircraft, range, tow,
                                                       altp, mach, disa)

    aircraft.nominal_mission.block_fuel = block_fuel
    aircraft.nominal_mission.block_time = block_time
    aircraft.nominal_mission.total_fuel = total_fuel

    return
Пример #2
0
def specific_air_range(aircraft, altp, mass, mach, disa):

    propulsion = aircraft.propulsion

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

    g = earth.gravity()

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

    vsnd = earth.sound_speed(tamb)

    Cz = flight.lift_from_speed(aircraft, pamb, mach, mass)

    [Cx, LoD] = craft_aero.drag(aircraft, pamb, tamb, mach, Cz)

    nei = 0.

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

    sar = (vsnd * mach * LoD) / (mass * g * sfc)

    return sar
Пример #3
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)

    elif (propulsion.architecture == 3):

        engine = aircraft.turbofan_engine

        eval_hybrid_turbofan_engine_design(aircraft)
        eval_hybrid_engine_design(aircraft)
        eval_hybrid_body_nacelle_design(aircraft)

    elif (propulsion.architecture == 4):

        engine = aircraft.turboprop_engine

        eval_turboprop_engine_design(aircraft)
        eval_turboprop_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)

    elif (propulsion.architecture == 3):

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

    elif (propulsion.architecture == 4):

        sec = 0.

    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
Пример #4
0
print('Coupling : delta_mlw = ', "%.2f" % delta_mlw, 'kg, (= 0 ?)')

print("-------------------------------------------")
print("Mass and CG estimation : done")

# Nominal mission
#------------------------------------------------------------------------------------------------------
disa = 0
altp = ac.design_driver.ref_cruise_altp
mach = ac.design_driver.cruise_mach
nei = 0

(MTO, MCN, MCL, MCR, FID) = ac.propulsion.rating_code
pamb, tamb, tstd, dtodz = earth.atmosphere(altp, disa)
lod_max, _ = craft_aero.lod_max(ac, pamb, tamb, mach)
sfc = propu.sfc(ac, pamb, tamb, mach, MCR, nei)

ac.high_speed.cruise_lod = lod_max
ac.high_speed.cruise_sfc = sfc

ac.nominal_mission.payload = ac.payload.nominal
ac.nominal_mission.range = ac.design_driver.design_range
ac.nominal_mission.tow = ac.weights.mtow

payload = ac.nominal_mission.payload
range = ac.nominal_mission.range
tow = ac.nominal_mission.tow

block_fuel, block_time, total_fuel = perfo.mission(ac, range, tow, altp, mach,
                                                   disa)
Пример #5
0
def performance_analysis(aircraft):
    """
    Compute operational performances
    """

    # Nominal mission (here : range is an output)
    #------------------------------------------------------------------------------------------------------
    disa = 0.
    altp = aircraft.design_driver.ref_cruise_altp
    mach = aircraft.design_driver.cruise_mach
    nei = 0.

    (MTO, MCN, MCL, MCR, FID) = aircraft.propulsion.rating_code
    pamb, tamb, tstd, dtodz = earth.atmosphere(altp, disa)
    lod_max, _ = craft_aero.lod_max(aircraft, pamb, tamb, mach)
    sfc = propu.sfc(aircraft, pamb, tamb, mach, MCR, nei)

    aircraft.high_speed.cruise_lod = lod_max
    aircraft.high_speed.cruise_sfc = sfc

    aircraft.nominal_mission.payload = aircraft.payload.nominal
    aircraft.nominal_mission.range = aircraft.design_driver.design_range
    aircraft.nominal_mission.tow = aircraft.weights.mtow

    payload = aircraft.nominal_mission.payload
    tow = aircraft.nominal_mission.tow

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

    aircraft.nominal_mission.range = range

    aircraft.nominal_mission.block_fuel = block_fuel
    aircraft.nominal_mission.block_time = block_time
    aircraft.nominal_mission.total_fuel = total_fuel

    # Ceilings
    #------------------------------------------------------------------------------------------------------
    toc = aircraft.design_driver.top_of_climb_altp
    oei_ceil_req = aircraft.low_speed.req_oei_altp

    vz_clb, vz_crz, oei_path, oei_mach = perfo.ceilings(
        aircraft, toc, oei_ceil_req)

    aircraft.high_speed.eff_vz_climb = vz_clb
    aircraft.high_speed.eff_vz_cruise = vz_crz
    aircraft.low_speed.eff_oei_path = oei_path

    # Time to climb to requested altitude
    #------------------------------------------------------------------------------------------------------
    toc = aircraft.high_speed.req_toc_altp
    disa = 0
    mass = aircraft.weights.mtow
    vcas1 = aircraft.high_speed.cas1_ttc
    vcas2 = aircraft.high_speed.cas2_ttc
    mach = aircraft.design_driver.cruise_mach

    ttc = perfo.time_to_climb(aircraft, toc, disa, mass, vcas1, vcas2, mach)

    aircraft.high_speed.eff_ttc = ttc

    # Take off field length
    #------------------------------------------------------------------------------------------------------
    altp = aircraft.low_speed.altp_tofl
    disa = aircraft.low_speed.disa_tofl
    mass = aircraft.weights.mtow
    hld_conf_to = aircraft.aerodynamics.hld_conf_to

    tofl, seg2_path, eff_kvs1g, limitation = perfo.take_off_field_length(
        aircraft, altp, disa, mass, hld_conf_to)

    aircraft.low_speed.eff_tofl = tofl
    aircraft.low_speed.eff_kvs1g = eff_kvs1g
    aircraft.low_speed.seg2_path = seg2_path
    aircraft.low_speed.limitation = limitation

    # Approach speed
    #------------------------------------------------------------------------------------------------------
    altp = aircraft.low_speed.altp_app_speed
    disa = aircraft.low_speed.disa_app_speed
    mass = aircraft.weights.mlw
    hld_conf_ld = aircraft.aerodynamics.hld_conf_to

    app_speed = perfo.approach_speed(aircraft, altp, disa, mass, hld_conf_ld)

    aircraft.low_speed.eff_app_speed = app_speed

    # Environment
    #------------------------------------------------------------------------------------------------------
    CO2_metric, rgf = environ.fuel_efficiency_metric(aircraft)

    aircraft.environmental_impact.rgf = rgf
    aircraft.environmental_impact.CO2_metric = CO2_metric

    # Cost mission
    #-----------------------------------------------------------------------------------------------------------------------------------------------
    altp = aircraft.design_driver.ref_cruise_altp
    mach = aircraft.design_driver.cruise_mach

    disa = aircraft.cost_mission.disa
    range = aircraft.cost_mission.range

    payload = aircraft.payload.nominal

    aircraft.cost_mission.payload = payload

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

    aircraft.cost_mission.block_fuel = block_fuel
    aircraft.cost_mission.block_time = block_time
    aircraft.cost_mission.total_fuel = total_fuel

    aircraft.cost_mission.block_CO2 = block_fuel * aircraft.environmental_impact.CO2_index

    # Economics
    #------------------------------------------------------------------------------------------------------
    direct_op_cost, cash_op_cost, block_fuel, engine_price, airplane_price = costing.operating_costs(
        aircraft, block_fuel, block_time)

    aircraft.economics.engine_price = engine_price
    aircraft.economics.airplane_price = airplane_price

    aircraft.economics.direct_operating_cost = direct_op_cost
    aircraft.economics.cash_operating_cost = cash_op_cost

    return
Пример #6
0
def mission(aircraft, dist_range, tow, altp, mach, disa):
    """
    Mission computation using breguet equation, fixed L/D and fixed sfc
    """

    engine = aircraft.turbofan_engine
    propulsion = aircraft.propulsion
    battery = aircraft.battery

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

    g = earth.gravity()

    pamb, tamb, tstd, dtodz = earth.atmosphere(altp, disa)
    vsnd = earth.sound_speed(tamb)
    tas = vsnd * mach

    lod_max, cz_lod_max = craft_aero.lod_max(aircraft, pamb, tamb, mach)

    lod_cruise = 0.95 * lod_max

    nei = 0.

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

    if (propulsion.architecture == 2):
        fn, sec, data = propu.hybrid_thrust(aircraft, pamb, tamb, mach, MCR,
                                            nei)
    if (propulsion.architecture == 3):
        fn, sec, data = propu.hybrid_thrust(aircraft, pamb, tamb, mach, MCR,
                                            nei)

    # Departure ground phases
    #-----------------------------------------------------------------------------------------------------------
    fuel_taxi_out = (34 + 2.3e-4 * engine.reference_thrust) * engine.n_engine
    time_taxi_out = 540

    fuel_take_off = 1e-4 * (2.8 + 2.3 / engine.bpr) * tow
    time_take_off = 220 * tow / (engine.reference_thrust * engine.n_engine)

    # Mission leg
    #-----------------------------------------------------------------------------------------------------------
    if (propulsion.architecture == 1):
        fuel_mission = tow * (1 - numpy.exp(-(sfc * g * dist_range) /
                                            (tas * lod_cruise)))
    elif (propulsion.architecture == 2):
        fuel_mission = tow*(1-numpy.exp(-(sfc*g*dist_range)/(tas*lod_cruise))) \
                        - (sfc/sec)*battery.energy_cruise
    elif (propulsion.architecture == 3):
        fuel_mission = tow*(1-numpy.exp(-(sfc*g*dist_range)/(tas*lod_cruise))) \
                        - (sfc/sec)*battery.energy_cruise
    elif (propulsion.architecture == 4):
        fuel_mission = tow * (1 - numpy.exp(-(sfc * g * dist_range) /
                                            (tas * lod_cruise)))
    else:
        raise Exception("propulsion.architecture index is out of range")

    time_mission = 1.09 * (dist_range / tas)

    l_w = tow - fuel_mission

    # Arrival ground phases
    #-----------------------------------------------------------------------------------------------------------
    fuel_landing = 1e-4 * (0.5 + 2.3 / engine.bpr) * l_w
    time_landing = 180

    fuel_taxi_in = (26 + 1.8e-4 * engine.reference_thrust) * engine.n_engine
    time_taxi_in = 420

    # Block fuel and time
    #-----------------------------------------------------------------------------------------------------------
    block_fuel = fuel_taxi_out + fuel_take_off + fuel_mission + fuel_landing + fuel_taxi_in
    time_block = time_taxi_out + time_take_off + time_mission + time_landing + time_taxi_in

    # Diversion and holding reserve fuel
    #-----------------------------------------------------------------------------------------------------------
    fuel_diversion = l_w * (1 -
                            numpy.exp(-(sfc * g * regul.diversion_range()) /
                                      (tas * lod_cruise)))

    fuel_holding = sfc * (l_w * g / lod_max) * regul.holding_time()

    # Total
    #-----------------------------------------------------------------------------------------------------------
    fuel_total = fuel_mission * (
        1 + regul.reserve_fuel_ratio()) + fuel_diversion + fuel_holding

    #-----------------------------------------------------------------------------------------------------------
    return block_fuel, time_block, fuel_total