Simulating the combustion of methane, observing the effect of air-preheating on the Fuel Utilization Efficiency of a mixture.
AIM:
(1) To observe the effect of air pre-heat temperature on the Adiabatic Flame Temperature of Methane.
(2) To observe the effect of the equivalence ratio and air pre-heat temperature on the combustion/fuel utilization efficiency of the mixture, fixing the furnace exit temperature at 1700K.
Introduction:
Furnaces are generally used for providing heat to materials, in order to increase their temperature to a point high enough to perform work on said material, and achieve the desired output. Furnaces,however, were known for their low efficiencies and large amounts of heat loss, despite their extensive usage in industries.
Recuperators are installed in furnaces in order to utilize or recover the heat lost in the flue gases, which are the products of combustion. Flue gas products are composed of various chemical species, that carry heat with them post-combustion. The total heat generated is always divided into heat utilized and heat losses due to various factors.
Theory:
Adiabatic Flame Temperature:
The Adiabatic Flame Temperature(AFT) of a fuel is the maximum temperature that can be achieved after complete combustion of all of the reactants in the system, with no heat transfer at the boundary. This means that the heat generated from combustion is utilized for the combustion products only, and there are no losses due to heat transfer at the boundaries. There are two types of Adiabatic Flame temperature:
(a) Constant Volume AFT
(b) Constant Pressure AFT
In the constant volume process, there is no heat transfer at the boundaries(Q=0) as the process is adiabatic and does not interact with the surroundings, and the work done in gas expansion post-combustion, is zero as well. This means that, if combustion took place inside a piston-cylinder arrangement, the piston would not move, as there is no work being done in order to move it. In this case, the difference between the internal energies of the products and the reactants, or vice versa, will be zero.
In the constant pressure process, the pressure is held constant, but unlike the constant volume process, work is done during gas expansion post-combustion, and the volume of the gas changes. A point to note is the fact that the constant volume adiabatic flame temperature should be higher than the constant temperature adiabatic flame temperature, because of the lack of work done in the constant volume process.
Air-preheating:
Air pre-heating is done by utilzing the heat that the flue gases carry with them as exhaust, and imparting some of that heat to the intake air to be used for combustion in the furnace. The flue gases flow over the pipes which contain air, hence increasing their temperature. Preheating the air will cause the air-fuel mixture to attain the temperature required for combustion, without using more fuel to reach the same temperature. Hence, it can be said that fuel is being saved as a consequence of preheating the air. This will be discussed in the later sections of the project.
Fuel Utilization Efficiency:
The Fuel Utilization Efficiency is the ratio of the actual heat generated post-combustion(considering the flue gas temperature at the exit) to the Lower Heating Value(LHV)/Lower Calorific Value(LCV) of the fuel. The LHV of the fuel is the amount of heat that can be potentially released after complete combustion of the reactants to products, considering that it contains water vapour in the products of combustion. Upon calculating this, an idea of how well the fuel used is being utiized during combustion can be gleaned.
This value will create a good benchmark for how optimised the combustion in furnace is.
Formulae used:
Formula for fuel utilization efficiency:
Fuel utilization efficiency (F.U.E) = -[{(air-fuel ratio +1)*(Specific enthalpy of products)} - {(air-fuel ratio)*(Specific enthalpy of air)} - (Specific enthalpy of CH4) ]/(L.H.V of methane)
Air-Fuel ratio = [(stoichiometric mass of air/stoichiometric mass of fuel)]/(equivalence ratio)
Stoichiometric mass of air = 17.12 kg(for 1 kg of fuel)
Stoichiometric mass of fuel = 1 kg
Stoichiometric number of moles of air = 2 (for 1 mole of fuel)
Stoichiometric number of moles of fuel = 1
Fuel savings formula:
Fuel savings = 1- [{F.U.E(No preheat)}/{F.U.E(with preheat)}]
Coding Approach:
(1) Observing the effect of the air-preheat temperature on the Adiabatic Flame Temperature of methane:
In this section, the air preheat temperature will be varied from 298.15K to 600K, and the effect of the increasing air preheat temperature on the Adiabatic Flame Temperature will be observed.
Step 1: Importing required libraries
The math,Cantera,NumPy and matplotlib libraries are used, and are imported into the program using the following code:
Lines of code:
import cantera as ct
import numpy as np
import math
import matplotlib.pyplot as plt
Step 2: Program construction.
- A 'gas' object is created by using the 'Solution' class, in order to import the thermodynamic properties of various species within the input file 'gri30.cti'.
Lines of code:
gas = ct.Solution('gri30.cti')
- Using the NumPy library, two empty arrays are created and will be used to store the values of the air preheating temperature and the values of AFT that will be computed. This has been done using the 'array' command of the numPy library.
- In order to find the AFTs for different values of air preheating temperatures between 298.15 K to 600 K, the 'linspace' command within the NumPy library is used to create an array of 100 values between 298.15 K to 600 K. This is then inserted into a 'for' loop, where these temperatures will be used to compute the AFT.
- Two objects 'Air' and 'Fuel' are then created using the 'Quantity' class, and are both part of the 'gas' object that has been specified in Step 1. Using the 'Quantity' class allows superior control over the species that we wish to examine, and the temperatures,pressure and mole fractions of air and fuel can be changed individually, as well as the number of moles of the species can be specified by using 'TPX' and 'moles' respectively.
- The air preheat temperature is a variable that has been fed to the object 'Air' and changes with every value provided by the 'for' loop. The fuel temperature is kept fixed at 298.15 K.
- The number of moles are specified for air and the fuel and is done using the 'moles' attribute of the 'Quantity' class.
- The mixture is then created by adding the two objects and is specified as 'M', in the program.
- The 'equilibrate' function is used to obtain the constant pressure Adiabatic Flame Temperature of the mixture, and is specified by 'HP' within the function.
- The values of AFT obtained after each run of the 'for' loop and their respective air preheat temperatures are then stored in the arrays mentioned at the beginning of the step by using the 'append' command in the NumPy library. This step is done within the 'for' loop.
- Finally, the air preheat temperatures and their respective AFTs are printed after each run of the 'for' loop. Two 'if' loops have been specified for printing purposes, in order to separate the AFTs with and without preheat
Lines of code:
for T_pre in np.linspace(298.15,600,num=100):
Air = ct.Quantity(gas)
Air.TPX = T_pre,ct.one_atm,{'O2':0.21,'N2':0.79}
Air.moles = 2*(1+3.76)
Fuel = ct.Quantity(gas)
Fuel.TPX = 298.15,ct.one_atm,'CH4:1'
Fuel.moles = 1
M = Air + Fuel
M.equilibrate('HP')
T_pre_comp = np.append(T_pre_comp,T_pre)
AFT_comp = np.append(AFT_comp,M.T)
if(T_pre==298.15):
print('No preheat =',T_pre,'K')
if(T_pre>298.15):
print('Air Preheat Temperature = ',T_pre,'K')
print('AFT=',M.T,'K','n')
Step 3: Plotting.
The 'T_pre_comp' and 'AFT_comp' arrays contain all the values of air preheating temperature and it's respective AFT value, after each run of the 'for' loop. These values are then used to create a plot for AIr preheat temperature vs AFT.
Plotting commands used and usage:
1) plot : Simple line plot for Air Preheating temperature vs AFT, with label and color defined.
2) scatter:Scatter plot of Air Preheating temperature vs AFT,with color defined.
3) title: Defining the title of the plot.
4) xticks,yticks : Defining density of values on the X,Y-axis respectively('arange' command of the numPy library used within command).
5) xlabel,ylabel : Naming the Air preheat temperature and AFT on the X,Y-axis respectively.
6) legend: Defining the legend and the location of the same.
7) show: Displays plot.
Lines of code:
plt.figure(1)
plt.plot(T_pre_comp,AFT_comp,label='AFT of Methane',color = 'r')
plt.scatter(T_pre_comp,AFT_comp,color = 'b')
plt.title('Air Preheat Temperature vs Adiabatic Flame Temperature')
plt.xticks(np.arange(298.15,620,12))
plt.yticks(np.arange(2224,2350,8))
plt.xlabel('Air Preheat Temperature(K)')
plt.ylabel('Adiabatic Flame Temperature(K)')
plt.legend(loc='lower right')
plt.show()
(2)To observe the effect of equivalance ratio and the air pre-heat temperature on the combustion/fuel utilization efficiency of the mixture, fixing the furnace exit temperature at 1700K:
In this section, the equivalence ratio and the air preheat temperature will be varied simultaneously.
The effect of increasing air preheat temperatures on rich, lean and stoichiometric mixtures will be observed.
The range of equivalance ratios specified in the program : 0.6 to 1.8.
The range of air preheat temperatures specified in the program : 298.15K to 600K.
The furnace exit temperature is fixed at 1700 K.
Step 1: Importing required libraries
The math,Cantera,NumPy and matplotlib libraries are used, and are imported into the program using the following code:
Lines of code:
import math
import cantera as ct
import matplotlib.pyplot as plt
import numpy as np
Step 2: Program construction
(a) Phase I: Creating the gas object, defining ranges for air preheat temperatures,equivalence ratios, and setting up necessary formulae.
- A 'gas' object is created by using the 'Solution' class, in order to import the thermodynamic properties of various species within the input file 'gri30.cti'.
Lines of code:
gas = ct.Solution('gri30.cti')
- Using the NumPy library, empty arrays are created in order to store the different values of efficiency calculated for different air preheat temperatures and equivalence ratios,the air preheat temperatures and the efficiencies for when the mixture is stoichiometric. This will be elaborated upon in Phase IV. This has been done using the 'array' command of the numPy library. These arrays will be called upon later.
- A 'for' loop for five different air preheat temperatures from 298.15 K to 600 K, has been created using the 'linspace' command of the NumPy library.
- Another 'for' loop for a range of equivalence ratios has been created using the method mentioned above, but is kept within the 'for' loop of the air preheat temperatures.
- A similar array has been created for the equivalence ratios, but is kept outside the 'for' loop of created for the equivalence ratios, but inside the 'for loop created for the air preheat temperatures. If this is not done, and the array is created outside the 'for' loop for air preheat temperature, the 'append' command(mentioned later) used to add each value of the equivalence ratio mentioned in the 'for' loop will not function, and will return an error.
- The stoichiometric fuel-air ratio for both mass and moles are then defined.
- The number of moles of air have been defined according to the equivalence ratio.
- The air-fuel ratio required for the computation of the fuel utilization efficiency is defined as well.
Lines of code:
#Creating an empty array in order to store the values of the fuel utilization efficiency:
eff_t1 = eff_t2 = eff_t3 = eff_t4 = eff_t5 = T_air_comp= f_u_e_comp = np.array([])
# T_air is the air temperature/preheating temperatures
for T_air in np.linspace(298.15,600,num = 5):
#equivalance ratios are to be stored in an array in order to create a plot.
eq_ratio_values = np.array([])
for eq_ratio in np.linspace(0.6,1.8,num=31):
#actual and stoichiometric mass and moles of fuel and air are set, along with air-fuel ratio.
mass_of_fuel = 1
moles_of_fuel = 1
stoi_mass_of_fuel = 1
stoi_moles_of_fuel = 2
stoi_mass_of_air = 17.12
stoi_f_a_ratio_mass = stoi_mass_of_fuel/stoi_mass_of_air
stoi_f_a_ratio_moles = moles_of_fuel/stoi_moles_of_fuel
moles_of_air = m_o_a = moles_of_fuel/(stoi_f_a_ratio_moles*eq_ratio)
mass_of_air = mass_of_fuel/(stoi_f_a_ratio_mass*eq_ratio)
a_f_ratio = (stoi_mass_of_air/stoi_mass_of_fuel)/eq_ratio
(b) Phase II: Chemical balancing
- The composition of the reactants and the products have been specified using the 'Quantity' class of the Cantera library. This allows control over the number of moles of the products and the reactants, that can be varied according to the equivalence ratio that has been specified in the 'for' loop.
- This also allows control over the temperature of the products and the reactants, allowing us to fix the exit temperature of the products at 1700 K and giving us the ability to vary the air preheat temperature of the mixture.
- Using the 'Quantity' class of the Cantera library, the objects for the reactant and products species can be separately created.
- The attributes 'moles' and 'TPX', are used to control the number of moles and the temperature,pressure and mole fraction of the species, respectively.
Reactants:
- Methane : CH4
- Air : O2 +3.76*N2
Products:
For stoichiometric combustion(Equivalence ratio = 1)/Primary products:
- Carbon Dioxide : CO2
- Water : H2O
- Nitrogen : N2
Additional products for lean and rich mixtures(equivalence ratios above and below 1):
Combustion of lean mixtures(Equivalence ratio<1):
- Oxygen : O2
Combustion of rich mixtures(Equivalence ratio>1):
- Hydrogen : H2
- Carbon monoxide: CO
The products depend on the number of moles of air provided for combustion of the mixture. Hence, chemical balancing of the reactants and the products will prove vital to achieve an accurate result.
The following table displays the logic used to balance rich and lean mixtures:

