40_仿真验证 04 —— 电磁场仿真:Gmsh + GetDP 磁静场入门
本篇回答的问题:变压器和电感的手算(磁芯选型/匝数/气隙)到底准不准?有限元电磁仿真能不能验证手算?用开源工具(Gmsh 网格 + GetDP 求解器)怎么搭建一个能跑的磁静场仿真?
实测声明:GetDP 3.5.0 + Gmsh 4.13.1(Debian 13 仓库安装),已在本地实际运行官方永磁体示例并成功提取 B 场数据(501 行输出)。电感/变压器的定制模型代码见 §4——流程已验证,算例数据标注为「框架已通、比对待运行」。 补测声明(2026-10-03):Windows 本机已用 FEMM 4.2(工具矩阵备选)完成同参数轴对称磁静场交叉验证,比对结果见 §7;本篇 GetDP 算例文件已补齐备跑(§4 →
sim/04_magnetic_fea/ei_planar_getdp/),Linux 侧待跑。与库内的关系:手算流程见 02_反激变压器设计(AP 法→匝数→气隙→B 值);GetDP 求解的电感模型可比对该篇的 B_gap≈0.22 T、Lp=180 µH;仿真在流程中的门禁见 04_设计开发流程。
本篇总结
- Gmsh + GetDP 是开源电磁仿真的标准组合(Debian 仓库直接安装,无 wine):Gmsh 4.13 建几何与网格,GetDP 3.5 解磁静场/谐波磁/涡流——学术与工业界变压器/电机仿真的基石工具链。
- 流程已验证:GetDP 自带永磁体示例(
/usr/share/doc/getdp/examples/)实际运行通过——Gmsh 网格 → GetDP 磁静场求解 → B 场 501 点输出,完整流程 <1 s。 - 电感/变压器仿真的核心思路:2D 轴对称或平面截面 → 定义铁芯(高 µr)/气隙(µr=1)/线圈(电流密度 J)→ 解磁矢位 A → 从磁能 W=½LI² 提取电感 → 比对手算。
- 65W 反激变压器的比对目标(出自 02_反激变压器设计 §9):Np=25、气隙 0.46mm、Lp=180 µH、B_gap≈0.22 T——FEA 的 B 场分布和电感值应与手算在 ±5% 以内(2D 近似误差 + 边界效应)。
- FreeCAD 1.1.3 AppImage 可作为建模前端(本机已装),但 2D 轴对称磁仿真的最短路径是 Gmsh 直接建几何(脚本化程度更高)。
1. 工具链安装
# Debian 13 直接安装
sudo apt-get install gmsh getdp
# 验证
gmsh --version # 4.13.1
getdp --version # 3.5.0
FreeCAD 1.1.3 AppImage(建模可视化,可选):
chmod +x ~/Appimage/FreeCAD_1.1.3-Linux-x86_64-py311.AppImage
# headless 测试
~/Appimage/FreeCAD_1.1.3-...AppImage --appimage-extract-and-run -c "import FreeCAD; print(FreeCAD.Version())"
注意:FreeCAD 的 FEM 工作台的磁静场求解器是 Elmer(非 GetDP)——Elmer 不在 Debian 仓库中,如需 FreeCAD FEM 内建磁仿真须另装 Elmer。本篇用 Gmsh+GetDP 组合,因为更脚本化且 Debian 原生支持。
2. GetDP 磁静场框架(已验证可运行)
2.1 流程
magnet.geo(几何定义)→ gmsh -2 → magnet.msh(网格)
magnet.pro(物理定义)→ getdp magnet -solve Magnetostatics_a -pos a → b_a.txt(B 场数据)
2.2 自带示例实际运行(永磁体)
| 步骤 | 命令 | 耗时 | 产出 |
|---|---|---|---|
| 网格 | gmsh magnet.geo -2 -o magnet.msh |
<0.1 s | 网格文件 |
| 求解 | getdp magnet -solve Magnetostatics_a -pos a |
<0.2 s | b_a.txt(501 行 B 场) |
示例输出:永磁体在气隙中产生 B_max ≈ 0.119 T(本机实际运行提取)——量级合理(永磁体典型 0.1~0.5 T)。
2.3 框架文件
| 文件 | 内容 |
|---|---|
Lib_Magnetostatics_a_phi.pro |
GetDP 官方磁静场求解模板(矢量位 A 或标量位 φ) |
Lib_Materials.pro |
材料库(µr、B-H 曲线) |
magnet.geo |
几何定义示例(C 型铁芯+永磁体+气隙+空气) |
magnet.pro |
物理定义示例(Group/Function/Constraint/Formulation/PostOperation) |
位置:/usr/share/doc/getdp/examples/(Debian 安装自带)。
3. 磁静场公式的物理含义
3.1 磁矢位 A
磁静场的核心是解磁矢位 A 的偏微分方程:
$$\nabla \times \left( \frac{1}{\mu} \nabla \times \vec{A} \right) = \vec{J}$$
- A 是磁矢位(Wb/m),B = ∇×A
- J 是电流密度(A/m²)——线圈区域的源
- µ 是磁导率——铁芯(µr>>1)和空气(µr=1)不同
GetDP 的 Magnetostatics_a 公式就是这方程的有限元离散。
3.2 从磁能提取电感
仿真解出 B 场后,磁能:
$$W = \int \frac{B^2}{2\mu} \, dV$$
电感从能量反推(单匝等效→乘 N²):
$$L = \frac{2W}{I^2}$$
这是 FEA 电感提取的标准方法——不需要知道匝数的精确分布,只要电流区域的总安匝数对就行。
3.3 2D 轴对称 vs 2D 平面
| 类型 | 适用 | 变换 |
|---|---|---|
| 2D 轴对称 | 圆柱磁芯(PQ/RM/ETD) | 绕 z 轴旋转,截面在 r-z 平面 |
| 2D 平面 | E-I 磁芯(切面均匀) | 假设深度 d=1m,结果乘实际深度 |
反激变压器(PQ26 磁芯)用 2D 轴对称——中柱、气隙、绕组窗口都绕中心轴旋转对称。
4. 电感模型的 Gmsh + GetDP 代码框架
以下代码为框架(几何尺寸需按实际磁芯 datasheet 填写):
4.1 Gmsh 几何(inductor.geo)
// 2D 轴对称电感:C 型铁芯截面 + 气隙 + 线圈 + 空气
// 参数(从库内 65W 反激变压器设计 §9 取值)
lc = 0.3e-3; // 网格尺寸
rc = 6.5e-3; // 中柱半径
gap = 0.23e-3; // 半气隙(总 0.46mm)
hc = 7e-3; // 单边铁芯高
rw = 4.5e-3; // 绕组窗口宽
ro = 7.5e-3; // 外臂宽
r_out = 25e-3; // 空气边界
// (几何定义:用矩形拼出 E-I 铁芯半剖 + 线圈 + 空气)
// 中柱下半 (r: 0→rc, z: 0→hc)
// 气隙 (r: 0→rc, z: hc→hc+gap)
// 中柱上半 (r: 0→rc, z: hc+gap→2hc+gap)
// 线圈窗口 (r: rc→rc+rw, z: 0→2hc+gap) ← 电流密度 J 在此
// 外臂 (r: rc+rw→rc+rw+ro, z: 0→2hc+gap)
// 底部轭、顶部轭
// 空气边界
// Physical Regions for GetDP
// Physical Volume("Core") = {中柱上, 中柱下, 外臂, 底轭, 顶轭};
// Physical Volume("AirGap") = {气隙};
// Physical Volume("Coil") = {线圈窗口};
// Physical Volume("Air") = {空气};
4.2 GetDP 物理定义(inductor.pro 关键段)
// 基于 Lib_Magnetostatics_a_phi.pro 模板
// 核心:把 Magnet 区域换成 Coil 区域(电流源)
Group {
Core = Region[{CORE_ID}];
AirGap = Region[{GAP_ID}];
Coil = Region[{COIL_ID}];
Air = Region[{AIR_ID}];
Vol_Mag = Region[{Core, AirGap, Coil, Air}];
}
Function {
nu[Coil] = 1/mu0; // 线圈区域 µr=1(铜)
// 电流密度:J = N*I / A_coil(z 方向)
// N=25, I=3.44A, A_coil=窗口截面积
Jz[Coil] = 25 * 3.44 / (rw * wh); // A/m²
}
// 求解后提取:
// 1. B 场分布(气隙处应 ≈ 0.22 T)
// 2. 磁能 W → L = 2W/I²(应 ≈ 180 µH)
4.3 比对目标
| 量 | 手算(反激变压器设计 §9) | FEA 期望 |
|---|---|---|
| 气隙 B 场 | B ≈ 0.22 T | ±5%(2D 边缘效应) |
| 初级电感 Lp | 180 µH | ±5%(能量法提取) |
| 铁芯 B_max | 0.22 T(限流 0.25 T) | 应 < 0.25 T |
| 窗口漏感 | — | FEA 可提取(手算近似) |
2026-10-03 更新:本表比对已由 Windows 本机 FEMM 4.2 交叉验证先行完成(GetDP 文件备跑中)——实测偏差远大于 ±5%(L +26%),归因为边缘磁通,详见 §7。
5. 操作纪律
- 2D 近似的局限:2D 平面假设深度均匀(实际 3D 端部效应漏掉);2D 轴对称假设完全旋转对称(实际 PQ 磁芯有方形圆角)。2D 结果比手算准、比 3D FEA 粗。
- 网格密度:气隙处网格必须细(B 梯度大);铁芯/空气边界需要至少 3~5 层过渡网格。
- 边界条件:空气边界距器件 ≥5 倍磁芯尺寸(或用无限元);Dirichlet A=0 在外边界。
- 非线性 B-H:铁氧体 µr 随 B 变化(B>0.2T 时 µr 下降)——初始仿真用常数 µr,验证 B 后如接近饱和再引入 B-H 曲线。
- 比对纪律:FEA 结果必须先跟手算比对(差 <5% 才可信),再用于优化迭代。FEA 不替代手算,它验证手算。
6. 精炼速查
6.1 工具链
| 工具 | 版本 | 安装 | 用途 |
|---|---|---|---|
| Gmsh | 4.13.1 | apt install gmsh |
几何 + 网格 |
| GetDP | 3.5.0 | apt install getdp |
磁静场/谐波/涡流求解 |
| FreeCAD | 1.1.3 | AppImage | 3D 建模可视化(可选) |
6.2 流程卡
1. Gmsh .geo 定义几何 + Physical Region
2. gmsh -2 xxx.geo → xxx.msh
3. GetDP .pro 定义材料/源/公式
4. getdp xxx -solve Magnetostatics_a -pos a
5. 提取 B 场 → 与手算核对
6. 提取磁能 → L = 2W/I²
6.3 陷阱清单
- Elmer 不在 Debian 仓库——FreeCAD FEM 磁仿真需另装 Elmer(或用 GetDP 替代);
- GetDP 模板路径问题——
Include "../templates/xxx.pro"须改为相对当前目录; - 2D 平面假设深度 1m——结果须乘实际深度才是真实电感;
- 气隙网格不够细 → B 场不准(气隙边缘 B 集中效应漏掉);
- FEA 电感 ≠ 手算电感的根本原因:手算忽略边缘磁通和漏感——FEA 比手算准,但设计裕量要覆盖两者的差。
7. 补测(2026-10-03):FEMM 本机交叉验证 + GetDP 文件备跑
实测声明:2026-10-03 于 Windows 本机(Windows 10.0.26200;FEMM 4.2 x64 便携版,2015-11-01 构建;COM 自动化驱动)。模型:轴对称 PQ26 级带气隙电感,N=25 匝、I=3.44 A(反激变压器设计 §9 口径),rc=6.0mm(Ae≈113mm²)、lg=0.46mm、µr=2000 线性(铁氧体量级假设)。原始日志存 sim/04_magnetic_fea/femm/femm_run_log.txt(含 .fem 模型与驱动脚本)。 为什么是 FEMM:本机网络装不上 Gmsh/GetDP(源不可达),FEMM 是01_工具总览工具矩阵内的备选磁件工具,先在本机把比对做实;正式 GetDP 比对仍按本篇 §4 流程在 Linux 侧运行,文件已备(sim/04_magnetic_fea/ei_planar_getdp/,含完整 .geo/.pro 与复现命令,状态「文件已备、Linux 待运行」)。
7.1 比对结果
| 量 | 手算(§9 / 一维磁路) | FEMM 本机实测 | 偏差 | 归因 |
|---|---|---|---|---|
| 初级电感 Lp(磁链法 flux/I) | 180 µH | 227.5 µH | +26% | 边缘磁通(见 7.2) |
| 初级电感 Lp(能量法 2W/I²) | 180 µH | 227.4 µH | +26% | 与磁链法互证一致(独立两法差 <0.05%) |
| 网格加密(气隙 0.05→0.03mm + 细网格空气区) | — | L 漂移 <0.1% | — | 结果网格无关 |
| 中柱平均 B(线积分 ∫B·n dl / 12mm) | 0.219 T(ΔB=Lp·Ipk/Np·Ae) | 0.249 T | +14% | 同源边缘磁通 |
| 气隙平均 B(线积分) | 0.233 T(µ0·NI/(lg+l_e/µr)) | 0.304 T | +30% | 同源 + 窄窗口 fringing 口径更宽 |
7.2 偏差归因:边缘磁通是这里的一阶效应,不是二阶修正
手算链(§9.3)用 $l_g = \mu_0 N_p^2 A_e / L_p$ 反推气隙,不含 fringing 项——0.46mm 气隙在 12mm 极面上、紧贴 4.5mm 窄窗口,气隙边缘磁通直接从绕组窗口借道,等效气隙面积增大 → 磁阻下降 → L 与 B 同时升高。经典 fringing 修正($F = 1 + \frac{l_g}{\pi r_c}\ln(1+2h/l_g)$,h 取窗口半高)给 +14%;本模型窗口窄、外臂近,FEMM 给 +26%(几何上界口径)。工程结论:手算 180 µH 是设计链自洽锚点(匝数/气隙/ΔB 联立用),L 的绝对值以电桥实测闭环(§8.1/8.2 的量产流程本来就是为此设计);FEA 的价值在 B 分布、热点与漏感,不在复述一维公式。
7.3 本机自动化陷阱清单(FEMM 4.2 无 GUI 驱动,给后来人)
- 官方只发 Inno 安装器、无便携 zip:innoextract 1.9 解不开新版 Inno 格式,7-Zip 也不行——用旧版存档安装器(2015-11-01 构建,Inno 5.5.6)+ innoextract 成功解包;
- COM 没有注册入口:便携目录
femm.exe /RegServer无效——需从femm.tlb提取 coclass CLSID(PowerShell LoadTypeLibEx 可解析),手工写 HKCUSoftware\Classes(CLSID/LocalServer32/ProgID/TypeLib 四件套)后Activator.CreateInstance激活; - 接口只有两个字符串通道:
call2femm/mlab2femm(TypeLib 枚举确认),没有 NewDocument 之类的具名方法——所有操作发 Lua 字符串、返回字符串; mi_addblocklabel不会自动选中新标签:必须mi_selectlabel(x,y)→mi_setblockprop(...)→mi_clearselected(),否则分析时报 “Material properties have not been defined for all block labels”;- 每次 COM 激活新起一个 femm.exe 进程:建模-求解-读数必须同一会话完成,或先
open()存盘的 .fem 再mi_loadsolution(); - mo_getpointvalues 点位读数与线积分矛盾(待核实):气隙中点读出 |B|≈7.7 mT,而线积分给 0.304 T——且 7.7 mT 恰等于同几何空气芯螺线管理论值 µ0·N·I/wh——字段映射可疑,本篇比对一律以线积分(B)与磁链/能量双法(L)为准;
- 新建问题没有默认 “Air” 材料,
mi_addmaterial("Air",1,1)要显式定义。
上一级:仿真验证