地面濃度動畫批次製作
背景
- earth靜態的展現方式,雖然有沿著流線滑動的質點,但基本上仍然是同一個時間框架,並不是動態的表現。
- 如果需要對向量或格柵圖檔進行時間的播放,除了js程式如leaflet、D3js等等之外,最簡單的方式,就是將圖檔整併成gif檔案,只需一個簡單的播放控制器就可以檢視了。(參考時序地圖製作方式之選擇)
- 個別的檔案轉換,可以參考m3nc2gif,此處將其功能應用在每日的預報作業之中。
- 原則上濃度分布圖檔的顏色分布設定以最多顏色的rainbow,台灣島模擬結果為方便比較,設定為RdYlGn(紅黃綠、紅綠燈色階),更新詳見更新色階。
- 預報作業到此階段並沒有大量的計算,因此圖檔的產生可以放在背景平行運作。
- 將結果上傳Github Page,雖然是很好的展示平台,但也挑戰防火牆的管制規則:非上班時間卻有大量數據傳出,不免啟人疑竇,還是需要遵守規則比較好。
- 腳本可詳見make_gifs.cs,說明如下:
程式設計
引數
- 腳本需要1個引數:CMAQ domain層級序號(
$i=0~2
)
濃度檔之抽取
- 雖然逐日輸出檔案是一般CMAQ的內設方式,但因為所有日期的結果都放在同一目錄,要找到最近的結果來抽取數據,才不會發生錯誤。
- 用
ls
與tail
等指令,找到最近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
- Git/repository的遠端新增刪除等操作方式的更新,詳見以github備份模擬圖檔。
完整腳本下載
Download: 地面濃度動畫批次製作make_gifs.cs