使用WACCM全球預報作為東亞邊界條件
Table of contents
背景
- WACCM全球空品預報結果做為地區CMAQ預報模式的邊界條件(BCON)並不是一件新事,範例如Vaughan, et. al (2018)所示。
- 數據來源與處理詳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數據檔
$ 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()