逐日循序執行bcon.exe

 

背景

  • 大型、多層網格、連日的CMAQ執行結果,要接續執行bcon.exe會遭遇到龐大濃度檔(ACONC)的問題。雖然如大型網格系統切割邊界濃度(see also [[2022-03-03-hd_bc]]1)文中所述,可以python程式來執行內插與切割,但仍然不夠快速、簡潔。
  • 由於CMAQ結果是逐日輸出,因此發展逐日執行bcon.exe還是比較合理的作法,唯一的困難,是bcon程式內設會從METBDY3D讀取相對應的起始時間,會需要:
    1. 將執行批次的METBDY3D檔案切割成逐日
    2. 逐日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

腳本內容

結果檢討

  • 將4面邊界濃度寫成平面檔案。詳參[[2022-10-26-bcon2icon]]2
  1. https://sinotec2.github.io/FAQ/2022/03/03/hd_bc.html “ 大型網格系統切割邊界濃度” 

  2. https://sinotec2.github.io/FAQ/2022/10/26/bcon2icon.html “ BCON南東北西4面2維濃度檔之轉接程式”