Fig(a) : Chemical balancing of rich and lean mixtures.
Assumptions:
- The number of moles of fuel will always be one.
(c) Phase III: Creating species objects, setting up number of moles of each species,creating mixtures with respect to equivalence ratio, finding the fuel utilization efficiency.
- The equivalence ratios determine whether a mixture is rich or lean. As mentioned above, if the equivalence ratio of a mixture is above 1, it is a rich mixture and if it is below 1, it is a lean mixture. Using this fundamental aspect of segregating mixture types, three 'if' loops are created for stoichiometric, rich and lean mixtures.
- This has been done to include certain species, only when the value of the equivalence ratio is within certain ranges. In this particular case, if the equivalence ratio is above 1, the 'if' loop will include 'H2' and 'CO' as products, as they are the products generated due incomplete combustion of a fuel. With their inclusion, the amount of heat possessed by them can be determined by their enthalpy, and will be added to the total enthalpy of all of the species in the products. With the addition of these new products, the number of moles of the primary products, 'CO2' and 'H2O', will change, and this change has been accounted for in the 'if' loops that have been created.
- If the equivalence ratio of the mixture is below 1, the an 'if' loop containing 'O2' will be used, and will operate as explained above.
- Similarly, if the equivalence ratio is equal to exactly 1, the other products will be neglected, and the primary products will be used.
- Within each 'if' loop, the logic for the number of moles of each species in the mixture is as displayed in the table above.
- The exit temperature of the products has been set at 1700 K by using the 'TPX' attribute, and the number of moles of all of the species are varied using the 'moles' attribute of the 'Quantity class'.
- The objects of the product species that have been created, are added together to get the correct products composition,as the products are a mixture of different species. By using the 'if' loop, as explained above, we determined which secondary products are added to the primary products, to form the final product mixture.
- The specific enthalpy of the reactants and the products have been obtained by using the 'enthalpy_mass' attribute of the 'Quantity' class. This divides the total mass of the fuel, air or product mixture, with their respective molecular weight. This has been used in order to obtain the fuel utilization efficiency.
- Finally, the fuel utilization efficiency is defined using the formulae mentioned above.
Lines of code:
air= ct.Quantity(gas)
air.TPX = T_air,101325,{'O2':1*moles_of_air,'N2':3.76*moles_of_air}
air.moles = moles_of_air*(1+3.76)
CH4 = ct.Quantity(gas)
CH4.TPX = 298.15,101325,'CH4:1'
CH4.moles = 1
#The equivalence ratio determines the species type in the products:
if (1<eq_ratio<=1.8):
CO2_m = 0.5
CO_m = 0.5
H2O_m = (2*m_o_a) - (2*CO2_m+CO_m)
H2_m = 2 - H2O_m
N2_m = 3.76*m_o_a
H2= ct.Quantity(gas)
H2.TPX =1700,101325,'H2:1'
H2.moles = H2_m
CO = ct.Quantity(gas)
CO.TPX =1700,101325,'CO:1'
CO.moles = CO_m
if (eq_ratio==1):
CO2_m = 1
H2O_m = 2
N2_m = 3.76*m_o_a
if (0.6<=eq_ratio<1):
CO2_m = 1
H2O_m = 2
N2_m = 3.76*m_o_a
O2_m = m_o_a - 2
O2 = ct.Quantity(gas)
O2.TPX =1700,101325,'O2:1'
O2.mass = O2_m
CO2 = ct.Quantity(gas)
CO2.TPX =1700,101325,'CO2:1'
CO2.moles = CO2_m
H2O = ct.Quantity(gas)
H2O.TPX =1700,101325,'H2O:1'
H2O.moles = H2O_m
N2 = ct.Quantity(gas)
N2.TPX =1700,101325,'N2:3.76'
N2.moles = N2_m
if (1<eq_ratio<=1.8):
Tot = CO2+H2O+CO+H2+N2
if (eq_ratio==1):
Tot = CO2+H2O+N2
if (0.6<=eq_ratio<1):
Tot = CO2+O2+H2O+N2
eff = -( ((a_f_ratio+1)*(Tot.enthalpy_mass)) - ((a_f_ratio)*(air.enthalpy_mass)) - (CH4.enthalpy_mass) )/50000000
(d) Phase IV: Printing results for stoichiometric mixtures,computing fuel savings, plotting results.
(i) Plotting prerequisite procedure for Air preheat temperature vs Fuel Utilization Efficiency(F.U.E):
- Two 'if' loops are utilized to store the values of fuel utilization efficiency of the stoichiometric mixtures, of each air preheat temperature. The first 'if' loop specifies the air preheat temperature range for which we require the F.U.E, and the second 'if' loop within this defines the equivalence ratio for a stoichiometric mixture.
- The within this 'if' loop, we compile the values of the F.U.E using the array specified in the previous section, using the 'append' command of the NumPy library.
- The air preheat temperatures are compiled in a similar fashion, except for the fact that it is compiled outside of these loops.
(ii) Plotting prerequisite procedure for Equivalence ratio vs Fuel Utilization Efficiency(F.U.E), and printing the results of fuel saving,F.U.E of stoichiometric mixtures with respect to specific air preheat temperatures:
- In order to obtain the fuel utilization efficiencies for each air preheating temperature, an 'if' loop is utilized by setting the condition to the required air preheat temperature, and the hence compiling the values into the arrays specified in an earlier section in the program, by using the 'append' command of the NumPy library. This captures all of the values of efficiency that satisfy the air preheat temperature specified. This is done outside the 'if' loop mentioned below.
- Within this 'if' loop, another 'if' loop is specified. This new 'if' loop is used to obtain the values of the fuel utilization efficiencies of the stoichiometric mixture. The equivalence ratio is specified as 1 in the 'if' loop, and a variable is created to capture the value of the efficiency.
- The amount of fuel saving is obtained by inserting the formula mentioned in the Theory section above into this loop, utilizing the efficiencies without preheat and with preheat.
- The values of the equivalence ratio, air preheat temperature, efficiency and fuel savings are printed using the 'print' command.
- The compilation of all of the equivalance ratio values is done using the same method, but is done with respect to it's respective 'for' loop, and is not done within the 'if' loops mentioned previously.
Lines of code:
if(298.15<=T_air<=600):
if(eq_ratio == 1):
f_u_e_comp = np.append(f_u_e_comp,eff)
if(T_air==298.15):
eff_t1 = np.append(eff_t1,eff)
if(eq_ratio==1):
f_u_e_298 = eff
print('Equivalence ratio = ',eq_ratio)
print('Without preheat (298.15 K)')
print('Fuel utilization efficiency =',eff,'n')
if(T_air==373.61249999999995):
eff_t2 = np.append(eff_t2,eff)
if(eq_ratio==1):
f_u_e_373 = eff
fuel_savings_373 = 1 - (f_u_e_298/f_u_e_373)
print('Equivalence ratio = ',eq_ratio)
print('Air preheat temperature =',T_air,'K')
print('Fuel utilization efficiency =',eff)
print('Fuel savings =',fuel_savings_373*100,'%','n')
if(T_air==449.075):
eff_t3 = np.append(eff_t3,eff)
if(eq_ratio==1):
f_u_e_449 = eff
fuel_savings_449= 1 - (f_u_e_298/f_u_e_449)
print('Equivalence ratio = ',eq_ratio)
print('Air preheat temperature =',T_air,'K')
print('Fuel utilization efficiency =',eff)
print('Fuel savings =',fuel_savings_449*100,'%','n')
if(T_air==524.5375):
eff_t4 = np.append(eff_t4,eff)
if(eq_ratio==1):
f_u_e_524 = eff
fuel_savings_524 = 1 - (f_u_e_298/f_u_e_524)
print('Equivalence ratio = ',eq_ratio)
print('Air preheat temperature =',T_air,'K')
print('Fuel utilization efficiency =',eff)
print('Fuel savings =',fuel_savings_524*100,'%','n')
if(T_air==600):
eff_t5 = np.append(eff_t5,eff)
if(eq_ratio==1):
f_u_e_600 = eff
fuel_savings_600 = 1 - (f_u_e_298/f_u_e_600)
print('Equivalence ratio = ',eq_ratio)
print('Air preheat temperature =',T_air,'K')
print('Fuel utilization efficiency =',eff)
print('Fuel savings =',fuel_savings_600*100,'%','n')
eq_ratio_values = np.append(eq_ratio_values,eq_ratio)
T_air_comp = np.append(T_air_comp,T_air)
(iii) Plotting commands used:
The arrays 'T_air_comp' and 'f_u_e_comp' are used for Air Preheating temperature vs Fuel Utilization Efficiency(figure 1).
The arrays 'eq_ratio_values, eff_t1, eff_t2, eff_t3, eff_t4, eff_t5' are used for Fuel Utilization Efficiency vs Equivalence ratio(figure 2).
Plotting commands used and usage:
1) plot : Simple line plots for Air Preheating temperature vs Fuel Utilization Efficiency and Fuel Utilization Efficiency vs Equivalence ratio, with label and color defined.
2) scatter:Scatter plots of Air Preheating temperature vs Fuel Utilization Efficiency and Fuel Utilization Efficiency vs Equivalence ratio,with color defined.
3) title: Defining the title of the plot.
4) xticks,yticks : Defining density of values on the X,Y-axis respectively('arange' command of the numPy library used within command).
5) xlabel,ylabel : Defining Air Preheating temperature and Fuel Utilization Efficiency,Fuel Utilization Efficiency and Equivalence ratio on the X,Y-axes respectively.
6) legend: Defining the legend and the location.
7) grid : grid is displayed.
8) show: Displays plot.
Lines of code:
plt.figure(1)
plt.title('Air preheat temperature(K) vs Fuel Utilization Efficiency')
plt.xlabel('Air preheat temperature(K)')
plt.ylabel('Fuel Utilization Efficiency')
plt.yticks(np.arange(0, 1, 0.005))
plt.xticks(np.arange(298.15, 600, 15.0925))
plt.plot(T_air_comp,f_u_e_comp,color='r',label='Fuel Utilization Efficiency')
plt.scatter(T_air_comp,f_u_e_comp,color='b')
plt.legend(loc='lower right')
plt.grid()
plt.figure(2)
plt.title('Equivalence ratio vs Fuel Utilization Efficiency')
plt.xlabel('Equivalence ratio')
plt.ylabel('Fuel Utilization Efficiency')
plt.xticks(np.arange(0, 2, 0.04))
plt.yticks(np.arange(0, 1, 0.03))
plt.plot(eq_ratio_values,eff_t1,color='r',label='No preheat(298.15 K)')
plt.plot(eq_ratio_values,eff_t2,color='g',label='Air preheat temp = 373.612 K')
plt.plot(eq_ratio_values,eff_t3,color='b',label='Air preheat temp = 449.075 K')
plt.plot(eq_ratio_values,eff_t4,color='y',label='Air preheat temp = 524.5375 K')
plt.plot(eq_ratio_values,eff_t5,color='c',label='Air preheat temp = 600 K')
plt.scatter(eq_ratio_values,eff_t1,color='r')
plt.scatter(eq_ratio_values,eff_t2,color='g')
plt.scatter(eq_ratio_values,eff_t3,color='b')
plt.scatter(eq_ratio_values,eff_t4,color='y')
plt.scatter(eq_ratio_values,eff_t5,color='c')
plt.legend()
plt.grid()
plt.show()
CODE:
(1) To observe the effect of air pre-heat temperature on the Adiabatic Flame Temperature of Methane:
import cantera as ct
import numpy as np
import math
import matplotlib.pyplot as plt
gas = ct.Solution('gri30.cti')
T_pre_comp= AFT_comp = np.array([])
for T_pre in np.linspace(298.15,600,num=100):
Air = ct.Quantity(gas)
Air.TPX = T_pre,ct.one_atm,{'O2':0.21,'N2':0.79}
Air.moles = 2*(1+3.76)
Fuel = ct.Quantity(gas)
Fuel.TPX = 298.15,ct.one_atm,'CH4:1'
Fuel.moles = 1
M = Air + Fuel
M.equilibrate('HP')
T_pre_comp = np.append(T_pre_comp,T_pre)
AFT_comp = np.append(AFT_comp,M.T)
if(T_pre==298.15):
print('No preheat =',T_pre,'K')
if(T_pre>298.15):
print('Air Preheat Temperature = ',T_pre,'K')
print('AFT=',M.T,'K','n')
plt.figure(1)
plt.plot(T_pre_comp,AFT_comp,label='AFT of Methane',color = 'r')
plt.scatter(T_pre_comp,AFT_comp,color = 'b')
plt.title('Air Preheat Temperature vs Adiabatic Flame Temperature')
plt.xticks(np.arange(298.15,620,12))
plt.yticks(np.arange(2224,2350,8))
plt.xlabel('Air Preheat Temperature(K)')
plt.ylabel('Adiabatic Flame Temperature(K)')
plt.legend(loc='lower right')
plt.show()
(2) To observe the effect of the equivalence ratio and air pre-heat temperature on the combustion/fuel utilization efficiency of the mixture, fixing the furnace exit temperature at 1700K.
import math
import cantera as ct
import matplotlib.pyplot as plt
import numpy as np
gas = ct.Solution('gri30.cti')
#Creating an empty array in order to store the values of the fuel utilization efficiency:
eff_t1 = eff_t2 = eff_t3 = eff_t4 = eff_t5 = T_air_comp= f_u_e_comp = np.array([])
# T_air is the air temperature/preheating temperatures
for T_air in np.linspace(298.15,600,num = 5):
#equivalance ratios are to be stored in an array in order to create a plot.
eq_ratio_values = np.array([])
for eq_ratio in np.linspace(0.6,1.8,num=31):
#actual and stoichiometric mass and moles of fuel and air are set, along with air-fuel ratio.
mass_of_fuel = 1
moles_of_fuel = 1
stoi_mass_of_fuel = 1
stoi_moles_of_fuel = 2
stoi_mass_of_air = 17.12
stoi_f_a_ratio_mass = stoi_mass_of_fuel/stoi_mass_of_air
stoi_f_a_ratio_moles = moles_of_fuel/stoi_moles_of_fuel
moles_of_air = m_o_a = moles_of_fuel/(stoi_f_a_ratio_moles*eq_ratio)
mass_of_air = mass_of_fuel/(stoi_f_a_ratio_mass*eq_ratio)
a_f_ratio = (stoi_mass_of_air/stoi_mass_of_fuel)/eq_ratio
air= ct.Quantity(gas)
air.TPX = T_air,101325,{'O2':1*moles_of_air,'N2':3.76*moles_of_air}
air.moles = moles_of_air*(1+3.76)
CH4 = ct.Quantity(gas)
CH4.TPX = 298.15,101325,'CH4:1'
CH4.moles = 1
#The equivalence ratio determines the species type in the products:
if (1<eq_ratio<=1.8):
CO2_m = 0.5
CO_m = 0.5
H2O_m = (2*m_o_a) - (2*CO2_m+CO_m)
H2_m = 2 - H2O_m
N2_m = 3.76*m_o_a
H2= ct.Quantity(gas)
H2.TPX =1700,101325,'H2:1'
H2.moles = H2_m
CO = ct.Quantity(gas)
CO.TPX =1700,101325,'CO:1'
CO.moles = CO_m
if (eq_ratio==1):
CO2_m = 1
H2O_m = 2
N2_m = 3.76*m_o_a
if (0.6<=eq_ratio<1):
CO2_m = 1
H2O_m = 2
N2_m = 3.76*m_o_a
O2_m = m_o_a - 2
O2 = ct.Quantity(gas)
O2.TPX =1700,101325,'O2:1'
O2.mass = O2_m
CO2 = ct.Quantity(gas)
CO2.TPX =1700,101325,'CO2:1'
CO2.moles = CO2_m
H2O = ct.Quantity(gas)
H2O.TPX =1700,101325,'H2O:1'
H2O.moles = H2O_m
N2 = ct.Quantity(gas)
N2.TPX =1700,101325,'N2:3.76'
N2.moles = N2_m
if (1<eq_ratio<=1.8):
Tot = CO2+H2O+CO+H2+N2
if (eq_ratio==1):
Tot = CO2+H2O+N2
if (0.6<=eq_ratio<1):
Tot = CO2+O2+H2O+N2
eff = -( ((a_f_ratio+1)*(Tot.enthalpy_mass)) - ((a_f_ratio)*(air.enthalpy_mass)) - (CH4.enthalpy_mass) )/50000000
if(298.15<=T_air<=600):
if(eq_ratio == 1):
f_u_e_comp = np.append(f_u_e_comp,eff)
if(T_air==298.15):
eff_t1 = np.append(eff_t1,eff)
if(eq_ratio==1):
f_u_e_298 = eff
print('Equivalence ratio = ',eq_ratio)
print('Without preheat (298.15 K)')
print('Fuel utilization efficiency =',eff,'n')
if(T_air==373.61249999999995):
eff_t2 = np.append(eff_t2,eff)
if(eq_ratio==1):
f_u_e_373 = eff
fuel_savings_373 = 1 - (f_u_e_298/f_u_e_373)
print('Equivalence ratio = ',eq_ratio)
print('Air preheat temperature =',T_air,'K')
print('Fuel utilization efficiency =',eff)
print('Fuel savings =',fuel_savings_373*100,'%','n')
if(T_air==449.075):
eff_t3 = np.append(eff_t3,eff)
if(eq_ratio==1):
f_u_e_449 = eff
fuel_savings_449= 1 - (f_u_e_298/f_u_e_449)
print('Equivalence ratio = ',eq_ratio)
print('Air preheat temperature =',T_air,'K')
print('Fuel utilization efficiency =',eff)
print('Fuel savings =',fuel_savings_449*100,'%','n')
if(T_air==524.5375):
eff_t4 = np.append(eff_t4,eff)
if(eq_ratio==1):
f_u_e_524 = eff
fuel_savings_524 = 1 - (f_u_e_298/f_u_e_524)
print('Equivalence ratio = ',eq_ratio)
print('Air preheat temperature =',T_air,'K')
print('Fuel utilization efficiency =',eff)
print('Fuel savings =',fuel_savings_524*100,'%','n')
if(T_air==600):
eff_t5 = np.append(eff_t5,eff)
if(eq_ratio==1):
f_u_e_600 = eff
fuel_savings_600 = 1 - (f_u_e_298/f_u_e_600)
print('Equivalence ratio = ',eq_ratio)
print('Air preheat temperature =',T_air,'K')
print('Fuel utilization efficiency =',eff)
print('Fuel savings =',fuel_savings_600*100,'%','n')
eq_ratio_values = np.append(eq_ratio_values,eq_ratio)
T_air_comp = np.append(T_air_comp,T_air)
plt.figure(1)
plt.title('Air preheat temperature(K) vs Fuel Utilization Efficiency')
plt.xlabel('Air preheat temperature(K)')
plt.ylabel('Fuel Utilization Efficiency')
plt.yticks(np.arange(0, 1, 0.005))
plt.xticks(np.arange(298.15, 600, 15.0925))
plt.plot(T_air_comp,f_u_e_comp,color='r',label='Fuel Utilization Efficiency')
plt.scatter(T_air_comp,f_u_e_comp,color='b')
plt.legend(loc='lower right')
plt.grid()
plt.figure(2)
plt.title('Equivalence ratio vs Fuel Utilization Efficiency')
plt.xlabel('Equivalence ratio')
plt.ylabel('Fuel Utilization Efficiency')
plt.xticks(np.arange(0, 2, 0.04))
plt.yticks(np.arange(0, 1, 0.03))
plt.plot(eq_ratio_values,eff_t1,color='r',label='No preheat(298.15 K)')
plt.plot(eq_ratio_values,eff_t2,color='g',label='Air preheat temp = 373.612 K')
plt.plot(eq_ratio_values,eff_t3,color='b',label='Air preheat temp = 449.075 K')
plt.plot(eq_ratio_values,eff_t4,color='y',label='Air preheat temp = 524.5375 K')
plt.plot(eq_ratio_values,eff_t5,color='c',label='Air preheat temp = 600 K')
plt.scatter(eq_ratio_values,eff_t1,color='r')
plt.scatter(eq_ratio_values,eff_t2,color='g')
plt.scatter(eq_ratio_values,eff_t3,color='b')
plt.scatter(eq_ratio_values,eff_t4,color='y')
plt.scatter(eq_ratio_values,eff_t5,color='c')
plt.legend()
plt.grid()
plt.show()
RESULTS:
(1) To observe the effect of air pre-heat temperature on the Adiabatic Flame Temperature of Methane:
Air Preheat Temperature vs Adiabatic flame temperature:

