Skip to content
R package to estimate Vehicular Emissions INventories VEIN.
R Rebol
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github/ISSUE_TEMPLATE
R
data fix #180 and add tests for all NMHC species May 16, 2019
demo
docs Add parsed function in emis_grid Aug 6, 2019
inst
man
tests fix test and small improve in emis_to_street Aug 20, 2019
.Rbuildignore update ef_nitro May 8, 2019
.gitignore readme May 18, 2018
.travis.yml travis Jun 1, 2018
CODE_OF_CONDUCT.md
CONTRIBUTING.md Adding polycyclic aromatic hydrocarbons (PAHs) and persistent organi … May 16, 2018
DESCRIPTION
LICENSE
NAMESPACE fix test and small improve in emis_to_street Aug 20, 2019
NEWS.md
README.Rmd fix #185 emis_grid! Jul 15, 2019
README.html
README.md fix #185 emis_grid! Jul 15, 2019
_pkgdown.yml update 'emis_evap' Aug 7, 2017
all_comp.gif update ef_nitro May 8, 2019
appveyor.yml
codecov.yml
vein.Rproj fix #4 Dec 22, 2017

README.md

title author date output
VEIN model
Sergio Ibarra-Espinosa
19 de Octubre de 2016
html_document

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

Vehicular Emissions INventory (VEIN) model.

What is VEIN?

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

European emission factors for all available vehicle categories exhaust:

  • Criteria (g/km): "CO", "NOx", "HC", "PM", "CH4", "NMHC", "CO2", "SO2", "Pb", "FC" (Fuel Consumption),"NO", "NO2".
  • 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", "chrysene", "phenanthrene", "napthalene", "anthracene", "coronene", "dibenzo(ah)anthracene".
  • Dioxins and Furans (g/km): "PCDD", "PCDF", "PCB".
  • Metals (g/km): "As", "Cd", "Cr", "Cu", "Hg", "Ni", "Pb", "Se", "Zn".
  • NMHC (g/km):
  • ALKANES: "ethane", "propane", "butane", "isobutane", "pentane", "isopentane", "hexane", "heptane", "octane", "2-methylhexane", "nonane", "2-methylheptane", "3-methylhexane", "decane", "3-methylheptane", "alkanes_C10_C12", "alkanes_C13".
  • CYCLOALKANES: "cycloalcanes".
  • ALKENES: "ethylene", "propylene", "propadiene", "1-butene", "isobutene", "2-butene", "1,3-butadiene", "1-pentene", "2-pentene", "1-hexene", "dimethylhexene".
  • ALKYNES:"1-butyne", "propyne", "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-xylene", "p-xylene", "o-xylene", "1,2,3-trimethylbenzene", "1,2,4-trimethylbenzene", "1,3,5-trimethylbenzene", "styrene", "benzene", "C9", "C10", "C13".
  • Active Surface (cm2/km)
  • "AS_urban", "AS_rural", "AS_highway".
  • Total Number of particles (N/km)
  • "N_urban", "N_rural", "N_highway", "N_50nm_urban", "N_50_100nm_rural", "N_100_1000nm_highway".

European emission factors speciation for evapoative emissions:

  • Criteria (g/km): "NMHC".
  • NMHC (g/km):
  • ALKANES: "ethane", "propane", "n-butane", "i-pentane", "n-pentane", "2-methylheptane", "3-methylheptane", "n-hexane", "n-heptane"
  • ALKENES: "ethene", "propene", "1-butene", "trans-2-butene", "isobutene", "cis-2-butene", "1,3-butadiene", "trans-2-pentene", "cis-2-pentene", "isoprene"
  • ALKYNES:"propyne", "acetylene".
  • AROMATICS: "benzene", "toluene", "ethylbenzene", "m-xylene", "o-xylene", "1,2,3-trimethylbenzene" and "1,3,5-trimethylbenzene",

Brazilian emission factors for all available vehicle categories:

  • "COd", "HCd", "NMHCd", "CH4", "NOxd", "CO2" "PM", "N2O", "KML", "FC", "NO2d", "NOd", "gCO2/KWH", "RCHOd", "CO", "HC", "NMHC", "NOx", "NO2" ,"NO", "RCHO"

