使用WACCM全球預報作為東亞邊界條件
Table of contents
背景
- WACCM全球空品預報結果做為地區CMAQ預報模式的邊界條件(BCON)並不是一件新事,範例如[Vaughan, et. al (2018,2020)]1所示(AIRPACT)。
- 數據來源與處理詳WACCM模式結果之下載、讀取及應用,此處詳述銜接過程與問題。
- 問題:
- Ramboll公司提供的mz2cmaq.job,為舊版CAMQ化學物質,與新版無法配搭,還需將污染物名稱予以重新命名。
- 即使重新命名、修改nc檔案的全域屬性,仍然不被CMAQ接受,原因不明,還得再將數據內容填入BCON模版。
舊版CMAQ化學物質重新命名
o2n.cs
- 似乎是CB05與cb6之對照
- 粒狀物完全沒有CMAQ之特徵
- 還有5項物質完全對應不到CMAQ(CCRS,DMS,HCN,MECN,TRP)
- 由於
'NA'
字母數太少,出現在很多污染物名稱之中,因此置換是將會出現錯誤,需在前後都加上空格,才能精準置換。 - 變數名稱不能含有空格,bash中可以使用
xargs
去除空格,詳Linux系統xargs指令範例與教學 - 使用NCO指令
ncrename -v
:重新命名ncatted -a
:更新屬性值
$ cat o2n.cs
ncrn=/usr/bin/ncrename
ncat=/usr/bin/ncatted
#CCRS,DMS,HCN,MECN,TRP
lis="NO NO2 O3 H2O2 N2O5 HNO3 PNA PAN OPAN CO PAR OLE IOLE FORM ALD2 MGLY ETHA ETH ETHY PRPA ACET ETOH MEOH MEPX FACD AACD KET ISOP ISPD TERP TOL XYL BENZ CRES SO2 NH3 MECN HCN TOLA XYLA BNZA ISP TRP CH4 DMS GLY PSO4 PNH4 SOA3 SOA4 POA PEC FCRS CCRS NA PCL NUMATKN NUMACC NUMCOR SRFATKN SRFACC SRFCOR "
old=( 'BENZ ' 'BNZA ' 'FCRS ' 'CH4 ' 'ISP ' ' NA ' 'PCL ' 'PEC ' 'PNH4 ' 'POA ' 'PSO4 ' 'SOA3 ' 'SOA4 ' 'TOLA ' 'XYL ' 'XYLA ')
new=( 'BENZENE' 'BENZRO2' 'ASOIL' 'ECH4' 'ISPX' ' ANAJ' 'ACLK' 'AECJ' 'ANH4J' 'APOCJ' 'ASO4J' 'AMT3J' 'AMT4J' 'TOLRO2' 'XYLMN' 'XYLRO2')
nv=$(echo ${#old[@]})
for ((i=0;i < $nv; i+=1));do
o=${old[$i]};n=${new[$i]}
lis=${lis/$o/$n}
done
$ncat -a VAR-LIST,global,o,c,"${lis}" $1
for ((i=0;i < $nv; i+=1));do
o=${old[$i]};n=${new[$i]}
o=$(echo ${o}|xargs)
n=$(echo ${n}|xargs)
echo ,${o},${n},
$ncrn -v ${o},${n} $1
$ncat -a long_name,${n},o,c,"${n}" $1
done
合併CAMS與WACCM數據檔
原理說明
- 合併2個數值預報產品的努力幾乎是不可能完成的任務,2個模式的時間變化特性完全一樣嗎?空品項目的定義完全一樣嗎?物質之間的化學平衡可以在CCTM裏仍然維持嗎?汙染煙團的通過時間會一致嗎?有許多合理的懷疑點。
- 雖然知道不可能,此處還是假設2個模式的定義、模擬結果的時間、空間特性完全一樣,作為程式設計的原理,按照5天(CAMS的預報長度nt1)為一個分界:
- 0~nt1:完全使用CAMS數據
- nt1~nt2:以WACCM為主,如果沒有這個空品項目,則採用CAMS第5天之預報結果(24小時循環)
程式碼
$ cat mergeBC.py
import numpy as np
import netCDF4
import sys, os
import datetime
from dtconvertor import jul2dt, dt2jul
# WACCM BC
nc = netCDF4.Dataset(sys.argv[1],'r')
V=[list(filter(lambda x:nc.variables[x].ndim==j, [i for i in nc.variables])) for j in [1,2,3,4]]
nt,nrow,ncol=nc.variables[V[2][0]].shape
v='TFLAG'
bdate=jul2dt(nc[v][0,0,:])
SDATE=[bdate+datetime.timedelta(hours=int(i*nc.TSTEP/10000)) for i in range(nt)]
#expand the bcon file
fname=' /nas2/cmaqruns/2022fcst/grid45/bcon/BCON_today_CWBWRF_45k'
nc1 = netCDF4.Dataset(fname,'r+')
V1=[list(filter(lambda x:nc1.variables[x].ndim==j, [i for i in nc1.variables])) for j in [1,2,3,4]]
nt1,nrow,ncol=nc1.variables[V1[2][0]].shape
bdate1=jul2dt(nc1[v][0,0,:])
idx=SDATE.index(bdate1)
for t in range(nt1-1,nt-idx):
nc1.variables['TFLAG'][t,0,:]=nc.variables['TFLAG'][t+idx,0,:]
var=np.array(nc1.variables['TFLAG'][:,0,:])
var3=np.zeros(shape=nc1.variables['TFLAG'].shape)
var3[:,:,:]=var[:,None,:]
nc1.variables['TFLAG'][:]=var3[:]
for v in V1[2]:
if v=='TFLAG':continue
if v in V[2]:
for t in range(nt1-1,nt-idx):
nc1[v][t,:,:]=nc[v][t+idx,:,:]
else:
for t in range(nt1-1,nt-idx):
nc1[v][t,:,:]=nc1[v][t-idx,:,:]
for t in range(nt-idx,nt):
nc1[v][t,:,:]=nc1[v][t-idx,:,:]
nc1.close()
結果評估
- 邊界濃度對D1模擬範圍內空氣品質的影響似乎隨著時間逐步降低、10天的模擬則會加劇此一趨勢。這個結果疑似來自
- 全球模式(CAMS/WACCM)與CMAQ反應機制的差異、也可能來自
- 2個模式沉降量的顯著差異,CMAQ模式傾向較大的沉降損失,全球模式的損失似乎並沒有那麼大。
- 這項趨勢與全球模式的選擇並沒有太大的差異。
- CAMS與WSCCM之間的差異
詳見NW AIRQUEST/REGIONAL MODELING CONSORTIUM MEETINGS(2018,~2020)及華盛頓州立大學土木系Joe Vaughan教授參與之AIRPACT(Air Indicator Report for Public Awareness and Community Tracking) 計畫 ↩