From the plot:
- Adiabatic flame temperature without preheat = 2224 K
- Adiabatic flame temperature with air preheat temperature of 600K = 2346 K
Explanation:
Upon observing the plot, it can be said that the adiabatic flame temperature of methane increases with the increase of air preheat temperature.
This can be attributed to the enthalpy of the reactants. The enthalpy of air increases, with the increase in air preheat temperature. For the adiabatic flame temperature, the difference between the enthalpy of the products and the enthalpy of the reactants should ideally, be zero. This condition is never truly satisfied, as the difference between the enthalpies is never zero, but a value close to it. If observed from this perspective, the results begin to make sense.
Without preheat, the difference of the enthalpies of the products and the reactants is small, but not zero. But, if the air preheat temperature is increased, the enthalpy of the air increases, and the difference between the enthalpy of the products and the reactants reduces even further.
Taking this into consideration, it can be said that, with the additional preheat, the adiabatic conditions required for adiabatic flame temperature come closer to being fulfilled, compared to the conditions without preheat.
Hence, in conclusion,the difference between the enthalpies of the products and the reactants approaches a value closer to zero, hence increasing the adiabatic flame temperature of the mixture.
The specific heat of the mixture increases with the increase in the air preheat temperature, and this is an alternative explanation as to why the adiabatic flame temperature increases with air preheat.
Adiabatic flame temperatures with preheat and without preheat (Python console):

