Fuel Allocation
An introduction to fuel allocation and estimation methods, addressing and correcting an error in Alberta Quantification Methodologies v2.3.
Envirobyte
Fuel Allocation
AQM v2.3 Fuel Consumption Calculation (Equation C.6-1)
Alberta greenhouse gas quantification methodologies, AQM v2.3 provides methods to estimate fuel consumption for combustion equipment. However, a critical issue arises in Equation C.6-1, where the calculation does not accurately reflect energy input as intended.
The equation provided in AQM v2.3 for estimating fuel consumption is:
where
- is estimated fuel consumption from combustion equipment for a specific fuel type for the reporting period, p (m3).
- is equipment type
- is the maximum rated input power of the equipment j (kW).
- is the load factor for each type of equipment j.
- is the operating hours for each type of equipment j.
- is the thermal efficiency of the equipment j.
- is the lower heating value of the fuel for each type of equipment j (MJ/m3).
- 0.0036 Conversion factor for kWh to GJ.
The thermal efficiency represents the ratio of output energy to input energy:
When this efficiency factor is applied in AQM's equation, the calculation inadvertently represents energy output rather than input.
API Fuel Calculation
American Petroleum Institute (API)'s Compendium of Greenhouse Gas Emissions Methodologies for the Natural Gas and Oil Industry, 2021 provides a correct methodology for calculating fuel consumption in Equation 4-5 and 4-6:
API 2021 Equation 4-5.
where,
- FC is the fuel consumption (volumen/year)
- ER is the equipment rate (hp,kW,or J)
- LF is the load factor
- OH is the operating hours
- ETT is the equipment thermal efficiency (Btu input / hp-hr output, Btuinput / kW-hr output, or Jinput / J output))
- HV is the higher heating value
In the API 2021 compendium, thermal efficiency is represented as input-to-output (opposite to the standard output-to-input convention), and equipment rate is based on the equipment's output power, unlike AQM v2.3's focus on input power.
Nameplate
The inconsistency between AQM v2.3 and API v2021 methodologies can be attributed to differences in nameplate power definitions:
- For boilers and heaters, the nameplate often indicates energy input 1.
- In API v2021, the equipment rate corresponds to output energy.
Correction to AQM v2.3
The AQM Table C-1 and C-2 provide both thermal efficiency and load factors (based on fractions of maximum rated power output). This correction implies that should represent output power, not input as stated in AQM v2.3.
-
For engines and motors: Nameplate power indicates output power, so AQM v2.3's approach can convert output to input.
-
For heaters and boilers: Nameplate power already represents input power, so dividing by thermal efficiency is unnecessary. However, AQM v2.3 Table C-2 set the thermal efficiency for heaters and boilers as 1. The corrected equation for these types of equipment is:
where
- is estimated fuel consumption from combustion equipment for a specific fuel type for the reporting period, p (m3).
- is equipment type
- is the maximum rated input power of the equipment j (kW).
- is the load factor for each type of equipment j.
- is the operating hours for each type of equipment j.
- is the lower heating value of the fuel for each type of equipment j (MJ/m3).
- 0.0036 Conversion factor for kWh to GJ.
This correction aligns AQM with actual practice for fuel allocation calculations.
Python Code
To illustrate this methodology, we’ve included a Python function to calculate allocated fuel consumption based on nameplate power, operating hours, load factor, and thermal efficiency.
import pandas as pd
def calculate_allocated_fuel(row, df_clean):
# Subset of the relevant block
block = df_clean[(df_clean["Month"] == row["Month"]) & (df_clean["Phase"] == row["Phase"])]
numerator = (row["Nameplate Power (kW)"] * row["Equipment Hours"] * row["Load"]) / row["Thermal Eff."]
denominator = (
(block["Nameplate Power (kW)"] * block["Equipment Hours"] * block["Load"]) / block["Thermal Eff."]
).sum()
if denominator == 0:
return 0
else:
return row["Fuel"] * (numerator / denominator)
df_clean["Allocated Fuel"] = df_clean.apply(lambda row: calculate_allocated_fuel(row, df_clean), axis=1)
print("Updated DataFrame with Allocated Fuel:")
print(df_clean.head(18))
print(df_clean.tail(18))
file_path = 'path_to_your_file.xlsx'
with pd.ExcelWriter(file_path, mode='a') as writer:
df_clean.to_excel(writer, index=False, sheet_name='Allocated Fuel Data')
print("Updated DataFrame with Allocated Fuel has been written to a new sheet in the original Excel file.")
Reference [1]: https://www2.gov.bc.ca/gov/content/environment/waste-management/industrial-waste/agriculture/regulation-requirements/agricultural-boilers-heaters