CMAQ點源變數檔案之準備
CMAQ所需的點源排放量檔案有2個,一者為煙囪參數、座標、指標等常數項,一者為排放量會隨時間改變。此處將討論後者之準備。
由於CMAQ執行與檔案系統都是以日期為主體,因此點源隨時間變化部分最後也要整理切割成以日期為單位的檔案。(<=v5.3)
準備CMAQ點源之前,需先進行REAS電廠以及TEDS點源之處理,整理成CAMx點源檔案。
CMAQ點源相關緣起、與CAMx點源檔案之比較、策略面之考量等等,參見CMAQ點源常數檔案之準備之討論。
- 就時間項而言,CAMx保持較大的時間範圍,雖然檔案較大,處理起來有些不方便,但檔案管理輕鬆很多。適合系統性的改變。CMAQ逐日檔案如果要進行系統性的修改,還是必須從源頭、系統性來改,在逐日檔案內一一修改將事倍功半。
- CMAQ逐日的好處是有臨時性、局部針對性的修改,小檔案當然會比大檔案方便很多。不過這種情況應該很少(或儘量避免發生)才是。
- 綜合比較CAMx及CMAQ點源在變數項之異同如下表
點源nc檔案排放量數據之版本差異
項目 | CAMx6 | CAMx7 | CMAQ tim_var | 說明 |
---|---|---|---|---|
時間標籤 | TFLAG, ETFLAG | TFLAG, ETFLAG | TFLAG | 早期電腦數據儲存資源不足,排放量時間解析度也未必都以小時為單位。UAM或CAMx以起迄時間標籤來註記數據的時間範圍,為一項彈性、經濟的方案,甚至同一檔案內可以有不同的數據間隔時間。 |
排放量維度 | (TSTEP, NSTK) | (TSTEP, COL) | (TSTEP, LAY, ROW, COL), NLAYS=1, NCOLS=1 | CMAQ實質上也是2維,然而還是能夠可以符合IOAPI協定 |
單位 | gmole/Hr, g/Hr | gmole/Hr, g/Hr | gmole/s, g/s | CMAQ似乎也可以接受小時,直接讀取變數屬性以解析其單位 |
時間 | LST | LST | UTC | CMAQ沒有提供可以改變成LST的方式 |
全域屬性 | 需另增加 | 需另增加 | IOAPI協定 | CAMx之nc檔還需要執行add_ncatt.cs |
程式設計
記憶體管理
由於同時要記錄2萬多筆點源(上限為25000筆、詳模版之準備)700多小時的變量,矩陣和記憶體耗費很大,在DEVP甚至不能同時有3個程式同時執行(單一程式記憶體即達到VERT 102g、DEVP的25%、node01~3之52%),因此有必要好好檢討其記憶體的使用。
原則如下:
- 最花時間與記憶體的動作是模版的準備與展開,需要知道REAS csv及CAMx點源檔案時間、點源個數、污染物名稱等等條件。如果同時開啟勢必耗費記憶體。
- 策略上第一次開啟這2個唯讀檔只需讀取前述條件,可以展開模板即可,隨即關閉檔案(line 32~39)
- REAS csv檔案雖然不大,但因現階段只需知道其長度,根本不必開啟,直接用wc -l指令就可以知道(line 30)
30 len_df=int(subprocess.check_output('wc -l '+'point_reas16'+mm+".csv |awk '{print $1'}",shell=True).decode('utf8').strip('\n'))-1
31 #input the CAMx ptsource file
32 fname1=sys.argv[1]
33 pt = netCDF4.Dataset(fname1,'r')
34 v2=list(filter(lambda x:pt.variables[x].ndim==2, [i for i in pt.variables]))
35 nt,nopts=pt.variables[v2[0]].shape
36 fname0='template.timvar.nc'
37 nc = netCDF4.Dataset(fname0,'r')
38 v4=list(filter(lambda x:nc.variables[x].ndim==4, [i for i in nc.variables]))
39 nc.close()
- 暫時性之矩陣使用相同的名字(ARR),可以減少使用記憶體~4G。
模版的準備
- timvar模版特色
- ROW維度特別長,NCOLS及NALYS必須等於1
- 污染物名稱與反應機制的選擇有關。如有別的名稱,可以在CMAQ執行的時候,在$EMISSCTRL_NML檔案中添加對照關係。
- 可以參考CMAQ公開包裏的檔案。
- 先將其時間TSTEP剪下1小時(ncks -d),再將NCOLS即點源個數剪個25000筆,確切的筆數由TEDS及REAS資料庫再決定。
- 筆數如果超過,必須重複此動作
後處理
brk_day2.cs
- 將逐月檔案分割成駐日檔案,放在YYMM目錄下(詳見按日拆分m3.nc檔案(brk_day2.cs))。
- 小月不夠檔案的問題,可以用下面的腳本檢查、連結下月檔補足
ln_run12.cs
- 月份檔案分成逐日檔案之後,因為小月天數不足,有可能涵蓋到更多下月初的日子
- 此事也可在程式內解決,也可簡單地以下月初的天數來補足
- 以下腳本即為確認與連結所用
- 不單用在點源、任何分月檔案都可以查核、連結
- 日期必須在.間隔的第2欄,如teds11.20190101.timvar.nc。
kuang@centos8 ~/bin
$ !cat
cat -n ln_run12.cs
1 YR=$(echo $PWD|cut -d'/' -f4|cut -c1-4)
2 yy=$(echo $PWD|cut -d'/' -f4|cut -c3-4)
3 for m in {01..12};do
4 YM=$(date -ud "${YR}-${m}-1 -1 day" +%Y-%m)
5 YP=$(date -ud "${YR}-${m}-1 +1 month" +%y%m)
6 ED=$(date -ud "${YM}-15 + 48 day" +%Y%m%d)
7 LAST=$(ls ${yy}$m|T -n1|cut -d'.' -f2)
8 NX=$(date -ud "${LAST} + 1 day" +%Y%m%d)
9 for ((d=$NX;d<=$ED;d=$(date -ud "${d} + 1 day" +%Y%m%d)));do
10 echo $m $d
11 cd ${yy}$m
12 ln -s ../$YP/*${d}* .
13 cd ..
14 done
15 done
16
pt2em_d01.py
- 程式說明參考CMAQ/CAMx排放量檔案之轉換
- 引數:包括前綴及年月
python /Users/cmaqruns/2016base/data/ptse/twn/pt2em_d01.py teds11.201901
結果檢查
Resources
- Barron Henderson, pseudonetcdf tutorial, http://www.barronh.com/software/tutorials/pseudonetcdf-tutorial
- verdi usage https://www.airqualitymodeling.org/index.php/VERDI_1.5_User_Manual#3.1_Installation_Instructions_for_Linux_and_Mac
- VERDI使用說明 : http://www.evernote.com/l/AH3leuVQTuBEF7Vrs0D1C8Q-Iff5CpHl7eU
- pt2emNest:https://github.com/sinotec2/CAMx_utility/blob/master/pt2emNest.f
- ncks
- Example https://github.com/sinotec2/cmaq_relatives/blob/master/run_cctmMM_RR_DM.csh
- Notes
- CAMx(UAM)的檔案格式, Yungchuan Kuang edited this page on 12 Jul 2016 · 2 revision, shttps://github.com/sinotec2/camxruns/wiki/CAMx(UAM)的檔案格式
- Here: pt_timvar.py
- BoostNote: pt_timvarLL.py程式說明
- Relatives:
- pt_const.py
- CMAQ/CAMx排放量檔案之轉換
- D4範圍地面排放檔案之轉換
- CMAQ compilations
- CMAQ初始及邊界條件設定
- REASv3.1排放檔案之處理
- CAMx(UAM)的檔案格式