Non-Additive Emission Impacts When Using Zero-Out Method for SNAP Source Apportionment in SMOKE

Hello SMOKE community,

I’m conducting source apportionment using SMOKE v4.8 for 13 SNAP emission sectors by running the zero-out method (BASE scenario plus 13 scenarios with each SNAP category zeroed via removing one category at a time) for each month of 2019. In my post processing, I’m getting non-additive results where the sum of individual SNAP contributions doesn’t equal the BASE scenario, and I’m seeking guidance on whether this is expected behavior.
Setup:

SMOKE v4.8, area sources, European domain
13 SNAP categories (energy, industry, transport, agriculture, etc.)
Year 2019, monthly SMOKE runs
Zero-out method: One SNAP category is not taken into consideration for each run, by removing its txt file from arinv.area.lst inside area inventory folder.

For post-processing, I computed total annual emissions per pollutant and per scenario by summing all hourly emission values over all grid cells and over all timesteps from the SMOKE EGTS output files. Specifically:
For each scenario (BASE and each zero-SNAP run), for each pollutant, I read all .ncf files, summed emissions over all time steps and spatial grid cells, without any averaging or normalization. The resulting value represents the total annual emission mass over the full modeling domain. Sectoral impacts were computed as:
ImpactSNAPi=BASE−zeroSNAPi. Then, I evaluated additivity by comparing:
∑ImpactSNAPi vs BASE.

PMFINE PMC PM10 NO NO2 SO2 NH3 CO NOx
IMPACTSUM 620327566 351324279 971650572 48463517 47688032.5 39428038.75 102982685.5 373153510 96151520.5
BASE-IMPACTSUM 2584338 1943727 4529336 1797991.5 66881.25 88870.75 29080.5 16767804 1864914
relative residual % 0.00415 0.00550 0.00464 0.03577 0.00140 0.00225 0.00028 0.04300 0.01903

Small residual differences (<5%) were observed, so I am trying to understand the reasons. A colleague supports that successfully used this method some years ago with perfect additivity, so I’m concerned something is wrong with my approach. Does SMOKE distribute emissions, renormalize temporal splits, apply speciation or vertical allocation? When one sector is removed, can temporal redistribution slightly shift how other emissions are written due to floating point ordering, accumulation and minor nonlinearities and introduce small deviations? Is there available documentation on what normalization is performed (if it does) or whether it could cause the remaining non-zeroed profiles to be redistributed differently when one category is removed?

Thank you for any insights!

Hi,

Depending on the temporal profile type it is common to see aggregate differences less than 5%, particularly when using a representative day approach. Do you have an example temporal profile that you can share?

SMOKE, by default, renormalizes temporal profiles ( 4.17.3. Files and Environment Variables ). This can be turned off by setting the environment variable RENORM_TPROF to “N”.

Hello,

Thank you for the reply,

I am using standard monthly, weekly, and hourly temporal profiles (APTPRO files) and my ASSIGNS files do not have the variable RENORM_TPROF.

amptpro_weekly.csv (1006 Bytes)

amptpro_hourly.csv (2.4 KB)

amptpro_monthly.csv (1.3 KB)

Thanks, these profiles appear to already sum to 1 so the renormalization setting would not make any difference whether on or off.

The type of temporal profiles that you are using typically map to representative days, or a day of emissions that represents all other of the same day of week in the month. When applying the representative day approach aggregation back from daily to annual can result in differences up to 0.5% because the number of days of each type is not the same for each month. This, however does not completely explain the differences for CO and NO.

Just to verify, when you are adding the emissions from the netCDFs are you only including the first 24 hours from each file?

Thanks for checking.

In my post-processing, I sum all emissions across the entire domain and across all timesteps in the NetCDF files. For each file I read the pollutant variable and compute the total using np.nansum, which sums across all dimensions (time and grid cells). I then accumulate this over all files in the scenario directory. The files start at 01:00 of the first day of the month and extend until 00:00 of the first day of the following month (For example: January: 2019-01-01 01:00 → 2019-02-01 00:00, February: 2019-02-01 01:00 → 2019-03-01 00:00). Therefore each monthly file contains all hours of the month plus one additional hour from the next month, without duplication of timestamps. So the aggregation includes the entire temporal coverage of each file rather than only the first 24 hours.

Hello,

After rerunning all scenarios - including BASE- using RENORM_TPROF to N, my final post processing results are:

PMFINE PMC PM10 NO NO2 SO2 NH3 CO NOx
IMPACTSUM 622910814 353255638 976162036 48524077 47747734 39516680 103010630 375276354 96271418
BASE-IMPACTSUM -3034 -494 716 1730007.5 -116.25 40 369.999999776483 14572734 1730259
relative residual % -4.87143543309241E-06 -1.39934083341873E-06 7.3372857283021E-07 0.034673156584945 -2.45284125209306E-06 1.01326362079622E-06 3.59202027624075E-06 0.037514716615176 0.017784783408187

So, now, SO2 and NH3 are now additive to machine precision. However, NO and CO still show ~3–4% residuals. Does it suggest that the non-additivity originates from representative-day temporal allocation rather than temporal renormalization or post-processing aggregation? Can this be due to that CO and NO are emitted strongly by multiple dominant sectors, and when those sectors use representative-day temporal allocation, non-additivity becomes much more visible? Is it an expected SMOKE behavior?