Source code for RCAIDE.Library.Methods.Powertrain.Propulsors.Turbofan.compute_thurst
# RCAIDE/Methods/Energy/Propulsors/Turbofan/compute_thrust.py
#
#
# Created: Jul 2023, M. Clarke
# ----------------------------------------------------------------------------------------------------------------------
# IMPORT
# ----------------------------------------------------------------------------------------------------------------------
# RCAIDE imports
from RCAIDE.Framework.Core import Units
# Python package imports
import numpy as np
# ----------------------------------------------------------------------------------------------------------------------
# compute_thrust
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def compute_thrust(turbofan,conditions):
"""
Computes thrust and other performance metrics for a turbofan engine.
Parameters
----------
turbofan : RCAIDE.Library.Components.Propulsors.Turbofan
Turbofan engine component with the following attributes:
- tag : str
Identifier for the turbofan
- reference_temperature : float
Reference temperature for mass flow scaling [K]
- reference_pressure : float
Reference pressure for mass flow scaling [Pa]
- compressor_nondimensional_massflow : float
Non-dimensional mass flow parameter [kg·√K/(s·Pa)]
- SFC_adjustment : float
Adjustment factor for specific fuel consumption
conditions : RCAIDE.Framework.Mission.Common.Conditions
Flight conditions with:
- freestream : Data
Freestream properties
- isentropic_expansion_factor : numpy.ndarray
Ratio of specific heats (gamma)
- velocity : numpy.ndarray
Freestream velocity [m/s]
- speed_of_sound : numpy.ndarray
Speed of sound [m/s]
- mach_number : numpy.ndarray
Freestream Mach number
- pressure : numpy.ndarray
Freestream pressure [Pa]
- gravity : numpy.ndarray
Gravitational acceleration [m/s²]
- specific_heat_at_constant_pressure : numpy.ndarray
Specific heat at constant pressure [J/(kg·K)]
- energy.propulsors[turbofan.tag] : Data
Turbofan-specific conditions
- fuel_to_air_ratio : numpy.ndarray
Fuel-to-air ratio
- total_temperature_reference : numpy.ndarray
Reference total temperature [K]
- total_pressure_reference : numpy.ndarray
Reference total pressure [Pa]
- fan_nozzle_exit_velocity : numpy.ndarray
Fan nozzle exit velocity [m/s]
- fan_nozzle_static_pressure : numpy.ndarray
Fan nozzle static pressure [Pa]
- fan_nozzle_area_ratio : numpy.ndarray
Fan nozzle area ratio
- core_nozzle_exit_velocity : numpy.ndarray
Core nozzle exit velocity [m/s]
- core_nozzle_static_pressure : numpy.ndarray
Core nozzle static pressure [Pa]
- core_nozzle_area_ratio : numpy.ndarray
Core nozzle area ratio
- flow_through_core : numpy.ndarray
Fraction of flow through core
- flow_through_fan : numpy.ndarray
Fraction of flow through fan
- bypass_ratio : numpy.ndarray
Bypass ratio
- throttle : numpy.ndarray
Throttle setting [0-1]
Returns
-------
None
Results are stored in conditions.energy.propulsors[turbofan.tag]:
- thrust : numpy.ndarray
Total thrust force [N]
- fan_thrust : numpy.ndarray
Thrust from fan stream [N]
- core_thrust : numpy.ndarray
Thrust from core stream [N]
- thrust_specific_fuel_consumption : numpy.ndarray
Thrust specific fuel consumption [kg/(N·hr)]
- non_dimensional_thrust : numpy.ndarray
Non-dimensional thrust
- core_mass_flow_rate : numpy.ndarray
Core mass flow rate [kg/s]
- fuel_flow_rate : numpy.ndarray
Fuel flow rate [kg/s]
- power : numpy.ndarray
Power output [W]
- specific_impulse : numpy.ndarray
Specific impulse [s]
Notes
-----
This function implements a thermodynamic model for a turbofan engine to calculate
thrust, fuel consumption, and other performance metrics. It computes thrust from
both the core and fan streams, accounting for momentum and pressure forces.
**Major Assumptions**
* Perfect gas behavior
* Thrust is calculated from momentum and pressure forces at the nozzle exits
**Theory**
The non-dimensional thrust components are calculated as:
.. math::
F_{nd,fan} = \\phi_{fan} \\cdot (\\gamma \\cdot M_0^2 \\cdot (V_{fan}/V_0 - 1) + A_{fan} \\cdot (P_{fan}/P_0 - 1))
F_{nd,core} = \\phi_{core} \\cdot (\\gamma \\cdot M_0^2 \\cdot (V_{core}/V_0 - 1) + A_{core} \\cdot (P_{core}/P_0 - 1))
where:
* :math:`\\phi_{fan}` is the flow through fan fraction
* :math:`\\phi_{core}` is the flow through core fraction
* :math:`\\gamma` is the ratio of specific heats
* :math:`M_0` is the freestream Mach number
* :math:`V_{fan}` is the fan nozzle exit velocity
* :math:`V_{core}` is the core nozzle exit velocity
* :math:`V_0` is the freestream velocity
* :math:`A_{fan}` is the fan nozzle area ratio
* :math:`A_{core}` is the core nozzle area ratio
* :math:`P_{fan}` is the fan nozzle static pressure
* :math:`P_{core}` is the core nozzle static pressure
* :math:`P_0` is the freestream pressure
The specific thrust is then:
.. math::
F_{sp} = \\frac{F_{nd,fan} + F_{nd,core}}{\\gamma \\cdot M_0}
References
----------
[1] Cantwell, B., "AA283 Course Notes", Stanford University. https://web.stanford.edu/~cantwell/AA283_Course_Material/
See Also
--------
RCAIDE.Library.Methods.Powertrain.Propulsors.Turbofan.compute_turbofan_performance
RCAIDE.Library.Methods.Powertrain.Propulsors.Turbofan.size_core
"""
# Unpack flight conditions
gamma = conditions.freestream.isentropic_expansion_factor
u0 = conditions.freestream.velocity
a0 = conditions.freestream.speed_of_sound
M0 = conditions.freestream.mach_number
p0 = conditions.freestream.pressure
g = conditions.freestream.gravity
# Unpack turbofan operating conditions and properties
Tref = turbofan.reference_temperature
Pref = turbofan.reference_pressure
mdhc = turbofan.compressor_nondimensional_massflow
SFC_adjustment = turbofan.specific_fuel_consumption_reduction_factor
turbofan_conditions = conditions.energy.propulsors[turbofan.tag]
f = turbofan_conditions.fuel_to_air_ratio
total_temperature_reference = turbofan_conditions.total_temperature_reference
total_pressure_reference = turbofan_conditions.total_pressure_reference
flow_through_core = turbofan_conditions.flow_through_core
flow_through_fan = turbofan_conditions.flow_through_fan
V_fan_nozzle = turbofan_conditions.fan_nozzle_exit_velocity
fan_area_ratio = turbofan_conditions.fan_nozzle_area_ratio
P_fan_nozzle = turbofan_conditions.fan_nozzle_static_pressure
P_core_nozzle = turbofan_conditions.core_nozzle_static_pressure
V_core_nozzle = turbofan_conditions.core_nozzle_exit_velocity
core_area_ratio = turbofan_conditions.core_nozzle_area_ratio
bypass_ratio = turbofan_conditions.bypass_ratio
# Compute non dimensional thrust
fan_thrust_nondim = flow_through_fan*(gamma*M0*M0*(V_fan_nozzle/u0-1.) + fan_area_ratio*(P_fan_nozzle/p0-1.))
core_thrust_nondim = flow_through_core*(gamma*M0*M0*(V_core_nozzle/u0-1.) + core_area_ratio*(P_core_nozzle/p0-1.))
thrust_nondim = core_thrust_nondim + fan_thrust_nondim
# Computing Specifc Thrust
Fsp = 1./(gamma*M0)*thrust_nondim
Fsp_c = 1./(gamma*M0)*core_thrust_nondim
Fsp_f = 1./(gamma*M0)*fan_thrust_nondim
# Compute specific impulse
Isp = Fsp*a0*(1.+bypass_ratio)/(f*g)
# Compute TSFC
TSFC = f*g/(Fsp*a0*(1.+bypass_ratio))*(1.-SFC_adjustment) * Units.hour # 1/s is converted to 1/hr here
# Compute core mass flow
mdot_core = mdhc*np.sqrt(Tref/total_temperature_reference)*(total_pressure_reference/Pref)
# Compute dimensional thrust
FD2 = Fsp*a0*(1.+bypass_ratio)*mdot_core*turbofan_conditions.throttle
FD2_f = Fsp_f*a0*(1.+bypass_ratio)*mdot_core*turbofan_conditions.throttle
FD2_c = Fsp_c*a0*(1.+bypass_ratio)*mdot_core*turbofan_conditions.throttle
# Compute power
power = FD2*u0
# Compute fuel flow rate
fuel_flow_rate = np.fmax(FD2*TSFC/g,np.array([0.]))*1./Units.hour
# Pack turbofan outouts
turbofan_conditions.thrust = FD2
turbofan_conditions.fan_thrust = FD2_f
turbofan_conditions.core_thrust = FD2_c
turbofan_conditions.thrust_specific_fuel_consumption = TSFC
turbofan_conditions.non_dimensional_thrust = Fsp
turbofan_conditions.power = power
turbofan_conditions.specific_impulse = Isp
turbofan_conditions.core_mass_flow_rate = mdot_core
turbofan_conditions.fuel_flow_rate = fuel_flow_rate
return