背景
- 大型、多層網格、連日的CMAQ執行結果,要接續執行bcon.exe會遭遇到龐大濃度檔(ACONC)的問題。雖然如大型網格系統切割邊界濃度(see also [[2022-03-03-hd_bc]]1)文中所述,可以python程式來執行內插與切割,但仍然不夠快速、簡潔。
- 由於CMAQ結果是逐日輸出,因此發展逐日執行bcon.exe還是比較合理的作法,唯一的困難,是bcon程式內設會從METBDY3D讀取相對應的起始時間,會需要:
- 將執行批次的METBDY3D檔案切割成逐日
- 逐日METBDY3D檔案的SDATE需配合ACONC濃度檔案的內容。
- 前述2項作業在brk_day2.cs中已經妥善處理好了,只需執行即可(還好METBDY3D檔案並不太大,即使重複儲存也還能容忍)。
輸入輸出檔案
輸入檔案
- bcon.exe 會需要mcip的結果,包括本層的METCRO3D以及下層的MEDBDY3D檔案,因此必須先將各層mcip及切割日期都先處理好。
- ACONC檔案:
- 因為是逐日檔,所以只有24小時長度,而一般bcon.exe 會多產生一小時因應時間內插的需求,因此程式會報錯。
- 但這樣反而是合適的,因為以下進行ncrcat才會正確連接。
- ACONC vs CONC 之選擇考量
- 前者是小時內的平均值、後者是小時結束時的瞬間值。
- 後者會有比較高的化學平衡特性。在排放量變化較大、網格較小的情況下,會有較顯著的差異。
輸出檔案
- BCON_YMD_GRIDNAME :需要保留8碼的日期訊息
- 以便ncrcat可以按照正確的順序將逐日檔案連接起來。
- 逐日檔案將會被未來的作業覆蓋。
- BCON_today_GRIDNAME:作為ncrcat的最後結果檔名。因為檔案容量不小,必須每天覆蓋避免重複。
- 因為各層的bcon目錄都連結在同一處,因此BCON處理結果也會出現在同一目錄,會需要網格名稱來辨識。
腳本內容
引數
- 1個引數:上層CCTM執行成果(CCTM_ACONC檔案)
- 檔案需含網格系統名稱的目錄,對照關係如下
- 如
/nas2/cmaqruns/2022fcst/grid45/cctm.fcst/daily/CCTM_ACONC_v532_intel_Taiwan_20220828.nc
, - 腳本會自檔案目錄的第5欄找到網格名稱,以對應到mcip檔案、開啟下一層的輸出檔。
序號 | 公版模式習慣 | 網格系統名稱 | 下層網格 | 說明 |
---|---|---|---|---|
1 | grid45 | CWBWRF_45k | grid09 | 中亞到東亞範圍切出中國東南與臺灣 |
2 | grid09 | SECN_9k | grid03 | 切出台灣澎湖公版模式部分 |
3 | grid03 | TWEAP_3k | - | 公版模式 |
- 說明:公版模式的GRID_NAME全部設成’Taiwan’,因此無從辨識其網格系統內容。必須進行修改。
日期及輸出檔名的設定
- 雖然公版模式產出的ACONC檔名中即有日期資訊,此處還是從nc.SDATE內容來讀取,比較穩妥。
- y, j分別為年代及julian day
- 使用date指令計算日期
set DATE = `ncdump -h $nc|grep SDATE|awk '{print $3}'`
set y = `echo $DATE|cut -c1-4`
set j = `echo $DATE|cut -c5-`
set NDAYS = 1
set YYYYJJJ = ${DATE} #> Convert YYYY-MM-DD to YYYYJJJ
set YYYYMMDD = `date -d "${y}-01-01 +${j}days -1days" +%Y%m%d` #> Convert YYYY-MM-DD to YYYYMMDD
執行邏輯與bash技巧
- 雖然bcon.exe也可以同步執行,但因速度還可以接受,此處就循序進行,
- 最後用ncrcat將其連成一個大檔,還要加上最後一個小時值的bc就完成了。
- 產生一個環境變數序列
- 日期與順序的對照關係,可以由ls指令達成(如wrfout的連結),也可以用OS的環境變數將其正確排序,此處選擇後者方法,以利未來任意組合成所需的模擬起迄日期。
- 宣告一個空的陣列如
dates=()
,或f=()
- 逐一加入陣列的元素,累加到既有所有陣列內容(
${dates[@]}
,${f[@]}
)之後
- 將陣列內容輸出成ncrcat的命令列引數
- 在ncrcat引數位置使用$(…)產生一個即時性的環境變數,以應用crontab執行序中。
/usr/bin/ncrcat -O $(echo ${f[@]} BCON_today_${DOM[$j]})
執行批次腳本
dates=()
for id in {0..4};do
dates=( ${dates[@]} $(date -d "$BEGD +${id}days" +%Y%m%d) )
done
for i in 0 1 2;do
ii=$(echo ${GRD[$i]}|cut -c5-)
cd $fcst
...
# nest down BCON and ICON
test $i -eq 2 && continue
j=$(( $i + 1))
rm -f $fcst/grid$ii/bcon/BCON_*_${DOM[$j]}
for id in {0..4};do
nc=$fcst/grid$ii/cctm.fcst/daily/CCTM_ACONC_v532_intel_${DOM[$i]}_${dates[$id]}.nc
csh $fcst/run_bcon_NC.csh $nc >&/dev/null
done
#expand the last hour to next day
nt=$(~/bin/pr_tflag.py $nc|wc -l)
if [[ $nt < 25 ]];then
for ((t=$nt;t <= 25; t+=1));do
~/bin/add_lastHr.py $nc
done
fi
f=()
for id in {0..4};do
f=( ${f[@]} BCON_${dates[id]}_${DOM[$j]} )
done
/usr/bin/ncrcat -O $(echo ${f[@]} BCON_today_${DOM[$j]})
csh $fcst/run_icon_NC.csh $fcst/grid$ii/icon/ICON_yesterday_${DOM[$i]} >&/dev/null
done
腳本內容
-
Download: 逐日循序執行bcon.exe腳本run_bcon_NC.csh
-
Download: 延長nc檔案最後1小時add_lastHr.py
結果檢討
- 將4面邊界濃度寫成平面檔案。詳參[[2022-10-26-bcon2icon]]2