How to activate VBS in CMAQ v5.2?


I would like to use the VBS mechanism for SOA simulation in CMAQ v5.2, but it seems no explicit way to activate it. I found a piece of code in CCTM/src/aero/aero6/AERO_DATA.F as follows:

C Primary Organic Aerosol Volatility Distributions
Integer, Parameter :: n_vbs_bin = 5
Character( 10 ) :: poa_name( n_vbs_bin ) = (/ ‘LVPO1’, ‘SVPO1’, ‘SVPO2’, ‘SVPO3’, ‘IVPO1’ /)
Real, Parameter :: poa_op_vf( n_vbs_bin ) = (/ 0.09, 0.09, 0.14, 0.18, 0.5 /) ! Aggregated

! The Following Volatility Distributions are alternative options
! but at this point can only be implemented indivdually for the
! entire POA suite of compounds.
! Real, Parameter :: poa_gv_vf(n_vbs_bin) = (/0.27, 0.15, 0.26, 0.15, 0.17/) ! Gasoline
! Real, Parameter :: poa_dv_vf(n_vbs_bin) = (/0.03, 0.25, 0.37, 0.24, 0.11/) ! Diesel
! Real, Parameter :: poa_bb_vf(n_vbs_bin) = (/0.2, 0.1, 0.1, 0.2, 0.4/) ! Biomass Burning
! Real, Parameter :: poa_nv_vf(n_vbs_bin) = (/1.0, 0.0, 0.0, 0.0, 0.0/) ! Nonvolatile
! Real, Parameter :: poa_mc_vf(n_vbs_bin) = (/0.35, 0.35, 0.1, 0.1, 0.1/) ! Meat Cooking

! POA_AMF is the fraction of total emissions in the particle phase.
! This parameter is for distributing the total emissions between
! gas and particle BEFORE the aerosol size distribution is applied.
! This helps prevent numerical issues with shrinking the particles
! instantaneously.
Real, Parameter :: poa_amf( n_vbs_bin ) = (/ 1.0, 0.5, 0.0, 0.0, 0.0 /)

C number of lognormal modes in windblown dust aerosol = n_mode
C - but only accumulation and coarse modes used
Type emis_table
Character( 16 ) :: description
Character( 16 ) :: name ( n_mode )
Real :: spcfac( n_mode )
End type emis_table

However, I am not sure whether it implements the VBS mechanism if I uncomment the piece of code. Moreover, is there anything I should do with the emission inventories if using the VBS mechanism?


You are correct that there is no ‘on/off’ switch for the VBS mechanism, and this is because the ‘VBS’ approach comprises a collection of assumptions, each of which may or may not be appropriate based on your application. Can you verify the chemical mechanism you have chosen? CMAQv5.2, you will need to also use the pcSOA species to account for missing IVOC SOA, but this species has been parameterized for the US. Please send details describing your species simulation case (where and when) and the major emission sources you expect to be most important for driving POA and SOA concentrations.

Best regards,
Ben Murphy

1 Like

Hello Ben,

Thank you for the reply!

I attempted to use zero-out method base on CMAQv5.2 to account for the PM2.5 concentration contribution of emission sources like gasoline vehicle, diesel vehicle, and solvent use. Due to the underestimate of SOA simulation, the contribution would be influenced. Therefore, I would like to use the VBS mechanism to mitigate such underestimate.

The simulated period is the whole year of 2013, 2017, and 2020, and the simulation domain covers the whole China. The chemical mechanism I previously used is cb6r3_ae6_aq.

I have noticed the CMAQv5.0.2 provides the VBS mechanism, but my advisor insists on using the CMAQv5.2. So I’m here to seek for help. Could you please give me more detailed descriptions on how to use the VBS mechanism in CMAQv5.2 such as what species I should provide in the emission inventory?

Best regards,
Shigan Liu

Of course! Happy to help.

My first question is whether or not you would consider upgrading to the most recent CMAQv5.3.3. There is more flexibility and transparency when it comes to adjusting emissions in this newer version. For example, you would be able to adjust gasoline and diesel emissions separately, if you happen to have those data in separate files.