(2) To observe the effect of the equivalence ratio and air pre-heat temperature on the combustion/fuel utilization efficiency of the mixture, fixing the furnace exit temperature at 1700K:
(a) Effect of preheating on Fuel utilization efficiency and fuel savings, of a stoichiometric mixture:
Python console results:

Air preheat temperature vs Fuel Utilization Efficiency:

From the results:
- Fuel utilization efficiency at 298.15 K = 0.3387 or 33.87 %
- Fuel utilization efficiency at 600 K = 0.4453 or 44.53 %
- Fuel savings at 298.15 K = 0 %
- Fuel savings at 600 K = 23.92 %
Explanations:
Observing the Python console results and the plot displayed above, two conclusions can be made.
(i) The fuel utilization efficiency increases with the air preheating temperature.
(ii) The fuel savings increase with increase in air preheating temperature.
These two conclusions are mutually inclusive. The fuel utilization efficiency increases due to the reduced amount of heat required to achieve combustion. The temperature of the air is higher after preheating, hence increasing the enthalpy of the air by a significant amount. Air at room temperature, has low enthalpy, and the majority of the enthalpy of air in general, is contributed by the nitrogen within it.
This is important, as increasing the temperature increases the enthalpy of the nitrogen within the air by a significant amount. Due to this phenomenon, the heat content possessed by the air is significantly higher, and this heat contributes to combustion.
This essentially means that less fuel is burnt to achieve combustion, as the heat content in the air offsets the excess combustion of fuel required to achieve the same amount of heat generation. To put it simply, the same amount of heat is generated, without burning excess fuel.
If less fuel is being utilized for combustion, this suggests that fuel is being saved by preheating the air.
The fuel utilization efficiency at 600 K is 44.53 %, whereas at room temperature, it is 33.87%. The fuel utilization efficiency increases by 10%, which is a significant increase.
The 23.92% fuel is saved by preheating the air to 600K.
Hence, it can be concluded that air preheating is highly beneficial for the efficiency of a furnace.
(b) Effect of air preheating on the lean,stoichiometric and rich mixtures:
Equivalence ratio vs Fuel Utilization Efficiency:

