Source code for RCAIDE.Library.Methods.Powertrain.Propulsors.Turbofan.design_turbofan
# RCAIDE/Library/Methods/Powertrain/Propulsors/Turbofan/design_turbofan.py
#
# Created: Jul 2024, RCAIDE Team
# ----------------------------------------------------------------------------------------------------------------------
# IMPORT
# ----------------------------------------------------------------------------------------------------------------------
# RCAIDE Imports
import RCAIDE
from RCAIDE.Library.Methods.Powertrain.Converters.Ram import compute_ram_performance
from RCAIDE.Library.Methods.Powertrain.Converters.Combustor import compute_combustor_performance
from RCAIDE.Library.Methods.Powertrain.Converters.Compressor import compute_compressor_performance
from RCAIDE.Library.Methods.Powertrain.Converters.Fan import compute_fan_performance
from RCAIDE.Library.Methods.Powertrain.Converters.Turbine import compute_turbine_performance
from RCAIDE.Library.Methods.Powertrain.Converters.Expansion_Nozzle import compute_expansion_nozzle_performance
from RCAIDE.Library.Methods.Powertrain.Converters.Compression_Nozzle import compute_compression_nozzle_performance
from RCAIDE.Library.Methods.Powertrain.Propulsors.Turbofan import size_core
from RCAIDE.Library.Methods.Powertrain import setup_operating_conditions
# Python package imports
import numpy as np
# ----------------------------------------------------------------------------------------------------------------------
# Design Turbofan
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def design_turbofan(turbofan):
"""
Computes performance properties of a turbofan engine at the design point by linking
and analyzing the thermodynamic cycle of its components.
Parameters
----------
turbofan : RCAIDE.Library.Components.Propulsors.Turbofan
Turbofan engine component with the following attributes:
- tag : str
Identifier for the turbofan
- design_mach_number : float
Design Mach number
- design_altitude : float
Design altitude [m]
- design_isa_deviation : float
ISA temperature deviation at design point [K]
- working_fluid : Data
Working fluid properties object
- reference_temperature : float
Reference temperature for mass flow scaling [K]
- reference_pressure : float
Reference pressure for mass flow scaling [Pa]
- bypass_ratio : float
Bypass ratio of the turbofan
- ram : Data
Ram component
- tag : str
Identifier for the ram
- inlet_nozzle : Data
Inlet nozzle component
- tag : str
Identifier for the inlet nozzle
- fan : Data
Fan component
- tag : str
Identifier for the fan
- low_pressure_compressor : Data
Low pressure compressor component
- tag : str
Identifier for the low pressure compressor
- high_pressure_compressor : Data
High pressure compressor component
- tag : str
Identifier for the high pressure compressor
- combustor : Data
Combustor component
- tag : str
Identifier for the combustor
- high_pressure_turbine : Data
High pressure turbine component
- tag : str
Identifier for the high pressure turbine
- low_pressure_turbine : Data
Low pressure turbine component
- tag : str
Identifier for the low pressure turbine
- core_nozzle : Data
Core nozzle component
- tag : str
Identifier for the core nozzle
- fan_nozzle : Data
Fan nozzle component
- tag : str
Identifier for the fan nozzle
Returns
-------
None
Notes
-----
This function performs a complete design analysis of a turbofan engine by:
1. Setting up atmospheric conditions at the design point
2. Creating a mission segment for the design point
3. Sequentially analyzing each component in the engine's thermodynamic cycle
4. Linking the output conditions of each component to the input conditions of the next
5. Sizing the core flow to meet the design requirements
6. Computing sea level static performance
The function follows this sequence for component analysis:
1. Ram (inlet)
2. Inlet nozzle
3. Fan
4. Low pressure compressor
5. High pressure compressor
6. Combustor
7. High pressure turbine
8. Low pressure turbine
9. Core nozzle
10. Fan nozzle
**Major Assumptions**
* US Standard Atmosphere 1976
* Steady state operation
* One-dimensional flow through components
* Adiabatic components except for the combustor
* Perfect gas behavior with variable properties
References
----------
[1] Mattingly, J.D., "Elements of Gas Turbine Propulsion", 2nd Edition, AIAA Education Series, 2005. https://soaneemrana.org/onewebmedia/ELEMENTS%20OF%20GAS%20TURBINE%20PROPULTION2.pdf
[2] Cantwell, B., "AA283 Course Notes", Stanford University. https://web.stanford.edu/~cantwell/AA283_Course_Material/AA283_Course_BOOK/AA283_Aircraft_and_Rocket_Propulsion_BOOK_Brian_J_Cantwell_May_28_2024.pdf
See Also
--------
RCAIDE.Library.Methods.Powertrain.Propulsors.Turbofan.compute_turbofan_performance
RCAIDE.Library.Methods.Powertrain.Propulsors.Turbofan.size_core
"""
# check if mach number and temperature are passed
if(turbofan.design_mach_number==None) and (turbofan.design_altitude==None):
raise NameError('The sizing conditions require an altitude and a Mach number')
else:
#call the atmospheric model to get the conditions at the specified altitude
atmosphere = RCAIDE.Framework.Analyses.Atmospheric.US_Standard_1976()
atmo_data = atmosphere.compute_values(turbofan.design_altitude,turbofan.design_isa_deviation)
planet = RCAIDE.Library.Attributes.Planets.Earth()
p = atmo_data.pressure
T = atmo_data.temperature
rho = atmo_data.density
a = atmo_data.speed_of_sound
mu = atmo_data.dynamic_viscosity
U = a*turbofan.design_mach_number
# setup conditions
conditions = RCAIDE.Framework.Mission.Common.Results()
# freestream conditions
conditions.freestream.altitude = np.atleast_1d(turbofan.design_altitude)
conditions.freestream.mach_number = np.atleast_1d(turbofan.design_mach_number)
conditions.freestream.pressure = np.atleast_1d(p)
conditions.freestream.temperature = np.atleast_1d(T)
conditions.freestream.density = np.atleast_1d(rho)
conditions.freestream.dynamic_viscosity = np.atleast_1d(mu)
conditions.freestream.gravity = np.atleast_1d(planet.compute_gravity(turbofan.design_altitude))
conditions.freestream.isentropic_expansion_factor = np.atleast_1d(turbofan.working_fluid.compute_gamma(T,p))
conditions.freestream.Cp = np.atleast_1d(turbofan.working_fluid.compute_cp(T,p))
conditions.freestream.R = np.atleast_1d(turbofan.working_fluid.gas_specific_constant)
conditions.freestream.speed_of_sound = np.atleast_1d(a)
conditions.freestream.velocity = np.atleast_1d(U)
segment = RCAIDE.Framework.Mission.Segments.Segment()
segment.state.conditions = conditions
turbofan.append_operating_conditions(segment,conditions.energy,conditions.noise)
ram = turbofan.ram
inlet_nozzle = turbofan.inlet_nozzle
fan = turbofan.fan
low_pressure_compressor = turbofan.low_pressure_compressor
high_pressure_compressor = turbofan.high_pressure_compressor
combustor = turbofan.combustor
high_pressure_turbine = turbofan.high_pressure_turbine
low_pressure_turbine = turbofan.low_pressure_turbine
core_nozzle = turbofan.core_nozzle
fan_nozzle = turbofan.fan_nozzle
bypass_ratio = turbofan.bypass_ratio
# unpack component conditions
turbofan_conditions = conditions.energy.propulsors[turbofan.tag]
ram_conditions = conditions.energy.converters[ram.tag]
inlet_nozzle_conditions = conditions.energy.converters[inlet_nozzle.tag]
fan_conditions = conditions.energy.converters[fan.tag]
lpc_conditions = conditions.energy.converters[low_pressure_compressor.tag]
hpc_conditions = conditions.energy.converters[high_pressure_compressor.tag]
combustor_conditions = conditions.energy.converters[combustor.tag]
lpt_conditions = conditions.energy.converters[low_pressure_turbine.tag]
hpt_conditions = conditions.energy.converters[high_pressure_turbine.tag]
core_nozzle_conditions = conditions.energy.converters[core_nozzle.tag]
fan_nozzle_conditions = conditions.energy.converters[fan_nozzle.tag]
# Step 1: Set the working fluid to determine the fluid properties
ram.working_fluid = turbofan.working_fluid
# Step 2: Compute flow through the ram , this computes the necessary flow quantities and stores it into conditions
compute_ram_performance(ram,conditions)
# Step 3: link inlet nozzle to ram
inlet_nozzle_conditions.inputs.stagnation_temperature = ram_conditions.outputs.stagnation_temperature
inlet_nozzle_conditions.inputs.stagnation_pressure = ram_conditions.outputs.stagnation_pressure
inlet_nozzle_conditions.inputs.static_temperature = ram_conditions.outputs.static_temperature
inlet_nozzle_conditions.inputs.static_pressure = ram_conditions.outputs.static_pressure
inlet_nozzle_conditions.inputs.mach_number = ram_conditions.outputs.mach_number
inlet_nozzle.working_fluid = ram.working_fluid
# Step 4: Compute flow through the inlet nozzle
compute_compression_nozzle_performance(inlet_nozzle,conditions)
# Step 5: Link the fan to the inlet nozzle
fan_conditions.inputs.stagnation_temperature = inlet_nozzle_conditions.outputs.stagnation_temperature
fan_conditions.inputs.stagnation_pressure = inlet_nozzle_conditions.outputs.stagnation_pressure
fan_conditions.inputs.static_temperature = inlet_nozzle_conditions.outputs.static_temperature
fan_conditions.inputs.static_pressure = inlet_nozzle_conditions.outputs.static_pressure
fan_conditions.inputs.mach_number = inlet_nozzle_conditions.outputs.mach_number
fan.working_fluid = inlet_nozzle.working_fluid
# Step 6: Compute flow through the fan
compute_fan_performance(fan,conditions)
# Step 7: Link low pressure compressor to the inlet nozzle
lpc_conditions.inputs.stagnation_temperature = fan_conditions.outputs.stagnation_temperature
lpc_conditions.inputs.stagnation_pressure = fan_conditions.outputs.stagnation_pressure
lpc_conditions.inputs.static_temperature = fan_conditions.outputs.static_temperature
lpc_conditions.inputs.static_pressure = fan_conditions.outputs.static_pressure
lpc_conditions.inputs.mach_number = fan_conditions.outputs.mach_number
low_pressure_compressor.working_fluid = fan.working_fluid
low_pressure_compressor.reference_temperature = turbofan.reference_temperature
low_pressure_compressor.reference_pressure = turbofan.reference_pressure
# Step 8: Compute flow through the low pressure compressor
compute_compressor_performance(low_pressure_compressor,conditions)
# Step 9: Link the high pressure compressor to the low pressure compressor
hpc_conditions.inputs.stagnation_temperature = lpc_conditions.outputs.stagnation_temperature
hpc_conditions.inputs.stagnation_pressure = lpc_conditions.outputs.stagnation_pressure
hpc_conditions.inputs.static_temperature = lpc_conditions.outputs.static_temperature
hpc_conditions.inputs.static_pressure = lpc_conditions.outputs.static_pressure
hpc_conditions.inputs.mach_number = lpc_conditions.outputs.mach_number
high_pressure_compressor.working_fluid = low_pressure_compressor.working_fluid
high_pressure_compressor.reference_temperature = turbofan.reference_temperature
high_pressure_compressor.reference_pressure = turbofan.reference_pressure
# Step 10: Compute flow through the high pressure compressor
compute_compressor_performance(high_pressure_compressor,conditions)
# Step 11: Link the combustor to the high pressure compressor
combustor_conditions.inputs.stagnation_temperature = hpc_conditions.outputs.stagnation_temperature
combustor_conditions.inputs.stagnation_pressure = hpc_conditions.outputs.stagnation_pressure
combustor_conditions.inputs.static_temperature = hpc_conditions.outputs.static_temperature
combustor_conditions.inputs.static_pressure = hpc_conditions.outputs.static_pressure
combustor_conditions.inputs.mach_number = hpc_conditions.outputs.mach_number
combustor.working_fluid = high_pressure_compressor.working_fluid
# Step 12: Compute flow through the high pressor compressor
compute_combustor_performance(combustor,conditions)
# Step 13: Link the high pressure turbione to the combustor
hpt_conditions.inputs.stagnation_temperature = combustor_conditions.outputs.stagnation_temperature
hpt_conditions.inputs.stagnation_pressure = combustor_conditions.outputs.stagnation_pressure
hpt_conditions.inputs.fuel_to_air_ratio = combustor_conditions.outputs.fuel_to_air_ratio
hpt_conditions.inputs.static_temperature = combustor_conditions.outputs.static_temperature
hpt_conditions.inputs.static_pressure = combustor_conditions.outputs.static_pressure
hpt_conditions.inputs.mach_number = combustor_conditions.outputs.mach_number
hpt_conditions.inputs.compressor = hpc_conditions.outputs
hpt_conditions.inputs.fan = fan_conditions.outputs
hpt_conditions.inputs.bypass_ratio = 0.0
high_pressure_turbine.working_fluid = combustor.working_fluid
# Step 14: Compute flow through the high pressure turbine
compute_turbine_performance(high_pressure_turbine,conditions)
# Step 15: Link the low pressure turbine to the high pressure turbine
lpt_conditions.inputs.stagnation_temperature = hpt_conditions.outputs.stagnation_temperature
lpt_conditions.inputs.stagnation_pressure = hpt_conditions.outputs.stagnation_pressure
lpt_conditions.inputs.static_temperature = hpt_conditions.outputs.static_temperature
lpt_conditions.inputs.static_pressure = hpt_conditions.outputs.static_pressure
lpt_conditions.inputs.mach_number = hpt_conditions.outputs.mach_number
low_pressure_turbine.working_fluid = high_pressure_turbine.working_fluid
lpt_conditions.inputs.compressor = lpc_conditions.outputs
lpt_conditions.inputs.fuel_to_air_ratio = combustor_conditions.outputs.fuel_to_air_ratio
lpt_conditions.inputs.fan = fan_conditions.outputs
lpt_conditions.inputs.bypass_ratio = bypass_ratio
# Step 16: Compute flow through the low pressure turbine
compute_turbine_performance(low_pressure_turbine,conditions)
# Step 17: Link the core nozzle to the low pressure turbine
core_nozzle_conditions.inputs.stagnation_temperature = lpt_conditions.outputs.stagnation_temperature
core_nozzle_conditions.inputs.stagnation_pressure = lpt_conditions.outputs.stagnation_pressure
core_nozzle_conditions.inputs.static_temperature = lpt_conditions.outputs.static_temperature
core_nozzle_conditions.inputs.static_pressure = lpt_conditions.outputs.static_pressure
core_nozzle_conditions.inputs.mach_number = lpt_conditions.outputs.mach_number
core_nozzle.working_fluid = low_pressure_turbine.working_fluid
# Step 18: Compute flow through the core nozzle
compute_expansion_nozzle_performance(core_nozzle,conditions)
# Step 19: Link the fan nozzle to the fan
fan_nozzle_conditions.inputs.stagnation_temperature = fan_conditions.outputs.stagnation_temperature
fan_nozzle_conditions.inputs.stagnation_pressure = fan_conditions.outputs.stagnation_pressure
fan_nozzle_conditions.inputs.static_temperature = fan_conditions.outputs.static_temperature
fan_nozzle_conditions.inputs.static_pressure = fan_conditions.outputs.static_pressure
fan_nozzle_conditions.inputs.mach_number = fan_conditions.outputs.mach_number
fan_nozzle.working_fluid = fan.working_fluid
# Step 20: Compute flow through the fan nozzle
compute_expansion_nozzle_performance(fan_nozzle,conditions)
# Step 21: Link the turbofan to outputs from various compoments
turbofan_conditions.bypass_ratio = bypass_ratio
turbofan_conditions.fan_nozzle_exit_velocity = fan_nozzle_conditions.outputs.velocity
turbofan_conditions.fan_nozzle_area_ratio = fan_nozzle_conditions.outputs.area_ratio
turbofan_conditions.fan_nozzle_static_pressure = fan_nozzle_conditions.outputs.static_pressure
turbofan_conditions.core_nozzle_area_ratio = core_nozzle_conditions.outputs.area_ratio
turbofan_conditions.core_nozzle_static_pressure = core_nozzle_conditions.outputs.static_pressure
turbofan_conditions.core_nozzle_exit_velocity = core_nozzle_conditions.outputs.velocity
turbofan_conditions.fuel_to_air_ratio = combustor_conditions.outputs.fuel_to_air_ratio
turbofan_conditions.total_temperature_reference = lpc_conditions.outputs.stagnation_temperature
turbofan_conditions.total_pressure_reference = lpc_conditions.outputs.stagnation_pressure
turbofan_conditions.flow_through_core = 1./(1.+bypass_ratio) #scaled constant to turn on core thrust computation
turbofan_conditions.flow_through_fan = bypass_ratio/(1.+bypass_ratio) #scaled constant to turn on fan thrust computation
# Step 22: Size the core of the turbofan
size_core(turbofan,conditions)
# Step 23: Static Sea Level Thrust
atmo_data_sea_level = atmosphere.compute_values(0.0,0.0)
V = atmo_data_sea_level.speed_of_sound[0][0]*0.01
operating_state = setup_operating_conditions(turbofan, altitude = 0,velocity_range=np.array([V]))
operating_state.conditions.energy.propulsors[turbofan.tag].throttle[:,0] = 1.0
sls_T,_,sls_P,_,_,_ = turbofan.compute_performance(operating_state)
turbofan.sealevel_static_thrust = sls_T[0][0]
turbofan.sealevel_static_power = sls_P[0][0]
return