This PR was started to add NOx and SO2 factors for boiler configurations in the historical data that were not previously specified. This is part of the effort to improve NOx and SO2 data quality for new historical years from 2005-2018.
Programmatic creation of the factor tables
Instead of continuing to manually update these in the table, we add a script to programmatically create the nox and so2 factor reference tables to address https://github.com/singularity-energy/open-grid-emissions/issues/276. This is meant to reduce the risk of typos, ensure consistency in the methodology, and also add transparency to how these factors are created.
Fluidized Bed Boilers
As noted by the EIA's Electric Power Annual technical notes, while the uncontrolled emissions factors published by EIA need to be adjusted to account for each plant's operational pollution control equipment, the exception is for fluidized bed boilers:
A special case for removal of SO2 is the fluidized bed boiler, in which the sulfur removal process is integral with the operation of the boiler. The SO2 emission factors shown in Table A.1. for fluidized bed boilers already account for 90 percent removal of SO2 since, in effect, the plant has no uncontrolled emissions of this pollutant.
Previously, we had been applying pollution control efficiency values to adjust so2 emissions from these boilers, which would underestimate emissions. We now do not adjust so2 emissions for this type of boiler since the calculated values already represent controlled emissions. It looks like this may have only affected a small number of plants, since many plants did not report control efficiencies for fluidized bed technologies in EIA-923.
Update default assumed value
This PR also includes an important methodological update on the assumptions used for assigning NOx and SO2 factors for boilers with missing boiler configuration data. When boiler configuration data is unknown, we had previously been using the lowest fuel-specific NOx or SO2 factor of any boiler firing type, with the reasoning that this is the minimum amount of emissions that could be expected. This was also the approach that eGRID had used in previous years (looking at more recent versions of eGRID, it looks like they may have abandoned this approach).
However, there are several drawbacks of this approach. For SO2, since the fluidized bed factors are already controlled, this approach would mean generally assuming that the generator is a fluidized bed boiler, which would be applying a special case as the default backstop. In the case of NOx, this could lead to the assumptions of different types of boilers being the standard default. The EIA's default assumption, in the case that boiler information is unavailable, is to assume that the boiler has a dry-bottom firing method falling into the "all other category." We adopt this assumption in this PR, which generally have the effect of increasing NOx and SO2 emissions in these cases.
https://github.com/singularity-energy/open-grid-emissions/issues/150
What the code is doing
How is the purpose executed?
Testing
In the notebook, I test for:
duplicate factors
How much the current factors differ from the factors already in reference_tables
That all historical boiler configurations are covered.
Ran pipeline for 2017-2018
Where to look
src/oge/create_nox_so2_factors.py
Usage Example/Visuals
For NOx, there are 80 factors that are different from previous.
For SO2, there are 288 factors that are different from the previous factors.
Inspecting these differences reveals that they are based on the updated default assumption, and how we treat combustion turbines with a specified boiler firing type. Where previously we had been assigning the combustion turbine factor, we now use the factor associated with the boiler firing type, since these may be associated with HRSG configurations (see: https://www.eia.gov/todayinenergy/detail.php?id=52778)
There are a few configurations for which NOx factors are still missing, but these seem to be anomalies (eg a hydro plant burning oil). This may just be a figment of the test logic I set up and these anomalous configurations may not appear in the real data.
Purpose
This PR was started to add NOx and SO2 factors for boiler configurations in the historical data that were not previously specified. This is part of the effort to improve NOx and SO2 data quality for new historical years from 2005-2018.
Programmatic creation of the factor tables Instead of continuing to manually update these in the table, we add a script to programmatically create the nox and so2 factor reference tables to address https://github.com/singularity-energy/open-grid-emissions/issues/276. This is meant to reduce the risk of typos, ensure consistency in the methodology, and also add transparency to how these factors are created.
Fluidized Bed Boilers As noted by the EIA's Electric Power Annual technical notes, while the uncontrolled emissions factors published by EIA need to be adjusted to account for each plant's operational pollution control equipment, the exception is for fluidized bed boilers:
Previously, we had been applying pollution control efficiency values to adjust so2 emissions from these boilers, which would underestimate emissions. We now do not adjust so2 emissions for this type of boiler since the calculated values already represent controlled emissions. It looks like this may have only affected a small number of plants, since many plants did not report control efficiencies for fluidized bed technologies in EIA-923.
Update default assumed value This PR also includes an important methodological update on the assumptions used for assigning NOx and SO2 factors for boilers with missing boiler configuration data. When boiler configuration data is unknown, we had previously been using the lowest fuel-specific NOx or SO2 factor of any boiler firing type, with the reasoning that this is the minimum amount of emissions that could be expected. This was also the approach that eGRID had used in previous years (looking at more recent versions of eGRID, it looks like they may have abandoned this approach).
However, there are several drawbacks of this approach. For SO2, since the fluidized bed factors are already controlled, this approach would mean generally assuming that the generator is a fluidized bed boiler, which would be applying a special case as the default backstop. In the case of NOx, this could lead to the assumptions of different types of boilers being the standard default. The EIA's default assumption, in the case that boiler information is unavailable, is to assume that the boiler has a dry-bottom firing method falling into the "all other category." We adopt this assumption in this PR, which generally have the effect of increasing NOx and SO2 emissions in these cases. https://github.com/singularity-energy/open-grid-emissions/issues/150
What the code is doing
How is the purpose executed?
Testing
In the notebook, I test for:
reference_tables
Ran pipeline for 2017-2018
Where to look
Usage Example/Visuals
For NOx, there are 80 factors that are different from previous.
For SO2, there are 288 factors that are different from the previous factors.
Inspecting these differences reveals that they are based on the updated default assumption, and how we treat combustion turbines with a specified boiler firing type. Where previously we had been assigning the combustion turbine factor, we now use the factor associated with the boiler firing type, since these may be associated with HRSG configurations (see: https://www.eia.gov/todayinenergy/detail.php?id=52778)
There are a few configurations for which NOx factors are still missing, but these seem to be anomalies (eg a hydro plant burning oil). This may just be a figment of the test logic I set up and these anomalous configurations may not appear in the real data.
Review estimate
20-30 min
Future work
Updating LFG factors: https://github.com/singularity-energy/open-grid-emissions/issues/218 Default factor assumptions: https://github.com/singularity-energy/open-grid-emissions/issues/69
Checklist
black