import aerosandbox.numpy as np
[docs]def thrust_turbofan(
mass_turbofan: float,
) -> float:
"""
Estimates the maximum rated dry thrust of a turbofan engine. A regression to historical data.
Based on data for both civilian and military turbofans, available in:
`aerosandbox/library/datasets/turbine_engines/data.xlsx`
Applicable to both turbojets and turbofans, and with sizes ranging from micro-turbines (<1 kg) to large transport
aircraft turbofans.
See studies in `/AeroSandbox/studies/TurbofanStudies/make_fit_thrust.py` for model details.
Args:
mass_turbofan: The mass of the turbofan engine. [kg]
Returns:
The maximum (rated takeoff) dry thrust of the turbofan engine. [N]
"""
p = {'a': 12050.719283568596, 'w': 0.9353861810025565}
return (
p["a"] * mass_turbofan ** p["w"]
)
[docs]def thrust_specific_fuel_consumption_turbofan(
mass_turbofan: float,
bypass_ratio: float,
) -> float:
"""
Estimates the thrust-specific fuel consumption (TSFC) of a turbofan engine. A regression to historical data.
Based on data for both civilian and military turbofans, available in:
`aerosandbox/library/datasets/turbine_engines/data.xlsx`
Applicable to both turbojets and turbofans, and with sizes ranging from micro-turbines (<1 kg) to large transport
aircraft turbofans.
See studies in `/AeroSandbox/studies/TurbofanStudies/make_fit_tsfc.py` for model details.
"""
p = {'a' : 3.2916082331121034e-05, 'Weight [kg]': -0.07792863839756586, 'BPR': -0.3438158689838915,
'BPR2': 0.29880079602955967}
return (
p["a"]
* mass_turbofan ** p["Weight [kg]"]
* (bypass_ratio + p["BPR2"]) ** p["BPR"]
)
[docs]def mass_turbofan(
m_dot_core_corrected,
overall_pressure_ratio,
bypass_ratio,
diameter_fan,
):
"""
Computes the combined mass of a bare turbofan, nacelle, and accessory and pylon weights.
Bare weight depends on m_dot, OPR, and BPR.
Nacelle weight is a function of various areas and fan diameter.
From TASOPT documentation by Mark Drela, available here: http://web.mit.edu/drela/Public/web/tasopt/TASOPT_doc.pdf
Section: "Turbofan Weight Model from Historical Data"
Args:
m_dot_core_corrected: The mass flow of the core only, corrected to standard conditions. [kg/s]
overall_pressure_ratio: The overall pressure ratio (OPR) [-]
bypass_ratio: The bypass ratio (BPR) [-]
diameter_fan: The diameter of the fan. [m]
Returns: The total engine mass. [kg]
"""
kg_to_lbm = 2.20462262
m_to_ft = 1 / 0.3048
##### Compute bare turbofan weight
m_dot_core_corrected_lbm_per_sec = m_dot_core_corrected * kg_to_lbm # Converts from kg/s to lbm/s
### Parameters determined via least-squares fitting by Drela in TASOPT doc.
b_m = 1
b_pi = 1
b_alpha = 1.2
W_0_lbm = 1684.5
W_pi_lbm = 17.7
W_alpha_lbm = 1662.2
W_bare_lbm = (
m_dot_core_corrected_lbm_per_sec / 100
) ** b_m * (
W_0_lbm +
W_pi_lbm * (overall_pressure_ratio / 30) ** b_pi +
W_alpha_lbm * (bypass_ratio / 5) ** b_alpha
)
W_bare = W_bare_lbm / kg_to_lbm
##### Compute nacelle weight
### Nondimensional parameters, given by Drela in TASOPT doc.
r_s_nace = 12
f_inlet = 0.4
f_fan = 0.2
f_exit = 0.4
r_core = 12
### Fan size in imperial units
d_fan_ft = diameter_fan * m_to_ft
d_fan_in = d_fan_ft * 12
### Compute the diameter of the LPC based on fan diameter and BPR.
d_LPC_ft = d_fan_ft * (bypass_ratio) ** -0.5
### Models from Drela in TASOPT
S_nace_sqft = r_s_nace * np.pi * (d_fan_ft / 2) ** 2
A_inlet_sqft = f_inlet * S_nace_sqft
A_fan_sqft = f_fan * S_nace_sqft
A_exit_sqft = f_exit * S_nace_sqft
A_core_sqft = r_core * np.pi * (d_LPC_ft / 2) ** 2
W_inlet_lbm = A_inlet_sqft * (2.5 + 0.0238 * d_fan_in)
W_fan_lbm = A_fan_sqft * 1.9
W_exit_lbm = A_exit_sqft * (2.5 * 0.0363 * d_fan_in)
W_core_lbm = A_core_sqft * 1.9
W_nace_lbm = W_inlet_lbm + W_fan_lbm + W_exit_lbm + W_core_lbm
W_nace = W_nace_lbm / kg_to_lbm
##### Compute accessory and pylon weights
### Nondimensional parameters, given by Drela in TASOPT doc
f_add = 0.10
f_pylon = 0.10
W_add = f_add * W_bare
W_pylon = f_pylon * (W_bare + W_add + W_nace)
##### Compute the total weight
W_engine = W_bare + W_add + W_nace + W_pylon
return W_engine
[docs]def m_dot_corrected_over_m_dot(
temperature_total_2,
pressure_total_2,
):
"""
Computes the ratio `m_dot_corrected / m_dot`, where:
* `m_dot_corrected` is the corrected mass flow rate, where corrected refers to correction to ISO 3977 standard
temperature and pressure conditions (15C, 101325 Pa).
* `m_dot` is the raw mass flow rate, at some other conditions.
Args:
temperature_total_2: The total temperature at the compressor inlet face, at the conditions to be evaluated. [K]
pressure_total_2: The total pressure at the compressor inlet face, at the conditions to be evaluated. [Pa]
Returns:
The ratio `m_dot_corrected / m_dot`.
"""
temperature_standard = 273.15 + 15
pressure_standard = 101325
return (
temperature_total_2 / temperature_standard
) ** 0.5 / (pressure_total_2 / pressure_standard)
if __name__ == '__main__':
import aerosandbox as asb
[docs] atmo = asb.Atmosphere(altitude=10668)
op_point = asb.OperatingPoint(atmo, velocity=0.80 * atmo.speed_of_sound())
m_dot_corrected_over_m_dot_ratio = m_dot_corrected_over_m_dot(
temperature_total_2=op_point.total_temperature(),
pressure_total_2=op_point.total_pressure()
)
### CFM56-2 engine test
mass_cfm56_2 = mass_turbofan( # Data here from Wikipedia, cross-referenced to other sources for sanity check.
m_dot_core_corrected=364 / (5.95 + 1),
overall_pressure_ratio=31.2,
bypass_ratio=5.95,
diameter_fan=1.73
) # real mass: (2139 to 2200 kg bare, ~3400 kg installed)