If you want to use standard CMAQv5.2 with VBS parameters that we optimized for the US, then I recommend the following:

  • Choose the cb6r3_ae6_aq mechanism as you have done already
  • Use the default definition of the poa_op_vf variable in AERO_DATA
  • In the GC_cb6r3_ae6_aq.nml namelist, use the default value for the scale factor of PCVOC to POC emissions (0.0387).
  • In the run script, make sure the CTM_ZERO_PCSOA environment variable is set to N or F so that pcSOA is active. This species is meant to capture a lot of the SOA formed from IVOC emissions and is highly optimized for the US. It is not appropriate for wildfire or residential woodburning emissions, and it may give strange answers for emissions that are influenced by residential solid fuel cooking.


1 Like

Thanks a lot, Ben! It is really helpful!

First I have to correct a mistake I made that I used the cb05e51_ae6_aq mechanism rather than the cb6r3_ae6_aq. I’m sorry for the mistake! But I checked GC_cb05e51_ae6_aq.nml, there is exactly the same value of scale factor of PCVOC to POC emissions (0.0387). So I guess it would also work well.

I would like to use the CMAQv5.2 rather than the CMAQv5.3.3, because our emission inventory species are adapted to the CB05 mechanism and additional work is required to support the CMAQv5.3.3 which is based on the CB6 mechanism.

In my previous simulations, I configured the CMAQv5.2 as you said (i.e., use the default value for PCVOC-to-POC factor and set CTM_ZERO_PCSOA to N), but the simulated SOA concentrations were not satisfactory. It is probably because the VBS parameters are optimized for the US instead of China.

Now, there are several questions I would like to ask you:

  1. How could I change the number of VBS bins? I found the declaration of n_vbs_bin = 5 in AERO_DATA.F, which indicates the C* in 0.1, 1, 10, 100, and 1000 μgm-3. What code files should I modify if I want to include more bins (e.g., C*=0.001, 10000, and etc.)? I guess maybe I should add more vapor_type variables and determine their enthalphy of vaporization and add corresponding species in the semivolatile POA part in AERO_DATA.F. Besides, it seems additional lines should be added in the GC_cb05e51_ae6_aq.nml. Is it right?

  2. Is the VBS mechanism in CMAQ v5.2 the 2D-VBS? Murphy et al. (2017) mentioned O:C in the Table 1, but I could not find the definition of bins for O:C in CCTM/src. In other words, I don’t know how O:C works in the CMAQv5.2 VBS mechanism.

  3. How to add species for biogenic SOA? I noticed that all the VBS species in SOA_DEFN.F are from anthropogenic sources. What code files should I modify if I would like to implement VBS for biogenic SOA under different parameters?

Murphy, B. N., Woody, M. C., Jimenez, J. L., Carlton, A. M. G., Hayes, P. L., Liu, S., Ng, N. L., Russell, L. M., Setyan, A., Xu, L., Young, J., Zaveri, R. A., Zhang, Q., & Pye, H. O. T. (2017). Semivolatile POA and parameterized total combustion SOA in CMAQv5.2: Impacts on source strength and partitioning. Atmospheric Chemistry and Physics, 17(18), 11107–11133. ACP - Semivolatile POA and parameterized total combustion SOA in CMAQv5.2: impacts on source strength and partitioning

Thank you very much for reading through my questions! The questions above may have been too specific, involving model development details, or even confidential, but I still look forward to your response!

Best regards,


Hi Shigan,

  1. Yes you are correct that you need to add species for both aerosols and vapors in order to represent the bins spanning 0.001 to 10,000. You’re instinct is spot on.

  2. No, it is not 2D-VBS. The CMAQv5.2 and v5.3+ mechanisms (AE6 and AE7) are aligned with the idea of a 1.5D-VBS (see Koo et al., 2014). The idea is to simplify the full 2D-VBS and have many fewer species, but to vary the O:C with C* to mimic the correlation that is seen in laboratory and ambient measurements.

  3. Check out the more recent versions of SOA_DEFN in CMAQv5.3. We have added a VBS set of species for monoterpene SOA formation (AMT1-AMT7). CMAQ/SOA_DEFN.F at 5.3.3+ · USEPA/CMAQ · GitHub. Aerosol species are then defined in the AE namelist.
    These are equilibrated with vapor species defined in the NR namelist here (SVMT1-SVMT6) CMAQ/NR_cb6r3_ae7_aq.nml at 5.3.3+ · USEPA/CMAQ · GitHub. SVMT7 is ignored assuming it does not condense appreciably to the particle phase.


1 Like

Hi Ben,

Thank you for your response!

