Source code for RCAIDE.Library.Methods.Powertrain.Converters.Expansion_Nozzle.compute_expansion_nozzle_performance

# RCAIDE/Library/Methods/Powertrain/Converters/Fan/compute_fan_performance.py
# (c) Copyright 2023 Aerospace Research Community LLC
# 
# Created:  Feb 2024, M. Clarke 

# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ----------------------------------------------------------------------------------------------------------------------    
# package imports
import numpy as np 
from RCAIDE.Library.Methods.Gas_Dynamics.fm_id import fm_id

# exceptions/warnings
from warnings import warn

# ----------------------------------------------------------------------------------------------------------------------
#  compute_expansion_nozzle_performance
# ----------------------------------------------------------------------------------------------------------------------        
[docs] def compute_expansion_nozzle_performance(expansion_nozzle, conditions): """ Computes the thermodynamic performance of an expansion nozzle in a propulsion system. Parameters ---------- expansion_nozzle : RCAIDE.Library.Components.Converters.Expansion_Nozzle Expansion nozzle component with the following attributes: - tag : str Identifier for the nozzle - working_fluid : Data Working fluid properties object - pressure_ratio : float Pressure ratio across the nozzle - polytropic_efficiency : float Polytropic efficiency of the expansion process conditions : RCAIDE.Framework.Mission.Common.Conditions Flight conditions with: - freestream : Data Freestream properties - isentropic_expansion_factor : numpy.ndarray Ratio of specific heats (gamma) - specific_heat_at_constant_pressure : numpy.ndarray Specific heat at constant pressure [J/(kg·K)] - pressure : numpy.ndarray Freestream pressure [Pa] - stagnation_pressure : numpy.ndarray Freestream stagnation pressure [Pa] - stagnation_temperature : numpy.ndarray Freestream stagnation temperature [K] - specific_gas_constant : numpy.ndarray Specific gas constant [J/(kg·K)] - mach_number : numpy.ndarray Freestream Mach number - energy : Data Energy conditions - converters : dict Converter energy conditions indexed by tag Returns ------- None Results are stored in conditions.energy.converters[expansion_nozzle.tag].outputs: - stagnation_temperature : numpy.ndarray Stagnation temperature at nozzle exit [K] - stagnation_pressure : numpy.ndarray Stagnation pressure at nozzle exit [Pa] - stagnation_enthalpy : numpy.ndarray Stagnation enthalpy at nozzle exit [J/kg] - mach_number : numpy.ndarray Mach number at nozzle exit - static_temperature : numpy.ndarray Static temperature at nozzle exit [K] - static_enthalpy : numpy.ndarray Static enthalpy at nozzle exit [J/kg] - velocity : numpy.ndarray Exit velocity [m/s] - static_pressure : numpy.ndarray Static pressure at nozzle exit [Pa] - area_ratio : numpy.ndarray Exit to freestream area ratio Notes ----- This function computes the thermodynamic properties at the expansion nozzle exit based on the inlet conditions and nozzle characteristics. It calculates the exit velocity, pressure, temperature, and other properties for both subsonic and supersonic flow regimes. The computation follows these steps: 1. Extract freestream and inlet conditions 2. Compute working fluid properties (gamma, Cp) 3. Calculate stagnation conditions at exit using pressure ratio 4. Compute exit Mach number based on pressure ratio 5. Handle subsonic (M < 1.0) and supersonic (M ≥ 1.0) cases separately 6. Calculate static conditions (temperature, pressure) at exit 7. Compute exit velocity from energy conservation 8. Calculate area ratio between freestream and nozzle exit 9. Store all results in the conditions data structure **Major Assumptions** * Constant polytropic efficiency and pressure ratio * If pressures make the Mach number go negative, these values are corrected **Theory** For subsonic flow (M < 1.0), the exit pressure equals the ambient pressure, and the Mach number is calculated from the pressure ratio. For supersonic flow (M ≥ 1.0), the nozzle is choked, and the exit pressure is calculated from the Mach number. The exit velocity is calculated from the conservation of energy: .. math:: u_{out} = \\sqrt{2(h_{t,out} - h_{out})} where h_{t,out} is the exit stagnation enthalpy and h_{out} is the exit static enthalpy. References ---------- [1] Cantwell, B., "AA283 Course Notes", Stanford University https://web.stanford.edu/~cantwell/AA283_Course_Material/AA283_Course_Notes/ See Also -------- RCAIDE.Library.Methods.Gas_Dynamics.fm_id """ # Unpack flight conditions M0 = conditions.freestream.mach_number P0 = conditions.freestream.pressure Pt0 = conditions.freestream.stagnation_pressure Tt0 = conditions.freestream.stagnation_temperature nozzle_conditions = conditions.energy.converters[expansion_nozzle.tag] # Unpack exansion nozzle inputs Tt_in = nozzle_conditions.inputs.stagnation_temperature Pt_in = nozzle_conditions.inputs.stagnation_pressure PR = expansion_nozzle.pressure_ratio etapold = expansion_nozzle.polytropic_efficiency P_in = nozzle_conditions.inputs.static_pressure T_in = nozzle_conditions.inputs.static_temperature # Unpack ram inputs working_fluid = expansion_nozzle.working_fluid gamma = working_fluid.compute_gamma(T_in,P_in) Cp = working_fluid.compute_cp(T_in,P_in) # Compute output stagnation quantities Pt_out = Pt_in*PR Tt_out = Tt_in*PR**((gamma-1)/(gamma)*etapold) ht_out = Cp*Tt_out # A cap so pressure doesn't go negative Pt_out[Pt_out<P0] = P0[Pt_out<P0] # Compute the output Mach number, static quantities and the output velocity Mach = np.sqrt((((Pt_out/P0)**((gamma-1)/gamma))-1)*2/(gamma-1)) #initializing the Pout array P_out = np.ones_like(Mach) # Computing output pressure and Mach number for the case Mach <1.0 i_low = Mach < 1.0 P_out[i_low] = P0[i_low] Mach[i_low] = np.sqrt((((Pt_out[i_low]/P0[i_low])**((gamma[i_low]-1.)/gamma[i_low]))-1.)*2./(gamma[i_low]-1.)) # Computing output pressure and Mach number for the case Mach >=1.0 i_high = Mach >=1.0 Mach[i_high] = Mach[i_high]/Mach[i_high] P_out[i_high] = Pt_out[i_high]/(1.+(gamma[i_high]-1.)/2.*Mach[i_high]*Mach[i_high])**(gamma[i_high]/(gamma[i_high]-1.)) # A cap to make sure Mach doesn't go to zero: if np.any(Mach<=0.0): warn('Pressures Result in Negative Mach Number, making positive',RuntimeWarning) Mach[Mach<=0.0] = 0.001 # Compute the output temperature,enthalpy,velocity and density T_out = Tt_out/(1+(gamma-1)/2*Mach*Mach) h_out = T_out * Cp u_out = np.sqrt(2*(ht_out-h_out)) #rho_out = P_out/(R*T_out) # Compute the freestream to nozzle area ratio area_ratio = (fm_id(M0,gamma)/fm_id(Mach,gamma)*(1/(Pt_out/Pt0))*(np.sqrt(Tt_out/Tt0))) #pack computed quantities into outputs nozzle_conditions.outputs.area_ratio = area_ratio nozzle_conditions.outputs.mach_number = Mach #nozzle_conditions.outputs.density = rho_out nozzle_conditions.outputs.velocity = u_out nozzle_conditions.outputs.static_pressure = P_out nozzle_conditions.outputs.static_temperature = T_out nozzle_conditions.outputs.static_enthalpy = h_out nozzle_conditions.outputs.stagnation_temperature = Tt_out nozzle_conditions.outputs.stagnation_pressure = Pt_out nozzle_conditions.outputs.stagnation_enthalpy = ht_out return