Numerical modelling of water injection processes in Internal Combustion Engines (ICE) intake manifolds.
The "port" injection of water into the intakes of Internal Combustion Engines (ICE), sometimes called fumigation, is an old and well known strategy to improve their performances and decrease some of their tail pipe pollutions, as shortly explained in this video from the Society of Automotive Engineers (SAE) youtube channel:
In a nutshell, the water latent heat of vaporization creates a cooling effect of the fresh mixture and increases the engine volumetric efficiency, and so the amount of fuel aspirated. Furthermore, the required compression work and the maximum flame temperature decrease as well.
Hovewer, previous studies of the effects of water injection on a given ICE were so far only based on experimental results, and then inadequate to untangle its actual effects on different engine parameters, but also to predict its potential improvement when set up on an existing engine. The goal of this project is to develop a numerical tool usable to theoretically assess the influence of water injection on the performances of a given ICE.
Firstly, the water_injection_package
must be loaded as any other python package, for example by:
In [1]: import water_injection_package as wi
The two main objects in this package are the classes Fuel
and FreshMixture
.
The first practical thing to do in such study is to choose the fuel eventually burnt within the engine. The class Fuel
has been designed for so. The chemical composition and the specific heat heat at constant pressure (when the fuel is considered as an ideal gas) are the only fuel properties required so far.
The fuel chemical composition is given to the class as a python dictionary of the type:
In [2]: octane_composition = {'C':8, 'H':18, 'O':0, 'N':0, 'S':0}
With each value corresponding to the number of atoms of carbon 'C'
, hydrogen 'H'
, oxygen 'O'
, nitrogen 'N'
and sulfur 'S'
, respectively involved in the fuel composition. In the previous example, the fuel considered is then the usual iso-octane. If I want for example to consider pure ethanol as fuel, I just have to type:
In [3]: ethanol_composition = {'C':2, 'H':6, 'O':1, 'N':0, 'S':0}
As previously mentioned, the only other required physical property of the fuel is its gaseous specific heat at constant pressure, expressed in J/(kg.K). Once the latter is known, the octane fuel can be created by:
In [4]: octane = wi.Fuel(composition=octane_composition, specif_heat=1.644e+3)
The methods included into the Fuel
class allow to compute some useful properties, as for example its molar mass, in g/mol:
In [5]: octane.fuel_molar_mass()
Out[5]: 114.232
Its specific heat at constant volume:
In [6]: octane.fuel_specif_heat_at_cste_v()
Out[6]: 1571.2143655017858
Or its heat capacity ratio:
In [7]: octane.fuel_heat_capacity_ratio()
Out[7]: 1.0463244456621101
Another interesting parameter, more related to the combustion process itself, is the stoichiometric Air-Fuel Ratio (AFR), so the amount of air (in mass) required to burn each amount of fuel consumed. We have for octane:
In [8]: octane.stoichiometric_air_fuel_ratio()
Out[8]: 15.033440717137056
Sometimes, it is the Fuel-Air Ratio (FAR) which is used instead of the AFR:
In [9]: octane.stoichiometric_fuel_air_ratio()
Out[9]: 0.06651837186280789
The goal of the class FreshMixture
is to do calculations on wet fresh mixtures, so on gaseous blends of fuel, air and water, the latter being present in the fresh mixture because of both the water injection process and the ambient humidity in the surroundings. This is why the attributes of the FreshMixture
class are related to the blend itself and to its surroundings.
- Regarding to the specific type of engine considered, the fuel is not always involved in the fresh mixture in the intake system, as for "usual" compression ignition (CI) engines for instance, in whom the fuel is directly injected into the cylinder at the end of the compression stroke. In order to consider such situation, we can choose to mix the fuel with the rest of the fresh mixture during the intake process, using the boolean parameter
fuel_is_present = True
orFalse
. - The second attribute needed is related to the combustion process, it is the Air-Fuel Equivalence Ratio
air_fuel_equivalent_ratio
, usually called "lambda". This parameter is: a.= 1
for a stoichiometric combustion. b.< 1
for a rich combustion, so with more fuel than it is needed. c.> 1
for a lean combustion, so with less fuel than it is needed. - The water fuel ratio (WFR) is the fundamental parameter of engines water injection systems. Its value is usually such as
0.2 < WFR < 1.5
. - The other attributes are the ones related to the engine surroundings, so the latter:
a. Temperature
ambient_temperature
. b. Pressureambient_pressure
. c. And relative humidityambient_relative_humidity
.
Our fresh mixture can now be created, for example with a stoichiometric combustion (air_fuel_equivalent_ratio=1.0
) with no water injected (water_fuel_ratio=0.0
) and within an ambience at a temperature of 25°C, a pressure of 1 bar and a relative humidity of 50%:
mixture = wi.FreshMixture(fuel_is_present=True, air_fuel_equivalent_ratio=1.0,\
water_fuel_ratio=0.0, ambient_temperature=298.,\
ambient_relative_humidity=0.5, ambient_pressure=1.0)