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
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
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
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)
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
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