开关电源知识库

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_设计开发流程。


本篇总结

  1. Gmsh + GetDP 是开源电磁仿真的标准组合(Debian 仓库直接安装,无 wine):Gmsh 4.13 建几何与网格,GetDP 3.5 解磁静场/谐波磁/涡流——学术与工业界变压器/电机仿真的基石工具链。
  2. 流程已验证:GetDP 自带永磁体示例(/usr/share/doc/getdp/examples/)实际运行通过——Gmsh 网格 → GetDP 磁静场求解 → B 场 501 点输出,完整流程 <1 s。
  3. 电感/变压器仿真的核心思路:2D 轴对称或平面截面 → 定义铁芯(高 µr)/气隙(µr=1)/线圈(电流密度 J)→ 解磁矢位 A → 从磁能 W=½LI² 提取电感 → 比对手算。
  4. 65W 反激变压器的比对目标(出自 02_反激变压器设计 §9):Np=25、气隙 0.46mm、Lp=180 µH、B_gap≈0.22 T——FEA 的 B 场分布和电感值应与手算在 ±5% 以内(2D 近似误差 + 边界效应)。
  5. 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}$$

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. 操作纪律

  1. 2D 近似的局限:2D 平面假设深度均匀(实际 3D 端部效应漏掉);2D 轴对称假设完全旋转对称(实际 PQ 磁芯有方形圆角)。2D 结果比手算准、比 3D FEA 粗。
  2. 网格密度:气隙处网格必须细(B 梯度大);铁芯/空气边界需要至少 3~5 层过渡网格。
  3. 边界条件:空气边界距器件 ≥5 倍磁芯尺寸(或用无限元);Dirichlet A=0 在外边界。
  4. 非线性 B-H:铁氧体 µr 随 B 变化(B>0.2T 时 µr 下降)——初始仿真用常数 µr,验证 B 后如接近饱和再引入 B-H 曲线。
  5. 比对纪律: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 陷阱清单

  1. Elmer 不在 Debian 仓库——FreeCAD FEM 磁仿真需另装 Elmer(或用 GetDP 替代);
  2. GetDP 模板路径问题——Include "../templates/xxx.pro" 须改为相对当前目录;
  3. 2D 平面假设深度 1m——结果须乘实际深度才是真实电感;
  4. 气隙网格不够细 → B 场不准(气隙边缘 B 集中效应漏掉);
  5. 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 驱动,给后来人)

  1. 官方只发 Inno 安装器、无便携 zip:innoextract 1.9 解不开新版 Inno 格式,7-Zip 也不行——用旧版存档安装器(2015-11-01 构建,Inno 5.5.6)+ innoextract 成功解包;
  2. COM 没有注册入口:便携目录 femm.exe /RegServer 无效——需从 femm.tlb 提取 coclass CLSID(PowerShell LoadTypeLibEx 可解析),手工写 HKCU Software\Classes(CLSID/LocalServer32/ProgID/TypeLib 四件套)后 Activator.CreateInstance 激活;
  3. 接口只有两个字符串通道:call2femm / mlab2femm(TypeLib 枚举确认),没有 NewDocument 之类的具名方法——所有操作发 Lua 字符串、返回字符串;
  4. mi_addblocklabel 不会自动选中新标签:必须 mi_selectlabel(x,y) → mi_setblockprop(...) → mi_clearselected(),否则分析时报 “Material properties have not been defined for all block labels”;
  5. 每次 COM 激活新起一个 femm.exe 进程:建模-求解-读数必须同一会话完成,或先 open() 存盘的 .fem 再 mi_loadsolution();
  6. mo_getpointvalues 点位读数与线积分矛盾(待核实):气隙中点读出 |B|≈7.7 mT,而线积分给 0.304 T——且 7.7 mT 恰等于同几何空气芯螺线管理论值 µ0·N·I/wh——字段映射可疑,本篇比对一律以线积分(B)与磁链/能量双法(L)为准;
  7. 新建问题没有默认 “Air” 材料,mi_addmaterial("Air",1,1) 要显式定义。

上一级:仿真验证