Explanations:
From the plot displayed above, the benefits of air preheating become apparent. For lean mixtures with an equivalance ratios of 0.72,0.84,0.88 and 0.92,with air preheating temperatures of 600,524,449,and 373K respectively, a fuel utilzation efficiency of around 0.33 or 33%, is observed. This value is around the maximum of the fuel utilization efficiency of a stoichiometric mixture without preheat. This is a testament to the effectiveness of air preheating.
Similar trends can be seen with the other preheated temperatures. The some of the rich and lean mixtures with air preheat, have greater or around the same fuel utilization efficiency as the stoichiometric mixture without preheat.
This suggests that preheating the air has profound benefits on the efficiency, regardless of the mixture being rich or lean. The heat content carried by the air is significant enough to promote combustion, regardless of the mixture type. Again, this can be attributed to the increased enthalpy of the air.
Hence,it can be concluded that using lean mixtures with air preheating is optimal for practical applications.
Fixed furnace exit temperature:
The exit temperature of the flue gases gives us an understanding of how well the furnace is operating. Ideally, the furnace exit temperature should be very low, as this suggests that the majority of the heat generated in the system is contributing to the job the furnace is required to perform,such as, giving heat to the stock within it. If the temperature of the flue gases is very high, this means that the heat generated due to combustion is not being used optimally, and the thermal efficiency of the system will reduce.
Assuming a fixed furnace temperature will prevent us from understanding if the system is performing within an optimal range, and the shortcomings of the system cannot be analysed. Hence, the analysing and determining the actual exit temperature of the flue gases is vital.
A fixed furnace temperature for primitive ballpark calculations might be useful, but will be ultimately be detrimental for practical applications.
Google drive link for python programs:
https://drive.google.com/drive/folders/1U3MIum6_qa-3hXW8udzmL5S6BSPEAvGm?usp=sharing