R package to estimate bottom-up Vehicular Emissions INventories VEIN.
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


title author date output
VEIN model
Sergio Ibarra-Espinosa
19 de Octubre de 2016
knitr::opts_chunk$set(echo = TRUE)

Travis-CI Build Status AppVeyor Build Status DOI Coverage Status CRAN_Status_Badge CRAN Downloads Package Status

Paper 😃 Published 😃 on GMD 🎉🎉 !!

Our paper was published on GMD:


Vehicular Emissions INventory (VEIN) model.

Please read the documentation.

What is VEIN ?

Vehicular Emissions Inventories. An R package to estimate vehicular emissions. It currently covers the following pollutants in speed functions:

  • Criteria: "CO", "NOx", "HC", "PM", "CH4", "NMHC", "CO2", "SO2", "Pb", "FC" (Fuel Consumption).
  • PAH and POP: "indeno(1,2,3-cd)pyrene", "benzo(k)fluoranthene", "benzo(b)fluoranthene", "benzo(ghi)perylene", "fluoranthene", "benzo(a)pyrene", "pyrene", "perylene", "anthanthrene", "benzo(b)fluorene", "benzo(e)pyrene", "triphenylene", "benzo(j)fluoranthene", "dibenzo(a,j)anthacene", "dibenzo(a,l)pyrene", "3,6-dimethyl-phenanthrene", "benzo(a)anthracene", "acenaphthylene", "acenapthene", "fluorene", "chrysene", "phenanthrene", "napthalene", "anthracene", "coronene", "dibenzo(ah)anthracene"
  • Dioxins and Furans: "PCDD", "PCDF", "PCB".
  • Metals: "As", "Cd", "Cr", "Cu", "Hg", "Ni", "Pb", "Se", "Zn".
  • NMHC:
  • ALKANES: "ethane", "propane", "butane", "isobutane", "pentane", "isopentane", "hexane", "heptane", "octane", "TWO_methylhexane", "nonane", "TWO_methylheptane", "THREE_methylhexane", "decane", "THREE_methylheptane", "alcanes_C10_C12", "alkanes_C13".
  • CYCLOALKANES: "cycloalcanes".
  • ALKENES: "ethylene", "propylene", "propadiene", "ONE_butene", "isobutene", "TWO_butene", "ONE_3_butadiene", "ONE_pentene", "TWO_pentene", "ONE_hexene", "dimethylhexene".
  • ALKYNES:"ONE_butine", "propine", "acetylene".
  • ALDEHYDES: "formaldehyde", "acetaldehyde", "acrolein", "benzaldehyde", "crotonaldehyde", "methacrolein", "butyraldehyde", "isobutanaldehyde", "propionaldehyde", "hexanal", "i_valeraldehyde", "valeraldehyde", "o_tolualdehyde", "m_tolualdehyde", "p_tolualdehyde".
  • KETONES: "acetone", "methylethlketone".
  • AROMATICS: "toluene", "ethylbenzene", "m_p_xylene", "o_xylene", "ONE_2_3_trimethylbenzene", "ONE_2_4_trimethylbenzene", "ONE_3_5_trimethylbenzene", "styrene", "benzene", "C9", "C10", "C13".

Also, Brazilian emission factors and speciations for WRF-Chem runs:

e_eth e_hc3 e_hc5 e_hc8 e_ol2 e_olt e_oli e_iso e_tol e_xyl e_c2h5oh e_ald e_hcho e_ch3oh e_ket E_SO4i E_SO4j E_NO3i E_NO3j E_MP2.5i E_MP2.5j E_ORGi E_ORGj E_ECi E_ECj

BONUS: I've added the CETESB Emissio Factors 2016!

System requirements

vein imports functions from spatial packages listed below. In order to install these packages, firstly the user must install the requirements mentioned here.

Packages needed

After installing system dependencies, you will need these packages:

In order to run the demo, this package is also needed:


VEIN can be installed via CRAN or github