I have discussed this with my advisor, and we think it is more complex to improve the VBS mechanism in CMAQv5.2. So, we decided to modify our emission inventory to support cb6r3_ae7_aq in CMAQv5.3.3. As you said, CMAQv5.3 is more flexibility and transparency to adjust emissions. And there are many improvements for the SOA simulation you have done, which probably help to obtain better SOA simulation performance in the area we are interested in!

By the way, do you know where the species mapping table could be found for cb6r3_ae7_aq in CMAQv5.3? The chemical speciation database maintained by William P. L. Carter ( Curent Information on Development of an Improved Emissions Speciation Database) does not contain the CB6 mechanism.


Hi Shigan,

Is this folder what you’re looking for? CMAQ/CCTM/src/MECHS/mechanism_information/cb6r3_ae7_aq at 5.3.3+ · USEPA/CMAQ · GitHub

Or are you looking for translations from other mechanisms to cb6r3_ae7_aq? Note that this mechanism is very similar to cb6r3_ae6_aq.


1 Like

Hi Ben,

No, I am not looking for the mechanism information in the CMAQ folders.

Yes, I am looking for translations from cb05e51_ae6_aq to cb6r3_ae7_aq.

Previously I corrected a mistake (I am sorry for it!) that I used the cb05e51_ae6_aq mechanism in CMAQv5.2 rather than cb6r3_ae6_aq. Now, I decided to use CMAQv5.3.3. So, I would like to know how to modify my emission inventory to adapt the cb6r3_ae7_aq mechanism, the default setting in the CMAQv5.3.3. As far as I know, there are some differences in species between cb05e51_ae6_aq and cb6r3_ae7_aq.


Hi Ben,

I found a few pages of PowerPoint:

It seems I can use the cb6r3_ae7_aq mechanism by simply mapping some species in cb05e51_ae6_aq to cb6r3_ae7_aq. Is it right? Could I do this through EmissCtrl_{MECH}.nml?


Hi Shigan,
Yes, please use the Emission Control File (EmissCtrl_{MECH}.nml) to do the mapping. Let me know if you have any questions about how to use the interface.

The powerpoint you posted is a good start. I’m linking @hogrefe.christian who has experience in mapping among mechanisms and may have a recipe for going from cb05e51_ae6_aq to cb6r3_ae7_aq.


1 Like

Unfortunately, I do not have any experience with emissions mapping between cb05e51_ae6_aq and cb6r3_ae7_aq, maybe @barronh does.

For one project, we mapped concentrations from a run with cb05e51 to prepare boundary conditions for a run with cb6r3, and the species we estimated largely line up with the powerpoint you posted. Looking back at that code, we estimated ACET, KET, and PRPA as 0.05xPAR, 0.13xPAR, and 0.014xPAR and then reduced PAR accordingly (also accounting for any differences in carbon numbers). We also subtracted BENZENE from PAR. I think BENZENE had already been included as a SOA precursor species in cb05e51 so we didn’t need to estimate it but for gas phase chemistry purposes its reactivity was still lumped with PAR so we had to subtract it from PAR. The fractions for estimating ACET, KET and PRPA concentrations from PAR were based on some internal analysis by a colleague of ours who has since retired, so unfortunately I cannot provide further documentation. And these concentration-based estimates may not be appropriate for scaling emissions.

The other emissions change you need to be aware of going from ae6 to ae7 concerns biogenic emissions. For ae7, you need to separate APIN from TERP as described in the aero7 overview.

There might be other considerations, but that’s what came to my mind.

1 Like

Here are my basic thoughts:

  • First, most of the species map without any updates. It’s really just the ones in the powerpoint, though there might be some renaming. Not sure. For the VOCs listed in the powerpoint, it is more difficult.
  • The best answer would be to update to cb6 speciation in SMOKE or your preprocessor, but that may not be an option.
  • Based on the powerpoint, you see that you need to trade 1 BENZ for 1 PAR, 1 PRPA for PAR, 1 ETHY with ALDX, with BENZ, and (1 KET + 3 PAR) for 4 PAR… but to do that you need to know how much ACET, KET, BENZ, and ETHY there is in each of your grid cells for each day.
    • So where can you see how much ACET (or PRPA, KET, BENZ, ETHY) there are?
  • One option is to look at newer versions of your inventory. Perhaps someone else has a 2019 with CB6? Then, you could do some basic scaling.
  • If you have “premerged” sector emissions, you could take some sector-based scaling factors from other inventories and back calculate the missing species.
  • If you don’t have space-time varying estimates for your own inventory or “premerged” sector emissions, you apply ratios from another inventory.
    • For example, CEDS has total VOC and speciated VOC estimates. These are available thru input4MIPs Data Search | input4MIPs | ESGF-CoG.
    • Then you have options on how to estimate ACET, KET, BENZ, and ETHY.
    • You could get a gridded ratio of each (e.g., ACET) to a explicit compounds in CB05. Then apply that ratio to your inventory.
    • You could assume the total in CEDS is right, and translate accordingly.

