Fuel Weight#
This section describes the code used for computing the fuel weight fraction for a given MTOW value and parameter class object. As described in mission analysis section, only the methods for cruise and loiter segments are refined. The remaining segments are same as initial weight estimation. The cruise and loiter segments are divided into many smaller parts and compute fuel burnt in those smaller segments. The total total fuel burnt is just the sum of all the fuel burnt in those smaller segments.
Below code block defines function for computing cruise and loiter weight fraction.
import numpy as np
import nbimporter
from parameters import AircraftParameters
def compute_cruise_weight_fraction(parameters: AircraftParameters, weight, R, cruise_speed, num_segements=100):
"""
Compute the weight fraction for cruise segment
Parameters
----------
weight : float
Initial weight at the beginning of cruise (lbs)
R : float
Range of cruise (ft)
cruise_speed : float
speed during cruise (ft/s)
num_segements : int
Number of segments to divide the cruise into
Returns
-------
cruise_weight_fraction: float
Total weight fraction for the cruise segment
avg_power_req: float
Average power required during cruise (hp)
avg_CL_cruise: float
Average lift coefficient during cruise
"""
# Parameters
A = parameters.A
S = parameters.S
rho = parameters.rho_cruise
CD0 = parameters.CD0
e = parameters.e
PI = parameters.PI
Cbhp = parameters.Cbhp
install_loss_factor = parameters.install_loss_factor
prop_eff_cruise = parameters.prop_eff_cruise
segment_range = R / num_segements # segment range, ft
segment_time = segment_range / cruise_speed / 3600 # hr
q = 0.5 * rho * cruise_speed**2 # lbs/sq ft
K = 1/PI/A/e
# initialize empty lists
cruise_fuel = 0
power_req = []
cruise_CL = []
for i in range(num_segements):
# Compute Cd
CL = weight / q / S
cruise_CL.append(CL)
CD = CD0 + K * CL**2
# Compute power required for this segment
T = CD * q * S / install_loss_factor # lbs
segment_power = T * cruise_speed / prop_eff_cruise / 550 # hp
power_req.append(segment_power)
# fuel spent
segment_fuel = Cbhp * segment_power * segment_time # lbs
cruise_fuel += segment_fuel
weight = weight - segment_fuel # weight at the end of the segment
cruise_weight_fraction = weight / (weight + cruise_fuel)
avg_power_req = np.mean(power_req)
avg_cruise_CL = np.mean(cruise_CL)
return cruise_weight_fraction, avg_power_req, avg_cruise_CL
def compute_loiter_weight_fraction(parameters: AircraftParameters, weight, E, num_segements=100):
"""
Compute the weight fraction for loiter segment
Parameters
----------
weight : float
Initial weight at the beginning of loiter (lbs)
E : float
loiter time (sec)
num_segements : int
Number of segments to divide the loiter into
Returns
-------
weight_fraction: float
Total weight fraction for the loiter segment
avg_power_req: float
Average power required during loiter (hp)
avg_speed_loiter: float
Average speed during loiter
"""
# Parameters
A = parameters.A
S = parameters.S
rho = parameters.rho_loiter
CD0 = parameters.CD0
e = parameters.e
PI = parameters.PI
Cbhp = parameters.Cbhp
install_loss_factor = parameters.install_loss_factor
prop_eff_loiter = parameters.prop_eff_loiter
segment_time = E / num_segements / 3600 # hr
K = 1/PI/A/e
CL = (3*CD0/K)**0.5 # for max endurance for a prop airplane
CD = CD0 + K * CL**2
# initialize empty lists
loiter_fuel = 0
power_req = []
loiter_speed = []
for i in range(num_segements):
V = ( weight/S * 2/rho * 1/CL )**0.5 # ft/s
loiter_speed.append(V)
q = 0.5 * rho * V**2 # lbs/sq ft
# Compute power required for this segment
T = CD * q * S / install_loss_factor # lbs
segment_power = T * V / prop_eff_loiter / 550 # hp
power_req.append(segment_power)
# fuel spent
segment_fuel = Cbhp * segment_power * segment_time # lbs
loiter_fuel += segment_fuel
weight = weight - segment_fuel # weight at the end of the segment
loiter_weight_fraction = weight / (weight + loiter_fuel)
avg_power_req = np.mean(power_req)
avg_loiter_speed = np.mean(loiter_speed)
return loiter_weight_fraction, avg_power_req, avg_loiter_speed
Below code block defines a function for fuel weight estimation:
def compute_fuel_weight(parameters: AircraftParameters, weight):
"""
Method to compute fuel weight fraction for a given maximum takeoff weight
This function essentially performs mission analysis
"""
R = parameters.range
W0 = weight
W1_W0 = parameters.W1_W0
W2_W1 = parameters.W2_W1
W4_W3 = parameters.W4_W3
# Compute cruise weight fraction
weight = W2_W1 * W1_W0 * weight # weight at the start of cruise
W3_W2, avg_cruise_power, avg_cruise_CL = compute_cruise_weight_fraction(parameters, weight, R, parameters.cruise_speed)
parameters.W3_W2 = W3_W2
parameters.avg_cruise_power = avg_cruise_power
parameters.avg_cruise_CL = avg_cruise_CL
# Compute loiter weight fraction
W5_W4 = parameters.W5_W4
weight = W5_W4 * W4_W3 * W3_W2 * weight # weight at the start of loiter
W6_W5, avg_loiter_power, avg_loiter_speed = compute_loiter_weight_fraction(parameters, weight, parameters.endurance)
parameters.W6_W5 = W6_W5
parameters.avg_loiter_power = avg_loiter_power
parameters.avg_loiter_speed = avg_loiter_speed
W7_W6 = parameters.W7_W6
W8_W7 = parameters.W8_W7
# compute final weight fraction
W8_W0 = W8_W7 * W7_W6 * W6_W5 * W5_W4 * W4_W3 * W3_W2 * W2_W1 * W1_W0 # mission weight fraction
Wf_W0 = 1.06 * (1 - W8_W0) # 6% is for trapped unusable fuel
parameters.fuel_weight = Wf_W0 * W0
return parameters.fuel_weight # fuel weight
Below code block demonstrates how the fuel weight function can be used:
# Parameters
A = 8
S = 134 # sq ft
max_power = 595 # hp
aircraft = AircraftParameters(A, S, max_power)
# Weight
MTOW = 5000 # lbs
fuel_weight = compute_fuel_weight(aircraft, MTOW) # lbs
print(f"Fuel weight for MTOW of {MTOW:.0f} lbs: {fuel_weight:.0f} lbs")
Fuel weight for MTOW of 5000 lbs: 1456 lbs
This concludes the fuel weight fraction estimation module, next section describes module for empty weight estimation.