EDGAR v8.1 Global Air Pollutant Emissions

Overview

We have a data loader for EDGAR v8.1 monthly global air pollutant emissions, EDGARv81MonthlyEmis.

EDGAR (Emissions Database for Global Atmospheric Research) provides global gridded emissions at 0.1°×0.1° resolution for 2000-2022. Monthly flux data (kg m⁻² s⁻¹) is available for 9 pollutants (BC, CO, NH3, NMVOC, NOx, OC, PM10, PM2.5, SO2) across multiple emission sectors.

Reference: Crippa, M., et al. (2024). EDGAR v8.1 Global Air Pollutant Emissions. European Commission, Joint Research Centre (JRC). https://edgar.jrc.ec.europa.eu/dataset_ap81

EarthSciData.EDGARv81MonthlyEmisFunction
EDGARv81MonthlyEmis(
    substance,
    sector,
    domaininfo;
    scale,
    name,
    stream,
    spatial_interp
)

A data loader for EDGAR v8.1 monthly global air pollutant emissions data at 0.1°×0.1° resolution. Data spans 2000-2022 and is available from: https://edgar.jrc.ec.europa.eu/dataset_ap81

substance is the pollutant name (one of: BC, CO, NH3, NMVOC, NOx, OC, PM10, PM2.5, SO2).

sector is the emission sector (e.g. "POWER_INDUSTRY", "TRANSPORT", "AGRICULTURE", etc.).

domaininfo should specify lon, lat, and lev coordinate variables.

scale is a scaling factor to apply to the emissions data.

stream specifies whether the data should be streamed in as needed or loaded all at once.

spatial_interp = :linear (default) does full multilinear interpolation; :nearest does spatial nearest-neighbour + time-only linear interpolation for ~8x speedup when queries are always at grid points.

Note: emissions are applied only at the surface level (lev < 2) and converted from flux (kg m⁻² s⁻¹) to volumetric rate (kg m⁻³ s⁻¹) by dividing by the first-layer height Δz.

source

Equations

This is what its equation system looks like:

using EarthSciData, EarthSciMLBase
using ModelingToolkit, DynamicQuantities, DataFrames
using ModelingToolkit: t
using DynamicQuantities: dimension
using Dates

domain = DomainInfo(
    DateTime(2020, 6, 1), DateTime(2020, 7, 1);
    lonrange = deg2rad(-10.0):deg2rad(2.5):deg2rad(30.0),
    latrange = deg2rad(40.0):deg2rad(2):deg2rad(60.0),
    levrange = 1:10
)

emis = EDGARv81MonthlyEmis("NOx", "POWER_INDUSTRY", domain)

\[ \begin{align} \mathtt{fluxes}\left( t \right) &= ifelse\left( \mathtt{lev} < 2, \frac{\mathtt{fluxes\_unit} ~ interp\_unsafe\left( \mathtt{fluxes\_data}, 1 + \frac{ - \mathtt{fluxes\_tstart} + t + \mathtt{t\_ref}}{\mathtt{fluxes\_tstep}}, 1 + \frac{ - \mathtt{fluxes\_s1start} + \mathtt{lon}}{\mathtt{fluxes\_s1step}}, 1 + \frac{ - \mathtt{fluxes\_s2start} + \mathtt{lat}}{\mathtt{fluxes\_s2step}}, \mathtt{fluxes\_extrap} \right)}{\mathtt{{\Delta}z}}, \mathtt{zero\_fluxes} \right) \end{align} \]

Variables

Here are the variables in tabular format:

function table(vars)
    DataFrame(
        :Name => [string(Symbolics.tosymbol(v, escape = false)) for v in vars],
        :Units => [dimension(ModelingToolkit.get_unit(v)) for v in vars],
        :Description => [ModelingToolkit.getdescription(v) for v in vars]
    )
end
table(unknowns(emis))
1×3 DataFrame
RowNameUnitsDescription
StringDimensio…String
1fluxesm⁻³ kg s⁻¹Power industry

Parameters

Finally, here are the parameters in tabular format:

table(parameters(emis))
15×3 DataFrame
RowNameUnitsDescription
StringDimensio…String
1lonLongitude
2latLatitude
3levLevel Index
4ΔzmHeight of the first vertical grid layer
5fluxes_s1startSpatial grid start dim 1 for fluxes
6fluxes_s1stepSpatial grid step dim 1 for fluxes
7fluxes_s2startSpatial grid start dim 2 for fluxes
8fluxes_s2stepSpatial grid step dim 2 for fluxes
9fluxes_extrapExtrapolation type for fluxes
10fluxes_unitm⁻² kg s⁻¹Unit scale for fluxes
11zero_fluxesm⁻³ kg s⁻¹
12fluxes_dataInterpolation data for fluxes
13fluxes_tstartsTime grid start for fluxes
14fluxes_tstepsTime grid step for fluxes
15t_refsReference time