Building WRF

Building WRF

cloud_download  

WRF source code

助教已幫下載 WRF-4.5.2 原始碼,請至首頁 data 路徑尋找檔名含有 tar.gz 的打包壓縮檔。頻寬及硬碟有限下,不需要每個人都去下載一次。拿到 tar 檔,首先要解壓縮,才能進去 WRF 原始碼的目錄。看看目錄下有什麼東西。

[USER@VAPOR ***]$ tar -zxf "${dataROOT}/WRF-4.5.2.tar.gz" -C "${work}"[USER@VAPOR ***]$ cd "${work}/WRF-4.5.2"[USER@VAPOR ***]$ ls -ltotal 232drwxr-xr-x  2 - -  4096 23.12.23_0023 arch      # 跟硬體架構有關的環境文件drwxr-xr-x  3 - -  8192 23.12.23_0023 chem      # WRF-Chem 相關原始碼-rwxr-xr-x  1 - -  4023 23.12.23_0023 clean     # ./clean -a 清除編譯-rwxr-xr-x  1 - - 17078 23.12.23_0023 compile   # 編譯執行檔-rwxr-xr-x  1 - - 36731 23.12.23_0023 configure # 設定執行檔(檢查環境)drwxr-xr-x  2 - -  4096 23.12.23_0023 doc       # 一堆 README 檔的分靈體drwxr-xr-x  2 - -  4096 23.12.23_0023 dyn_em    # 動力相關原始碼drwxr-xr-x 18 - -  4096 23.12.23_0023 external  # 外部 lib 的drwxr-xr-x  2 - -  4096 23.12.23_0023 frame     # WRF 框架相關原始碼drwxr-xr-x 15 - -  4096 23.12.23_0023 hydro     # WRF-Hydro 相關原始碼drwxr-xr-x  2 - -  4096 23.12.23_0023 inc       # 檔頭文件-rw-r--r--  1 - -  1027 23.12.23_0023 LICENSE.txt # A lot of textdrwxr-xr-x  2 - -  4096 23.12.23_0023 main      # WRF 主程式-rw-r--r--  1 - - 58124 23.12.23_0023 Makefile  # WRF 編譯過程的食譜書drwxr-xr-x  3 - -  8192 23.12.23_0023 phys      # 物理過程相關原始碼-rw-r--r--  1 - - 17699 23.12.23_0023 README    # 不管有沒有用-rw-r--r--  1 - -  1151 23.12.23_0023 README.md # 請你一定要看一遍drwxr-xr-x  2 - -  4096 23.12.23_0023 Registry  # 變數輸出控制及檔頭控制相關drwxr-xr-x  2 - -  4096 23.12.23_0023 run       # 執行模擬的工作目錄drwxr-xr-x  2 - -  4096 23.12.23_0023 share     # 中介層原始碼drwxr-xr-x 17 - -  4096 23.12.23_0023 test      # 測試檔案drwxr-xr-x  4 - -  4096 23.12.23_0023 tools     # Registry讀取及檔頭文件生成drwxr-xr-x 14 - -  4096 23.12.23_0023 var       # 資料同化相關drwxr-xr-x  2 - -  4096 23.12.23_0023 wrftladj  # WRFPLUS相關

Configuring

編譯第一步檢查環境設定生成一份給編譯器的食譜書 "Makefile"

依序執行 clean configure compile 三支腳本,除了單純的直接以./執行之外,還可以用 -help 選項查看有什麼其他的有趣設定。而編譯的第一步,就是檢查環境設定,生成一份給編譯器的食譜書 "Makefile",在 WRF 的目錄中還會生成一個可以控制編譯的設定檔 ${WRF_DIR}/configure.wrf

另外,要使用單核心、單節點、跨節點、OpenMP 加速等功能也要在 configure 前先設定好,先前已執行過一次 configure 的使用者也可以到 configure 結束後所生成的 ${WRF_DIR}/configure.wrf 檔案中調整。

[serial]

serial : computes with a single processor

serial : computes with a single processor. This is only useful for small cases with domain size of about 100x100 grid spaces.

[smpar]

smpar : Symmetric Multi-processing/Shared Memory Parallel (OpenMP)

smpar : Symmetric Multi-processing/Shared Memory Parallel (OpenMP). This option is only recommended for those who are knowledgeable with computation and processing. It works most reliably for IBM machines.

[dmpar]

dmpar : Distributed Memory Parallel (MPI)

跨節點記憶體分散式平行計算(可以使用兩台以上的電腦,分配到自己需要使用的記憶體)

[dm+sm]

dm+sm : Distributed Memory with Shared Memory

dm+sm : Distributed Memory with Shared Memory (for e.g., MPI across nodes with OpenMP within a node). Performance is typically better with the dmpar-only option, and this option is not recommended for those without extensive computation/processing experience.

