From 223b51c9086adf7a62ad91c60449e3c9e28ef312 Mon Sep 17 00:00:00 2001 From: Aditeya Shukla Date: Wed, 21 Aug 2024 13:56:20 -0400 Subject: [PATCH 1/3] reduced input tasopt --- src/IO/default_input.toml | 3 + src/IO/default_regional.toml | 492 ++++++++++++++++++++++++++++++++++ src/IO/default_wide.toml | 496 +++++++++++++++++++++++++++++++++++ src/IO/read_input.jl | 73 ++++-- 4 files changed, 1049 insertions(+), 15 deletions(-) create mode 100644 src/IO/default_regional.toml create mode 100644 src/IO/default_wide.toml diff --git a/src/IO/default_input.toml b/src/IO/default_input.toml index c5642f5c..aa6559ff 100644 --- a/src/IO/default_input.toml +++ b/src/IO/default_input.toml @@ -8,6 +8,9 @@ also loaded by the `TASOPT.jl` package as default if no other details are provided by the user. """ + aircraft_type = "Narrow Body" # 0: Regional Aircraft + # 1: Narrow Body Aircraft + # 2: Wide Body Aircraft #-------------------------------------------------# ## Note on units ## diff --git a/src/IO/default_regional.toml b/src/IO/default_regional.toml new file mode 100644 index 00000000..c347b0f2 --- /dev/null +++ b/src/IO/default_regional.toml @@ -0,0 +1,492 @@ +["Aircraft Description"] + name = "Regional Aircraft TASOPT Model" + description = """ + This model file describes a basic single-aisle regional aircraft. + """ + aircraft_type = "Regional Aircraft" # 0: Regional Aircraft + # 1: Narrow Body Aircraft + # 2: Wide Body Aircraft + + +#-------------------------------------------------# +## Note on units ## +#-------------------------------------------------# +# TASOPT input files can parse the following units. +# if no units are provided or pure numerical values are +# provided then they are assumed to be in SI units. +# ╔══════════╦══════════╦══════════════════════════╗ +# ║ Quantity ║ SI units ║ Other allowed units ║ +# ╠══════════╬══════════╬═════╦═══════╦═══════╦════╣ +# ║ mass ║ kg ║ g ║ lbm ║ ║ ║ +# ╠══════════╬══════════╬═════╬═══════╬═══════╬════╣ +# ║ distance ║ m ║ km ║ nmi ║ ft ║ in ║ +# ╠══════════╬══════════╬═════╬═══════╬═══════╬════╣ +# ║ area ║ m2 ║ ║ ║ ft2 ║ in2║ +# ╠══════════╬══════════╬═════╬═══════╬═══════╬════╣ +# ║ volume ║ m3 ║ ║ ║ ft3 ║ in3║ +# ╠══════════╬══════════╬═════╬═══════╬═══════╬════╣ +# ║ force ║ N ║ kN ║ lbf ║ ║ ║ +# ╠══════════╬══════════╬═════╬═══════╬═══════╬════╣ +# ║ pressure ║ Pa ║ atm ║lbf/in2║lbf/ft2║ psi║ +# ╠══════════╬══════════╬═════╬═══════╬═══════╬════╣ +# ║ speed ║ m/s ║ kts ║ km/hr ║ ft/s ║ ║ +# ╠══════════╬══════════╬═════╬═══════╬═══════╬════╣ +# ║ power ║ W ║ kW ║ MW ║ hp ║ ║ +# ╠══════════╬══════════╬═════╬═══════╬═══════╬════╣ +# ║ angle ║ rad ║ deg ║ ║ ║ ║ +# ╚══════════╩══════════╩═════╩═══════╩═══════╩════╝ + +[Options] # + optimize = false # Do you want TASOPT to optimize the aircraft or just size it + + engine_location = "wing" # 1: Engines on "wing" + # 2: Engines on "fuselage" + + prop_sys_arch = "TF" #Options are TF: Turbofan + # TE: Turbo-electric +[Fuel] + fuel_type = "Jet-A" # Choices are ... [TODO] + fuel_in_wing = true # Is fuel stored in wings? + fuel_in_wingcen = true # Is fuel stored in wing center box? + fuel_usability_factor = 0.90 # fraction of max fuel volume that is usable + + fuel_temp = 280.0 + fuel_density = 817.0 #kg/m3 + +[Mission] + N_missions = 1 # Number of missions to be modeled (first mission is the design mission) + pax = 118 # Number of passengers in each mission + max_pax = 122 # Maximum number of passengers for aircarft + # defines the maximum payload carrying capacity of the aircraft + + range = "2200.0 nmi" + # Design Range + second mission range + weight_per_pax = "215.0 lbf" # Specify weight per passenger - + # includes luggage [lbm or lbf or kg or N] + # judging you if you use imperial units but wtvs + + fuel_reserves = 0.05 # W_reserveFuel / W_fuelburned + + Nlift = 3.0 # Max vertical load factor for wing bending loads + Vne = "280 kts" # Never exceed ac for tail loads + +[Mission.Takeoff] + takeoff_alt = "0 ft" + takeoff_T = 288.2 + + max_balanced_field_length = "7450.0 ft" + Nland = 6.0 # Max vertical load factor for fuse bending loads + + CL_max_perp = 2.0 #CLmax/(cos(sweep))^2 + CD_dead_engine = 0.50 #CDA_fan/ A_fan + CD_landing_gear = 0.015 #CD*Agear/ Sref + CD_spoilers = 0.10 #CD*Aspoiler/ Sref + + rolling_resistance_coeff = 0.025 + braking_resistance_coeff = 0.35 + + takeoff_obstacle_height = "35 ft" + +[Mission.Climb] + minimum_top-of-climb_gradient = 0.015 + +[Mission.Cruise] + cruise_alt = "38500 ft" + cruise_mach = 0.80 + cruise_CL = 0.52 + +[Mission.Descent] + descent_angle_top-of-descent = "-2.5 deg" + descent_angle_bottom-of-descent = "-3.0 deg" + +[Fuselage] + cabin_pressure_altitude = "8000.0 ft" + +[Fuselage.Geometry] + number_of_bubbles = 1 # SingleBubble or MultiBubble Designs + radius = "59.5 in" # Fuselage radius + dRadius = "13.0 in" # Downward shift of lower bubbles + y_offset = 0.0 # y offset of bubble center + floor_depth = "6.0 in" # depth of floor beams + Nwebs = 0 # number of webs (for double bubble designs) + + a_nose = 1.7 # Nose radius = Rfuse*(1 - xi^a_nose)^(1/a_nose) + b_tail = 1.75 # Tail radius = Rfuse*(1 - xi^b_tail) + tailcone_taper = 0.3 + taper_fuse_to = "point" # Options are "point" or "edge" + + # Tail load fuselage bending moment inertial relief factor + HT_load_fuse_bend_relief = 0.4 + VT_load_fuse_bend_relief = 0.7 +# Overall fuselage layout + #Use provided layout (false) or recalculate it (true) for maximum pax keeping deltas + calculate_cabin_length = false + + double_decker = false #if true, the fuselage has two passenger decks + seat_pitch = "30 in" + seat_width = "19 in" + aisle_halfwidth = "10 in" + + #Provided layout + x_nose_tip = "0 ft" + x_pressure_shell_fwd = "17 ft" + x_start_cylinder = "15 ft" + x_end_cylinder = "97 ft" + x_pressure_shell_aft = "103 ft" + x_cone_end = "117 ft" + x_end = "127 ft" + +# Power systems and landing gear locations + x_HPE_sys = "60ft" #Hydraulic, Pneumatic and Electrical systems + x_nose_landing_gear = "14ft" + x_main_landing_gear_offset = "1 ft" # main LG offset behind the wing lift centroid + + x_APU = "122 ft" + + x_fixed_weight = "7ft" #Cockpit/ pilots etc + +# Engine positions + x_engines = "47 ft" + y_critical_engines = "14.5 ft" # y location of engines that would cause max yaw here + +[Fuselage.Weights] + stringer = 0.35 # (Weight of stringers)/ Wskin + frame = 0.25 # (Weight of frame)/ Wskin + additional = 0.20 # (Additional weight)/ Wskin + + fixed_weight = "3000 lbf" #cockpit, pilots etc + + window_per_length = 435.0 #[N/m] + window_insul_per_area = 22.0 #[N/m2] + floor_weight_per_area = 60.0 #[N/m2] + + HPE_sys_weight_fraction = 0.010 # W_HPEsys/WMTO + LG_nose_weight_fraction = 0.011 # Wlgnose/WMTO + LG_main_weight_fraction = 0.044 # Wlgmain/WMTO + + APU_weight_fraction = 0.035 # W_APU/W_payload + seat_weight_fraction = 0.10 # Wseats/W_payload + add_payload_weight_fraction = 0.35 # Additional payload proportional Wfrac + +[Fuselage.Aero] + fuse_moment_volume_deriv = "1450.0 ft3" # d(Mfuse/q)/dCL + CL_zero_fuse_moment = 0.185 # CL when Mfuse = 0 + #Fuselage velocity overspeed at wing + wingroot_fuse_overspeed = 0.0125 + wingbreak_fuse_overspeed = 0.01 + wingtip_fuse_overspeed = 0.003 + + excrescence_drag_factor = 1.1 # Rivets, sheet breaks etc + + BLI_frac = 0.0 #Fraction of fuselage BL KE defect ingested + +[Wing] + wing_planform = 1 # 0: Wing cantilever, plain + # 1: Wing cantilever with engine + strut_braced_wing = false + + sweep = 26.0 # wing sweep in degrees + AR = 8.7 + maxSpan = "100 ft" + + inner_panel_taper_ratio = 0.7 #cs/co + outer_panel_taper_ratio = 0.225 #ct/co + + panel_break_location = 0.370 # eta_s panel break eta location. eta = y/b + + center_box_halfspan = "4.30 ft" + box_width_chord = 0.50 + root_thickness_to_chord = 0.135 + spanbreak_thickness_to_chord = 0.12 + + hweb_to_hbox = 0.75 #web-height/hbox ratio + spar_box_x_c = 0.40 # spar box axis x/c location + + x_wing_box = "55 ft" + z_wing = "-4.0 ft" + z_strut = "154 in" #Note only used if `strut_braced_wing = true` CHECK + + #Only used if `sturt_braced_wing == true`: + strut_toc = 0.15 #strut thickness to chord + strut_local_velocity_ratio = 1.0 # V_strut/V_freestream + +[Wing.Aero] + fuselage_lift_carryover_loss_factor = -0.3 + wing_tip_lift_rolloff_factor = -0.05 + + lowspeed_cdf = 0.0085 + lowspeed_cdp = 0.0035 + Re_ref = 20e6 + + #Only used if strut present + strut_lowspeed_cdf = 0.0085 + strut_lowspeed_cdp = 0.0035 + strut_Re_ref = 1e6 + + Reynolds_scaling = -0.15 # = aRe, used for Re-scaling CD = cd*(Re/Re_ref)^aRe + + excrescence_drag_factor = 1.08 # Rivets, sheet breaks etc + + BLI_frac = 0.0 #Fraction of wing BL KE defect ingested + +# Spanwise cl and cm distributions: +[Wing.Aero.Takeoff] + cls_clo = 1.1 #rcls = break/root cl ratio = cls/clo + clt_clo = 0.6 #rclt = tip /root cl ratio = clt/clo + cm_o = -0.20 # root section cm + cm_s = -0.20 # span-break section cm + cm_t = -0.02 # tip section cm + +[Wing.Aero.Climb] #used for all clean situations + cls_clo = 1.3 #rcls = break/root cl ratio = cls/clo + clt_clo = 1.25 #rclt = tip /root cl ratio = clt/clo + cm_o = -0.06 # root section cm + cm_s = -0.06 # span-break section cm + cm_t = -0.06 # tip section cm + +[Wing.Aero.Landing] #Forward-CG tail sizing case + cls_clo = 1.1 #rcls = break/root cl ratio = cls/clo + clt_clo = 0.5 #rclt = tip /root cl ratio = clt/clo + cm_o = -0.35 # root section cm + cm_s = -0.35 # span-break section cm + cm_t = -0.15 # tip section cm + +[Wing.Weightfracs] + # Weight fractions of flight surfaces and secondary wing components + # as fractions of the sturctural wing box weight + flap = 0.2 #flaps, flap mounts and actuators weight fraction + slat = 0.1 #slats, slat mounts and actuators weight fraction + aileron = 0.04 #ailerons, aileron mounts and actuators weight fraction + leading_trailing_edge = 0.1 + ribs = 0.15 # Ribs, local stiffeners, reinforcements + spoilers = 0.020 # Spoilers, spolier mounts and attachements + attachments = 0.03 # Wing attachment hardware + + + +[Stabilizers] + + #Tail profile drags: + lowspeed_cdf = 0.0060 + lowspeed_cdp = 0.0030 + Re_ref = 10e6 + + excrescence_drag_factor = 1.08 # Rivets, sheet breaks etc + + [Stabilizers.Htail] + AR_Htail = 5.8 + taper = 0.25 + sweep = 25.0 #typically can be set to be the same as the wings + center_box_halfspan = "2.5 ft" + x_Htail = "115 ft" + z_Htail = "4 ft" + + max_tail_download = -0.5 # = CLh/CLmax. Tail download param at max load case. + + # How do you want to size the horizontal stabilizers? + HTsize = "maxforwardCG" # Options are "Vh" or "maxforwardCG" + # 1: set Sh via specified Vh + # 2: set Sh via CLhCGfwd at max-forward CG during landing + Vh = 1.3 # Horizontal tail volume (only used if HTsize == "Vh") + CLh_at_max_forward_CG = -0.6 # (only used if HTsize == "maxforwardCG") + + move_wingbox = "SMmin" # 0: "fix" wing position + # 1: move wing to get CLh="CLhspec" in cruise + # 2: move wing to get min static margin = "SMmin" + + SM_min = 0.15 # Minimum static margin + CLh_spec = -0.02 + + downwash_factor = 0.55 #dε/dα + nacelle_lift_curve_slope = 3.8 #dCL_nacelle/dα + # Recommend ~3.8 for wing mounted nacelle + # ~0.0 for rear mounted nacelle + CD_Htail_from_center = 0.1 #CDhtail contribution factor from center part 0 < y < yoh + CLh_max = 2.0 + + added_weight_fraction = 0.30 # e.g. ribs, LE, elevator, attachments + + box_width_chord = 0.50 + box_height_chord = 0.12 + web_height_hbox = 0.75 + + [Stabilizers.Vtail] + AR_Vtail = 2.0 + taper = 0.30 + sweep = 25.0 + center_box_halfspan = 0.0 + x_Vtail = "113 ft" + number_Vtails = 1.0 + + VTsize = "Vv" # Options are "Vv" or "OEI" + # 1: set Vtail area Sv via specified Vv + # 2: set Vtail area Sv via engine-out trim CL + Vv = 0.12 # only used if VTsize == "Vv" + CLv_at_engine_out = 0.5 # only used if VTsize == "OEI" + CLv_max = 2.6 + + added_weight_fraction = 0.40 # e.g. ribs, LE, rudder, attachments + + box_width_chord = 0.50 + box_height_chord = 0.12 + web_height_hbox = 0.75 + +[Structures] + stress_factor = 1.0 # convenient factor to multiply all stress below + + # Allowable stresses at sizing cases: + ## Fuselage pressurization skin stress and bending skin+stringer stress + skin_material = "TASOPT-Al" + skin_max_avg_stress = 1.1 + skin_safety_factor = 3.0 + # the sigma_max works out to be roughly 15e3 lbf/in2 + + bending_material = "TASOPT-Al" + bending_max_avg_stress = 1.1 + bending_safety_factor = 1.5 + # the sigma_max works out to be roughly 30e3 lbf/in2 + + cone_material = "TASOPT-Al" + cone_max_avg_stress = 1.1 + cone_safety_factor = 2.0 + + floor_material = "TASOPT-Al" + floor_max_avg_stress = 1.1 + floor_safety_factor = 1.5 + + ## Wing and tail bending and shear stresses + sigma_caps = "30e3 lbf/in2" + sigma_struts = "30e3 lbf/in2" + tau_webs = "20e3 lbf/in2" + + fuse_shell_modulus_ratio = 1.0 # Ebend/Eskin + + E_wing_spar_cap = "10e6 lbf/in2" + E_struts = "10e6 lbf/in2" + + # Material densities (Aluminium) + wing_tail_cap_density = 2700.0 + wing_tail_web_density = 2700.0 + strut_density = 2700.0 + +[Propulsion] + + number_of_engines = 2 + T_max_metal = 1250.0 + + Tt4_takeoff = 1541.7 + Tt4_frac_bottom_of_climb = 0.2 + Tt4_frac_top_of_climb = 0.2 + Tt4_cruise = 1326.6 + + # Core in clean flow or does core ingests KE defect? + core_in_clean_flow = true + +[Propulsion.Turbomachinery] + + BPR = 5.0 + gear_ratio = 1.0 #Fan gear ratio. 1 => direct drive turbofan + + OPR = 28.0 + Fan_PR = 1.6 + LPC_PR = 8.0 + + diffuser_PR = 0.995 + burner_PR = 0.94 + fan_nozzle_PR = 0.98 + core_nozzle_PR = 0.995 + + fan_eta_poly = 0.9 + LPC_eta_poly = 0.89 + HPC_eta_poly = 0.88 + HPT_eta_poly = 0.9 + LPT_eta_poly = 0.9 + + #Fan efficiency function constants -> epoly_actual = epolyf + Kf*(FPR-FPR0) + FPR0 = 1.65 + Kf_polyeff = -0.077 + + HTR_fan = 0.30 + HTR_LPC = 0.60 + HTR_HPC = 0.80 + + M2 = 0.60 + M25 = 0.60 + + low_spool_loss = 0.01 + high_spool_loss = 0.022 + +[Propulsion.Combustor] + combustion_efficiency = 0.985 + +[Propulsion.Cooling] + hot_streak_T_allowance = 200.0 + M_turbine_blade_exit = 1.0 + St = 0.09 # area-weighted effective Stanton number + e_film_cooling = 0.70 #blade-to-cooling flow heat transfer eff + t_film_cooling = 0.30 #cooling-film effectiveness factor + M41 = 0.9 # Mach number at start of cooling-air mixing zone + cooling_air_V_ratio = 0.3 #v_cool/v_edge velocity ratio of exiting cooling air + +[Propulsion.Offtakes] + LPC_mass_offtake_per_pax = 0.008 + LPC_mass_offtake_per_max_mass = 0.0000085 + + Low_spool_power_offtake_per_pax = 200.0 + Low_spool_power_offtake_per_max_mass = 0.5 + + Tt_offtake_air = 300.0 + Pt_offtake_air = 30000.0 + +[Propulsion.Nozzles] +#Nozzle area factors relative to cruise design_area + + fan_nozzle_area.static = 1.0 + fan_nozzle_area.rotation = 1.0 + fan_nozzle_area.cutback = 1.0 + fan_nozzle_area.climbstart = 1.0 + fan_nozzle_area.climbend = 1.0 + fan_nozzle_area.descentstart = 1.0 + fan_nozzle_area.descentend = 1.0 + + core_nozzle_area.static = 1.0 + core_nozzle_area.rotation = 1.0 + core_nozzle_area.cutback = 1.0 + core_nozzle_area.climbstart = 1.0 + core_nozzle_area.climbend = 1.0 + core_nozzle_area.descentstart = 1.0 + core_nozzle_area.descentend = 1.0 + + +[Propulsion.Nacelles] + nacelle_pylon_wetted_area_ratio = 16.0 # = rSnace = wetted area/fan area + nacelle_local_velocity_ratio = 1.02 # local/freestream velocity + +[Propulsion.HeatExchangers] #Default model does not have heat exchangers in the propulsion system + recirculation_flag = 0 + recirculation_temperature = 0 + latent_heat = 0 + core_inner_diameter = 0 + + precooler_order = 0 + precooler_effectiveness = 0 + precooler_inlet_mach = 0 + + intercooler_order = 0 + intercooler_effectiveness = 0 + intercooler_inlet_mach = 0 + + regenerative_order = 0 + regenerative_effectiveness = 0 + regenerative_inlet_mach = 0 + + turbine_cooler_order = 0 + turbine_cooler_effectiveness = 0 + turbine_cooler_inlet_mach = 0 + +[Propulsion.Weight] + engine_access_weight_fraction = 0.10 # feadd Weadd/Wbare engine accessories, fuel system fraction + pylon_weight_fraction = 0.10 # fpylon Wpylon/We+a+n engine pylon weight fraction + weight_model = "basic" #Options are "MD": Mark Drela's original model + # "basic": NF's new model with basic tech + #"advanced": NF's new model with advanced tech diff --git a/src/IO/default_wide.toml b/src/IO/default_wide.toml new file mode 100644 index 00000000..2c6b2a4d --- /dev/null +++ b/src/IO/default_wide.toml @@ -0,0 +1,496 @@ +# This is a template TOML input file and are the default values that will +# be used by TASOPT +["Aircraft Description"] + name = "Wide Body TASOPT Model" + description = """ + This model file describes a basic twin-aisle aircraft. + """ + aircraft_type = "Wide Body Aircraft" # 0: Regional Aircraft + # 1: Narrow Body Aircraft + # 2: Wide Body Aircraft + +#-------------------------------------------------# +## Note on units ## +#-------------------------------------------------# +# TASOPT input files can parse the following units. +# if no units are provided or pure numerical values are +# provided then they are assumed to be in SI units. +# ╔══════════╦══════════╦══════════════════════════╗ +# ║ Quantity ║ SI units ║ Other allowed units ║ +# ╠══════════╬══════════╬═════╦═══════╦═══════╦════╣ +# ║ mass ║ kg ║ g ║ lbm ║ ║ ║ +# ╠══════════╬══════════╬═════╬═══════╬═══════╬════╣ +# ║ distance ║ m ║ km ║ nmi ║ ft ║ in ║ +# ╠══════════╬══════════╬═════╬═══════╬═══════╬════╣ +# ║ area ║ m2 ║ ║ ║ ft2 ║ in2║ +# ╠══════════╬══════════╬═════╬═══════╬═══════╬════╣ +# ║ volume ║ m3 ║ ║ ║ ft3 ║ in3║ +# ╠══════════╬══════════╬═════╬═══════╬═══════╬════╣ +# ║ force ║ N ║ kN ║ lbf ║ ║ ║ +# ╠══════════╬══════════╬═════╬═══════╬═══════╬════╣ +# ║ pressure ║ Pa ║ atm ║lbf/in2║lbf/ft2║ psi║ +# ╠══════════╬══════════╬═════╬═══════╬═══════╬════╣ +# ║ speed ║ m/s ║ kts ║ km/hr ║ ft/s ║ ║ +# ╠══════════╬══════════╬═════╬═══════╬═══════╬════╣ +# ║ power ║ W ║ kW ║ MW ║ hp ║ ║ +# ╠══════════╬══════════╬═════╬═══════╬═══════╬════╣ +# ║ angle ║ rad ║ deg ║ ║ ║ ║ +# ╚══════════╩══════════╩═════╩═══════╩═══════╩════╝ + +[Options] # + + optimize = false # Do you want TASOPT to optimize the aircraft or just size it + + engine_location = "wing" # 1: Engines on "wing" + # 2: Engines on "fuselage" + + prop_sys_arch = "TF" #Options are TF: Turbofan + # TE: Turbo-electric +[Fuel] + fuel_type = "Jet-A" # Choices are ... [TODO] + fuel_in_wing = true # Is fuel stored in wings? + fuel_in_wingcen = true # Is fuel stored in wing center box? + fuel_usability_factor = 1 # fraction of max fuel volume that is usable + + fuel_temp = 280.0 + fuel_density = 810.0 #kg/m3 + +[Mission] + N_missions = 1 # Number of missions to be modeled (first mission is the design mission) + pax = 370 # Number of passengers in each mission + max_pax = 450 # Maximum number of passengers for aircarft + # defines the maximum payload carrying capacity of the aircraft + + range = "7800.0 nmi" # Design Range + + weight_per_pax = "230.0 lbf" # Specify weight per passenger - + # includes luggage [lbm or lbf or kg or N] + # judging you if you use imperial units but wtvs + + fuel_reserves = 0.07 # W_reserveFuel / W_fuelburned + + Nlift = 3.0 # Max vertical load factor for wing bending loads + Vne = "280 kts" # Never exceed IAS for tail loads + +[Mission.Takeoff] + takeoff_alt = "0.0 ft" + takeoff_T = 288.2 + + max_balanced_field_length = "8800.0 ft" + Nland = 6.0 # Max vertical load factor for fuse bending loads + + CL_max_perp = 2.8 #CLmax/(cos(sweep))^2 + CD_dead_engine = 0.50 #CDA_fan/ A_fan + CD_landing_gear = 0.015 #CD*Agear/ Sref + CD_spoilers = 0.10 #CD*Aspoiler/ Sref + + rolling_resistance_coeff = 0.025 + braking_resistance_coeff = 0.35 + + takeoff_obstacle_height = "35 ft" + +[Mission.Climb] + minimum_top-of-climb_gradient = 0.015 + +[Mission.Cruise] + cruise_alt = "32000.0 ft" + cruise_mach = 0.84 + cruise_CL = 0.51 + +[Mission.Descent] + descent_angle_top-of-descent = "-3 deg" + descent_angle_bottom-of-descent = "-3 deg" + +[Fuselage] + cabin_pressure_altitude = "8000.0 ft" + +[Fuselage.Geometry] + number_of_bubbles = 1 # SingleBubble or MultiBubble Designs + radius = "122 in" # Fuselage radius + dRadius = "0 in" # Downward shift of lower bubbles + y_offset = 0.0 # y offset of bubble center + floor_depth = "8.0 in" # depth of floor beams + Nwebs = 0 # number of webs (for double bubble designs) + + a_nose = 1.65 # Nose radius = Rfuse*(1 - xi^a_nose)^(1/a_nose) + b_tail = 2.0 # Tail radius = Rfuse*(1 - xi^b_tail) + tailcone_taper = 0.3 + taper_fuse_to = "point" # Options are "point" or "edge" + + # Tail load fuselage bending moment inertial relief factor + HT_load_fuse_bend_relief = 0.4 + VT_load_fuse_bend_relief = 0.7 +# Overall fuselage layout + #Use provided layout (false) or recalculate it (true) for maximum pax keeping deltas + calculate_cabin_length = false + + double_decker = false #if true, the fuselage has two passenger decks + seat_pitch = "30 in" + seat_width = "19 in" + aisle_halfwidth = "10 in" + + #Provided layout + x_nose_tip = "0 ft" + x_pressure_shell_fwd = "38 ft" + x_start_cylinder = "40 ft" + x_end_cylinder = "171 ft" + x_pressure_shell_aft = "204 ft" + x_cone_end = "235 ft" + x_end = "242 ft" + +# Power systems and landing gear locations + x_HPE_sys = "125 ft" #Hydraulic, Pneumatic and Electrical systems + x_nose_landing_gear = "28 ft" + x_main_landing_gear_offset = "3 ft" # main LG offset behind the wing lift centroid + + x_APU = "232 ft" + + x_fixed_weight = "10 ft" #Cockpit/ pilots etc + +# Engine positions + x_engines = "102 ft" + y_critical_engines = "32 ft" # y location of engines that would cause max yaw + + +[Fuselage.Weights] + stringer = 0.35 # (Weight of stringers)/ Wskin + frame = 0.24 # (Weight of frame)/ Wskin + additional = 0.20 # (Additional weight)/ Wskin + + fixed_weight = "3000 lbf" #cockpit, pilots etc + + window_per_length = 145.0 #[N/m] + window_insul_per_area = 40.0 #[N/m2] + floor_weight_per_area = 60.0 #[N/m2] + + HPE_sys_weight_fraction = 0.010 # W_HPEsys/WMTO + LG_nose_weight_fraction = 0.010 # Wlgnose/WMTO + LG_main_weight_fraction = 0.040 # Wlgmain/WMTO + + APU_weight_fraction = 0.035 # W_APU/W_payload + seat_weight_fraction = 0.10 # Wseats/W_payload + add_payload_weight_fraction = 0.35 # Additional payload proportional Wfrac + +[Fuselage.Aero] + fuse_moment_volume_deriv = "7470.0 ft3" # d(Mfuse/q)/dCL + CL_zero_fuse_moment = 0.185 # CL when Mfuse = 0 + #Fuselage velocity overspeed at wing + wingroot_fuse_overspeed = 0.019 + wingbreak_fuse_overspeed = 0.014 + wingtip_fuse_overspeed = 0.004 + + excrescence_drag_factor = 1.03 # Rivets, sheet breaks etc + + BLI_frac = 0.0 #Fraction of fuselage BL KE defect ingested + +[Wing] + wing_planform = 1 # 0: Wing cantilever, plain + # 1: Wing cantilever with engine + strut_braced_wing = false + + sweep = 29 # wing sweep in degrees + AR = 8.8 + maxSpan = "213 ft" + + inner_panel_taper_ratio = 0.58 #cs/co #NOT CHANGED + outer_panel_taper_ratio = 0.1 #ct/co + + panel_break_location = 0.32 # eta_s panel break eta location. eta = y/b + + center_box_halfspan = "120.0 in" + box_width_chord = 0.50 + root_thickness_to_chord = 0.1 + spanbreak_thickness_to_chord = 0.108 + + hweb_to_hbox = 0.9 #web-height/hbox ratio + spar_box_x_c = 0.04 # spar box axis x/c location + + x_wing_box = "114 ft" + z_wing = "-7 ft" + z_strut = "154 in" #Note only used if `strut_braced_wing = true` + + #Only used if `sturt_braced_wing == true`: + strut_toc = 0.15 #strut thickness to chord + strut_local_velocity_ratio = 1.0 # V_strut/V_freestream + +[Wing.Aero] + fuselage_lift_carryover_loss_factor = -0.3 + wing_tip_lift_rolloff_factor = -0.05 + + lowspeed_cdf = 0.0085 + lowspeed_cdp = 0.0035 + Re_ref = 20e6 + + #Only used if strut present + strut_lowspeed_cdf = 0.0085 + strut_lowspeed_cdp = 0.0035 + strut_Re_ref = 1e6 + + Reynolds_scaling = -0.15 # = aRe, used for Re-scaling CD = cd*(Re/Re_ref)^aRe + + excrescence_drag_factor = 1.02 # Rivets, sheet breaks etc + + BLI_frac = 0.0 #Fraction of wing BL KE defect ingested + +# Spanwise cl and cm distributions: +[Wing.Aero.Takeoff] + cls_clo = 1.1 #rcls = break/root cl ratio = cls/clo + clt_clo = 0.6 #rclt = tip /root cl ratio = clt/clo + cm_o = -0.30 # root section cm + cm_s = -0.30 # span-break section cm + cm_t = -0.05 # tip section cm + +[Wing.Aero.Climb] #used for all clean situations + cls_clo = 1.1320 #rcls = break/root cl ratio = cls/clo + clt_clo = 1.0266 #rclt = tip /root cl ratio = clt/clo #TODO + cm_o = -0.1 # root section cm + cm_s = -0.1 # span-break section cm + cm_t = -0.1 # tip section cm + +[Wing.Aero.Landing] #Forward-CG tail sizing case + cls_clo = 1.1320 #rcls = break/root cl ratio = cls/clo + clt_clo = 1.0266 #rclt = tip /root cl ratio = clt/clo + cm_o = -0.1 # root section cm + cm_s = -0.1 # span-break section cm + cm_t = -0.1 # tip section cm + +[Wing.Weightfracs] + # Weight fractions of flight surfaces and secondary wing components + # as fractions of the sturctural wing box weight + flap = 0.2 #flaps, flap mounts and actuators weight fraction + slat = 0.1 #slats, slat mounts and actuators weight fraction + aileron = 0.04 #ailerons, aileron mounts and actuators weight fraction + leading_trailing_edge = 0.1 + ribs = 0.15 # Ribs, local stiffeners, reinforcements + spoilers = 0.020 # Spoilers, spolier mounts and attachements + attachments = 0.03 # Wing attachment hardware + + + +[Stabilizers] + + #Tail profile drags: + lowspeed_cdf = 0.0060 + lowspeed_cdp = 0.0035 + Re_ref = 10e6 + + excrescence_drag_factor = 1.02 # Rivets, sheet breaks etc + + [Stabilizers.Htail] + AR_Htail = 4.8 + taper = 0.32 + sweep = 33.0 #typically can be set to be the same as the wings + center_box_halfspan = "5 ft" + x_Htail = "220 ft" + z_Htail = "9 ft" + + max_tail_download = -0.5 # = CLh/CLmax. Tail download param at max load case. + + # How do you want to size the horizontal stabilizers? + HTsize = "maxforwardCG" # Options are "Vh" or "maxforwardCG" + # 1: set Sh via specified Vh + # 2: set Sh via CLhCGfwd at max-forward CG during landing + Vh = 0.85 # Horizontal tail volume (only used if HTsize == "Vh") + CLh_at_max_forward_CG = -1 # (only used if HTsize == "maxforwardCG") + + move_wingbox = "SMmin" # 0: "fix" wing position + # 1: move wing to get CLh="CLhspec" in cruise + # 2: move wing to get min static margin = "SMmin" + + SM_min = 0.15 # Minimum static margin + CLh_spec = -0.02 + + downwash_factor = 0.60 #dε/dα + nacelle_lift_curve_slope = 3.8 #dCL_nacelle/dα + # Recommend ~3.8 for wing mounted nacelle + # ~0.0 for rear mounted nacelle + CD_Htail_from_center = 0.1 #CDhtail contribution factor from center part 0 < y < yoh + CLh_max = 1.5 + + added_weight_fraction = 0.30 # e.g. ribs, LE, elevator, attachments + + box_width_chord = 0.50 + box_height_chord = 0.14 + web_height_hbox = 0.75 + + [Stabilizers.Vtail] + AR_Vtail = 2.35 + taper = 0.25 + sweep = 28.0 + center_box_halfspan = 0.0 + x_Vtail = "212 ft" + number_Vtails = 1.0 + + VTsize = "Vv" # Options are "Vv" or "OEI" + # 1: set Vtail area Sv via specified Vv + # 2: set Vtail area Sv via engine-out trim CL + Vv = 0.06 # only used if VTsize == "Vv" + CLv_at_engine_out = 11.675933 # 0.5 # only used if VTsize == "OEI" + CLv_max = 2.0 + + added_weight_fraction = 0.40 # e.g. ribs, LE, rudder, attachments + + box_width_chord = 0.50 + box_height_chord = 0.14 + web_height_hbox = 0.75 + +[Structures] + stress_factor = 1.0 # convenient factor to multiply all stress below + + # Allowable stresses at sizing cases: + ## Fuselage pressurization skin stress and bending skin+stringer stress + skin_material = "TASOPT-Al" + skin_max_avg_stress = 1.1 + skin_safety_factor = 3.0 + # the sigma_max works out to be roughly 15e3 lbf/in2 + + bending_material = "TASOPT-Al" + bending_max_avg_stress = 1.1 + bending_safety_factor = 1.5 + # the sigma_max works out to be roughly 30e3 lbf/in2 + + cone_material = "TASOPT-Al" + cone_max_avg_stress = 1.1 + cone_safety_factor = 2.0 + + floor_material = "TASOPT-Al" + floor_max_avg_stress = 1.1 + floor_safety_factor = 1.5 + + ## Wing and tail bending and shear stresses + sigma_caps = "30e3 lbf/in2" + sigma_struts = "30e3 lbf/in2" + tau_webs = "20e3 lbf/in2" + + fuse_shell_modulus_ratio = 1.0 # Ebend/Eskin + + E_wing_spar_cap = "10e6 lbf/in2" + E_struts = "10e6 lbf/in2" + + # Material densities (Aluminium) + wing_tail_cap_density = 2700.0 + wing_tail_web_density = 2700.0 + strut_density = 2700.0 + +[Propulsion] + + number_of_engines = 2 + T_max_metal = 1350 + + Tt4_takeoff = 1785.6 + Tt4_frac_bottom_of_climb = 0.2 + Tt4_frac_top_of_climb = 0.2 + Tt4_cruise = 1590.6 + + # Core in clean flow or does core ingests KE defect? + core_in_clean_flow = true + +[Propulsion.Turbomachinery] + + BPR = 7.2 + gear_ratio = 1.0 #Fan gear ratio. 1 => direct drive turbofan TODO + + OPR = 39.9 + Fan_PR = 1.6 + LPC_PR = 1.86 + + #Commented out means I couldn't find the values and thus using default + diffuser_PR = 0.995 + burner_PR = 0.94 + fan_nozzle_PR = 0.985 + core_nozzle_PR = 0.995 + + fan_eta_poly = 0.916 + LPC_eta_poly = 0.908 + HPC_eta_poly = 0.902 + HPT_eta_poly = 0.896 + LPT_eta_poly = 0.905 + + #Fan efficiency function constants -> epoly_actual = epolyf + Kf*(FPR-FPR0) + FPR0 = 1.55 + Kf_polyeff = -0.077 + + HTR_fan = 0.30 + HTR_LPC = 0.60 + HTR_HPC = 0.80 + + M2 = 0.65 + M25 = 0.60 + + low_spool_loss = 0.01 + high_spool_loss = 0.022 + +[Propulsion.Combustor] + combustion_efficiency = 0.985 + +[Propulsion.Cooling] + hot_streak_T_allowance = 200.0 + M_turbine_blade_exit = 1.0 + St = 0.08 # area-weighted effective Stanton number + e_film_cooling = 0.70 #blade-to-cooling flow heat transfer eff + t_film_cooling = 0.30 #cooling-film effectiveness factor + M41 = 1.0 # Mach number at start of cooling-air mixing zone + cooling_air_V_ratio = 0.3 #v_cool/v_edge velocity ratio of exiting cooling air + +[Propulsion.Offtakes] + LPC_mass_offtake_per_pax = 0.008 + LPC_mass_offtake_per_max_mass = 0.0000085 + + Low_spool_power_offtake_per_pax = 200.0 + Low_spool_power_offtake_per_max_mass = 0.5 + + Tt_offtake_air = 300.0 + Pt_offtake_air = 30e3 + +[Propulsion.Nozzles] +#Nozzle area factors relative to cruise design_area + + fan_nozzle_area.static = 1.0 + fan_nozzle_area.rotation = 1.0 + fan_nozzle_area.cutback = 1.0 + fan_nozzle_area.climbstart = 1.0 + fan_nozzle_area.climbend = 1.0 + fan_nozzle_area.descentstart = 1.0 + fan_nozzle_area.descentend = 1.0 + + core_nozzle_area.static = 1.0 + core_nozzle_area.rotation = 1.0 + core_nozzle_area.cutback = 1.0 + core_nozzle_area.climbstart = 1.0 + core_nozzle_area.climbend = 1.0 + core_nozzle_area.descentstart = 1.0 + core_nozzle_area.descentend = 1.0 + + +[Propulsion.Nacelles] + nacelle_pylon_wetted_area_ratio = 12.0 # = rSnace = wetted area/fan area + nacelle_local_velocity_ratio = 1.02 # local/freestream velocity + +[Propulsion.HeatExchangers] #Default model does not have heat exchangers in the propulsion system + recirculation_flag = 0 + recirculation_temperature = 0 + latent_heat = 0 + core_inner_diameter = 0 + + precooler_order = 0 + precooler_effectiveness = 0 + precooler_inlet_mach = 0 + + intercooler_order = 0 + intercooler_effectiveness = 0 + intercooler_inlet_mach = 0 + + regenerative_order = 0 + regenerative_effectiveness = 0 + regenerative_inlet_mach = 0 + + turbine_cooler_order = 0 + turbine_cooler_effectiveness = 0 + turbine_cooler_inlet_mach = 0 + +[Propulsion.Weight] + engine_access_weight_fraction = 0.10 # feadd Weadd/Wbare engine accessories, fuel system fraction + pylon_weight_fraction = 0.05 # fpylon Wpylon/We+a+n engine pylon weight fraction + weight_model = "basic" #Options are "MD": Mark Drela's original model + # "basic": NF's new model with basic tech + #"advanced": NF's new model with advanced tech diff --git a/src/IO/read_input.jl b/src/IO/read_input.jl index ff119e7a..f8596954 100644 --- a/src/IO/read_input.jl +++ b/src/IO/read_input.jl @@ -27,6 +27,20 @@ function read_input(k::String, dict::AbstractDict=data, end end +function get_default_input_file(input) + if input == 0 || input == "Regional Aircraft" + defaultfile = joinpath(TASOPT.__TASOPTroot__, "IO/default_regional.toml") + elseif input == 1 || input == "Narrow Body Aircraft" + defaultfile = joinpath(TASOPT.__TASOPTroot__, "IO/default_input.toml") + elseif input == 2 || input == "Wide Body Aircraft" + defaultfile = joinpath(TASOPT.__TASOPTroot__, "IO/default_wide.toml") + else + println("\n") + @info """Requested aircraft type not supported. Selecting Narrow Body Aircraft""" + defaultfile = joinpath(TASOPT.__TASOPTroot__, "IO/default_input.toml") + end + return TOML.parsefile(defaultfile) +end # Convenience functions to convert to SI units Speed(x) = convertSpeed(parse_unit(x)...) Distance(x) = convertDist(parse_unit(x)...) @@ -85,6 +99,17 @@ ac_descrip = get(data, "Aircraft Description", Dict{}) name = get(ac_descrip, "name", "Untitled Model") description = get(ac_descrip, "description", "---") sized = get(ac_descrip, "sized",[false]) + +# Check if aircraft type exists +if "aircraft_type" in keys(ac_descrip) + default = get_default_input_file(ac_descrip["aircraft_type"]) + ac_type_fixed = true +else + println("\n") + @info """Aircraft Type not specified: Selecting AC type depending on range or payload""" + ac_type_fixed = false +end + #Get number of missions to create data arrays mis = read_input("Mission", data, default) dmis = default["Mission"] @@ -98,6 +123,39 @@ pare = zeros(Float64, (ietotal, iptotal, nmisx)) fuselage = Fuselage() +# Setup mission variables +ranges = readmis("range") +parm[imRange, :] .= Distance.(ranges) + +if !ac_type_fixed + if parm[imRange, 1] <= 2600 * nmi_to_m + default = get_default_input_file(0) + @info """Setting AC Type based on design range: Regional Aircraft""" + elseif parm[imRange, 1] <= 3115 * nmi_to_m + default = get_default_input_file(1) + @info """Setting AC Type based on design range: Narrow Body Aircraft""" + elseif parm[imRange, 1] <= 8500 * nmi_to_m + default = get_default_input_file(2) + @info """Setting AC Type based on design range: Wide Body Aircraft""" + end + ac_type_fixed = true +end + +maxpax = readmis("max_pax") +pax = readmis("pax") +despax = pax[1] #Design number of passengers +if despax > maxpax + error("Design mission has higher # of passengers than max passengers for aircraft!") +end + +Wpax = Force(readmis("weight_per_pax")) +parm[imWperpax, :] .= Wpax +parm[imWpay, :] .= pax * Wpax +parg[igWpaymax] = maxpax * Wpax +parg[igfreserve] = readmis("fuel_reserves") +parg[igVne] = Speed(readmis("Vne")) +parg[igNlift] = readmis("Nlift") + # Setup option variables options = read_input("Options", data, default) doptions = default["Options"] @@ -160,21 +218,6 @@ pari[iifwing] = readfuel("fuel_in_wing") pari[iifwcen] = readfuel("fuel_in_wingcen") parg[igrWfmax] = readfuel("fuel_usability_factor") -# Setup mission variables -ranges = readmis("range") -parm[imRange, :] .= Distance.(ranges) - -maxpax = readmis("max_pax") -pax = readmis("pax") -despax = pax[1] #Design number of passengers -Wpax = Force(readmis("weight_per_pax")) -parm[imWperpax, :] .= Wpax -parm[imWpay, :] .= pax * Wpax -parg[igWpaymax] = maxpax * Wpax -parg[igfreserve] = readmis("fuel_reserves") -parg[igVne] = Speed(readmis("Vne")) -parg[igNlift] = readmis("Nlift") - ##Takeoff takeoff = readmis("Takeoff") dtakeoff = dmis["Takeoff"] From 6810a71edcfc297467001804bb444f12bdfefe08 Mon Sep 17 00:00:00 2001 From: Aditeya Shukla Date: Thu, 12 Sep 2024 10:36:03 -0400 Subject: [PATCH 2/3] lowercase change --- src/IO/read_input.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/IO/read_input.jl b/src/IO/read_input.jl index f8596954..9d99500f 100644 --- a/src/IO/read_input.jl +++ b/src/IO/read_input.jl @@ -28,11 +28,11 @@ function read_input(k::String, dict::AbstractDict=data, end function get_default_input_file(input) - if input == 0 || input == "Regional Aircraft" + if input == 0 || lowercase(input) == "regional aircraft" defaultfile = joinpath(TASOPT.__TASOPTroot__, "IO/default_regional.toml") - elseif input == 1 || input == "Narrow Body Aircraft" + elseif input == 1 || lowercase(input) == "narrow body aircraft" defaultfile = joinpath(TASOPT.__TASOPTroot__, "IO/default_input.toml") - elseif input == 2 || input == "Wide Body Aircraft" + elseif input == 2 || lowercase(input) == "wide body aircraft" defaultfile = joinpath(TASOPT.__TASOPTroot__, "IO/default_wide.toml") else println("\n") From 03cb2a5f1b5c16ee792cff6947313397de32713e Mon Sep 17 00:00:00 2001 From: Aditeya Shukla Date: Thu, 12 Sep 2024 10:57:07 -0400 Subject: [PATCH 3/3] pushing change again --- src/IO/read_input.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/IO/read_input.jl b/src/IO/read_input.jl index 9d99500f..34d5b59d 100644 --- a/src/IO/read_input.jl +++ b/src/IO/read_input.jl @@ -28,11 +28,11 @@ function read_input(k::String, dict::AbstractDict=data, end function get_default_input_file(input) - if input == 0 || lowercase(input) == "regional aircraft" + if input == 0 || lowercase(string(input)) == "regional aircraft" defaultfile = joinpath(TASOPT.__TASOPTroot__, "IO/default_regional.toml") - elseif input == 1 || lowercase(input) == "narrow body aircraft" + elseif input == 1 || lowercase(string(input)) == "narrow body aircraft" defaultfile = joinpath(TASOPT.__TASOPTroot__, "IO/default_input.toml") - elseif input == 2 || lowercase(input) == "wide body aircraft" + elseif input == 2 || lowercase(string(input)) == "wide body aircraft" defaultfile = joinpath(TASOPT.__TASOPTroot__, "IO/default_wide.toml") else println("\n")