You can make any of these approaches work, but none is going to be perfect.

If you don’t do anything, most of the species will map (e.g., NO=NO, NO2=NO2, etc). In that case, the ACET will stay in PAR as will the KET, BENZ, and ETHY. That is generally going to increases the production of NTR and decreases the lifetime of NOx. Overall, it will alter the reactivity of your VOCs. Basically, you won’t get the full benefit of the cb6 mechanism… It’s worth noting that cb05 was pretty good for a lot of years!

1 Like

p.s., might have something.

1 Like

Hi @Ben_Murphy @hogrefe.christian @barronh,

Thank you for the suggestions!

Among all the approaches above, I am interested in updating to CB6 speciation in our preprocessor.

Our preprocessor firstly decomposes the Non-methane volatile organic compounds (NMVOC) in the emission inventory to many single chemical species according to our source profiles, then all the single chemical species are lumped to species for a specific chemical mechanism (e.g., CB05, SAPRC-99, etc.).

But now the problem is that I could not find the mapping table from many single chemical species to CB6 mechanism species. Previously, we used the speciation database maintained by Dr. William P. L. Carter, University of California ( Curent Information on Development of an Improved Emissions Speciation Database ( But this database does not support CB6 mechanism.

I am not familiar to SMOKE, but I guess maybe SMOKE could provide information for CB6 speciation. Do you have some suggestions @barronh ?



@eyth.alison can answer more definitively, but I’ll do my best. The chemical compound to mechanism species mapping that EPA uses is stored in the SpeciateTool.[1] The typical work flow is something like this:

  1. export Speciate (or reuse an export)
  2. Use the SpeciateTool to create SMOKE gspro and gscnv inputs
  3. Run SMOKE.

The gspro files contain the mapping from a lumped emission (e.g., TOG, PM2_5, etc) to mechanism species, which is specific to a “profile.” Each “profile” may be used for one or more SCC.

Your process sounds different. Since you have already decomposed NMVOC to explicit chemical compounds, you need the mappings from chemical compounds to mechanism species. Those mappings are in the “Mechanism Mapping” file.[2] In that file, the first column is mechanism, the second is chemical compound, the third is mechanism species, and the fourth is a multiplier. The chemical compound is encoded by an ID, which is described in the “Species Properties” file.[3] So, the two files need to be joined on the ID.

The code below does a very basic connection to produce a compound to mechanism table.

import pandas as pd
import os
from urllib.request import urlretrieve

mechmapurl = ''
mechmappath = os.path.basename(mechmapurl)
spcpropurl = ''
spcproppath = os.path.basename(spcpropurl)

if not os.path.exists(mechmappath):
    urlretrieve(mechmapurl, filename=mechmappath)

if not os.path.exists(spcproppath):
    urlretrieve(spcpropurl , filename=spcproppath)

outpath = 'compound2mech.csv'
mechmap = pd.read_csv(mechmappath, names=['mech', 'compound_id', 'mech_id', 'factor']).query('mech == "CB6R3_AE7"')
spcprop = pd.read_csv(spcproppath, names=['compound_id', 'compound_name', 'cas', 'epaid', 'saroad', 'pams', 'haps', 'symbol', 'molecular_weight', 'non_voctog', 'non_vol_wt', 'unknown_wt', 'unassign_wt', 'exempt_wt', 'volatile_mw', 'num_carbons', 'epa_etn', 'comment', 'vp_epi', 'vp_um'], index_col='compound_id')
compound2mech = mechmap.join(spcprop, on='compound_id', lsuffix='_spc')

The “compound2mech.csv” file should have the type of information you’re looking for.


  1. Speciate Tool
  2. Speciate Tool - Mechanism Mapping
  3. Speciate Tool - Species Properties

We think this file might be what you need:

mech4import file

Hi @barronh @eyth.alison ,

Thank you for the detailed instructions! compound2mech.csv is exactly what I am looking for.:grinning: I think this problem has been solved.

Thanks again for your patient reply! @Ben_Murphy @hogrefe.christian @barronh @eyth.alison

Best regards,

1 Like