What is new? (v0.4.4)

  • ef_cetesb
  • vein_notes
  • VEIN imports sf functions.
  • Covers estimations of compounds of pollutants (e.g.: isobutene)
  • Add com util functions such as emis_source to source vein scripts.
  • Add emis_dist function to distribute top-down emissions into 'sf' objects by feature, specifically, ir returns a vector of lines (streeets).
  • Check the NEWS

future steps

  • Tests!
  • Parallelism. I've done some tests already with good results.
  • RCPP integration. I would like to do it, specifically in emis.
  • Estimation of evaporative emissions with Copert Tier 3.
  • More speciations.
  • A book (hopefully released in 2018). Currently 200 pags. No decided if it wiill be Leanpub or send to CRC.

How does it work?

VEIN consist of: "Elaboration of vehicular emissions inventories, consisting in four stages:

  1. pre-processing activity data,
  2. preparing emissions factors,
  3. estimating the emissions and
  4. post-processing of emissions in maps and databases."

This implies the use of several functions in a coordinates ans structured way, therefore it is added the new function inventory which creates a structured set of directories and scripts to run VEIN. Please, open the file 'main.R' and run each line to understand VEIN. Remember, if you have doubts with any function, just type '?' with the name of the function. For intance: ?inventory.

Using inventory

inventory(name = file.path(tempdir(), "YourCity"), show.dir = T,
          show.scripts = T)

Please, read the examples in the documentation of each function and run the demo.

1) Examples with traffic data:

age functions:

PC_E25_1400 <- age_ldv(x = net$ldv, name = "PC_E25_1400")
plot(PC_E25_1400, xlab = "age of use")

If you want to know the vehicles per street and by age of use, just add the net. Age functions now returns 'sf' objects if the net argument is present.

PC_E25_1400net <- age_ldv(x = net$ldv, name = "PC_E25_1400", net = net)
sp::spplot(as(PC_E25_1400net, "Spatial"),
       c("PC_E25_1400_1", "PC_E25_1400_9"),
       main = "PC by age of use", scales = list(draw = T),
       col.regions = rev(cptcity::cpt()))

temporal factors and netspeed

pc_week <- temp_fact(net$ldv+net$hdv, pc_profile)
dfspeed <- netspeed(pc_week, net$ps, net$ffs, net$capacity, net$lkm, alpha = 1.5)
plot(dfspeed, xlab = "Hours", ylab = "Speed [km/h]") 

If you want ot check the speed at different hours by street, just add net:

dfspeednet <- netspeed(pc_week, net$ps, net$ffs, net$capacity, net$lkm,
                       alpha = 1.5, net = net)
sp::spplot(as(dfspeednet, "Spatial"),
       c("S1", "S9"), scales = list(draw = T),
       col.regions = rev(cptcity::cpt()))

2) Emission Factors

V <- 0:150
ef1 <- ef_ldv_speed(v = "PC",t = "4S", cc = "<=1400", f = "G", eu = "PRE",
p = "CO")
efs <- EmissionFactors(ef1(1:150))
plot(Speed(1:150), efs, xlab = "speed[km/h]", type = "b", pch = 16)

3) Estimation of emissions

euro <- c(rep("V", 5), rep("IV", 5), rep("III", 5), rep("II", 5),
          rep("I", 5), rep("PRE", 15))
lef <- lapply(1:40, function(i) {
ef_ldv_speed(v = "PC", t = "4S", cc = "<=1400", f = "G",
          eu = euro[i], p = "CO", show.equation = FALSE) })
E_CO <- emis(veh = PC_E25_1400, lkm = net$lkm, ef = lef, speed = dfspeed,
             profile = pc_profile)
plot(E_CO, xlab = "Hours", ylab = "[g/h]")

4) Post Emissions

  • emis_post
  • When the argument by = "veh" the emissions are aggregated by age and hour.
  • When the argument by = "streets_wide", aggregated the emissions by street. In this cae, if you add the argument net with the respective streets, it returns an spatial net with the hourly emissions.
