WRF運行的單向/雙向嵌套機制
- 準備工作:
- WRF運行的基本流程
- namelist.input的詳細設置
- &time_control 設置
- &domain 嵌套結構
- &bdy_control 配置部分
- namelist 其他注意事項
- Registry.EM
- 運行 ARW 嵌套
- 雙向嵌套(two-way nesting)
- 單向嵌套(one-way nesting)
- 🔁 One-way vs Two-way 嵌套對比
- 另:“單向嵌套”與“雙向嵌套” 的差異比較
- 設置"純凈"的嵌套模擬
- 參考
準備工作:
1、編譯時選擇支持嵌套的選項
2、確保生成了 real.exe, wrf.exe, ndown.exe(如需單獨運行嵌套區域)
可查看wrf/run文件夾下的.exe文件內容:
ls -lh /home/directory/WRF-4.6/WRF-4.6.1/run/*.exe
對于ARW版本:輸出結果應包含:
ndown.exe
real.exe
tc.exe
wrf.exe
3、對于 real-data 模擬,需生成 met_em.d0 文件供嵌套區域使用*
對于ARW版本:(只有有一個時間段)
met_em.d01.<date>, met_em.d0*.<date>
WRF運行的基本流程
WPS預處理和WRF運行的詳細過程可參見另一博客-【WRF模擬】全過程總結:WPS預處理及WRF運行。
1、進入運行目錄
cd /home/directory/WRF-4.6/WRF-4.6.1/run
2、在wrf/run文件夾下,鏈接或復制 WPS 輸出文件
cd test/em_real
ln -sf ../../../WPS/met_em.* .
3、編輯 namelist.input
namelist.input 是關鍵:
- 嵌套運行的控制幾乎全部依賴 namelist.input
- 關鍵參數:max_dom ≥ 2
- 注意嵌套相關多列參數設置(如時間、格點數等)
4、運行 real.exe 初始化
mpirun -np N ./real.exe
mpirun -np 3 ./real.exe
N為并行進程數。
5、運行 wrf.exe 執行模擬
# 設置 堆棧大小 為 無限制,以避免分段錯誤
ulimit -s unlimited# <num_processes> 替換為希望使用的計算進程數。
mpirun -np <num_processes> ./wrf.exe# 單進程運行
mpirun -np 1 ./wrf.exe
namelist.input的詳細設置
&time_control 設置
&time_control 部分的配置內容如下:
注意:嵌套域的起止時間可以不同于父域,但必須在父域的時間范圍內!!!
參數解釋與說明:
參數 | 含義 | 示例值 | 說明 |
---|---|---|---|
run_days run_hours… | 模擬總時長 | 0天24小時 | 模型運行時間為 24 小時 |
start_year, start_month… | 各嵌套域的起始時間 | 2000-01-24 12:00:00 | 每列分別對應 D01, D02, D03 |
end_year, end_month… | 各嵌套域的結束時間 | 2000-01-25 12:00:00 | 與起始時間一致表示三層嵌套同步運行24小時 |
interval_seconds | WPS met_em 文件的時間間隔(秒) | 21600 秒(6小時) | WRF 每 6 小時讀取一次邊界數據 |
1、模擬時長可通過 run_* 設置,也可通過 start_* 和 end_* 控制:兩者必須一致,否則行為不可預測。
2、interval_seconds 參數必須與 met_em 文件時間間隔一致:
常見值:21600(6小時)、10800(3小時)等。
&time_control 其他部分的配置如下:
&time_controlinterval_seconds = 21600,history_interval = 180, 60, 60,frame_per_outfile = 1000, 1000, 1000,restart_interval = 360,
/
參數解釋與說明:
參數 | 示例值 | 說明 |
---|---|---|
interval_seconds | 21600 | 輸入數據的時間間隔(單位:秒),通常指 met_em.d0* 文件的時間步長,21600 秒 = 6 小時 |
history_interval | 180, 60, 60 | 每個 domain 輸出一次歷史文件的時間間隔(單位:分鐘) - D01 每 180 分鐘(3小時) 輸出一次 - D02 和 D03 每 60 分鐘(1小時) 輸出一次 |
frame_per_outfile | 1000, 1000, 1000 | 每個輸出文件中包含的時間幀數(即多少個時間點的數據寫入一個文件) - 如果模擬時間長,會自動拆分成多個 wrfout_* 文件 |
restart_interval | 360 | 每 360 分鐘(6小時) 輸出一次 wrfrst_d0* 重啟動文件(restart file) - 便于從中斷處繼續模擬 |
注意:
1、每個嵌套域都會生成自己的 wrfout_d0* 歷史文件(比如 wrfout_d01_…, wrfout_d02_…)
2、各嵌套層的輸出間隔可以不同,便于根據分辨率控制輸出精度與數據量(由 history_interval 控制)
3、每個域的重啟文件(wrfrst_d0*)也分別生成,可用于單獨或聯合重啟模擬(由restart_interval變量控制)
4、如果 frame_per_outfile 值較小,或模擬時間很長,會拆分出多個 wrfout 文件(例如按天或按小時)
3、&time_control 中關于嵌套域輸入控制的變量
&time_controlinput_from_file = .true., .true., .true.,fine_input_stream = 0, 2, 2,
/
🔹 input_from_file(布爾型)
作用:控制 real.exe 是否為每個嵌套域讀取 wrfinput_d0* 文件作為初始場。
對應域:
- .true.:為該域讀取 wrfinput_d0* 文件(通常由 real.exe 生成);
- .false.:該域不讀取輸入文件,WRF 會自動從父域插值獲得初始場。
📌 在 真實資料模擬(real-data run) 中,通常都設為 .true.,這樣每個域都有自己的初始化文件。這是 真實資料模擬(real) 中的常規做法。
🔹 fine_input_stream(整數型)
作用:指定嵌套域在初始化時使用哪些輸入流(input streams)中定義的數據變量。
取值說明:
- 0:使用所有變量(默認)(fine_input_stream = 0);
- 2:表示使用 Registry 中 io_form_2(即 I/O stream 2)中定義的變量;
這通常用于嵌套域在父域開始后延遲啟動的情況,可避免不必要變量的初始化。
&domain 嵌套結構
&domains 支持以下嵌套結構:
-
多嵌套共享一個父域 ?
-
多層嵌套(嵌套嵌套)?
-
? 不允許多父域(如 D03 同時嵌套 D01 & D02)
嵌套域(Nest)在父域中的起始位置定義:
i_parent_start、j_parent_start:指定嵌套域在父域中的起始位置(起始網格點),以父域的網格坐標系為參考。
紅色箭頭指向嵌套域的左下角,說明其起始位置在 父域的第 31 個網格點(I=31)。
對應在 namelist.input 的設置如下:
i_parent_start = 31,
j_parent_start = 17,
- i_parent_start=31:嵌套域在 父域的第31列網格點 開始;
- j_parent_start=17:嵌套域在 父域的第17行網格點 開始
&domain 的內容如下(參考):
max_dom = 3,
e_we = 74, 112, 94,
e_sn = 61, 97, 91,
e_vert = 28, 28, 28,
grid_id = 1, 2, 3,
parent_id = 0, 1, 2,
i_parent_start = 0, 31, 30,
j_parent_start = 0, 17, 30,
設置項 | 含義 | 注意事項 |
---|---|---|
max_dom | 定義模擬的嵌套域數量 | 必須 ≥ 所用嵌套層數 |
e_we/e_sn | 每個域的水平網格維度 | 與 WPS 完全一致 |
grid_id/parent_id | 定義域的嵌套層級關系 | 編號從 1 開始,父域 ID 必須小于子域 ID |
i/j_parent_start | 嵌套域在父域中的起始位置 | 對應左下角,必須準確對齊 WPS 設置 |
注意:這些值必須與 WPS 中設置的嵌套起點一致,否則會報錯或嵌套錯位。
dx = 30000, 10000, 3333.33,
dy = 30000, 10000, 3333.33,
parent_grid_ratio = 1, 3, 3,
parent_time_step_ratio = 1, 3, 3,
參數詳解:
參數 | 含義 | 示例值 |
---|---|---|
dx, dy | 每個網格點的水平間距(單位:米) | D01: 30km, D02: 10km, D03: 3.33km |
parent_grid_ratio | 當前域相對于父域的網格間距倍率 | D01:1, D02:3, D03:3(都表示 finer by 3x) |
parent_time_step_ratio | 當前域相對于父域的時間步長倍率 | 通常與 grid ratio 相同,但可以不同 |
注意:
1、所有 4 個變量都必須顯示設置(否則模擬會失敗);
2、grid ratio(網格比率)必須為整數,如 3、5;
3、time step ratio(時間步長比)可與 grid ratio 不同,但通常建議一致,以保持數值穩定性;
4、網格間距單位為米,即使使用經緯度投影(lat/lon)也必須換算為米;
對于旋轉經緯度網格(rotated lat/lon),dx ≠ dy 是允許的。
與嵌套反饋機制相關的參數:feedback 和 smooth_option。它們控制嵌套域(Nest)與其父域(Parent Domain)之間的數據回饋與平滑處理。
&domainsfeedback = 1,smooth_option = 0,
/
? feedback
作用:控制嵌套域(子域)是否將其模擬結果“反饋”給父域。
取值:
- 0:無反饋(稱為 一向嵌套 one-way nesting)
? 嵌套域不會修改父域的模擬結果; - 1:開啟反饋(稱為 雙向嵌套 two-way nesting)
? 嵌套域的高分辨率結果可更新父域覆蓋區域中的值。
📌 通常推薦在研究高分辨率區域對整個區域有反饋影響時使用 feedback = 1。
? smooth_option
作用:當開啟 feedback=1 時,是否對嵌套與父域邊界區域進行平滑處理,以減少突變。
取值:
- 0:不進行平滑(默認值);
- 1:進行一次平滑;
- 2:進行兩次平滑。
📌 平滑處理有助于防止嵌套區與父域交界處出現數值不連續,尤其在地形復雜區域。
參數 | 含義 | 常用值 | 建議 |
---|---|---|---|
feedback | 嵌套域是否影響父域 | 0 = one-way 1 = two-way | 若嵌套區重要,建議設為 1 |
smooth_option | 是否對 feedback 區域進行平滑 | 0, 1, 2 | 若反饋開啟,建議設為 1 或 2 |
&bdy_control 配置部分
&bdy_control 配置部分主要控制邊界條件的設置方式和邊界區域的平滑處理,對于模型穩定性和嵌套域之間的一致性非常重要。
&bdy_controlspec_bdy_width = 5,spec_zone = 1,relax_zone = 4,specified = .T., .F., .F.,nested = .F., .T., .T.,
/
參數逐項解釋:
參數 | 意義 |
---|---|
spec_bdy_width | 外邊界總寬度(單位:格點數),包含指定區和緩沖區。這里為 5 |
spec_zone | 指定區(specified zone)的寬度。外部強制施加邊界值,比如來自 GFS 數據。這里為 1 |
relax_zone | 緩沖過渡區(relaxation zone)的寬度,用于平滑地過渡到內部模擬區域。這里為 4 |
specified | 是否為每個域施加外部邊界條件: .T. 表示施加(一般只對最外層域 d01) .F. 表示不施加(嵌套域不需要) |
nested | 是否為嵌套域應用父域邊界強制(嵌套邊界條件): d01 為 .F.(無父域) d02/d03 為 .T.(從父域獲得邊界) |
📌 注意事項
1、spec_zone + relax_zone = spec_bdy_width
即邊界區總寬度必須等于指定區與緩沖區之和。
2、對 ARW 模型,你可以自由設置 relax_zone 和 spec_zone 的值,但它們的總和必須等于 spec_bdy_width。
3、specified 和 nested 的布爾值列表應與你的 domain 數量一致(如 3 個域就要寫 3 個值)。
- 左圖:wrfinput_d02,為嵌套域的初始邊界輸入文件,邊界區域過渡較生硬,顏色變化突兀;
- 右圖:wrfout_d02,模擬過程中使用了邊界平滑處理,邊界(黑線標出)附近的顏色(變量值)過渡更加平滑。
📌 這說明設置合適的 relax_zone 能夠有效減少邊界處的不連續性,提高模擬穩定性和準確性。
namelist 其他注意事項
1、所有嵌套域應盡量使用相同的物理方案設置。
WRF 模擬中包括多種物理方案(如微物理、對流、邊界層、輻射等),建議所有域(d01、d02、d03…)使用相同的物理參數配置。
?? 例外:積云對流方案(cumulus scheme)
當嵌套域的分辨率非常高(通常 ≤ 3 km),對流可被顯式解析(即用顯式微物理方案模擬出來),不再需要參數化。即,對于高分辨率嵌套域(如 dx = 1 km 或 3 km),應關閉 cumulus 參數化:
cu_physics = 1, 0, 0, ! d01 開啟積云方案,d02/d03 關閉
2、所有域應使用相同的物理過程調用頻率,如 radt, cudt 等。
參數說明:
參數 | 含義 | 單位 |
---|---|---|
radt | 輻射方案的調用間隔 | 秒 |
cudt | 積云方案的調用間隔 | 秒 |
建議所有域統一設置這些頻率,不要因分辨率不同而設置不同值。
radt = 30, 30, 30
cudt = 5, 0, 0
3、并非所有 namelist 參數都與域(domain)相關
有些變量必須為每個 domain 單獨設置(如 dx, dy, i_parent_start),
但也有一些是全局變量(如 run_days, history_interval),不需要為每個域重復設置。
如果不確定某個參數是否與域有關,可以查閱:
?? Registry.EM
?? registry.io_boilerplate
在這些文件中查找 rconfig 或 namelist 字符串,可以判斷該變量是否支持逐域設置。例如:
rconfig "dx" real namelist,domain 1 "grid spacing x-direction"
表示 dx 是 namelist.input 中的、支持逐域設置的變量。
Registry.EM
Registry.EM 是 WRF 模型的核心配置注冊表,用于定義各類物理量、輸入輸出變量、namelist 參數等;其告訴 WRF 程序:
- 參數的類型(如整數、邏輯值等);
- 參數屬于哪個 namelist 區塊;
- 是否逐域(per domain)設置;
- 默認值是多少。
示例字段如下:
rconfig integer spec_bdy_width namelist,bdy_control 1 5
rconfig logical specified namelist,bdy_control max_domains .false.
字段 | 含義 |
---|---|
rconfig | 表示這是一個 namelist 配置項(run-time config) |
integer / logical / 浮點(real)/ 字符串(character) | 參數類型(整型 / 邏輯型) |
如:spec_bdy_width | 參數名稱 |
namelist,bdy_control | 參數屬于哪個 namelist 區塊(比如 &bdy_control) |
1 或 max_domains | 設置方式:1 表示所有域共用;max_domains 表示每個域獨立設置 |
默認值 | 比如 5, 1, 4, .false. 等 |
運行 ARW 嵌套
嵌套方式總結:
嵌套類型 | 特征 |
---|---|
Two-way (無 nest input) | input_from_file = .false. |
Two-way (有 nest input) | input_from_file = .true. |
Two-way(僅靜態輸入) | fine_input_stream = 2 |
One-way(并行) | feedback = 0 |
One-way(分開運行) | 使用 ndown.exe |
Two-way 移動嵌套 | 指定或自動追蹤臺風 |
雙向嵌套(two-way nesting)
單向嵌套(one-way nesting)
🔁 One-way vs Two-way 嵌套對比
特性 | One-way (feedback=0) | Two-way (feedback=1) |
---|---|---|
嵌套域影響父域? | ? 否 | ? 是 |
邊界光滑處理? | 無需 | 可用 smooth_option |
適用場景 | 較獨立區域研究 | 局地對大尺度有反饋的研究 |
另:“單向嵌套”與“雙向嵌套” 的差異比較
WRF論壇-Two-way and one-way nesting runs
根據此論壇內容,設置了兩組WRF實驗,期望D01(外層域)的模擬結果在以下兩種設置下應完全相同:
- 實驗一:雙域模擬(D01+D02),設置 max_dom=2,feedback=0(即one-way nesting)
- 實驗二:單域模擬(僅D01),設置 max_dom=1
兩次實驗都使用相同的時間步長、物理參數化方案等。但結果卻發現:D01的模擬結果不一致。
對此的合理解釋為:雖然理論上 feedback=0(即關閉反饋)時,父域D01的結果應與單獨運行D01的結果一致,但實際上:
- 當設置 max_dom=2 時,WRF 仍然需要初始化和建立子域D02;
- 這個過程會引入一些數值噪聲(noise),從而對D01的數值狀態造成微小擾動;
- 即使關閉了 feedback,D01 的模擬過程還是被“打擾”了。
換句話說:
只要運行了嵌套(即使 feedback=0),D01 的結果就不會完全等同于不含嵌套的運行。
設置"純凈"的嵌套模擬
如果希望真正不受嵌套影響的 D01 結果,可以嘗試使用 ndown程序 來運行嵌套模擬。
這種方式可以先單獨運行 D01,再將其結果作為邊界條件驅動 D02,避免 D02 在運行中影響 D01。
參考
1、PPT-WRF Nesting: Set up and Run