 海浪模型從源碼編譯到測(cè)試運(yùn)行的完整實(shí)踐指南)
1. 項(xiàng)目概述從零開(kāi)始駕馭海浪模擬的利器最近在折騰一個(gè)海洋數(shù)值模擬相關(guān)的項(xiàng)目需要用到海浪譜模型WaveWatch III通常簡(jiǎn)稱為WW3自然就成了繞不開(kāi)的工具。這可不是一個(gè)能一鍵安裝的桌面軟件而是一個(gè)由NOAA等機(jī)構(gòu)維護(hù)的、用于模擬全球或區(qū)域尺度海浪的Fortran數(shù)值模型。網(wǎng)上能找到的官方文檔和零散的安裝指南不少但要么過(guò)于簡(jiǎn)略跳過(guò)了關(guān)鍵細(xì)節(jié)要么環(huán)境老舊已經(jīng)不適用。我花了幾天時(shí)間在Linux系統(tǒng)上從源碼編譯、配置到成功運(yùn)行測(cè)試案例踩了不少坑也總結(jié)出一套相對(duì)穩(wěn)定可靠的流程。這篇筆記就詳細(xì)記錄下整個(gè)過(guò)程特別是那些官方手冊(cè)里沒(méi)明說(shuō)、但實(shí)際操作中一定會(huì)遇到的“坎兒”目標(biāo)是讓你能避開(kāi)我走過(guò)的彎路順利地把WW3環(huán)境搭起來(lái)并跑通第一個(gè)例子。無(wú)論你是海洋學(xué)、氣象學(xué)的研究生還是從事海岸工程、航運(yùn)預(yù)報(bào)的工程師只要需要用到海浪數(shù)值模擬WW3很可能就是你的核心工具之一。它的輸出如有效波高、譜峰周期、波浪傳播方向等是許多后續(xù)分析和應(yīng)用的基礎(chǔ)。因此一個(gè)穩(wěn)定、編譯正確的WW3環(huán)境是第一步也是最關(guān)鍵的一步。整個(gè)過(guò)程會(huì)涉及到Linux基礎(chǔ)操作、編譯器選擇、環(huán)境變量配置、NetCDF庫(kù)的依賴處理以及MPI并行環(huán)境的搭建如果你想發(fā)揮多核計(jì)算能力的話我會(huì)一步步拆開(kāi)講清楚。2. 環(huán)境準(zhǔn)備與核心依賴解析在動(dòng)手下載WW3源碼之前我們必須先把它的“家”給準(zhǔn)備好。這個(gè)“家”主要指的就是編譯器和一系列科學(xué)計(jì)算必需的庫(kù)。WW3是用Fortran 90寫(xiě)的所以一個(gè)現(xiàn)代的Fortran編譯器是必需品。同時(shí)它高度依賴NetCDF庫(kù)來(lái)讀寫(xiě)輸入輸出文件這也是最容易出問(wèn)題的地方。2.1 編譯器與基礎(chǔ)工具鏈選擇首先選擇一個(gè)合適的Fortran編譯器。常見(jiàn)的有GNU的gfortran、Intel的ifort和PGI的pgfortran。對(duì)于大多數(shù)用戶尤其是剛開(kāi)始接觸和在學(xué)術(shù)環(huán)境下的我強(qiáng)烈推薦使用gfortran。原因很簡(jiǎn)單它是開(kāi)源的、免費(fèi)且與大多數(shù)Linux發(fā)行版集成良好。Intel編譯器雖然理論上可能生成更優(yōu)化的代碼但其安裝和許可更復(fù)雜對(duì)于入門(mén)和測(cè)試來(lái)說(shuō)gfortran的簡(jiǎn)便性和穩(wěn)定性優(yōu)勢(shì)明顯。在Ubuntu或Debian系的系統(tǒng)上安裝基礎(chǔ)開(kāi)發(fā)工具和gfortran非常直接sudo apt update sudo apt install build-essential gfortran m4這里build-essential包含了make、gcc等核心工具m4是一個(gè)宏處理器WW3的編譯腳本會(huì)用到它。如果你用的是CentOS、RHEL或Fedora對(duì)應(yīng)的命令可能是sudo yum groupinstall Development Tools和sudo yum install gcc-gfortran m4。注意請(qǐng)務(wù)必確認(rèn)你的gfortran版本。太舊的版本如早于7.x可能不支持某些Fortran 2003/2008特性導(dǎo)致編譯失敗??梢酝ㄟ^(guò)gfortran --version查看。我使用的是gfortran 11.3.0整個(gè)過(guò)程很順利。2.2 NetCDF庫(kù)的依賴最關(guān)鍵的“一道坎”這是整個(gè)安裝過(guò)程中最具挑戰(zhàn)性的一環(huán)。WW3需要NetCDF庫(kù)而且它同時(shí)需要NetCDF的C接口和Fortran接口。更關(guān)鍵的是這些庫(kù)必須由同一個(gè)編譯器套件即你用來(lái)編譯WW3的gfortran和對(duì)應(yīng)的gcc編譯而來(lái)。直接使用系統(tǒng)包管理器安裝的NetCDF例如sudo apt install libnetcdf-dev libnetcdff-dev很可能是因?yàn)樗鼈兪怯孟到y(tǒng)默認(rèn)的編譯器編譯的與你的gfortran環(huán)境不兼容在鏈接WW3時(shí)會(huì)遭遇令人頭疼的“未定義引用”錯(cuò)誤。最可靠的方法是手動(dòng)編譯安裝NetCDF庫(kù)及其依賴。這聽(tīng)起來(lái)復(fù)雜但按順序來(lái)并不難。NetCDF庫(kù)依賴于HDF5和zlib等庫(kù)。我們需要按順序編譯zlib - HDF5 - NetCDF-C - NetCDF-Fortran。假設(shè)我們將所有庫(kù)安裝到/opt/ww3_libs目錄下你可以選擇其他有寫(xiě)入權(quán)限的目錄。首先創(chuàng)建安裝目錄并下載源碼包export WW3_LIBS/opt/ww3_libs mkdir -p $WW3_LIBS/src $WW3_LIBS cd $WW3_LIBS/src # 下載源碼 (版本號(hào)可去官網(wǎng)更新為最新穩(wěn)定版) wget https://zlib.net/zlib-1.2.13.tar.gz wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.14/hdf5-1.14.3/src/hdf5-1.14.3.tar.gz wget https://github.com/Unidata/netcdf-c/archive/refs/tags/v4.9.2.tar.gz -O netcdf-c-4.9.2.tar.gz wget https://github.com/Unidata/netcdf-fortran/archive/refs/tags/v4.6.1.tar.gz -O netcdf-fortran-4.6.1.tar.gz接下來(lái)是編譯安裝。核心原則每一步的CCC編譯器和FCFortran編譯器環(huán)境變量都要指向我們選定的gcc和gfortran并且--prefix指定安裝路徑。編譯安裝zlibtar -xzf zlib-1.2.13.tar.gz cd zlib-1.2.13 ./configure --prefix$WW3_LIBS make make check # 可選運(yùn)行測(cè)試 sudo make install # 如果需要安裝到系統(tǒng)目錄如/usr/local則需要sudo cd ..編譯安裝HDF5tar -xzf hdf5-1.14.3.tar.gz cd hdf5-1.14.3 # 這里必須設(shè)置CC為gcc并指定zlib路徑 CCgcc ./configure --prefix$WW3_LIBS --with-zlib$WW3_LIBS --enable-hl --enable-fortran make -j4 # 使用4個(gè)核心并行編譯加快速度 make check sudo make install cd ..注意--enable-fortran是必須的因?yàn)镹etCDF-Fortran依賴HDF5的Fortran接口。編譯安裝NetCDF-Ctar -xzf netcdf-c-4.9.2.tar.gz cd netcdf-c-4.9.2 # 設(shè)置CPPFLAGS和LDFLAGS來(lái)告訴編譯器HDF5和zlib的位置 CPPFLAGS-I$WW3_LIBS/include LDFLAGS-L$WW3_LIBS/lib CCgcc ./configure --prefix$WW3_LIBS --disable-dap make -j4 make check sudo make install cd ..編譯安裝NetCDF-Fortrantar -xzf netcdf-fortran-4.6.1.tar.gz cd netcdf-fortran-4.6.1 # 關(guān)鍵步驟必須導(dǎo)出NetCDF-C的路徑并指定Fortran編譯器 export LD_LIBRARY_PATH$WW3_LIBS/lib:$LD_LIBRARY_PATH CPPFLAGS-I$WW3_LIBS/include LDFLAGS-L$WW3_LIBS/lib FCgfortran ./configure --prefix$WW3_LIBS make -j4 make check sudo make install cd ..完成后可以測(cè)試一下Fortran接口是否正常nf-config --flibs和nc-config --libs應(yīng)該能正確輸出庫(kù)鏈接信息。2.3 MPI并行環(huán)境準(zhǔn)備可選但推薦WW3支持MPI并行計(jì)算以加速大規(guī)模模擬。如果你有多核CPU或要在集群上運(yùn)行建議安裝。常用的實(shí)現(xiàn)是OpenMPI或MPICH。同樣建議用系統(tǒng)包管理器安裝與編譯器兼容的版本。# Ubuntu/Debian sudo apt install openmpi-bin libopenmpi-dev # CentOS/RHEL sudo yum install openmpi openmpi-devel安裝后可以通過(guò)mpifort --version來(lái)確認(rèn)MPI的Fortran包裝器是否調(diào)用了我們指定的gfortran。3. 獲取源碼與編譯配置實(shí)戰(zhàn)當(dāng)所有依賴庫(kù)就位后我們就可以請(qǐng)出“主角”了。WW3的源代碼托管在GitHub上這使得獲取和更新代碼變得非常方便。3.1 克隆代碼倉(cāng)庫(kù)與結(jié)構(gòu)初探打開(kāi)終端找一個(gè)你打算存放項(xiàng)目的目錄執(zhí)行g(shù)it clone https://github.com/NOAA-EMC/WW3.git cd WW3克隆完成后你會(huì)看到一個(gè)結(jié)構(gòu)清晰的目錄樹(shù)。幾個(gè)關(guān)鍵目錄你需要了解model/WW3核心模型的源代碼所在地。work/這是你主要的工作目錄。里面存放了各種測(cè)試案例、編譯腳本和用于生成可執(zhí)行文件的鏈接文件。regtests/包含了大量的回歸測(cè)試用例用于驗(yàn)證編譯是否正確以及模型功能是否正常。我們后續(xù)的測(cè)試就在這里進(jìn)行。bin/編譯成功后生成的可執(zhí)行文件會(huì)放在這里或者你指定的位置。3.2 編譯配置文件的定制與解讀WW3的編譯系統(tǒng)并不使用常見(jiàn)的CMake或autotools而是采用了一套基于make和模板文件的機(jī)制其核心配置文件是work/ww3_makefile。我們需要根據(jù)我們的環(huán)境來(lái)修改它。首先我們復(fù)制一個(gè)模板過(guò)來(lái)cd work cp ../bin/makefile/makefile.gfortran ww3_makefile這里我們選擇了gfortran的模板。如果你用Intel編譯器就復(fù)制makefile.intel。現(xiàn)在用文本編輯器如vim或nano打開(kāi)ww3_makefile。我們需要關(guān)注以下幾個(gè)關(guān)鍵變量SHELL保持/bin/bash即可。LN鏈接命令保持ln -sf。CPPC預(yù)處理器用于處理Fortran代碼中的預(yù)處理指令。保持/lib/cpp -P -traditional。如果系統(tǒng)沒(méi)有/lib/cpp可能需要安裝cpp包或修改為/usr/bin/cpp。COMP編譯類(lèi)型。對(duì)于測(cè)試我們選擇single單精度即可它比double雙精度運(yùn)行更快且對(duì)于功能測(cè)試足夠。所以設(shè)置COMP single。CC,FC,MPICC,MPIFC這些是編譯器的設(shè)置。由于我們只用gfortran和可能用到的OpenMPI通常模板已經(jīng)設(shè)置好了如FC gfortran。檢查確保MPIFC mpif90。最關(guān)鍵的庫(kù)路徑和鏈接標(biāo)志。這是將我們之前編譯的NetCDF庫(kù)告訴編譯器的步驟。你需要找到類(lèi)似以下的行并進(jìn)行修改# 示例你的路徑可能不同 INC4 -I/opt/ww3_libs/include LIB4 -L/opt/ww3_libs/lib -lnetcdff -lnetcdf -lhdf5_hl -lhdf5 -lz -lmINC4是包含頭文件的路徑LIB4是鏈接庫(kù)的路徑和庫(kù)列表。順序很重要必須按照依賴關(guān)系從最上層netcdff到最底層zlib排列。-lm是數(shù)學(xué)庫(kù)。DMY日期函數(shù)。保持DMY 空通常可以。修改保存后這個(gè)ww3_makefile就成為了你當(dāng)前工作環(huán)境的編譯藍(lán)圖。3.3 執(zhí)行編譯與生成可執(zhí)行文件配置好后編譯過(guò)程本身反而很簡(jiǎn)單。在work/目錄下執(zhí)行make clean # 清理之前的編譯結(jié)果如果是第一次可跳過(guò) make all # 編譯所有組件make all命令會(huì)根據(jù)ww3_makefile中的配置編譯生成一系列可執(zhí)行文件例如ww3_grid網(wǎng)格生成器、ww3_prnc輸入數(shù)據(jù)預(yù)處理、ww3_shel主集成程序等。如果一切順利你會(huì)在work/目錄下看到這些可執(zhí)行文件或者它們被鏈接到了../bin/目錄下。實(shí)操心得編譯過(guò)程可能會(huì)輸出很多警告warning只要沒(méi)有錯(cuò)誤error導(dǎo)致中斷通??梢院雎?。如果遇到“未找到 -lnetcdff”或“無(wú)法識(shí)別 -lhdf5_hl”之類(lèi)的錯(cuò)誤請(qǐng)回頭仔細(xì)檢查L(zhǎng)IB4和INC4的路徑是否正確以及庫(kù)文件是否確實(shí)存在于那些目錄中可以用ls /opt/ww3_libs/lib/查看。最常見(jiàn)的錯(cuò)誤就是NetCDF庫(kù)的路徑或版本不匹配。4. 運(yùn)行測(cè)試案例驗(yàn)證安裝成功的“試金石”編譯成功只意味著代碼被轉(zhuǎn)換成了機(jī)器指令但模型邏輯是否正確、輸入輸出是否正常需要通過(guò)運(yùn)行測(cè)試案例來(lái)驗(yàn)證。WW3貼心地提供了regtests目錄里面包含了從簡(jiǎn)單到復(fù)雜的各種測(cè)試。4.1 測(cè)試案例結(jié)構(gòu)與運(yùn)行腳本剖析我們找一個(gè)最簡(jiǎn)單的案例開(kāi)始比如regtests/ww3_tp2.1這是一個(gè)雙網(wǎng)格點(diǎn)測(cè)試計(jì)算量極小幾秒鐘就跑完。進(jìn)入該目錄cd ../regtests/ww3_tp2.1 ls你會(huì)看到一些.inp文件輸入配置文件、wind.nc之類(lèi)的輸入數(shù)據(jù)文件以及一個(gè)關(guān)鍵的腳本run_test。這個(gè)腳本自動(dòng)化了整個(gè)測(cè)試流程。在運(yùn)行前我們最好先看一下這個(gè)腳本的內(nèi)容了解它做了什么cat run_test腳本內(nèi)容通常包括鏈接必要的輸入文件到工作目錄、運(yùn)行ww3_grid生成mod_def網(wǎng)格文件、運(yùn)行ww3_prnc處理強(qiáng)迫場(chǎng)數(shù)據(jù)、運(yùn)行ww3_shel進(jìn)行模式積分、最后運(yùn)行ww3_ounf等程序進(jìn)行后處理輸出。它是一系列標(biāo)準(zhǔn)操作流程的封裝。4.2 執(zhí)行測(cè)試與結(jié)果驗(yàn)證要運(yùn)行測(cè)試通常只需要./run_test或者如果腳本沒(méi)有執(zhí)行權(quán)限先chmod x run_test。腳本開(kāi)始運(yùn)行后會(huì)在終端輸出大量信息顯示各個(gè)組件正在執(zhí)行。如果一切正常最終你會(huì)看到腳本成功完成的提示并生成一系列輸出文件如out_grd.ww3網(wǎng)格信息、out_pnt.ww3點(diǎn)輸出以及NetCDF格式的結(jié)果文件。如何判斷測(cè)試是否真的成功看腳本退出狀態(tài)在終端中命令執(zhí)行完畢后輸入echo $?。如果返回0表示腳本正常退出??摧敵鑫募z查是否有預(yù)期的輸出文件生成并且文件大小不為零??慈罩九c錯(cuò)誤信息腳本運(yùn)行過(guò)程中不應(yīng)有FORTRAN STOP或ERROR等導(dǎo)致程序異常終止的信息。警告信息可能有一些需要根據(jù)內(nèi)容判斷是否影響結(jié)果。結(jié)果合理性檢查進(jìn)階對(duì)于ww3_tp2.1這種標(biāo)準(zhǔn)測(cè)試其結(jié)果應(yīng)該是可預(yù)期的。你可以快速用ncdump -h查看一下生成的NetCDF文件頭確認(rèn)其中包含如hs有效波高等變量。4.3 測(cè)試過(guò)程中常見(jiàn)問(wèn)題精講即使編譯通過(guò)了運(yùn)行測(cè)試時(shí)也可能遇到問(wèn)題。這里列舉幾個(gè)我遇到的典型情況“Cannot open netCDF file” 或 “NetCDF: Not a valid data type”問(wèn)題根源這幾乎100%是NetCDF庫(kù)版本不匹配或鏈接錯(cuò)誤造成的??赡苁悄憔幾gWW3時(shí)鏈接的NetCDF庫(kù)版本與系統(tǒng)環(huán)境變量LD_LIBRARY_PATH指向的運(yùn)行時(shí)庫(kù)版本不一致。解決方案確保你的LD_LIBRARY_PATH包含了自定義安裝的NetCDF庫(kù)路徑并且在運(yùn)行測(cè)試前將其導(dǎo)出。export LD_LIBRARY_PATH/opt/ww3_libs/lib:$LD_LIBRARY_PATH ./run_test為了避免每次都要設(shè)置可以將這行命令添加到你的shell配置文件如~/.bashrc中。腳本執(zhí)行到一半報(bào)錯(cuò)退出提示某個(gè)“.inp”文件找不到問(wèn)題根源run_test腳本內(nèi)部通過(guò)軟鏈接來(lái)獲取輸入文件。如果WW3的目錄結(jié)構(gòu)被移動(dòng)或者你在錯(cuò)誤的位置執(zhí)行腳本鏈接就會(huì)失效。解決方案確保你在測(cè)試案例的目錄下例如regtests/ww3_tp2.1執(zhí)行腳本并且WW3的主目錄結(jié)構(gòu)完整。不要隨意移動(dòng)regtests目錄。運(yùn)行ww3_shel時(shí)卡住或非常慢問(wèn)題根源如果你運(yùn)行的不是最簡(jiǎn)單的測(cè)試案例如ww3_tp2.1而是像ww3_ts1全球測(cè)試這樣的案例計(jì)算量會(huì)大很多。默認(rèn)可能是串行運(yùn)行。解決方案檢查測(cè)試案例目錄下是否有run_test.mpi腳本。如果有說(shuō)明該測(cè)試支持并行。你需要確保MPI已正確安裝然后使用mpirun來(lái)運(yùn)行例如mpirun -np 4 ./run_test.mpi使用4個(gè)進(jìn)程。這能極大縮短計(jì)算時(shí)間。生成的結(jié)果文件內(nèi)容全是填充值如-999.9問(wèn)題根源可能是強(qiáng)迫場(chǎng)數(shù)據(jù)風(fēng)場(chǎng)、流場(chǎng)沒(méi)有正確鏈接或處理或者時(shí)間范圍設(shè)置有問(wèn)題導(dǎo)致模型實(shí)際沒(méi)有接收到有效的驅(qū)動(dòng)數(shù)據(jù)。解決方案仔細(xì)檢查run_test腳本中關(guān)于ww3_prnc強(qiáng)迫場(chǎng)預(yù)處理的部分確認(rèn)輸入的風(fēng)場(chǎng)文件如wind.nc被正確鏈接且其時(shí)間覆蓋了模擬時(shí)段??梢允謩?dòng)執(zhí)行ww3_prnc命令看看是否有錯(cuò)誤輸出。5. 從測(cè)試到應(yīng)用搭建自定義模擬工作流成功運(yùn)行官方測(cè)試案例標(biāo)志著你的WW3安裝基本正確。但這只是開(kāi)始我們的最終目標(biāo)是為了自己的研究區(qū)域或工程問(wèn)題運(yùn)行模擬。這就需要我們建立自己的工作流。5.1 工作目錄的標(biāo)準(zhǔn)化管理我強(qiáng)烈建議不要直接在regtests或work目錄下進(jìn)行你的個(gè)人項(xiàng)目。最好的做法是創(chuàng)建一個(gè)獨(dú)立的工作目錄例如~/my_ww3_project并在此目錄下建立清晰的子文件夾結(jié)構(gòu)my_ww3_project/ ├── bin/ # 鏈接或復(fù)制WW3的可執(zhí)行文件到此 ├── grid/ # 存放網(wǎng)格生成相關(guān)文件 (.inp, 岸線數(shù)據(jù)等) ├── forc/ # 存放強(qiáng)迫場(chǎng)數(shù)據(jù) (風(fēng)場(chǎng).nc, 流場(chǎng).nc等) ├── inp/ # 存放各種.inp配置文件 ├── out/ # 存放模型輸出結(jié)果 ├── log/ # 存放運(yùn)行日志 └── scripts/ # 存放自己寫(xiě)的運(yùn)行腳本將編譯好的可執(zhí)行文件從WW3/work/鏈接到你的bin/目錄ln -s /path/to/WW3/work/ww3_* ~/my_ww3_project/bin/。5.2 核心輸入文件準(zhǔn)備詳解一個(gè)完整的WW3模擬需要準(zhǔn)備三個(gè)核心輸入文件它們通過(guò).inp文件進(jìn)行配置網(wǎng)格文件生成 (ww3_grid.inp)這是基礎(chǔ)。你需要定義模擬區(qū)域的網(wǎng)格經(jīng)緯度或笛卡爾坐標(biāo)、水深、岸線掩碼等。最復(fù)雜的是準(zhǔn)備水深數(shù)據(jù)文件和岸線數(shù)據(jù)文件。你可以從ETOPO、GEBCO等全球地形數(shù)據(jù)集獲取水深并使用GSHHS等岸線數(shù)據(jù)集。ww_grid.inp中需要指定這些文件的格式和路徑。運(yùn)行ww3_grid后會(huì)生成一個(gè)二進(jìn)制的mod_def.ww3文件供后續(xù)步驟使用。強(qiáng)迫場(chǎng)預(yù)處理 (ww3_prnc.inp)海浪需要風(fēng)來(lái)驅(qū)動(dòng)可能還需要水流場(chǎng)。你需要準(zhǔn)備N(xiāo)etCDF格式的風(fēng)場(chǎng)U10, V10等數(shù)據(jù)。ww3_prnc.inp文件用于告訴模型如何從你的NetCDF文件中讀取變量、時(shí)間和空間信息。運(yùn)行ww3_prnc會(huì)生成wind.ww3這樣的二進(jìn)制強(qiáng)迫場(chǎng)文件。主程序集成 (ww3_shel.inp)這是主控文件。在這里你設(shè)置模擬的起止時(shí)間、時(shí)間步長(zhǎng)、輸出頻率、輸出類(lèi)型譜、參數(shù)、重啟文件等、物理參數(shù)化方案源函數(shù)項(xiàng)風(fēng)輸入、白冠耗散、非線性波波相互作用等。你需要指定前面生成的mod_def.ww3和強(qiáng)迫場(chǎng)文件。5.3 編寫(xiě)自動(dòng)化運(yùn)行腳本手動(dòng)依次執(zhí)行三個(gè)步驟容易出錯(cuò)。編寫(xiě)一個(gè)Shell腳本來(lái)自動(dòng)化這個(gè)過(guò)程是專(zhuān)業(yè)做法。一個(gè)極簡(jiǎn)的腳本框架如下#!/bin/bash # run_my_simulation.sh # 1. 設(shè)置環(huán)境變量 export LD_LIBRARY_PATH/opt/ww3_libs/lib:$LD_LIBRARY_PATH # 2. 生成網(wǎng)格 echo Step 1: Running ww3_grid... ./bin/ww3_grid log/grid.log 21 if [ $? -ne 0 ]; then echo Grid generation failed!; exit 1; fi # 3. 預(yù)處理強(qiáng)迫場(chǎng) echo Step 2: Running ww3_prnc... ./bin/ww3_prnc log/prnc.log 21 if [ $? -ne 0 ]; then echo Forcing preprocessing failed!; exit 1; fi # 4. 運(yùn)行主模型 echo Step 3: Running ww3_shel... # 如果是并行運(yùn)行使用 mpirun -np N ./bin/ww3_shel ./bin/ww3_shel log/shel.log 21 if [ $? -ne 0 ]; then echo Model run failed!; exit 1; fi echo All steps completed successfully!這個(gè)腳本包含了基本的錯(cuò)誤檢查通過(guò)$?判斷上一條命令的退出狀態(tài)并將每個(gè)組件的輸出重定向到日志文件便于事后排查。5.4 結(jié)果后處理與可視化初步WW3默認(rèn)的輸出是二進(jìn)制或NetCDF格式。對(duì)于NetCDF輸出你可以使用多種工具進(jìn)行后處理Python使用xarray和netCDF4庫(kù)讀取數(shù)據(jù)用matplotlib或cartopy進(jìn)行繪圖。這是目前最靈活、最主流的方式。NCL在氣象海洋領(lǐng)域傳統(tǒng)深厚繪圖功能強(qiáng)大但已停止維護(hù)。MATLAB也有相應(yīng)的NetCDF讀寫(xiě)工具包。一個(gè)簡(jiǎn)單的Python腳本用于讀取并繪制有效波高場(chǎng)示例import xarray as xr import matplotlib.pyplot as plt import cartopy.crs as ccrs # 打開(kāi)WW3輸出的NetCDF文件 ds xr.open_dataset(out/ww3.201210.nc) # 假設(shè)變量名是hs選擇第一個(gè)時(shí)間步 hs ds[hs].isel(time0) # 創(chuàng)建地圖投影 fig plt.figure(figsize(12, 8)) ax plt.axes(projectionccrs.PlateCarree()) ax.coastlines(resolution10m) # 繪制填色圖 plot hs.plot(axax, transformccrs.PlateCarree(), cmapjet, add_colorbarTrue, cbar_kwargs{label: Significant Wave Height (m)}) ax.set_title(WW3 Model Output - Hs) plt.show()從編譯安裝到運(yùn)行測(cè)試再到建立自己的項(xiàng)目工作流這個(gè)過(guò)程確實(shí)涉及不少細(xì)節(jié)。最大的挑戰(zhàn)往往不在WW3本身而在其依賴環(huán)境的搭建尤其是NetCDF庫(kù)的手動(dòng)編譯。一旦跨過(guò)這道坎后面按照手冊(cè)和示例操作就會(huì)順暢很多。建議在開(kāi)始自己的科學(xué)模擬前多花時(shí)間研究幾個(gè)不同的regtests案例理解各種.inp文件的配置項(xiàng)含義這比直接啃理論手冊(cè)要直觀有效得多。