Issues with Onroad with CRACMM2 speciation

I am trying to generate emissions for the Vancouver domain and part of Washington state using the EPA 2018 platform, SMOKE4.8.1, and CRACMM2 speciation.

I downloaded the CRACMM2 speciation files from the 2022v1 platform (https://gaftp.epa.gov/Air/emismod/2022/v1/for_CRACMM/). I have merged the gsref_nostart_SEASON with gsref_start_month to produce the gsref_merged file.

When running the on-road sector with 2018 emission factors and on-road ancillary files, the VOC emissions (including VROC****, TOM_INV, STY, HC3, HC5, …) are zero except for VOC_INV and TOL across all on-road sectors (RPD, RPP, RPS, RPV, RPH, RPHO).

Then, I tried to use the 2022 MOVES’ emission factors along with the 2022 on-road ancillary data. This time, I got an error in the SPCMAT program (I have included some of the lines that generated the error below).

What workflow I need to follow to generate the emissions for on-road sectors using CRACMM2 mechanism?

SPCMAT LOG FILE:

File “GSREF” opened for input on unit: 96
/scratch/fazar37/models/SMOKE/smoke481/BC_US_data/ge_dat/speciation/CRACMM2/gsref_merged.txt

 File "GSPRO" opened for input on unit:  95
 /scratch/fazar37/models/SMOKE/smoke481/BC_US_data/ge_dat/speciation/CRACMM2/gspro_CRACMMv2_MOVES_onroad_20240618_03oct2024_nf_v3.txt


 File "INVTABLE" opened for input on unit:  94
 /scratch/fazar37/models/SMOKE/smoke481/BC_US_data/ge_dat/invtable_MOVES2014_13may2020_nf_v6.txt


 "TMP_POL_FILE" opened as OLD:READ-ONLY
 File name "/scratch/fazar37/models/SMOKE/smoke481/BC_US_data/inventory/18us/rpd.18us_dat/VMT.ncf"
 File type GRDDED3
 Execution ID "????????????????"
 Grid name ""
 Dimensions: 8583 rows, 1 cols, 1 lays, 2 vbles
 NetCDF ID:    131072  opened as READONLY
 Time-independent data.
 Closing file TMP_POL_FILE

 "TMP_POL_FILE" opened as OLD:READ-ONLY
 File name "/scratch/fazar37/models/SMOKE/smoke481/BC_US_data/inventory/18us/rpd.18us_dat/SPEED.ncf"
 File type GRDDED3
 Execution ID "????????????????"
 Grid name ""
 Dimensions: 8855 rows, 1 cols, 1 lays, 2 vbles
 NetCDF ID:    131072  opened as READONLY
 Time-independent data.
 Closing file TMP_POL_FILE

 File "MEPROC" opened for input on unit:  93
 /scratch/fazar37/models/SMOKE/smoke481/BC_US_data/ge_dat/onroad/2022/meproc_MOVES2014_RPD_AQ_custom_speciation_27feb2024_nf_v8

 Reading source data from inventory file...
 Generating unique lists from inventory data...
 Reading speciation cross-reference file...
 Value for USE_REF_COUNTY_MAP_YN not defined;returning default:   FALSE
 Number of inital xrefs:    291438
 Number of COMBO xrefs:         0
 Number of FRACS xrefs:    291438
 Processing speciation cross-reference file...
 Value for CMB_CHKFRACS not defined;returning default:   TRUE
 WARNING: XREF fracs do not add up to 1 for Region: 000000000000 Road Type: 000 Link: 000000022011102 Vtype: 72 yr          Acen
 WARNING: XREF fracs do not add up to 1 for Region: 000000000000 Road Type: 000 Link: 000000022011103 Vtype: 72 yr          Acen
 WARNING: XREF fracs do not add up to 1 for Region: 000000000000 Road Type: 000 Link: 000000022011104 Vtype: 72 yr          Acen
 WARNING: XREF fracs do not add up to 1 for Region: 000000000000 Road Type: 000 Link: 000000022011105 Vtype: 72 yr          Acen

…..

 *** ERROR ABORT in subroutine XFRACTBL
 ERROR:  XREF profile-fractions do not add up to 1.0

There are some challenges to run 2018 onroad with CRACMM.

The 2018gg case used speciation in MOVES and not in SMOKE, so it’s a little more difficult to switch to another speciation mechanism with that case than with newer speciation-in-SMOKE cases. Therefore, the CRACMM package that was posted with 2022v1 platform won’t work with 2018.

To do speciation in SMOKE-MOVES for 2018, a new INVTABLE, GSPRO, and GSREFs would be needed. We don’t have that in hand right now. We may consider pulling this together and will let you know if/when we do that.

We created a package for ORD a couple of years ago which supports running 2018 onroad emissions with CRACMM, but that was designed for the onroad-as-nonpoint method instead of for SMOKE-MOVES. We such a package be of interest to you or did you want to do the full SMOKE-MOVES approach?

Noting that for GSREFs a difference between regular onroad GSREFs and the CRACMM onroad GSREFs is that the CRACMM onroad GSREFs incorporate CROC/OM ratios for the TOM-based species. So if one were to swap in the CRACMM GSPRO but keep the regular GSREFs, you would get everything but the CROC/OM ratios. The GSREFs aren’t sharable across platforms like the GSPRO because the rep counties change from platform to platform, so if the CROC/OM ratios are important to you then that would be a potential complication.

Thank you for the clarification, @eyth.alison.

I am not restricted to using SMOKE-MOVES at this stage. However, having the SMOKE-MOVES package for CRACMM2 would be beneficial for future research. Therefore, I can work on the ORD package as the onroad-as-nonpoint method. What consideration do I need to make, compared to the MOVES method? I couldn’t find the environmental variables for this approach on the 2018v2 (gg) platform.

Regarding GSREFs, this means that I need to use the combined CRACMM2 GSREF from the 2022v1 platform (which provides a correct CROC/OM ratio but the counties rep would be incorrect) or the proper 2018v2 GSFREF (which provides an incorrect CROC/OM ratio but the counties rep would be correct)?

I processed the 2018gc_SMOKE_MOVES_MOVES3_AQ_fullHAP_29sep2021_v1.csv inventory as an area source using the following variable environment:

    setenv gs_ref_summer “$GE_DAT/speciation/CRACMM2/gsref_MOVES4_custom_speciation_2022hc_wOMratio_all_nostarts_summer_03oct2024_v0.txt”
    setenv gs_ref_winter “$GE_DAT/speciation/CRACMM2/gsref_MOVES4_custom_speciation_2022hc_wOMratio_all_nostarts_winter_03oct2024_v0.txt”
    setenv gs_ref_start “$GE_DAT/speciation/CRACMM2/gsref_MOVES4_custom_speciation_2022hc_wOMratio_all_starts_m${month_n}_03oct2024_v0.txt”
    setenv gs_ref_merge “$GE_DAT/speciation/CRACMM2/gsref_merged.txt”`

    if ( $month == ‘05’ || $month == ‘06’ || $month == ‘07’ || $month == ‘08’ || $month == ‘09’ ) then`
        setenv gs_ref_nostart $gs_ref_summer`
    else
        setenv gs_ref_nostart $gs_ref_winter`
    endif
   
    if ( -e $gs_ref_merge ) rm -f $gs_ref_merge
    cat $gs_ref_start > $gs_ref_merge
    cat $gs_ref_nostart >> $gs_ref_merge
    sed -i "/^#/d" $gs_ref_merge

    setenv ATPRO_HOURLY "${GE_DAT}/temporal/mtpro_hourly_MOVES_2014v2_25feb2021_nf_v3"
    setenv ATPRO_WEEKLY "${GE_DAT}/temporal/mtpro_weekly_MOVES_2014v2_25feb2021_nf_v3"
    setenv ATPRO_MONTHLY "${GE_DAT}/temporal/mtpro_monthly_MOVES_03aug2016_v1"
    setenv ATREF "${GE_DAT}/temporal/mtref_onroad_MOVES3_2017NEI_25feb2021_nf_v2"
    setenv SMKINVEN_MONTH ${month_n}
    setenv ORISDESC "${GE_DAT}/smkreport/orisdesc_04dec2006_v0.txt"
    setenv SCCDESC "${GE_DAT}/smkreport/sccdesc_2014platform_20may2020_nf_v5.txt"
    setenv AGREF "${GE_DAT}/gridding/mgref_onroad_MOVES3_25feb2021_nf_v1.txt"
    setenv SCCXREF "${GE_DAT}/onroad/MOVES3_SCCXREF_RPD_28aug2020_v0.csv"
    setenv GSPRO "${GE_DAT}/speciation/CRACMM2/gspro_CRACMMv2_MOVES_onroad_20240618_03oct2024_nf_v3.txt"
    setenv INVTABLE "${GE_DAT}/speciation/CRACMM2/invtable_2022platform_integrate_11jul2024_nf_v1.txt"
    setenv GSREF "${gs_ref_merge}"
    setenv GSCNV "${GE_DAT}/speciation/2022/gscnv_SPECIATE_5_3_fromS2S_20230911_01nov2023_v0.txt"
setenv NO_SPC_ZERO_EMIS "Y" ## Don't speciate zero emission SCCs
setenv DEFAULT_CONV_FAC_ERROR "Y" ## Error if profile missing from GSCNV
setenv RENORM_TPROF "Y" ## Renormalize temporal profiles
setenv OUTZONE "0" ## Output time zone
setenv USE_REF_SCC_YN "Y" ## Use SCC8-to-SCC10 mapping
setenv EXCLUDE_REF_SCC_YN "N" ## Drop SCC8s if not in SCCXREF
setenv USE_SPCMAT_SPC_YN "N" ## Re-apply speciation in SMOKE-MOVES
setenv USE_AVG_SPD_DIST "N" ## Use avera
setenv MEMORY_OPTIMIZE_YN "N" ## Don't use memory optimizati
setenv NO_SPC_ZERO_EMIS "Y"
setenv HOURLY_TPROF_BASE "MONTH"
setenv SMK_NHAPEXCLUDE_YN   N   # Y uses NHAPEXCLUDE file when integrating toxic sources
setenv SMKINVEN_FORMULA     "" #"EXH__PMC=EXH__PM10-EXH__PM2_5,BRK__PMC=BRK__PM10-BRK__PM2_5,TIR__PMC=TIR__PM10-TIR__PM2_5" # formula for computing emissions value
setenv WEST_HSPHERE         Y   # Y converts longitudes to negative values
setenv WKDAY_NORMALIZE      N   # Y treats average-day emissions as weekday only
setenv WRITE_ANN_ZERO       N   # Y writes zero emission values to intermediate inventory

## Parameters specific to this sector and/or job
setenv SMKINVEN_FORMULA "" ## Formula for Smkinven
setenv SMK_MAXWARNING "200" ## Maximum warnings printed
setenv NONHAP_TYPE #"VOC" ## Nonhap Type
setenv SMK_PROCESS_HAPS #"ALL" ## Use NHAPEXCLUDE file
setenv MRG_REPSTA_YN "N" ## Output state totals
setenv POLLUTANT_CONVERSION "N" ## Don't use pollutant conversion
setenv MRG_REPCNY_YN "N" ## Output county totals
setenv FILL_ANNUAL "Y" ## Fill annual values

All the models completed normally. However, the output only contains the following species. All included species have valid values across the study area.

HCNO, NMOG, BEN, ACD, NAPH, CO, EOH, HONO, NH3, NO, NO2, PEC, PMC, PNO3, TOM_INV, PSO4, SO2, VOC_INV

I wonder whether my approach is correct or need some adjustment? I noted that 2022v1 ATREF and ATPRO are not compatible with 2018v2 platform.

We will circle back sometime next week with guidance and a hopeful solution.

Hi, we uploaded a zip to our ftp site:

https://gaftp.epa.gov/Air/emismod/2018/v2/ancillary_data/

Note this is for CRACMMv1 because of limitations on our end when we initially processed this platform. This should have cross compatibility with CRACMMv2, even though new species and chemistry were added to CRACMMv2. I believe there is overlap for all remaining species. Also to note that in addition to using the files in the above zip (INVTABLE, GSPRO, GSREF, MEPROC), you should set USE_SPCMAT_SPC_YN to Y.

Thank you Karl.

The new INVTABLE, GSPRO, GSREF, and MEPROC files are working with the onroad sectors (RPD, RPS, …) in producing CRACMMv1 species.

To see the differences between CRACMMv1 and CRACMMv2 overlap species, I tried the new INVTABLE and MEPROC with CRACMMv2 speciation files. I noted that there are some differences in the VOC species. I wonder whether the differences would make many problem in CMAQ or do I need to make additional adjustment?

In the CRACMMv1 output file, I can see the following species:
PMNCOMN2, PMOCN2, ROCP2-ROCP6, VROCIOXY

In the CRACMMv2 output file, I can see the following species:
PMN (doesn’t include PMNCOMN2 and PMOCN2), VROCP1ALK-VROCP5ALK, … (doesn’t include ROCP2-ROCP6).
Additionally, PCA, PFE, PCL, PMG, PMN, … have zero emissions.

A lot of this can be resolved by appropriately mapping the DESID file:

ROCP2ALK > VROCP2ALK

Etc. The N2 species can be much but just routed to VROCN2ALK. As for the PCA, PFE, PCL, PMG, PMN species being zero, that is wrong. We ran a test using the files we provided, and PAL, PCA, PCL, and other PM species are there with nonzero emissions. To help diagnose why you aren’t getting those species, can you provide the Smkinven, Spcmat, and Movesmrg logs (one day/month for each is fine), and the first 100 or so lines of the Smkmerge report for one day (should be in $CASE/reports/smkmerge/[sector]/[rate]/)?

1 Like

Hello, CRACMM2 cleans up species names in emission inputs (see documentation in SI of The risks to human health of air toxics, PM2.5, and ozone from the 2023 Canadian wildfires | Earth, Space, and Environmental Chemistry | ChemRxiv | Cambridge Open Engage). CRACMM2 CMAQv5.5 DESID configurations should be relatively clean with many 1:1 mappings (see zenodo supporting data archive for example configuration files). CRACMM1 often drops the A/V prepending for phase on ROC species and uses PMOCN2 and PMNCOMN2 as pass through species for POA–CRACMM1 should use DESID to apply volatility profiles and will map PMOCN2 and PMNCOMN2 to many CRACMM species.

1 Like