Source code for RCAIDE.Library.Attributes.Propellants.Alcohol_Mixture
# RCAIDE/Library/Attributes/Propellants/Alcohol_Mixture.py
#
# Created: Mar 2024, M. Clarke
# ----------------------------------------------------------------------------------------------------------------------
# Imports
# ----------------------------------------------------------------------------------------------------------------------
import RCAIDE
from .Propellant import Propellant
# ----------------------------------------------------------------------------------------------------------------------
# Propanol Propellant Class
# ----------------------------------------------------------------------------------------------------------------------
[docs]
class Alcohol_Mixture(Propellant):
"""
A class representing a binary mixture of alcohol fuels with customizable composition.
Attributes
----------
tag : str
Identifier for the propellant (defaults to 'Alcohol_Mixture')
reactant : str
Oxidizer used for combustion (defaults to 'O2')
propellant_1 : Propellant
First alcohol component (default: Ethanol)
propellant_1_mass_fraction : float
Mass fraction of first component (defaults to 0.5)
propellant_2 : Propellant
Second alcohol component (default: Propanol)
propellant_2_mass_fraction : float
Mass fraction of second component (defaults to 0.5)
density : float
Mixture density in kg/m³, computed from components
specific_energy : float
Mixture specific energy in J/kg, computed from components
energy_density : float
Mixture energy density in J/m³, computed from components
lower_heating_value : float
Mixture lower heating value in J/kg, computed from components
Notes
-----
This class implements properties for binary alcohol fuel mixtures. All mixture
properties are computed using mass fraction weighted averages of the component
properties, except density which uses a volume-based mixing rule.
**Theory**
Density mixing rule:
.. math::
\\rho_{mix} = \\left(\\frac{X_1}{\\rho_1} + \\frac{X_2}{\\rho_2}\\right)^{-1}
Property mixing rule:
.. math::
P_{mix} = X_1P_1 + X_2P_2
where:
- X₁, X₂ are mass fractions
- ρ₁, ρ₂ are component densities
- P₁, P₂ are component properties
**Definitions**
'Mass Fraction'
The ratio of component mass to total mixture mass
'Lower Heating Value'
Heat of combustion excluding latent heat of water vapor
"""
def __defaults__(self):
"""This sets the default values.
Assumptions:
Density at 20C 1 atm
Source:
"""
self.tag = 'Alcohol_Mixture'
self.reactant = 'O2'
self.propellant_1 = RCAIDE.Library.Attributes.Propellants.Ethanol()
self.propellant_1_mass_fraction = 0.5
self.propellant_2 = RCAIDE.Library.Attributes.Propellants.Propanol()
self.propellant_2_mass_fraction = 0.5
self.density = self.compute_mixture_density() # kg/m^3 (15 C, 1 atm)
self.specific_energy = self.compute_mixture_specific_energy() # J/kg
self.energy_density = self.compute_mixture_energy_density() # J/m^3
self.lower_heating_value = self.compute_mixture_lower_heating_value() # J/kg
self.stoichiometric_fuel_air_ratio = 0 # [-] Stoichiometric Fuel to Air ratio
self.heat_of_vaporization = 0 # [J/kg] Heat of vaporization at standard conditions
self.temperature = 0 # [K] Temperature of fuel
self.pressure = 0 # [Pa] Pressure of fuel
self.fuel_surrogate_S1 = {} # [-] Mole fractions of fuel surrogate species
self.kinetic_mechanism = '' # [-] Kinetic mechanism for fuel surrogate species
self.oxidizer = ''
[docs]
def compute_mixture_density(self):
"""
Compute the mixture density using volume-based mixing rule.
Returns
-------
rho_mix : float
Mixture density in kg/m³
Notes
-----
Uses reciprocal mixing rule for proper volume-based averaging.
"""
p1 = self.propellant_1
p2 = self.propellant_2
rho1 = p1.density
rho2 = p2.density
X1 = self.propellant_1_mass_fraction
X2 = self.propellant_2_mass_fraction
rho_mix = ((X1/rho1) + (X2/rho2) ) ** (-1)
return rho_mix
[docs]
def compute_mixture_specific_energy(self):
"""
Compute the mixture specific energy using mass fraction weighted average.
Returns
-------
e_mix : float
Mixture specific energy in J/kg
"""
p1 = self.propellant_1
p2 = self.propellant_2
e1 = p1.specific_energy
e2 = p2.specific_energy
X1 = self.propellant_1_mass_fraction
X2 = self.propellant_2_mass_fraction
e_mix = X1 * e1 + X2 * e2
return e_mix
[docs]
def compute_mixture_energy_density(self):
"""
Compute the mixture energy density from specific energy and density.
Returns
-------
U_mix : float
Mixture energy density in J/m³
"""
e_mix = self.compute_mixture_specific_energy()
rho_mix = self.compute_mixture_density()
U_mix = e_mix * rho_mix
return U_mix
[docs]
def compute_mixture_lower_heating_value(self):
"""
Compute the mixture lower heating value using mass fraction weighted average.
Returns
-------
LHV_mix : float
Mixture lower heating value in J/kg
"""
p1 = self.propellant_1
p2 = self.propellant_2
LHV1 = p1.lower_heating_value
LHV2 = p2.lower_heating_value
X1 = self.propellant_1_mass_fraction
X2 = self.propellant_2_mass_fraction
LHV_mix = X1 * LHV1 + X2 * LHV2
return LHV_mix
[docs]
def compute_all(self):
"""
Update all mixture properties based on current composition.
Notes
-----
Recalculates density, specific energy, energy density, and lower heating value.
"""
self.density = self.compute_mixture_density() # kg/m^3 (15 C, 1 atm)
self.specific_energy = self.compute_mixture_specific_energy() # J/kg
self.energy_density = self.compute_mixture_energy_density() # J/m^3
self.lower_heating_value = self.compute_mixture_lower_heating_value() # J/kg