Link Search Menu Expand Document

使用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()