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