Link Search Menu Expand Document

CMAQ點源變數檔案之準備

Table of contents

CMAQ所需的點源排放量檔案有2個,一者為煙囪參數、座標、指標等常數項,一者為排放量會隨時間改變。此處將討論後者之準備。

由於CMAQ執行與檔案系統都是以日期為主體,因此點源隨時間變化部分最後也要整理切割成以日期為單位的檔案。(<=v5.3)

準備CMAQ點源之前,需先進行REAS電廠以及TEDS點源之處理,整理成CAMx點源檔案。

CMAQ點源相關緣起、與CAMx點源檔案之比較、策略面之考量等等,參見CMAQ點源常數檔案之準備之討論。

  • 就時間項而言,CAMx保持較大的時間範圍,雖然檔案較大,處理起來有些不方便,但檔案管理輕鬆很多。適合系統性的改變。CMAQ逐日檔案如果要進行系統性的修改,還是必須從源頭、系統性來改,在逐日檔案內一一修改將事倍功半。
  • CMAQ逐日的好處是有臨時性、局部針對性的修改,小檔案當然會比大檔案方便很多。不過這種情況應該很少(或儘量避免發生)才是。
  • 綜合比較CAMx及CMAQ點源在變數項之異同如下表

點源nc檔案排放量數據之版本差異

項目CAMx6CAMx7CMAQ tim_var說明
時間標籤TFLAG, ETFLAGTFLAG, ETFLAGTFLAG早期電腦數據儲存資源不足,排放量時間解析度也未必都以小時為單位。UAM或CAMx以起迄時間標籤來註記數據的時間範圍,為一項彈性、經濟的方案,甚至同一檔案內可以有不同的數據間隔時間。
排放量維度(TSTEP, NSTK)(TSTEP, COL)(TSTEP, LAY, ROW, COL), NLAYS=1, NCOLS=1CMAQ實質上也是2維,然而還是能夠可以符合IOAPI協定
單位gmole/Hr, g/Hrgmole/Hr, g/Hrgmole/s, g/sCMAQ似乎也可以接受小時,直接讀取變數屬性以解析其單位
時間LSTLSTUTCCMAQ沒有提供可以改變成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)的檔案格式