E_CO_DF <- emis_post(arra = E_CO,  veh = "PC", size = "<1400", fuel = "G",
pollutant = "CO", by = "veh")
E_CO_STREETS <- emis_post(arra = E_CO, pollutant = "CO", by = "streets_wide")


You can use this function in two ways

when spobj is "character", it is a path to wrfinput file and then runs eixport::wrf_grid to create a grid based on a wrf_input file.

  1. Create a grid using make_grid.The spobj is the spatial net. The size of the grid has the size of the net. You have to specify the grid spacing.
  2. Create a grid using a path to wrfinput file instead a net. The grid will have the size of the wrf_input. You don't have to specify the grid spacing.
E_CO_STREETSnet <- emis_post(arra = E_CO, pollutant = "CO", by = "streets_wide",
                             net = net)
g <- make_grid(net, 1/102.47/2) #500m in degrees
E_CO_g <- emis_grid(spobj = E_CO_STREETSnet, g = g, sr= 31983)
sp::spplot(as(E_CO_g, "Spatial"),
       c("V1", "V9"), scales = list(draw = T),
       col.regions = rev(cptcity::cpt()))

At this step, you can feed you grid with emissions from other sources!

Creating a WRFChem Input file using eixport:

  1. Create a grid using make_grid and a wrfinput file
  2. Run emis_grid to grid your emissions.
  3. Create a GriddedEmissionsArray.
  4. Create a wrfchem input file [eixport::wrf_create](https://atmoschem.github.io/eixport/reference/wrf_create.html.
  5. Put the GriddedEmissionsArray into the wrf chem input file using eixport::wrf_put.
eixport::wrf_create(wrfinput_dir = "PathToWrfInput", wrfchemi_dir = "OutputPathWrfChemInput")
gwrf <- eixport::wrf_grd("PathToWrfInput")
E_CO_gwrf <- emis_grid(spobj = E_CO_STREETSnet, g = gwrf)
gr <- GriddedEmissionsArray(E_CO_gwrf, rows = 19, cols = 23, times = 168, T)
eixport::wrf_put(file = "Path/To/WRFChemInputFile, name = "E_CO", POL = gr)

Creating a WRFChem Input file using AS4WRF

  1. Create a grid using make_grid and your net.
  2. Run emis_grid to grid your emissions.
  3. Run emis_wrf to create a data.frame the specifications for AS4WRF.ncl.
  4. Export the output of emis_wrf to a text file without header. Recall that AS4WRF requires all the lumped species.
  5. Contact the developer of AS4WRF Angel Vara alvv1986@gmail.com to get a copy and run AS4WRF.ncl.

Thanks and enjoy VEIN!


If you use VEIN, please, cite it (BIBTEX, ENDNOTE):

Ibarra-Espinosa, S., Ynoue, R., O'Sullivan, S., Pebesma, E., Andrade, M. D. F., and Osses, M.: VEIN v0.2.2: an R package for bottom-up vehicular emissions inventories, Geosci. Model Dev., 11, 2209-2229, https://doi.org/10.5194/gmd-11-2209-2018, 2018.

author = {Ibarra-Espinosa, S. and Ynoue, R. and O'Sullivan, S. and Pebesma, E. and Andrade, M. D. F. and Osses, M.},
title = {VEIN v0.2.2: an R package for bottom--up vehicular emissions inventories},
journal = {Geoscientific Model Development},
volume = {11},
year = {2018},
number = {6},
pages = {2209--2229},
url = {https://www.geosci-model-dev.net/11/2209/2018/},
doi = {10.5194/gmd-11-2209-2018}

Communications, doubts etc


If you encounter any issues while using VEIN, please submit your issues to: https://github.com/atmoschem/vein/issues/

If you have any suggestions just let me know to sergio.ibarra@usp.br.


Please, read this guide. Contributions of all sorts are welcome, issues and pull requests are the preferred ways of sharing them. When contributing pull requests, please follow the Google's R Style Guide. This project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.