Source code for RCAIDE.Library.Attributes.Gases.Air

# RCAIDE/Library/Attributes/Gases/Air.py
# 
#
# Created:  Mar 2024, M. Clarke

# ----------------------------------------------------------------------------------------------------------------------  
#  Imports
# ----------------------------------------------------------------------------------------------------------------------  
 
from .Gas import Gas 
import numpy as np 

# ----------------------------------------------------------------------------------------------------------------------  
# Air Class
# ----------------------------------------------------------------------------------------------------------------------   
[docs] class Air(Gas): """ A class representing air and its thermodynamic properties. Provides methods for computing various gas properties including density, speed of sound, specific heat, and transport properties. Attributes ---------- tag : str Identifier for the gas type ('air') molecular_mass : float Molecular mass of air in kg/kmol gas_specific_constant : float Specific gas constant in m²/s²-K specific_heat_capacity : float Specific heat capacity in J/kg·K composition : Data Chemical composition of air - O2 : float Mass fraction of oxygen (0.20946) - Ar : float Mass fraction of argon (0.00934) - CO2 : float Mass fraction of carbon dioxide (0.00036) - N2 : float Mass fraction of nitrogen (0.78084) - other : float Mass fraction of other components (0.00) Notes ----- This class implements standard atmospheric air properties and various methods for computing thermodynamic and transport properties. """ def __defaults__(self): """This sets the default values. Assumptions: None Source: None """ self.tag = 'air' self.molecular_mass = 28.96442 # kg/kmol self.gas_specific_constant = 287.0528742 # m^2/s^2-K, specific gas constant self.specific_heat_capacity = 1006 # J/kgK self.composition.O2 = 0.20946 self.composition.Ar = 0.00934 self.composition.CO2 = 0.00036 self.composition.N2 = 0.78084 self.composition.other = 0.00 self.air_surrogate = {'O2':0.2095, 'N2':0.7809, 'AR':0.0096} # [-] Mole fractions of air surrogate species self.kinetic_mechanism = 'Air.yaml'
[docs] def compute_density(self,T=300.,p=101325.): """ Computes air density using the ideal gas law. Parameters ---------- T : float Temperature in Kelvin p : float Pressure in Pascal Returns ------- rho : float Density in kg/m³ Notes ----- **Major Assumptions** * Air behaves as an ideal gas """ return p/(self.gas_specific_constant*T)
[docs] def compute_speed_of_sound(self,T=300.,p=101325.,variable_gamma=False): """ Computes speed of sound in air. Parameters ---------- T : float Temperature in Kelvin p : float Pressure in Pascal variable_gamma : bool If True, uses temperature-dependent specific heat ratio Returns ------- a : float Speed of sound in m/s Notes ----- **Major Assumptions** * If variable_gamma is False, assumes γ = 1.4 * Air behaves as an ideal gas """ if variable_gamma: g = self.compute_gamma(T,p) else: g = 1.4*np.ones_like(T) return np.sqrt(g*self.gas_specific_constant*T)
[docs] def compute_cp(self,T=300.,p=101325.): """ Computes specific heat capacity at constant pressure using a 3rd-order polynomial fit. Parameters ---------- T : float Temperature in Kelvin p : float Pressure in Pascal Returns ------- cp : float Specific heat capacity in J/(kg·K) Notes ----- **Major Assumptions** * Valid for temperature range: 123 K < T < 673 K **Theory** .. math:: c_p(T) = c_1T^3 + c_2T^2 + c_3T + c_4 References ---------- [1] Ekin, J. (2006). Experimental techniques for low-temperature measurements: Cryostat design, material properties and superconductor critical-current testing. Oxford University Press. """ c = [-7.357e-007, 0.001307, -0.5558, 1074.0] cp = c[0]*T*T*T + c[1]*T*T + c[2]*T + c[3] return cp
[docs] def compute_gamma(self,T=300.,p=101325.): """ Computes specific heat ratio using a 3rd-order polynomial fit. Parameters ---------- T : float Temperature in Kelvin p : float Pressure in Pascal Returns ------- g : float Specific heat ratio (gamma) [unitless] Notes ----- **Major Assumptions** * Valid for temperature range: 233 K < T < 1273 K """ c = [1.629e-010, -3.588e-007, 0.0001418, 1.386] g = c[0]*T*T*T + c[1]*T*T + c[2]*T + c[3] return g
[docs] def compute_absolute_viscosity(self,T=300.,p=101325.): """ Computes absolute (dynamic) viscosity using Sutherland's law. Parameters ---------- T : float Temperature in Kelvin p : float Pressure in Pascal Returns ------- mu : float Absolute viscosity in kg/(m·s) Notes ----- **Theory** Uses Sutherland's formula with S = 110.4K and C1 = 1.458e-6 kg/m-s-sqrt(K) References ---------- [1] Sutherland's law """ S = 110.4 # constant in deg K (Sutherland's Formula) C1 = 1.458e-6 # kg/m-s-sqrt(K), constant (Sutherland's Formula) return C1*(T**(1.5))/(T + S)
[docs] def compute_thermal_conductivity(self,T=300.,p=101325.): """ Computes thermal conductivity of air. Parameters ---------- T : float Temperature in Kelvin p : float Pressure in Pascal Returns ------- k : float Thermal conductivity in W/(m·K) Notes ----- **Major Assumptions** * Properties computed at 1 bar (14.5 psia) References ---------- [1] The Engineering ToolBox (2009). Air - Thermal Conductivity vs. Temperature and Pressure. [online] Available at: https://www.engineeringtoolbox.com/air-properties-viscosity-conductivity-heat-capacity-d_1509.html [Accessed 8 January 2025]. """ return 3.99E-4 + 9.89E-5*(T) -4.57E-8*(T**2) + 1.4E-11*(T**3)
[docs] def compute_prandtl_number(self,T=300.): """ Computes Prandtl number. Parameters ---------- T : float Temperature in Kelvin Returns ------- Pr : float Prandtl number [unitless] Notes ----- **Theory** .. math:: Pr = \\frac{\\mu C_p}{k} """ Cp = self.specific_heat_capacity mu = self.compute_absolute_viscosity(T) K = self.compute_thermal_conductivity(T) return mu*Cp/K
[docs] def compute_R(self,T=300.,p=101325.): """ Computes specific gas constant. Parameters ---------- T : float Temperature in Kelvin p : float Pressure in Pascal Returns ------- R : float Specific gas constant in J/(kg·K) Notes ----- **Theory** .. math:: R = \\frac{\\gamma - 1}{\\gamma}c_p """ gamma = self.compute_gamma(T,p) cp = self.compute_cp(T,p) R = ((gamma - 1)/gamma)*cp return R