Link Search Menu Expand Document

地面濃度動畫批次製作

Table of contents

背景

  • earth靜態的展現方式,雖然有沿著流線滑動的質點,但基本上仍然是同一個時間框架,並不是動態的表現。
    • 如果需要對向量或格柵圖檔進行時間的播放,除了js程式如leaflet、D3js等等之外,最簡單的方式,就是將圖檔整併成gif檔案,只需一個簡單的播放控制器就可以檢視了。(參考時序地圖製作方式之選擇)
    • 個別的檔案轉換,可以參考m3nc2gif,此處將其功能應用在每日的預報作業之中。
  • 預報作業到此階段並沒有大量的計算,因此圖檔的產生可以放在背景平行運作。
  • 將結果上傳Github Page,雖然是很好的展示平台,但也挑戰防火牆的管制規則:非上班時間卻有大量數據傳出,不免啟人疑竇,還是需要遵守規則比較好。
  • 腳本可詳見make_gifs.cs,說明如下:

程式設計

引數

  • 腳本需要1個引數:CMAQ domain層級序號($i=0~2)

濃度檔之抽取

  • 雖然逐日輸出檔案是一般CMAQ的內設方式,但因為所有日期的結果都放在同一目錄,要找到最近的結果來抽取數據,才不會發生錯誤。
    • lstail等指令,找到最近10天的模擬結果,進行以下的數據萃取。
  • 擷取的時間週期($it),與模擬的範圍有關
    • 範圍大時,時間間距也必須拉開,避免發生天氣系統移動緩慢令人厭煩。
    • 範圍小時,更關切特定時間的模擬結果,時間間距不能太大。
    • CCTM_ACONC檔案內設時間間距是一小時,如果更動,需修改nc.TSTEP屬性,以便m3nc2gif.py可以寫出正確的時間標題。
  • 每天模擬的總時數可能有所不同,以pr_tflag.py加以識別。
  • 粒狀物需先以combine.exe先行整合,氣狀物則直接由CCTM_ACONC中讀取。
  for fn in $(ls PMs20*|tail -n10);do
    nt=$(( $($bin/pr_tflag.py $fn|wc -l) - 1 ))
    j=$(echo $fn|cut -c4-11)
    for s in PM25_TOT PM10;do
      p=$s;test $p == "PM25_TOT" && p="PM2.5"
      $bin/ncks -O -d VAR,0 -d TSTEP,0,${nt},$it -v TFLAG,$s $fn ${p}_$j.nc
      $bin/ncatted -a TSTEP,global,o,i,$dt ${p}_$j.nc;done;done
  for s in SO2 CO O3 NO2;do for fn in $(ls CCTM_ACONC*|tail -n10);do
    j=$(echo $fn|cut -d'_' -f7)
    $bin/ncks -O -d LAY,0 -d VAR,0 -d TSTEP,0,${nt},$it -v TFLAG,$s $fn ${s}_$j
    $bin/ncatted -a TSTEP,global,o,i,$dt ${s}_$j;done;done

整併逐日檔案

  • 使用ncrcat
  • 輸入檔之檔名規則:物種_年月日.nc(整併後隨即刪除)
  • 結果檔:物種.nc
  • ncrcat執行速度很快,循序執行即可
  for s in PM2.5 PM10 SO2 CO O3 NO2;do
    $bin/ncrcat -O ${s}_2*.nc ${s}.nc;rm ${s}_2*.nc;done

平行運作m3nc2gif.py

  • m3nc2gif會將輸入檔每個時間框架(timeframe tf)先讀一遍,確認其濃度極值後,每個tf依序作圖、最後整併成gif檔案,過程較為耗時,因此每個物質種類分別放在背景執行。
  for s in PM2.5 PM10 SO2 CO O3 NO2;do
    $bin/sub $pyt $bin/m3nc2gif.py $s.nc;done

儲存gif檔案

  • 因檔名中不含日期,因此需按照年月日目錄儲存,避免覆蓋。
y=$(date -d -0day +%Y)
m=$(date -d -0day +%m)
d=$(date -d -0day +%d)

cd $fcst/${GRD[$i]}/cctm.fcst/daily
for s in PM25_TOT PM10 SO2 CO O3 NO2;do
  cp $s.gif pngs/$y/$m/$d;done

上傳至mac及GithubPage

  • 結果上傳至公司外的mac,在git不能運作時,可作為替代路徑。
daily=$fcst/${GRD[$i]}/cctm.fcst/daily
mac=~/GitHub/sinotec2.github.io/cmaq_forecast/{GRD[$i]}
/usr/bin/sshpass -f ~/bin/PW scp -r $daily/$s.gif kuang@imackuang:$mac
/usr/bin/sshpass -f ~/bin/PW scp -r $daily/png.tar.gz kuang@imackuang:$mac
  • GithubPages使用簡單的gif播放器,選擇方案及設置過程參GIF播放器,實作成果參東亞地區未來10天空品預報
  • 配合公司的網路安全管理規則
    • 設定git只在白天工作時間運作。
    • 運作標記:睡眠3600秒
n=$(~/bin/psg sleep|grep 3600|wc -l)
test $n -gt 0 && exit
while true;do
  H=10#$(date +%H)
  if [[ $H -ge 8 && $H -le 17 ]];then break;fi
  sleep 3600
done

cd $gtd
$GIT pull
$GIT add cmaq_forecast/${GRD[$i]}/*.g*
$GIT commit -m "revised PMF.gif $rundate"
$GIT push https://sinotec2:$TOKEN@github.com/sinotec2/sinotec2.github.io.git master >> ~/bat.log

完整腳本下載