戰(zhàn))
簡介本資源是基于擴(kuò)展有限差分時(shí)域法EC-FDTD實(shí)現(xiàn)的開源電磁場(chǎng)仿真求解器openEMS的Matlab代碼包面向電子信息工程、計(jì)算機(jī)科學(xué)與應(yīng)用數(shù)學(xué)等專業(yè)的本科生及研究生適用于課程設(shè)計(jì)、期末大作業(yè)與畢業(yè)設(shè)計(jì)中的電磁建模與仿真任務(wù)。壓縮包共349個(gè)文件含127個(gè)核心Matlab函數(shù).m、68個(gè)C引擎模塊.cpp支撐底層計(jì)算、66個(gè)頭文件.h定義接口與數(shù)據(jù)結(jié)構(gòu)以及配套文檔.rst/.txt、Python輔助腳本.py、可視化圖像.png和構(gòu)建配置文件CMake、Debian控制文件等整體僅1.9MB輕量易部署。已有110人學(xué)習(xí)下載代碼采用參數(shù)化設(shè)計(jì)關(guān)鍵變量集中可調(diào)注釋詳盡、邏輯清晰附帶可直接運(yùn)行的案例數(shù)據(jù)便于快速上手驗(yàn)證與二次開發(fā)。讀者可完整掌握EC-FDTD數(shù)值建模流程復(fù)現(xiàn)微波器件、天線輻射、NF2FF近遠(yuǎn)場(chǎng)變換等典型電磁仿真任務(wù)并基于源碼理解求解器架構(gòu)與算法實(shí)現(xiàn)細(xì)節(jié)。 直接說結(jié)論如果你在做天線、微波器件、電磁兼容相關(guān)的仿真又不想被商用軟件的授權(quán)費(fèi)卡脖子openEMS 是一個(gè)你繞不開的選項(xiàng)。它是一套開源的電磁場(chǎng)求解器Open Electromagnetic Field Solver核心求解方式是基于 EC-FDTD 的全波時(shí)域算法可以通過 Matlab 或 Octave 腳本完整驅(qū)動(dòng)建模、求解與后處理。簡單講它就是“能跑在你自己電腦上的 FDTD 電磁仿真環(huán)境”特別適合做貼片天線、濾波器、波導(dǎo)結(jié)構(gòu)、微帶電路的參數(shù)掃參和優(yōu)化迭代。這篇東西我會(huì)從算法原理講到環(huán)境配置再拿一個(gè)實(shí)際的微帶貼片天線案例走一遍完整仿真流程中間穿插我踩過的坑和排查經(jīng)驗(yàn)。適合三類人看剛接觸全波仿真、想用開源工具替代 HFSS/CST 的學(xué)生已經(jīng)在用 openEMS 但總在網(wǎng)格或端口設(shè)置上翻車的工程師以及單純想搞明白 EC-FDTD 和傳統(tǒng) FDTD 有什么區(qū)別的算法愛好者。1. openEMS 是什么EC-FDTD 方法加持的開源電磁場(chǎng)求解器1.1 一款什么樣的工具openEMS 由德國學(xué)者 Thorsten Hansen 等人開發(fā)維護(hù)本質(zhì)上是基于 FDTD時(shí)域有限差分思想發(fā)展來的全波 Maxwell 方程求解器。它把空間離散成 Yee 網(wǎng)格在時(shí)間軸上逐步推進(jìn)電場(chǎng)和磁場(chǎng)的更新一次仿真就能得到很寬頻帶內(nèi)的響應(yīng)再通過傅里葉變換提取 S 參數(shù)、遠(yuǎn)場(chǎng)方向圖、場(chǎng)分布等工程關(guān)心的結(jié)果。這一點(diǎn)和商用軟件里的 HFSS有限元或 CST時(shí)域/頻域混合走的是不同技術(shù)路線。FDTD 這類時(shí)域方法天然適合寬帶問題你用高斯脈沖激勵(lì)一次就能覆蓋比如 1GHz 到 6GHz 的連續(xù)頻段不用像頻域求解器那樣一個(gè)頻點(diǎn)一個(gè)頻點(diǎn)掃。做天線設(shè)計(jì)時(shí)這是巨大優(yōu)勢(shì)尤其是初版設(shè)計(jì)階段一個(gè)寬帶 S11 曲線能讓你快速判斷諧振點(diǎn)偏到哪里去了。openEMS 的另一個(gè)特點(diǎn)是它自帶一套基于 CSXCAD 的建模體系。你可以在 Matlab 腳本里用 AddMetal、AddMaterial、AddBox 這類命令搭幾何模型也可以裝 AppCSXCAD 圖形界面用鼠標(biāo)畫。我的習(xí)慣是腳本建模因?yàn)閹缀螀?shù)都是變量后面掃參優(yōu)化直接改數(shù)字重跑就行比 GUI 里拖拽快得多。項(xiàng)目里常見的 .rar 壓縮包里面的 Matlab 代碼文件就是這種“幾何 求解配置 后處理”的整套腳本。1.2 EC-FDTD 和傳統(tǒng) FDTD 的區(qū)別為什么這個(gè)選擇很重要傳統(tǒng) FDTD 用的是標(biāo)準(zhǔn)的蛙跳格式leapfrog scheme先更新所有電場(chǎng)分量再更新所有磁場(chǎng)分量每一步都基于上一步的結(jié)果。它實(shí)現(xiàn)簡單、內(nèi)存占用均衡但在處理色散材料、有損耗介質(zhì)或某些非線性場(chǎng)景時(shí)時(shí)間步長必須壓得比較小否則數(shù)值會(huì)發(fā)散或者出現(xiàn)明顯的數(shù)值色散誤差。openEMS 采用的 EC-FDTDEuler-Cromer FDTD則是在時(shí)間推進(jìn)格式上做了一點(diǎn)關(guān)鍵改動(dòng)它不是把電場(chǎng)和磁場(chǎng)當(dāng)成對(duì)稱的蛙跳關(guān)系而是采用 Euler-Cromer 半隱式的更新策略讓其中一個(gè)場(chǎng)量先更新然后立刻用這個(gè)新值去更新另一個(gè)場(chǎng)量。說白了就是把“相互追趕”變成“先走一步、后者跟進(jìn)”的模式。這種格式在處理色散介質(zhì)時(shí)穩(wěn)定性更好能容忍稍微大一點(diǎn)的時(shí)間步長在同樣網(wǎng)格條件下收斂性更穩(wěn)健。對(duì)你的實(shí)際好處是什么我做介質(zhì)基板天線仿真時(shí)體會(huì)最深FR4、Rogers 這類介質(zhì)都有頻變介電常數(shù)和損耗角正切傳統(tǒng) FDTD 處理這些材料要么不穩(wěn)定要么需要在每個(gè)頻點(diǎn)額外做修正。EC-FDTD 格式在色散材料的處理上天然更穩(wěn)仿真結(jié)果更不容易出現(xiàn)“網(wǎng)格加密一點(diǎn)、結(jié)果漂一大截”的糟心事。注意openEMS 的這套求解器是 C 寫的Matlab 腳本只是前端驅(qū)動(dòng)。真正跑仿真時(shí)計(jì)算核心的效率關(guān)鍵在網(wǎng)格數(shù)量和時(shí)間步長腳本本身快慢沒有那么重要。2. 環(huán)境準(zhǔn)備安裝 openEMS 并把 Matlab 接進(jìn)來2.1 獲取 openEMS版本選擇與安裝方式openEMS 的官方代碼托管在 GitHub 的 openEMS 倉庫頁面上有 release 版本可以直接下載。我建議你優(yōu)先拿 release 的預(yù)編譯包尤其是 Windows 用戶省去自己編譯的麻煩。Linux 用戶如果系統(tǒng)比較新也可以考慮自己從源碼編譯多花點(diǎn)時(shí)間但能拿到最新特性。安裝時(shí)有個(gè)容易踩坑的點(diǎn)openEMS 對(duì) Matlab 版本和 Octave 版本的兼容性不完全一樣。如果你用的是較新的 Matlab比如 R2022a 之后裝完 openEMS 之后要先跑一遍它自帶的測(cè)試腳本確認(rèn)核心庫能正常加載。網(wǎng)上很多人報(bào)“undefined function”錯(cuò)誤十有八九是 openEMS 目錄沒正確加到 Matlab 搜索路徑里。2.2 Matlab 環(huán)境配置與路徑設(shè)置openEMS 裝好后在 Matlab 里要做兩件事設(shè)置路徑和初始化環(huán)境變量。項(xiàng)目里常見的做法是寫一個(gè)init_openEMS.m腳本內(nèi)容大概是這樣% 設(shè)置 openEMS 根目錄改成你自己的安裝路徑 openEMS_dir D:/Program Files/openEMS; addpath(genpath(fullfile(openEMS_dir, matlab))); addpath(genpath(fullfile(openEMS_dir, matlab, openEMS))); addpath(genpath(fullfile(openEMS_dir, matlab, CSXCAD))); % 設(shè)置 hdf5 庫路徑部分版本需要 setenv(HDF5_DISABLE_VERSION_CHECK, 1);每次打開 Matlab 先跑一下這個(gè)腳本確認(rèn)沒有報(bào)錯(cuò)。如果提示找不到InitFDTD或AddBox這類函數(shù)就是路徑?jīng)]弄對(duì)別急著懷疑安裝包壞了。2.3 驗(yàn)證安裝跑一個(gè)最小例子環(huán)境配沒配好最快的驗(yàn)證方式是跑一個(gè)極簡單的偶極子或貼片天線案例看能不能出 S11 曲線。我自己通常會(huì)先跑 openEMS 自帶的antenna示例目錄里的某個(gè)例子跑通了再改自己的模型。這樣如果出問題能確定是自己改的代碼有問題還是環(huán)境沒配好排查范圍會(huì)小很多。實(shí)操心得Windows 上如果遇到“找不到 openEMS.exe”這類報(bào)錯(cuò)去檢查一下系統(tǒng)環(huán)境變量里有沒有把 openEMS 的 bin 目錄加進(jìn)去。openEMS 的求解核心是通過外部進(jìn)程調(diào)用的Matlab 腳本負(fù)責(zé)生成網(wǎng)格和配置文件真正算的時(shí)候是openEMS這個(gè)可執(zhí)行程序在工作。3. 核心概念解析CSXCAD 建模、網(wǎng)格、激勵(lì)與端口3.1 CSXCAD 幾何建模先把結(jié)構(gòu)畫對(duì)openEMS 的建模 API 風(fēng)格和 CST 的 VBA 腳本有點(diǎn)像都是用命令創(chuàng)建幾何體。常用的幾個(gè)AddMetal(CSX, name)定義金屬材料AddMaterial(CSX, name)定義介質(zhì)材料可設(shè) Epsilon、Mue、KappaAddBox(CSX, material, priority, start, stop)添加長方體AddCylinder(CSX, material, priority, start, stop, radius)添加圓柱體AddPolygon拉伸多邊形適合做不規(guī)則貼片形狀A(yù)ddPort設(shè)置集總端口這里有個(gè)關(guān)鍵概念叫 priority優(yōu)先級(jí)。openEMS 里不同材料重疊時(shí)優(yōu)先級(jí)高的材料占據(jù)重疊區(qū)域。比如微帶天線的金屬貼片壓在介質(zhì)基板上貼片的 priority 就要比基板高否則金屬會(huì)被介質(zhì)蓋住結(jié)果完全不對(duì)。這是我第一次用 openEMS 時(shí)栽過跟頭的地方調(diào)了半天諧振頻率不對(duì)最后發(fā)現(xiàn)是 priority 設(shè)反了。另外坐標(biāo)軸方向也要提前想清楚。常用的做法是把基板放在 XY 平面Z 方向是厚度方向貼片在 Z0 面地平面在 Z-h 面。這樣后期觀察場(chǎng)分布時(shí)視圖方向和結(jié)果理解都直觀。3.2 網(wǎng)格設(shè)置與穩(wěn)定性FDTD 的 CFL 條件FDTD 方法的時(shí)間步長和空間網(wǎng)格必須滿足 CFL 條件否則數(shù)值解直接發(fā)散。對(duì)三維情況穩(wěn)定條件是Δt ≤ 1 / (c * sqrt(1/Δx2 1/Δy2 1/Δz2))其中 c 是介質(zhì)中的光速。openEMS 會(huì)自動(dòng)根據(jù)網(wǎng)格尺寸計(jì)算時(shí)間步長所以你主要關(guān)心的是網(wǎng)格怎么劃分不用手動(dòng)去調(diào) Δt但最好理解這個(gè)關(guān)系。網(wǎng)格設(shè)置的關(guān)鍵在于結(jié)構(gòu)邊緣至少要有 10 到 20 個(gè)網(wǎng)格單元跨越才能保證幾何結(jié)構(gòu)被比較好地離散化。比如厚度 1.6mm 的 FR4 基板Z 方向網(wǎng)格不能給 2mm 一個(gè)網(wǎng)格那樣整個(gè)基板只有不到一個(gè)網(wǎng)格的高度介電常數(shù)加載位置都會(huì)出問題。openEMS 的DefineRectGrid函數(shù)允許你設(shè)置漸變網(wǎng)格在貼片邊緣、饋電點(diǎn)附近加密其他區(qū)域拉稀。我的習(xí)慣是先跑一個(gè)稀疏網(wǎng)格版本看趨勢(shì)確認(rèn)諧振頻率大概在哪再加密網(wǎng)格驗(yàn)證精度這樣能在精度和計(jì)算時(shí)間之間找到平衡。3.3 激勵(lì)源與端口S 參數(shù)怎么來的openEMS 里最常用的激勵(lì)方式是高斯脈沖。設(shè)置激勵(lì)頻率范圍和幅值后求解器會(huì)從端口注入一個(gè)寬帶脈沖然后在時(shí)域記錄端口電壓和電流通過傅里葉變換得到頻域 S 參數(shù)。核心代碼FDTD InitFDTD(endCriteria, 1e-5); FDTD SetGaussExcite(FDTD, 0.5*f_start, f_band);這里的endCriteria是時(shí)域迭代終止條件表示能量衰減到初始值的 1e-5 時(shí)停止計(jì)算。如果設(shè)得太寬松結(jié)果還沒收斂就停了S11 曲線會(huì)很毛糙設(shè)得太嚴(yán)格計(jì)算時(shí)間翻好幾倍。我一般先用 1e-4 做初步掃參最終驗(yàn)證時(shí)再收緊到 1e-5。端口方面微帶天線最常用的是集總端口lumped port。你要在端口位置定義一段傳輸線結(jié)構(gòu)并把端口設(shè)置在正確的位置和方向上。這個(gè)比較考驗(yàn)對(duì)結(jié)構(gòu)細(xì)節(jié)的理解端口必須放在激勵(lì)電流實(shí)際流過的路徑上方向要和電流方向一致否則 S11 曲線會(huì)莫名多出一些奇怪的諧振峰。4. 實(shí)操案例微帶貼片天線的完整仿真流程4.1 天線結(jié)構(gòu)與設(shè)計(jì)參數(shù)這里我以 2.45GHz 矩形微帶貼片天線為例這個(gè)頻段是 WiFi 和藍(lán)牙的工作頻段大家可能更熟悉。設(shè)計(jì)參數(shù)如下工作頻率2.45GHz基板材料FR4相對(duì)介電常數(shù) 4.4損耗角正切 0.02基板厚度1.6mm饋電方式微帶線側(cè)饋也可以做同軸探針饋電這里用微帶線饋電展示完整建模流程矩形貼片的初始尺寸可以用經(jīng)典公式估算。先算貼片寬度 WW c/(2*f0) * sqrt(2/(εr1))然后算有效介電常數(shù) εeff 和等效延伸長度 ΔL最后得到貼片長度 Lεeff (εr1)/2 (εr-1)/2 * (112h/W)^(-0.5) ΔL 0.412h * (εeff0.3)(W/h0.264) / (εeff-0.258)(W/h0.8) L c/(2*f0*sqrt(εeff)) - 2ΔL代入數(shù)值算一下W 約 37.3mmL 約 29.2mm。這個(gè)值是初始尺寸實(shí)際在 openEMS 里仿真后會(huì)發(fā)現(xiàn)諧振頻率有偏移需要調(diào) L 長度來校準(zhǔn)頻率。4.2 建模代碼逐段解讀下面是完整的 openEMS Matlab 建模腳本核心部分可直接運(yùn)行% 物理常量與單位 c0 2.99792458e8; mu0 4*pi*1e-7; eps0 1/(c0^2*mu0); % 天線設(shè)計(jì)參數(shù) f0 2.45e9; % 中心頻率 lambda0 c0/f0; % 自由空間波長 h 1.6e-3; % 基板厚度 er 4.4; % 基板介電常數(shù) % 矩形貼片尺寸上述公式計(jì)算 W c0/(2*f0)*sqrt(2/(er1)); eps_eff (er1)/2 (er-1)/2*(112*h/W)^(-0.5); deltaL 0.412*h*((eps_eff0.3)*(W/h0.264))/((eps_eff-0.258)*(W/h0.8)); L c0/(2*f0*sqrt(eps_eff)) - 2*deltaL; % 微帶饋線寬度50歐姆阻抗近似計(jì)算 W_feed 3.0e-3; % 先取約 3mm后續(xù)可通過仿真微調(diào) feed_len 8e-3; % 饋線長度 % 網(wǎng)格設(shè)置 grid [2*h 2*h h/4]; % 初始網(wǎng)格XY 方向粗Z 方向細(xì)分 mesh DefineRectGrid(grid); % 初始化 FDTD FDTD InitFDTD(endCriteria, 1e-5); FDTD SetGaussExcite(FDTD, 0.4*f0, 0.8*f0); % 激勵(lì)頻帶覆蓋 0.4f0~1.2f0 % 邊界條件MUR 吸收邊界或 PML BC {MUR, MUR, MUR, MUR, MUR, MUR}; FDTD SetBoundaryCond(FDTD, BC); % 創(chuàng)建材料 CSX InitCSX(); CSX AddMetal(CSX, GND); % 地平面 CSX AddMetal(CSX, Patch); % 貼片 CSX AddMaterial(CSX, FR4); % 介質(zhì)基板 CSX SetMaterialProperty(CSX, FR4, Epsilon, er, Kappa, 2*pi*f0*eps0*0.02); % 幾何建模 % 基板 CSX AddBox(CSX, FR4, 0, [-W/2-1e-3, -L/2-feed_len-1e-3, -h], [W/21e-3, L/21e-3, 0]); % 地平面比基板略大 CSX AddBox(CSX, GND, 1, [-W/2-2e-3, -L/2-feed_len-2e-3, -h], [W/22e-3, L/2feed_len2e-3, -h-0.01e-3]); % 貼片 CSX AddBox(CSX, Patch, 2, [-W/2, -L/2, 0], [W/2, L/2, 0.01e-3]); % 微帶饋線 CSX AddBox(CSX, Patch, 2, [-W_feed/2, -L/2, 0], [W_feed/2, -L/2-feed_len, 0.01e-3]); % 端口設(shè)置 port AddPort(CSX, 3, port1, 1, x, [-W_feed/2, -L/2-feed_len, -0.5e-3], [W_feed/2, -L/2-feed_len, 0], [0 0 1], lumped, 50);這段代碼里幾個(gè)值得注意的地方AddBox的第 5 個(gè)參數(shù)是 priority基板為 0地平面為 1貼片為 2。這樣貼片才能疊在基板表面地平面在基板下面不會(huì)互相覆蓋錯(cuò)誤。Kappa參數(shù)定義了介質(zhì)損耗。FR4 的損耗角正切約 0.02根據(jù)公式 Kappa ε0εr2πftanδ 可以近似算出。這里我取了中心頻率值來算嚴(yán)格做法是設(shè)置色散模型但工程上近似夠用。端口用AddPort定義饋電點(diǎn)位于微帶線末端和地平面之間方向沿 Z 軸。這是微帶結(jié)構(gòu)集總端口的典型接法。4.3 網(wǎng)格細(xì)化和監(jiān)控點(diǎn)設(shè)置上面的網(wǎng)格[2*h 2*h h/4]其實(shí)非常粗只能用來驗(yàn)證流程能不能跑通。我實(shí)際做仿真時(shí)會(huì)在貼片邊緣、饋電點(diǎn)附近用SmoothMesh或局部加密的方式把網(wǎng)格加到足夠細(xì)。FDTD 仿真里網(wǎng)格數(shù)為 N 時(shí)內(nèi)存消耗大約正比于 N計(jì)算時(shí)間正比于 N 的 4/3 次方左右。所以網(wǎng)格加密 2 倍計(jì)算時(shí)間大約會(huì)增加 2 到 3 倍這在仿真中是最大的開銷來源。為了避免網(wǎng)格數(shù)量失控我在 openEMS 里采用分級(jí)網(wǎng)格策略貼片區(qū)域用 1mm 網(wǎng)格饋電區(qū)域用 0.5mm 網(wǎng)格基板厚度方向用 0.2mm 網(wǎng)格外圍空氣區(qū)域用 2mm 網(wǎng)格。這樣既能保證關(guān)鍵區(qū)域精度又不至于網(wǎng)格數(shù)量爆炸。另外我建議在結(jié)構(gòu)周圍設(shè)置至少 3 到 5 層的吸收邊界網(wǎng)格。如果邊界距離天線太近吸收邊界會(huì)影響天線阻抗和輻射特性仿真結(jié)果會(huì)明顯偏離真實(shí)值。4.4 運(yùn)行仿真并提取 S11 與方向圖建模完成后調(diào)用求解器和后處理% 運(yùn)行求解 Sim_Path ./sim_result; Sim_CSX patch_antenna.xml; RunOpenEMS(FDTD, CSX, Sim_CSX, Sim_Path); % 后處理提取 S 參數(shù) freq linspace(2.0e9, 3.0e9, 501); S11 extractS(patch_antenna, Sim_Path, freq, 1, S11); % 畫 S11 曲線 figure; plot(freq/1e9, 20*log10(abs(S11)), LineWidth, 2); grid on; xlabel(Frequency (GHz)); ylabel(S11 (dB)); title(Rectangular Patch Antenna S11);跑完之后看 S11 曲線找到最低點(diǎn)對(duì)應(yīng)頻率。如果最低點(diǎn)沒落在 2.45GHz就需要調(diào)整貼片長度 L 來校準(zhǔn)諧振頻率。我通常會(huì)在腳本里寫一個(gè)循環(huán)自動(dòng)掃描 L 從 28mm 到 31mm 的幾個(gè)值然后選最接近目標(biāo)頻率的那組參數(shù)。遠(yuǎn)場(chǎng)方向圖提取稍微復(fù)雜一點(diǎn)需要在SetDump里打開遠(yuǎn)場(chǎng)輸出然后通過CalcNF2FF函數(shù)計(jì)算% 設(shè)置遠(yuǎn)場(chǎng)輸出 CSX SetDump(CSX, farfield, HTD, 5, Box, [-W/2-10e-3, -L/2-10e-3, -h-10e-3], ... [W/210e-3, L/210e-3, 10e-3], [0 0 1]); % 計(jì)算遠(yuǎn)場(chǎng) nf2ff CalcNF2FF(Sim_Path, patch_antenna, 2.45e9, [0, 90], [-180, 180, 2]); figure; plot(nf2ff.theta*180/pi, nf2ff.E_norm_dB, LineWidth, 2); grid on; xlabel(Theta (deg)); ylabel(Normalized Gain (dB));4.5 結(jié)果分析與優(yōu)化思路從仿真結(jié)果看一個(gè)典型的矩形貼片天線 S11 曲線會(huì)在諧振頻率點(diǎn)出現(xiàn)明顯凹陷通常能達(dá)到 -15dB 以下。如果凹陷不夠深可能是阻抗匹配不夠好可以調(diào)饋線位置也就是饋點(diǎn)沿 L 方向的位置來改善。這里說一下調(diào)饋點(diǎn)位置的原理矩形貼片沿 L 方向的電場(chǎng)分布是余弦函數(shù)邊緣處電場(chǎng)最強(qiáng)、阻抗最高中心處電場(chǎng)為零、阻抗為零。所以饋點(diǎn)從邊緣向中心移動(dòng)時(shí)輸入阻抗單調(diào)下降。通過仿真找阻抗匹配點(diǎn)就是移動(dòng)饋點(diǎn)位置找到 S11 曲線達(dá)到最深的那個(gè)點(diǎn)。這個(gè)方法在微帶天線設(shè)計(jì)中非?;A(chǔ)但極其實(shí)用。如果你想要圓極化或者雙頻工作可以在貼片上切角、開槽這些結(jié)構(gòu)在 openEMS 里都可以通過AddPolygon或布爾運(yùn)算實(shí)現(xiàn)。不過那是進(jìn)階玩法了先把基礎(chǔ)的線極化貼片跑通再往深了做。5. 進(jìn)階技巧與經(jīng)驗(yàn)讓 openEMS 更像生產(chǎn)工具5.1 加快仿真速度的幾個(gè)實(shí)用操作第一個(gè)技巧是用并行計(jì)算。openEMS 支持 OpenMP 多線程和 MPI 并行你在InitFDTD之前設(shè)置并行參數(shù)然后調(diào)用求解器時(shí)會(huì)自動(dòng)啟用多核。不過我實(shí)測(cè)下來在普通 PC 上把線程數(shù)設(shè)成和物理核心數(shù)相同效果最好設(shè)太多反而會(huì)因?yàn)榫€程切換開銷下降效率。第二個(gè)技巧是合理設(shè)置endCriteria。很多人在初版調(diào)試時(shí)就把收斂條件設(shè)得很嚴(yán)格結(jié)果每個(gè)參數(shù)都要等很久。我的習(xí)慣是大范圍掃參用 1e-3找到大致趨勢(shì)后縮小范圍最后精確仿真用 1e-5 到 1e-6。這樣總耗時(shí)通常能減少一半以上。第三個(gè)技巧是盡量減小空氣盒子的體積。吸收邊界離結(jié)構(gòu)太遠(yuǎn)雖然更安全但也意味著更多無用網(wǎng)格。實(shí)際操作中我一般把吸收邊界設(shè)在距結(jié)構(gòu)最外沿約 0.2 到 0.3 個(gè)波長處這樣可以兼顧精度和速度。第四個(gè)技巧是利用對(duì)稱性。如果天線結(jié)構(gòu)關(guān)于某個(gè)平面完全對(duì)稱幾何、材料、激勵(lì)都對(duì)稱可以只仿真一半設(shè)置對(duì)稱邊界條件。對(duì)于矩形貼片天線如果饋電方式也對(duì)稱仿真規(guī)模直接減半計(jì)算時(shí)間大約減少 40% 到 50%。不過要注意對(duì)稱邊界和激勵(lì)方向?qū)?yīng)關(guān)系很容易搞錯(cuò)要仔細(xì)對(duì)照文檔。5.2 與 HFSS 等商用工具的差異對(duì)比用慣了 HFSS 或 CST 的朋友接觸 openEMS 會(huì)有一些體驗(yàn)落差這是正常的。我整理了一個(gè)對(duì)比表對(duì)比維度openEMSHFSS/CST授權(quán)費(fèi)用免費(fèi)開源高昂年費(fèi)求解方法EC-FDTD 時(shí)域HFSS 有限元 / CST 時(shí)域頻域混合建模方式Matlab 腳本 / AppCSXCAD GUI成熟 GUI交互式建模網(wǎng)格處理手動(dòng)設(shè)置為主自動(dòng)網(wǎng)格劃分寬帶掃頻一次仿真得到寬頻段頻域需逐點(diǎn)掃時(shí)域也快材料模型支持色散介質(zhì)材料庫豐富后處理Matlab 腳本自定義內(nèi)置豐富后處理學(xué)習(xí)曲線較陡需寫代碼相對(duì)平緩優(yōu)化功能需自寫掃參腳本內(nèi)置參數(shù)優(yōu)化器我的個(gè)人建議是如果你做的是比較常規(guī)的天線或微波結(jié)構(gòu)而且預(yù)算允許HFSS/CST 的體驗(yàn)確實(shí)省心。但如果你要做的仿真數(shù)量很大比如課程設(shè)計(jì)、科研前期探索、小公司研發(fā)openEMS 這套免費(fèi)方案在成本上的優(yōu)勢(shì)是碾壓級(jí)的。而且腳本化建模的好處是參數(shù)可追溯、可復(fù)用比 GUI 操作更容易形成自己的仿真庫。5.3 腳本化仿真的工程價(jià)值既然說到仿真庫這點(diǎn)值得展開講講。用 openEMS 做事情最舒服的是所有設(shè)計(jì)都變成了可復(fù)現(xiàn)的代碼。我今天設(shè)計(jì)了一個(gè) 2.45GHz 貼片天線腳本存下來明天要改成 5.8GHz只需要改目標(biāo)頻率重新算一遍尺寸參數(shù)跑仿真完事。整個(gè)流程不需要重新建模改幾個(gè)數(shù)字就夠了。這種腳本化能力在做參數(shù)掃描時(shí)尤其值錢。我之前做一個(gè)雙頻天線項(xiàng)目需要在貼片上開 U 型槽槽的位置、寬度、深度都影響兩個(gè)諧振頻率。我寫了一個(gè)三層循環(huán)的掃參腳本連續(xù)跑了兩天把整個(gè)參數(shù)空間的 S11 數(shù)據(jù)全部拿到手然后直接畫出等高線圖定位最優(yōu)參數(shù)。這種工作如果放在 GUI 里手動(dòng)操作人力成本是不可想象的。6. 常見問題與排查技巧實(shí)錄6.1 安裝與報(bào)錯(cuò)類問題問題 1Matlab 提示找不到 InitFDTD 函數(shù)這是最典型的問題。原因幾乎都是 openEMS 的 matlab 路徑?jīng)]加全。openEMS 的 Matlab 接口分布在matlab、matlab/openEMS、matlab/CSXCAD等子目錄用addpath(genpath(...))一次性遞歸添加是最省事的。問題 2openEMS 求解器沒有輸出檢查一下系統(tǒng)環(huán)境變量里是否有 openEMS 的 bin 目錄以及RunOpenEMS中指定的輸出路徑是否有寫權(quán)限。如果路徑里有中文或空格也可能導(dǎo)致程序啟動(dòng)失敗建議所有路徑都用英文。問題 3新版 Matlab 下報(bào) HDF5 錯(cuò)誤這個(gè)大多和 HDF5 庫版本沖突有關(guān)我在環(huán)境變量里設(shè)置了HDF5_DISABLE_VERSION_CHECK1之后基本就解決了。6.2 仿真數(shù)值異常類問題問題 4S11 曲線高頻段嚴(yán)重“抖動(dòng)”高頻段出現(xiàn)鋸齒狀噪聲通常說明網(wǎng)格太粗或者時(shí)間步長設(shè)置過大。FDTD 方法在高頻段對(duì)網(wǎng)格尺寸很敏感網(wǎng)格尺寸一般要小于最高頻率對(duì)應(yīng)波長的 1/10。我遇到這種情況時(shí)會(huì)先檢查網(wǎng)格設(shè)置把中心頻率對(duì)應(yīng)的波長和網(wǎng)格尺寸比一下網(wǎng)格要至少 10 個(gè)點(diǎn)覆蓋一個(gè)波長。問題 5諧振頻率嚴(yán)重偏移設(shè)計(jì)值如果仿真出來的諧振頻率和理論計(jì)算差得很遠(yuǎn)先檢查材料參數(shù)是不是正確設(shè)置尤其是介電常數(shù)。FR4 的介電常數(shù)在 4.2 到 4.8 之間浮動(dòng)很常見和具體板材、頻率都有關(guān)系。另一個(gè)常見原因是端口和饋電位置不對(duì)導(dǎo)致天線沒有被有效激勵(lì)。問題 6S11 曲線看起來完全“沒有諧振”這個(gè)通常是網(wǎng)格太粗糙或者吸收邊界太近導(dǎo)致的。我一開始用稀疏網(wǎng)格仿真時(shí)貼片天線 S11 曲線就是一條平平的線完全沒有諧振峰。后來把網(wǎng)格加密到每個(gè)波長 15 個(gè)點(diǎn)以上諧振才顯現(xiàn)出來。經(jīng)驗(yàn)是如果結(jié)構(gòu)關(guān)鍵區(qū)域網(wǎng)格數(shù)不夠幾何結(jié)構(gòu)實(shí)際上已經(jīng)變形了仿真出來的東西跟設(shè)計(jì)對(duì)象根本不是同一個(gè)東西。6.3 參數(shù)速查表調(diào)試和寫報(bào)告時(shí)我常參考這個(gè)表檢查項(xiàng)推薦值/原則最高頻率網(wǎng)格密度至少 10 網(wǎng)格/波長建議 15-20基板厚度方向網(wǎng)格至少 3-5 層吸收邊界距離0.2-0.3 倍波長PML或 0.5 倍波長MURendCriteria 初跑1e-3 到 1e-4endCriteria 精跑1e-5 到 1e-6端口阻抗50 歐姆常規(guī)激勵(lì)脈沖頻帶目標(biāo)頻段寬度的 1.5-2 倍材料 priority金屬貼片 地平面 介質(zhì)基板最后分享一個(gè)小技巧。如果你在調(diào)模型時(shí)總感覺哪里不對(duì)不要急于改代碼。先在 AppCSXCAD 里打開模型看一眼幾何結(jié)構(gòu)對(duì)不對(duì)這個(gè)可視化的成本很低能幫你迅速發(fā)現(xiàn)坐標(biāo)寫反、尺寸少個(gè)毫米這類低級(jí)錯(cuò)誤。我在項(xiàng)目早期因?yàn)樽鴺?biāo)正負(fù)號(hào)寫錯(cuò)白跑了好幾次仿真后來養(yǎng)成了“建模必可視化檢查”的習(xí)慣省下的時(shí)間遠(yuǎn)超打開 GUI 的那幾秒鐘。本文還有配套的精品資源點(diǎn)擊獲取