2015年3月25日

WRF模式輸出的後處理

WRF USERS PAGE 介紹(推薦)了幾款 WRF MODEL GRAPHIC TOOLS,熟悉GrADS的人大概會選用 ARWpost 將模式的輸出檔轉換成 GrADS 可用的 binary 格式和一個相對應的 .ctl 檔。而 NCL 也在這個網頁名單的行列之中。

和 ARWpost 比較起來,使用 NCL 來處理 WRF 的輸出檔最明顯的優點就是省了一個轉檔的動作,NCL 可以直接讀取模式輸出而不需要先產生一個「中繼檔」。其優點是操作的靈活性。由於 WRF 垂直座標為 eta 座標 (terrain-following hydrostatic-pressure vertical coordinate),計算或畫圖之前通常需要先將資料內差到氣壓座標或高度座標上,若使用ARWpost來轉換資料,每次想要改變垂直氣壓(高度)層都得重新輸出中繼檔一次,不但花時間又佔用硬碟空間。

其次是 WRF 的水平網格採用 C-grid,簡單的說就是動量場跟熱力場不在同一個格點上面,差了半個格點的距離,甚至連東西向的風場 (U) 和南北向的風場 (V) 也都不在同一個格點上。除了圖法煉鋼的手動把資料內差成同一個網格外,簡單的做法就是用 ARWpost 做轉換,或著使用 NCL 的內建函數。

NCL 官網中詳列了 NCL 內建的 WRF 函數。使用這些內建函數的時候有兩點要特別注意:

1. 很多WRF函數放在 WRFUserARW.ncl script 裡面,所以使用時需要先 load 它。
load "$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRFUserARW.ncl"

2. 一般的 NCL 函數認得出無效值 (@_FillValue),計算/畫圖的時候會自動忽略無效值,但是內建的 WRF 函數並不會忽視無效值!使用 WRF 函數前先確認變數中有沒有無效值,可以用 print (ismissing(var)) 來檢查。

這邊介紹兩個一定會用到的函數:wrf_user_getvar 和 wrf_interp_3d_z。

wrf_user_getvar

用這個函數讀取 WRF 模式輸出檔內的變數,可以把 U, V, T 等等這種原本不在「一般網格」上的資料,自動轉換到「一般網格」上。也可以透過它輸出原本不在輸出檔中一些簡單的診斷量,像是 vorticity、potential temperature、wet bulb temperature 等等。

這裏有完整的可輸出變數清單。

用法很簡單:

ncFile = addfile ( "wrfout_d01_2003-07-15_00-00-00.nc" , "r" )
Tvertual = wrf_user_getvar ( ncFile , "tv" , 0 )
printVarSummary( Tvertual )

wrf_user_getvar 的第三個 input 是時間,0 代表第一筆,1 代表第二筆,以此類推,如果用 -1 則代表所有的時間都要輸出。最後用 printVarSummary 確認一下輸出的變數資訊,像是變數名稱、單位、維度、無效值、等等。

這邊提醒一點,一般 WRF 的輸出檔檔名類似:wrfout_d01_2003-07-15_00-00-00,並沒有 .nc 的副檔名。如果在 addfile 中放入沒有副檔名 .nc 的檔案名稱,執行 script 時會出現警告並終止程序。但是不需要特別去把 WRF 的輸出檔加上副檔名 (改名),只要 script 裡面有加就好。換句話說,addfile ( "XXX123.nc" , "r" ) 這行指令可以讀 XXX123.nc 也可以讀 XXX123!

wrf_interp_3d_z

這個函數可以將 WRF 的模式輸出轉換到氣壓座標或高度座標上。以氣壓座標為例,使用方法很簡單:

VAR500 = wrf_interp_3d_z ( VAR , P , 500. )

VAR:要內差的變數
P:氣壓 (如果要高度層資料就擺 Z 在這)
500.:要內插到哪一層氣壓層

需要特別注意的是
1. 這邊的 P 要用 hPa 當單位 (wrfout 裡面存放的氣壓資料單位是 Pa )。
2. 不做外差,因此太低或太高的地方會填入無效值。

雖然無法一次內差出多個氣壓層,但是手動做一個 loop 並不會太複雜:

pLevels = 1000. - ispan(0,900,100)
nP = dimsizes (pLevels)
VAR_p = new( (/ nP , nY , nX /) , float )
do iP = 0 , nP-1 , 1
    VAR_p ( iP , : , : ) = wrf_interp_3d_z ( VAR , P , pLevels(iP) )
end do

Take Home Message

善用本文中介紹的這兩個內建函數,就可以輕鬆的在 NCL 中直接操作 WRF 輸出檔啦,不需要再用 ARWpost 轉出一堆中繼檔了唷。

沒有留言:

張貼留言