電仿真算例實(shí)戰(zhàn))
簡(jiǎn)介《風(fēng)電開源仿真軟件 OpenFAST v3.2.1 源碼》是一份面向風(fēng)電建模仿真、電氣工程和數(shù)值計(jì)算研究人員的完整源代碼資源。OpenFAST 將 AeroDyn、SubDyn、InflowWind、BeamDyn 等氣動(dòng)載荷、結(jié)構(gòu)動(dòng)力學(xué)、入流風(fēng)場(chǎng)與葉片塔架模型整合為可耦合求解的整機(jī)仿真框架適合開展風(fēng)力機(jī)動(dòng)態(tài)響應(yīng)分析、控制器驗(yàn)證和模塊級(jí)二次開發(fā)也可用于風(fēng)電課程設(shè)計(jì)與科研平臺(tái)搭建。該壓縮包約四百三十四兆包內(nèi)文件總數(shù)暫未提供主要文件類型包括 Fortran 源碼、VS 解決方案文件、CMake 構(gòu)建配置及模塊頭文件/接口定義通過 Visual Studio 解決方案可一鍵配置編譯參數(shù)與模塊依賴免去手動(dòng)處理多個(gè)組件構(gòu)建關(guān)系的麻煩而 CMake 命令行方式則便于 Linux 用戶自動(dòng)化配置。已有 1661 人學(xué)習(xí)下載。讀者下載后可直接獲得全模塊源碼與構(gòu)建腳本根據(jù)自身環(huán)境選擇 Windows 或 Linux 編譯路徑在理解模塊耦合機(jī)制的基礎(chǔ)上進(jìn)行仿真計(jì)算、調(diào)試排錯(cuò)或功能擴(kuò)展是風(fēng)電仿真領(lǐng)域深入學(xué)習(xí)與工程實(shí)踐不可多得的開源參考。1. openfast仿真軟件風(fēng)電建模仿真的開源主力實(shí)測(cè)風(fēng)速只有 13m/s塔筒頂部振動(dòng)卻在幾分鐘里翻了三倍。這類動(dòng)態(tài)效應(yīng)靠經(jīng)驗(yàn)公式根本推不出來必須回到時(shí)域仿真里去解。OpenFAST 就是干這個(gè)的——它把葉片氣動(dòng)、結(jié)構(gòu)彈性、發(fā)電機(jī)控制和塔基支撐耦合到同一套時(shí)間步里推進(jìn)輸出每個(gè)時(shí)刻的載荷與響應(yīng)。v3.2.1 源碼包的價(jià)值在于你能看到方程在哪里組裝、狀態(tài)量如何跨模塊傳遞而不是把一個(gè)商業(yè)黑匣子當(dāng)擺設(shè)。適合做整機(jī)載荷計(jì)算、控制器開發(fā)和動(dòng)力學(xué)研究的工程師也適合想在畢業(yè)論文里寫清楚算法機(jī)理的學(xué)生。2. 看懂 OpenFAST 的源碼骨架模塊化架構(gòu)與 v3.2.1 的關(guān)鍵差異2.1 從 FAST 到 OpenFAST為什么這套代碼值得讀FAST 在風(fēng)電領(lǐng)域跑了二十多年NREL 后來把它按模塊重構(gòu)倉庫遷移到 GitHub 上名字改成 OpenFAST。v3.x 延續(xù)了模塊化設(shè)計(jì)主程序負(fù)責(zé)調(diào)度氣動(dòng)、結(jié)構(gòu)、水動(dòng)力、控制各自獨(dú)立成模塊模塊之間通過注冊(cè)好的輸入輸出變量交換數(shù)據(jù)。這個(gè)設(shè)計(jì)對(duì)做仿真的人非常友好你想換一套變槳控制策略只需要?jiǎng)?ServoDyn結(jié)構(gòu)模塊和氣動(dòng)模塊的代碼不用碰。源碼里最值得讀的不是算法公式本身而是模塊之間的耦合方式。氣動(dòng)載荷算完寫到哪個(gè)變量結(jié)構(gòu)模塊從哪個(gè)變量讀入再算出位移和速度反過來喂給氣動(dòng)模塊這一來一回的時(shí)序決定了整個(gè)時(shí)間步的穩(wěn)定性。我拆這套 v3.2.1 源碼時(shí)先畫了一張模塊數(shù)據(jù)流圖后面排查問題基本都靠它。2.2 模塊間的數(shù)據(jù)流一個(gè)時(shí)間步里發(fā)生了什么OpenFAST 的時(shí)間推進(jìn)邏輯集中在 src/FAST.f90 里。每個(gè)時(shí)間步大致做這幾件事先調(diào)用 AeroDyn 根據(jù)當(dāng)前風(fēng)速、槳距、轉(zhuǎn)速和葉片變形算氣動(dòng)力再把它映射到結(jié)構(gòu)網(wǎng)格上ElastoDyn 接收氣動(dòng)力后做結(jié)構(gòu)積分更新節(jié)點(diǎn)位移和速度如果是海上風(fēng)機(jī)HydroDyn 同時(shí)計(jì)算波浪載荷最后 ServoDyn 根據(jù)當(dāng)前轉(zhuǎn)速和槳距角狀態(tài)算出新的控制指令交給發(fā)電機(jī)和變槳執(zhí)行器。這套流程里最容易出問題的是氣動(dòng)模塊的時(shí)間步長(zhǎng)。氣動(dòng)力的變化比結(jié)構(gòu)響應(yīng)快得多DT 一旦設(shè)得過大BEM 迭代不收斂載荷曲線會(huì)出現(xiàn)鋸齒狀的數(shù)值振蕩。我一般先把 DT 設(shè)為 0.0125 秒跑一遍再對(duì)比 0.005 秒的結(jié)果確認(rèn)載荷差異在 1% 以內(nèi)再放大步長(zhǎng)。2.3 源碼目錄里找什么入口文件與依賴清單openfast/ ├── modules/ # 各物理模塊 │ ├── aerodyn/ # 氣動(dòng)載荷BEM 與渦尾跡方法 │ ├── elastodyn/ # 結(jié)構(gòu)動(dòng)力學(xué)葉片與塔筒 │ ├── hydrodyn/ # 波浪與水動(dòng)力 │ ├── servodyn/ # 發(fā)電機(jī)、變槳與控制器 │ └── inowind/ # 入流風(fēng)場(chǎng)生成 ├── src/ # 主程序與膠水代碼 │ ├── FAST.f90 # 主入口時(shí)間推進(jìn)循環(huán) │ └── FAST_ConfigSubs.f90 ├── reg_tests/ # 回歸測(cè)試算例 ├── docs/ # 文檔 └── CMakeLists.txt讀取源碼時(shí)先看 modules 目錄下的每個(gè)子目錄它們各自維護(hù)一套獨(dú)立的狀態(tài)變量和輸入文件。src 目錄里的 FAST.f90 是主入口整個(gè)仿真循環(huán)在這里跑。依賴方面v3.x 離不開 libxml2 和 yaml-cpp這兩個(gè)庫負(fù)責(zé)解析 fst 和 yaml 格式的輸入文件編譯前必須先裝好。2.4 為什么選 v3.2.1 而不是更早版本v3.x 相比 v2.x 最大的變化是主輸入文件格式統(tǒng)一了不再兼容老 FAST 直接生成的 fst 文件。你在網(wǎng)上找到的很多舊教程里那一套輸入格式塞給 v3.2.1 大概率會(huì)報(bào)錯(cuò)。v3.2.1 這個(gè) tag 的回歸測(cè)試和文檔都比較完整拿來學(xué)習(xí)或做工程驗(yàn)證比追最新主分支要省心。對(duì)于只做陸上風(fēng)機(jī)載荷計(jì)算的人HydroDyn 相關(guān)的代碼可以暫時(shí)不深入但不能在 CMake 里直接關(guān)掉因?yàn)檎麢C(jī)裝配時(shí)模塊列表是寫死的。3. 源碼編譯與安裝從 v3.2.1 源碼到可運(yùn)行的 openfast 命令3.1 準(zhǔn)備環(huán)境依賴、編譯器與 CMake 版本編譯 OpenFAST 需要 gfortran、CMake 和兩個(gè)基礎(chǔ)庫。以 Ubuntu/Debian 為例安裝命令如下sudo apt update sudo apt install -y build-essential gfortran cmake \ libxml2-dev libyaml-cpp-devgfortran 是 Fortran 編譯核心OpenFAST 主體代碼是 Fortran 寫的不能用 gcc 頂替。libxml2-dev 提供 XML 解析支持libyaml-cpp-dev 負(fù)責(zé) yaml 格式配置解析。CMake 版本建議不低于 3.16太老的 CMake 可能不認(rèn)項(xiàng)目里的一些 target 定義。裝完這些依賴后可以用gfortran --version和cmake --version確認(rèn)版本。3.2 拉取源碼并配置構(gòu)建我一般直接從 GitHub 拉 v3.2.1 這個(gè) tag而不是下整個(gè)倉庫所有歷史省時(shí)間也避免切錯(cuò)分支git clone --depth 1 --branch v3.2.1 \ https://github.com/OpenFAST/openfast.git cd openfast mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERELEASE \ -DOPENFAST_DOUBLE_PRECISIONON make -j4-DCMAKE_BUILD_TYPERELEASE開啟編譯器優(yōu)化仿真速度明顯比 Debug 快但編譯失敗時(shí)的報(bào)錯(cuò)信息會(huì)少一些我通常在首次編譯時(shí)先用默認(rèn) Debug跑通后再切 RELEASE。-DOPENFAST_DOUBLE_PRECISIONON強(qiáng)制雙精度浮點(diǎn)這是復(fù)現(xiàn)論文結(jié)果的關(guān)鍵默認(rèn)單精度的舍入誤差會(huì)在長(zhǎng)時(shí)仿真里被積分放大。make -j4開 4 個(gè)并行任務(wù)如果內(nèi)存只有 4GB建議改成-j2否則鏈接階段可能直接 OOM 翻車。3.3 安裝與驗(yàn)證編譯完成后安裝到系統(tǒng)目錄再驗(yàn)證版本號(hào)sudo make install openfast --version默認(rèn)安裝路徑在 /usr/local可執(zhí)行文件是 openfast。如果直接敲命令提示找不到先export PATH/usr/local/bin:$PATH再試。openfast --version輸出類似 v3.2.1 的版本信息說明主程序已經(jīng)能運(yùn)行。這一步?jīng)]做下一步直接跑算例是白費(fèi)力氣。3.4 Windows 用戶的實(shí)際路徑WSL 還是 MSYS2Windows 下原生編譯 OpenFAST 挺折騰的路徑里的反斜杠、空格以及 Fortran 編譯器環(huán)境變量都能讓人耗掉一整天。我的建議是裝 WSL里面跑 Ubuntu然后完全按上面三步走。這條路線最省心而且后續(xù)處理仿真數(shù)據(jù)的 Python 環(huán)境也能共用。如果必須原生 Windows常見做法是裝 MSYS2用 pacman 裝 gcc-fortran、cmake、libxml2、yaml-cpp再按同樣流程 cmake 和 make。但要注意 MSYS2 里庫路徑和編譯器默認(rèn)查找路徑不一樣CMake 經(jīng)常報(bào)找不到依賴得有心理準(zhǔn)備。4. 跑通第一個(gè)風(fēng)電仿真算例參數(shù)設(shè)置與輸出解讀4.1 從基準(zhǔn)風(fēng)機(jī)開始NREL 5MW 算例為什么是首選OpenFAST 自帶 reg_tests 回歸測(cè)試目錄里面有大量現(xiàn)成的算例配置。我第一次編譯完不會(huì)立刻去建自己的機(jī)型而是先找 NREL 5MW 基準(zhǔn)風(fēng)機(jī)的算例跑一遍。這個(gè)機(jī)型的數(shù)據(jù)公開了十幾年塔筒和葉片的物理參數(shù)全是公開的仿真結(jié)果能直接跟論文和設(shè)計(jì)報(bào)告對(duì)比環(huán)境有沒有問題一目了然。在 reg_tests/glue-codes/openfast 下能找到一堆 fst 主輸入文件。先列一下再?zèng)Q定跑哪個(gè)cd openfast/reg_tests/glue-codes/openfast ls *.fst openfast 選中的算例.fst算例運(yùn)行后會(huì)在當(dāng)前目錄生成對(duì)應(yīng)名字的 out 文件里面的通道就是仿真結(jié)果。第一次跑不需要糾結(jié)選哪個(gè)算例主要目的是驗(yàn)證程序能完整推進(jìn)一個(gè)仿真周期并正常落盤。4.2 讀懂 fst 文件里的關(guān)鍵參數(shù)fst 文件是 OpenFAST 的主輸入文件里面按區(qū)塊排布仿真控制、輸入輸出和模塊開關(guān)參數(shù)。以下幾個(gè)字段是每次跑算例我都會(huì)先確認(rèn)的參數(shù)作用我一般這樣給DT仿真時(shí)間步長(zhǎng)單位秒0.0125氣動(dòng)不收斂時(shí)再調(diào)小TMax仿真總時(shí)長(zhǎng)單位秒600 起步穩(wěn)態(tài)統(tǒng)計(jì)建議 1200DT_Out輸出數(shù)據(jù)采樣間隔DT 的整數(shù)倍比如 0.05TStart從哪個(gè)時(shí)刻開始輸出跳過瞬態(tài)段時(shí)設(shè)為 60 或 120OutFmt輸出數(shù)據(jù)的格式串保持默認(rèn)想提高精度改 E16.8E3DT 這個(gè)參數(shù)最敏感。步長(zhǎng)太大BEM 氣動(dòng)模塊里的迭代容易不收斂載荷序列會(huì)出現(xiàn)高頻振蕩步長(zhǎng)太小計(jì)算時(shí)間成倍上漲數(shù)據(jù)量也大。我的習(xí)慣是先跑一遍短時(shí)仿真把 DT 從 0.0125 改到 0.00625 對(duì)比結(jié)果差異小于 1% 就認(rèn)為步長(zhǎng)合適。TStart 常常被忽略實(shí)際上風(fēng)輪啟動(dòng)和控制器介入的頭幾十秒包含大量瞬態(tài)分量如果直接拿整段數(shù)據(jù)做統(tǒng)計(jì)極值和均值都偏大。4.3 輸出數(shù)據(jù)解讀先把表頭吃透OpenFAST 的 out 文件是純文本前面幾行是注釋和表頭后面是時(shí)間序列。格式問題常常讓人卡住我建議先用 head 看前十幾行head -n 12 算例.out確認(rèn)表頭在哪一行、單位在哪一行再寫 Python 腳本讀取。常見的處理方式是用 pandas 加 skiprows 跳過注釋和表頭import pandas as pd # 如果表頭前有 2 行注釋 1 行表頭 1 行單位則跳過 3 行 df pd.read_csv(算例.out, sepr\s, skiprows3) print(df.columns) print(df.head())提示skiprows 的數(shù)值一定要以 head 實(shí)際輸出為準(zhǔn)不同版本的文件頭行數(shù)可能不一樣寧可多打印幾行手?jǐn)?shù)也不要盲猜。讀進(jìn)來之后通道名以 Time、Wind1VelX、RootMxb1、RotThrust、GenPwr 這類形式出現(xiàn)分別代表時(shí)間、風(fēng)速、葉根彎矩、風(fēng)輪推力和發(fā)電機(jī)功率。我先打印 columns 確認(rèn)單位列已被跳過再進(jìn)行后續(xù)計(jì)算。4.4 第一條曲線畫功率和葉根彎矩?cái)?shù)據(jù)讀進(jìn)來后最快的驗(yàn)證方式是畫兩條曲線import matplotlib.pyplot as plt fig, ax1 plt.subplots(figsize(10, 4)) ax1.plot(df[Time], df[GenPwr], labelGenPwr, colortab:blue) ax1.set_xlabel(Time (s)) ax1.set_ylabel(GenPwr (kW)) ax2 ax1.twinx() ax2.plot(df[Time], df[RootMyb1], labelRootMyb1, colortab:red) ax2.set_ylabel(RootMyb1 (kN*m)) plt.tight_layout() plt.show()功率曲線在穩(wěn)態(tài)風(fēng)速下應(yīng)當(dāng)收斂到接近額定功率的平直線葉根彎矩曲線則是圍繞均值波動(dòng)的寬帶信號(hào)。如果這兩條曲線表現(xiàn)異常先回去檢查輸入文件里的風(fēng)速和轉(zhuǎn)速設(shè)置而不是懷疑程序裝壞了。5. 避坑排查編譯、運(yùn)行與舊輸入文件遷移常見的翻車記錄5.1 編譯時(shí)找不到 yaml-cppcmake 緩存把依賴指丟了現(xiàn)象cmake 階段報(bào) Could NOT find YAMLCPP配置直接中止。原因系統(tǒng)里其實(shí)裝了 libyaml-cpp-dev但 CMake 的 find_package 在第一次配置失敗后會(huì)把空結(jié)果寫進(jìn)緩存哪怕你后來補(bǔ)裝了庫不清理緩存它依然按舊的失敗結(jié)果走。解決先sudo apt install -y libyaml-cpp-dev然后刪除整個(gè) build 目錄重新建確保緩存從零開始。如果依然找不到用dpkg -L libyaml-cpp-dev | grep yaml-cpp-config查安裝路徑再手動(dòng)指定-Dyaml-cpp_DIR/usr/lib/cmake/yaml-cpp。5.2 運(yùn)行時(shí)提示找不到 libxml2.so.2編譯過了運(yùn)行卻失敗現(xiàn)象編譯和鏈接都成功執(zhí)行 openfast 時(shí)提示 error while loading shared libraries: libxml2.so.2。原因編譯階段靠頭文件找到開發(fā)包運(yùn)行時(shí)需要?jiǎng)討B(tài)庫參與但某些系統(tǒng)默認(rèn)沒裝運(yùn)行時(shí)庫或者裝到了 ldconfig 不掃描的目錄。解決首先sudo apt install -y libxml2補(bǔ)運(yùn)行時(shí)庫執(zhí)行l(wèi)dconfig -p | grep libxml2確認(rèn)動(dòng)態(tài)庫存在。如果庫在自定義目錄用export LD_LIBRARY_PATH/your/libdir:$LD_LIBRARY_PATH臨時(shí)指定再寫進(jìn) ~/.bashrc 避免每次配置。5.3 結(jié)果和論文對(duì)不上單精度編譯的舍入誤差被積分放大現(xiàn)象跑同樣的 NREL 5MW 算例輸出的額定功率、葉根載荷極值和公開論文對(duì)不上誤差在 2%~3%而且載荷曲線有細(xì)微毛刺。原因編譯時(shí)沒顯式開啟雙精度浮點(diǎn)運(yùn)算的舍入誤差在長(zhǎng)時(shí)間積分里積累導(dǎo)致載荷均值偏移和數(shù)值振蕩。解決重新用-DOPENFAST_DOUBLE_PRECISIONON配置編譯再跑同一算例對(duì)比。這個(gè)改動(dòng)只影響編譯選項(xiàng)不需要改輸入文件但要重新 make 并安裝。從那以后我每次拿到新機(jī)器第一件事就是確認(rèn)這個(gè)開關(guān)是 ON。5.4 風(fēng)輪啟動(dòng)段瘋狂振蕩TStart 沒把瞬態(tài)甩掉現(xiàn)象仿真前面 30 秒的功率和彎矩曲線大幅振蕩對(duì)比穩(wěn)態(tài)段完全不是一個(gè)量級(jí)整體統(tǒng)計(jì)結(jié)果偏高。原因初始條件給出的轉(zhuǎn)速、槳距角與實(shí)際風(fēng)速不匹配OpenFAST 從非平衡狀態(tài)開始積分前幾十秒其實(shí)是控制系統(tǒng)把風(fēng)輪拉回平衡點(diǎn)的時(shí)間不是真實(shí)的穩(wěn)態(tài)響應(yīng)。解決統(tǒng)計(jì)前把 TStart 設(shè)為 60 到 120 秒只對(duì)之后的輸出做均值、極值和頻譜分析。新建算例時(shí)不要圖省事設(shè) TStart 為 0除非你明確要研究啟動(dòng)瞬態(tài)過程。5.5 老版 FAST 輸入文件遷移失敗v3.x 格式不兼容現(xiàn)象把 FAST v1/v2 時(shí)代的 fst 文件直接放進(jìn) v3.2.1 運(yùn)行解析階段就報(bào)錯(cuò)有時(shí)提示某一行未知參數(shù)有時(shí)直接卡在 Echo 開關(guān)。原因v3.x 統(tǒng)一了主輸入文件的語法和參數(shù)命名舊文件里的部分行被重新定義或刪除編譯器不再接受老寫法。解決不建議手工去補(bǔ)老文件里的字段。正確做法是打開 reg_tests 里同類型機(jī)型的 fst 模板把模型相關(guān)的葉片、塔筒、機(jī)艙參數(shù)遷移進(jìn)新模板模塊開關(guān)按新版本默認(rèn)值走。遷移完成后跑一遍基準(zhǔn)算例載荷差異超過 5% 就說明遷移過程中漏掉了某個(gè)結(jié)構(gòu)參數(shù)。6. 進(jìn)階驗(yàn)證用輸出通道做葉根載荷對(duì)比驗(yàn)證仿真跑完只是開始載荷校核才是工程上真正關(guān)心的事。我通常拿 RootMyb1 通道的葉根揮舞彎矩做兩個(gè)驗(yàn)證一個(gè)是看時(shí)序極值是否落在設(shè)計(jì)報(bào)告允許范圍內(nèi)另一個(gè)是用局部極大值篩出循環(huán)峰值估算等效疲勞載荷的量級(jí)。下面這段代碼做的是第一件事把局部極大值挑出來看分布import numpy as np mom df[RootMyb1].to_numpy() t df[Time].to_numpy() # 尋找局部極大值點(diǎn)左右鄰居都比它小 peak_idx np.where( (mom[1:-1] mom[:-2]) (mom[1:-1] mom[2:]) )[0] 1 print(f峰值個(gè)數(shù): {len(peak_idx)}) print(f最大葉根揮舞彎矩: {mom[peak_idx].max():.2f} kN*m) print(f平均峰值: {mom[peak_idx].mean():.2f} kN*m)極值對(duì)應(yīng)的時(shí)刻也要打印出來方便回到 out 文件里核對(duì)當(dāng)時(shí)的槳距角和轉(zhuǎn)速狀態(tài)。如果極值出現(xiàn)在風(fēng)速大幅下降的時(shí)段很可能是動(dòng)態(tài)失速造成的載荷尖峰比額定風(fēng)速附近的極值更需要關(guān)注。工程上做疲勞評(píng)估時(shí)還要把峰值序列做雨流循環(huán)統(tǒng)計(jì)這里先用極值分布確認(rèn)載荷量級(jí)合理再?zèng)Q定是否進(jìn)入疲勞分析流程。每次仿真新機(jī)型我都會(huì)強(qiáng)制走一遍基準(zhǔn)算例對(duì)標(biāo)用 NREL 5MW 的公開參數(shù)跑同一工況先把功率曲線和葉根彎矩極值對(duì)齊確認(rèn)載荷量級(jí)和趨勢(shì)都合理才敢把后續(xù)結(jié)果拿去做塔筒和葉片校核。這個(gè)習(xí)慣幫我擋掉了好幾次因?yàn)檩斎胛募w移錯(cuò)誤而導(dǎo)致的無效載荷輸出。這套 v3.2.1 源碼包下載后第 3 章的編譯流程就能直接跑起來記得先打開雙精度開關(guān)。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取