[USER@VAPOR ***]$ ./configure -help**************************************************usage: ./configure [-d|-D|-s|-f|-os os|-mach mach|-time timecommand] [chem] [kpp]-d    build with debugging information and no optimization-D    build with -d AND floating traps, traceback, uninitialized variables-r8   build with 8 byte reals-help print this message**************************************************[USER@VAPOR ***]$ ./configurechecking for perl5... nochecking for perl... found /usr/bin/perl (perl)Will use NETCDF in dir: /work3/NWP2024SP/***ADIOS2 not set in environment. Will configure WRF for use without.HDF5 not set in environment. Will configure WRF for use without.PHDF5 not set in environment. Will configure WRF for use without.Will use 'time' to report timing information

If you REALLY want Grib2 output from WRF, modify the arch/Config.pl script.Right now you are not getting the Jasper lib, from the environment, compiled into WRF.
------------------------------------------------------------------------Please select from among the following Linux x86_64 options:
  1. (serial)   2. (smpar)   3. (dmpar)   4. (dm+sm)   PGI (pgf90/gcc)  5. (serial)   6. (smpar)   7. (dmpar)   8. (dm+sm)   PGI (pgf90/pgcc): SGI MPT  9. (serial)  10. (smpar)  11. (dmpar)  12. (dm+sm)   PGI (pgf90/gcc): PGI accelerator 13. (serial)  14. (smpar)  15. (dmpar)  16. (dm+sm)   INTEL (ifort/icc)                                         17. (dm+sm)   INTEL (ifort/icc): Xeon Phi (MIC architecture) 18. (serial)  19. (smpar)  20. (dmpar)  21. (dm+sm)   INTEL (ifort/icc): Xeon (SNB with AVX mods) 22. (serial)  23. (smpar)  24. (dmpar)  25. (dm+sm)   INTEL (ifort/icc): SGI MPT 26. (serial)  27. (smpar)  28. (dmpar)  29. (dm+sm)   INTEL (ifort/icc): IBM POE 32. (serial)  33. (smpar)  34. (dmpar)  35. (dm+sm)   GNU (gfortran/gcc) 48. (serial)  49. (smpar)  50. (dmpar)  51. (dm+sm)   INTEL (ftn/icc): Cray XC 64. (serial)  65. (smpar)  66. (dmpar)  67. (dm+sm)   INTEL (ifort/icc): HSW/BDW 68. (serial)  69. (smpar)  70. (dmpar)  71. (dm+sm)   INTEL (ifort/icc): KNL MIC~~~~~~~~ 76. (serial)  77. (smpar)  78. (dmpar)  79. (dm+sm)   INTEL (ifx/icx) : oneAPI LLVM 80. (serial)  81. (smpar)  82. (dmpar)  83. (dm+sm)   FUJITSU (frtpx/fccpx): FX10/FX100 SPARC64 IXfx/Xlfx
Enter selection [1-83] :

請依照自己的環境設定選取,一般而言,隨著越高解析模式的進展, WRF 需要去模擬更細的網格,整個三維體積的網格點數目增加,就表示計算量加倍,除非有特殊需求,例如理想化研究通常比較(龜毛X)會有限用單核或不能跨節點等等的要求,不然基本上都是選(dmpar)分散式記憶體平行化,至於我們環境設定是使用什麼編譯器就請你照實際狀況選即可,應該不至於到這一步還搞不清楚目前使用哪一個編譯器都不清楚吧。

經過 2024.05.01 測試,選用 20 的選項在編譯時加入最佳化選項,能以 AVX 指令集將程式向量化編譯,雖然增加編譯時間,但之後模式執行的速度會較未優化的快。

Compile for nesting? (1=basic, 2=preset moves, 3=vortex following) [default 1]:

本次作業請選擇 1 ,未來請依實際需求選取。執行結束時如果結尾的說明有印出成功或回應有偵測到NETCDF環境,基本上就是沒問題了。如果結尾出現 warning 後面跟著 Fortran 2003 就表示所使用的編譯器不支援 Fortran 2003 語法,所以有使用到 2003 標準的 Fortran 程式不會被編譯到,當然也就不能使用囉,後續如果在模式設計時, namelist.input 選用到沒被編譯到的選項,是無法成功執行的喔。

可以使用ls來看一下configure.wrf是否有產出新的檔案,如果要調整一些編譯的最佳化設定或是新增額外函式庫可以在這份檔案中做設定,只要有這份檔案加上之前的環境設定都有完成,那即使不用執行configure也可以直接開始執行編譯。

Compiling WRF

WRF模式下除了有一個真實模組:em_real 以外,還有數種不同的理想化模組。

em_real

em_b_wave

em_convrad

em_fire

em_les

em_quarter_ss

em_tropical_cyclone

em_grav2d_x

em_hill2d_x

em_seabreeze2d_x

em_squall2d_x, em_squall2d_y

執行編譯指令時,後方加上模組名稱,這樣 WRF 才會變成指定的樣子實作課程以真實個案作為教學,因為理想個案模擬只需要安裝WRF即可,請自行練習。

[USER@VAPOR ***]$ ./compile em_real >& log-wrf

執行編譯指令時,後方要加上模組名稱,這樣 WRF 才會變成指定的樣子。實作課程以真實個案作為教學,因為理想個案模擬只需要安裝WRF即可,請自行練習。

[USER@VAPOR ***]$ grep Error log-wrf [USER@VAPOR ***]$ ls -l /work1/${user}/WRFV3/run/*.exendown.exe -> ../main/ndown.exereal.exe -> ../main/real.exetc.exe -> ../main/tc.exewrf.exe -> ../main/wrf.exe

第一行 grep 指令是尋找編譯輸出的 logfile 有沒有 Error 出現,有的話就是編譯失敗了,請 vi 打開 logfile 去看看 Error 出現在編譯到什麼程式的時候,依照 logfile 的指示去除錯。第二行指令是去看編譯完的執行檔是否都有出現在 run 資料夾底下,應該要出現:ndown.exereal.exetc.exewrf.exe 四個執行檔。理想化模擬應該要出現:ideal.exewrf.exe 二個執行檔。

編譯失敗就要先到 logfile 中尋找 Error 的地方,接著執行 ./clean –a 清除編譯的資料,再從 WRF 目錄下的 configure 開始修正錯誤重新來過。兩個檢查都通過的話,恭喜你。WRF 已經安裝完成囉,已經可以進行理想模式模擬,真實個案模擬/預報就接著下一步開始安裝 WPS 了。