Brazilian speciation based on IAG/USP (Fátima's group) studies:

  • "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"

Base emission factors from International Emission Model (IVE) for all available vehicle categories:

  • "VOC_gkm", "CO_gkm", "NOx_gkm", "PM_gkm", "Pb_gkm", "SO2_gkm", "NH3_gkm", "ONE_3_butadiene_gkm", "formaldehyde_gkm", "acetaldehyde_gkm", "benzene_gkm", "EVAP_gkm", "CO2_gkm", "N20_gkm", "CH4_gkm", "VOC_gstart", "CO_gstart", "NOx_gstart", "PM_gstart", "Pb_gstart", "SO2_gstart", "NH3_gstart", "ONE_3butadiene_gstart", "formaldehyde_gstart","acetaldehyde_gstart", "benzene_gstart", "EVAP_gstart", "CO2_gstart", "N20_gstart", "CH4_gstart"

Emission factors from Chinese emission guidelines

  • "CO", "NOx", "HC", "PM10", "PM2.5".
  • They depend on humidity, temperature, altitude and other parameters.

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:

Installation

VEIN can be installed via CRAN or github

library(remotes) 
install_github("atmoschem/vein")
library(vein)
demo(VEIN)

or

install.packages("vein")
library(vein)
demo(VEIN)

What is new? 0.7.0

  • Re-design of ef_ldv_speed and ef_hdv_speed. Adds argument speed into ef_ldv_speed in order to return data.frames insted of list of functions. For instance, speed = Speed(0:120). Also, it euro can be with length bigger than one, and also can be data.frames. This is useful, when you have regions with different emission standards.
  • Add Active Surface (cm2/km): "AS_urban", "AS_rural", "AS_highway".
  • Add number of particles (N/km): "N_urban", "N_rural", "N_highway", "N_50nm_urban", "N_50_100nm_rural", "N_100_1000nm_highway".
  • split_emis Split street emissions based on a grid or polygon. For instance, let's say that you need street emissiosn at 10 m. You could split your street emissions with this.
  • Fix some EF metals in ef_ldv_speed.
  • Fix milage equation of fkm$KM_LDV_GNV. Fix #137.
  • Adds cold_mileage
  • Adds emis_cold_td
  • Adds emis_hot_td
  • Adds emis_evap
  • Adds pro_month in emis_hot_td and emis_cold_td, to account for monthly variation.
  • Add argumnent namerows in age*functions to change row.names.
  • Add argument fcorr to account for the effect of fuel composition by euro standard. This result in a factor by euro standard.
  • Adds age with survival function of Gompertz, Weibull, logistic. This function aims to replace age_ldv, age_moto and age_hdv.
  • Update ef_cetesb for emission factors 2017. CETESB updated (and possibly recalcualted) most of PC with gasoline emission factors.
  • Fix minor bugs.
  • Check the NEWS

Future steps:

  • Enhance inventory. The idea is to configurate a whole emissions inventory for emission factors of CETESB, COPERT.
  • Adds ef_china, to include chinese emission factors.
  • Adds or connect traffic from gtfs services.
  • Add HBEFA EF.
  • Fortran.
  • Estimation of evaporative emissions with Copert Tier 3.
  • Group species by chemical mechanism.

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

library(vein)
inventory(name = file.path(tempdir(), "YourCity"), 
          vehcomp = c(PC = 1, LCV = 1, HGV = 1, BUS = 1, MC = 1),
          show.dir = T, 
          show.scripts = T)
files at /tmp/RtmpEorTs8/YourCity
Directories:
 [1] "/tmp/RtmpEorTs8/YourCity"              
 [2] "/tmp/RtmpEorTs8/YourCity/ef"           
 [3] "/tmp/RtmpEorTs8/YourCity/emi"          
 [4] "/tmp/RtmpEorTs8/YourCity/emi/BUS_01"  
 [5] "/tmp/RtmpEorTs8/YourCity/emi/HGV_01"   
 [6] "/tmp/RtmpEorTs8/YourCity/emi/LCV_01"  
 [7] "/tmp/RtmpEorTs8/YourCity/emi/MC_01"    
 [8] "/tmp/RtmpEorTs8/YourCity/emi/PC_01"   
 [9] "/tmp/RtmpEorTs8/YourCity/est"          
 [10] "/tmp/RtmpEorTs8/YourCity/images"       
 [11] "/tmp/RtmpEorTs8/YourCity/network"      
 [12] "/tmp/RtmpEorTs8/YourCity/post"        
 [13] "/tmp/RtmpEorTs8/YourCity/post/df"      
 [14] "/tmp/RtmpEorTs8/YourCity/post/grids"   
 [15] "/tmp/RtmpEorTs8/YourCity/post/streets" 
 [16] "/tmp/RtmpEorTs8/YourCity/profiles"    
 [17] "/tmp/RtmpEorTs8/YourCity/veh"         
Scripts:
 [1] "est/BUS_01_input.R" 
 [2] "est/HGV_01_input.R" 
 [3] "est/LCV_01_input.R" 
 [4] "est/MC_01_input.R"  
 [5] "est/PC_01_input.R"  
 [6] "main.R"             
 [7] "post.R"            
 [8] "traffic.R" 

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

1) Examples with traffic data:

  1. If you know the distribution of the vehicles by age of use , use: my_age
  2. If you know the sales of vehicles, or the registry of new vehicles, use age to apply a survival function.
  3. If you know the theoretical shape of the circulating fleet and you can use age_ldv, age_hdv or age_moto. For instance, you dont know the sales or registry of vehicles, but somehow you know the shape of this curve.
  4. You can use/merge/transform/adapt any of these functions.
data("net")
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()))
data("net")
data("pc_profile")
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)


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

```r
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")

Grids

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.
data(net)
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
plot(g)
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!

Citation

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.

@article{gmd-11-2209-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

Issues

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.

Contributing

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.

Note for non-english and anaconda users

Sometimes you need to install R and all dependencies and a way for doing that is using anaconda. Well, as my system is in portuguese, after installing R using anaconda it changed the decimal character to ','. In order to change it back to english meaning decimal separator as '.', I added this variable into the .bashrc

nano ~/.bashrc
export Lang=C

More details on StackOverflow

More

You can learn more about VEIN reading the documentation in PDF, online, reading the book online, or buy it in Kindle or Paperback

You can’t perform that action at this time.