电磁仿真手把手教程 —— Gmsh + GetDP 从零算一个带气隙的电感
你将学会:用文本文件定义一个带气隙电感的 2D 几何 → 生成网格 → 用 GetDP 解磁静场 → 提取 B 场和电感值 → 比对手算公式。 预计时间:60 分钟(第一次)。前置:已读 02_反激变压器设计(知道气隙、B、Lp 是什么)。无需任何 FEA 经验。 工具:Gmsh 4.13 + GetDP 3.5(Debian 仓库安装:
sudo apt install gmsh getdp)。已验证版本。 目标:验证 65W 反激变压器(设计篇 §9)的手算——B_gap ≈ 0.22 T、Lp = 180 µH。
你要搭的模型
一个带气隙的电感的 2D 截面。把 3D 电感简化为 2D 是标准做法(省 100 倍计算量):
← r(径向)→
┌──────────────────────────────────────────┐ ← 空气边界
│ │
│ ┌───┐ ┌──────────┐ ┌───┐ │
│ │铁 │ │ 窗口 │ │铁 │ │
│ │芯 │ │ (线圈) │ │芯 │ ← 外臂 │
│ │ │ │ │ │ │ │
│ └───┘ └──────────┘ └───┘ │
│ ←→ ← 气隙在铁芯回路中 → │
│ │
└──────────────────────────────────────────┘
↑ 中心轴线
这是 E-I 磁芯的正面截面。左侧柱 = 中柱(有气隙),右侧柱 = 外臂(无气隙),中间窗口放线圈。
第 1 步:建几何文件(.geo)
Gmsh 用文本文件定义几何——每一行都可以解释。创建文件 inductor.geo:
// ============================================================
// 带气隙电感 2D 磁静场(E-I 磁芯截面,平面近似)
// 参数取自库内 65W 反激变压器设计 §9
// ============================================================
// --- 参数(mm→m)---
lc = 0.3e-3; // 网格尺寸(铁芯/气隙处)
lc_air = 2e-3; // 网格尺寸(空气区,可以粗)
cw = 6.5e-3; // 中柱宽 = 6.5mm
ch = 7e-3; // 铁芯臂高 = 7mm
gap = 0.46e-3; // 气隙 = 0.46mm
ww = 4.5e-3; // 窗口宽
ro = 6.5e-3; // 外臂宽
air = 10e-3; // 空气边界余量
H_tot = 2*ch + gap;// 总高度
// --- 中柱(有气隙)---
// 中柱分为三段:下段铁芯 + 气隙 + 上段铁芯
Point(1) = {0, 0, 0, lc}; // 中柱左下
Point(2) = {cw, 0, 0, lc}; // 中柱右下
Point(3) = {cw, ch, 0, lc}; // 中柱右(气隙下沿)
Point(4) = {cw, ch+gap, 0, lc}; // 中柱右(气隙上沿)
Point(5) = {cw, H_tot, 0, lc}; // 中柱右上
Point(6) = {0, H_tot, 0, lc}; // 中柱左上
Point(7) = {0, ch+gap, 0, lc}; // 中柱左(气隙上沿)
Point(8) = {0, ch, 0, lc}; // 中柱左(气隙下沿)
// --- 窗口(线圈区域,在中柱和外臂之间)---
Point(9) = {cw+ww, ch, 0, lc}; // 窗口右下
Point(10) = {cw+ww, ch+gap, 0, lc}; // 窗口右上
// --- 外臂(无气隙)---
Point(11) = {cw+ww+ro, 0, 0, lc}; // 外臂右下
Point(12) = {cw+ww+ro, H_tot, 0, lc}; // 外臂右上
// --- 空气外框 ---
Point(13) = {-air, -air, 0, lc_air};
Point(14) = {cw+ww+ro+air, -air, 0, lc_air};
Point(15) = {cw+ww+ro+air, H_tot+air, 0, lc_air};
Point(16) = {-air, H_tot+air, 0, lc_air};
// --- 连线(逆时针或顺时针,闭合回路)---
// 中柱(含气隙分为 3 个区域)
Line(1) = {1, 2}; // 中柱底边
Line(2) = {2, 3}; // 中柱右下(铁芯)
Line(3) = {3, 4}; // 气隙
Line(4) = {4, 5}; // 中柱右上(铁芯)
Line(5) = {5, 6}; // 中柱顶边
Line(6) = {6, 7}; // 中柱左上(铁芯)
Line(7) = {7, 8}; // 气隙(左侧边界)
Line(8) = {8, 1}; // 中柱左下(铁芯)
// 窗口(线圈区域)
Line(9) = {2, 9}; // 窗口底边
Line(10) = {9, 10}; // 窗口右边
Line(11) = {10, 4}; // 窗口顶边右段
// 外臂
Line(12) = {9, 11}; // 窗口底边延伸到外臂
Line(13) = {11, 12}; // 外臂右边
Line(14) = {12, 10}; // 外臂顶边到窗口右上
// 空气外框
Line(15) = {13, 14};
Line(16) = {14, 15};
Line(17) = {15, 16};
Line(18) = {16, 13};
// --- 定义面(用线回路包围)---
// 铁芯中柱(含气隙分为铁芯/气隙两个面)
Curve Loop(1) = {1, 2, -8}; // 不对——需要完整回路
// ===== 简化方法:用 Plane Surface 自动检测 =====
// Gmsh 可以用 Curve Loop 定义每个面的边界线段集合
// 中柱下段铁芯(面 1)
Curve Loop(1) = {1, 2, -8};
Plane Surface(1) = {1};
// 气隙(面 2)
Curve Loop(2) = {2, 3, -7, -2}; // 这不对——需要重新组织
如果你觉得上面太复杂——对,直接手写多区域 Gmsh 几何确实复杂。更简单的方法:用下面第 1b 步的极简 2 匝螺线管模型(只需要 3 个矩形),先运行一遍最小流程,再回来做复杂几何。(2026-10-03 更新:完整可运行的 E-I 带气隙几何已补齐,见下方第 1c 步,宏写法不再需要逐点手动编写。)
第 1b 步(简化版):一个矩形线圈 + 空气 + 铁芯板
这是能 5 分钟完成的最小磁仿真实例——不做完整磁芯,只验证“电流产生磁场”这个基本物理:
几何文件 simple_coil.geo
// 一个矩形线圈截面(电流流入纸面)在空气中
// 上方一块铁板(高 µr)会聚集磁通
lc = 0.2e-3;
lcair = 2e-3;
// 线圈截面(左导体)
Point(1) = {0, 0, 0, lc};
Point(2) = {2e-3, 0, 0, lc};
Point(3) = {2e-3, 5e-3, 0, lc};
Point(4) = {0, 5e-3, 0, lc};
// 线圈截面(右导体,电流方向相反)
Point(5) = {10e-3, 0, 0, lc};
Point(6) = {12e-3, 0, 0, lc};
Point(7) = {12e-3, 5e-3, 0, lc};
Point(8) = {10e-3, 5e-3, 0, lc};
// 铁板
Point(9) = {-5e-3, 10e-3, 0, lcair};
Point(10) = {17e-3, 10e-3, 0, lcair};
Point(11) = {17e-3, 13e-3, 0, lcair};
Point(12) = {-5e-3, 13e-3, 0, lcair};
// 空气外框
Point(13) = {-20e-3, -10e-3, 0, lcair};
Point(14) = {32e-3, -10e-3, 0, lcair};
Point(15) = {32e-3, 25e-3, 0, lcair};
Point(16) = {-20e-3, 25e-3, 0, lcair};
// 线圈左导体
Line(1) = {1, 2}; Line(2) = {2, 3}; Line(3) = {3, 4}; Line(4) = {4, 1};
Curve Loop(1) = {1, 2, 3, 4};
Plane Surface(1) = {1}; // Coil_L(电流 +z 方向)
// 线圈右导体
Line(5) = {5, 6}; Line(6) = {6, 7}; Line(7) = {7, 8}; Line(8) = {8, 5};
Curve Loop(2) = {5, 6, 7, 8};
Plane Surface(2) = {2}; // Coil_R(电流 -z 方向)
// 铁板
Line(9) = {9, 10}; Line(10) = {10, 11}; Line(11) = {11, 12}; Line(12) = {12, 9};
Curve Loop(3) = {9, 10, 11, 12};
Plane Surface(3) = {3}; // Iron(µr = 1000)
// 空气(最外框减去内部所有区域)
Line(13) = {13, 14}; Line(14) = {14, 15};
Line(15) = {15, 16}; Line(16) = {16, 13};
Curve Loop(4) = {13, 14, 15, 16};
Plane Surface(4) = {4, 1, 2, 3}; // Air = 外框减去线圈和铁板
// 物理区域(GetDP 靠这些标签识别区域)
Physical Surface("Coil_Plus", 1) = {1};
Physical Surface("Coil_Minus", 2) = {2};
Physical Surface("Iron", 3) = {3};
Physical Surface("Air", 4) = {4};
网格生成
gmsh simple_coil.geo -2 -o simple_coil.msh
# 应该输出 "Done meshing" 且无错误
第 1c 步(完整版,2026-10-03 补齐):E-I 磁芯带气隙电感
状态:文件已备、Linux 侧待跑——完整文件已入库 sim/04_magnetic_fea/ei_planar_getdp/inductor_ei.geo(同目录有配套
inductor_ei.pro),本节只讲思路与预期结果。上面第 1 步手写挣扎的几何,用 Gmsh 宏(Macro) 一次解决:写一个“画矩形”宏(RectIn),每个区域调一次,几何量与物理标签分开管理。
模型要点(参数全部出自反激变压器设计 §9 的 65W 示例):
- 10 个矩形:中柱下铁芯/气隙(0.46mm)/上铁芯、左右窗口(电流源)、左外臂、上下轭、气隙旁细网格空气区、空气外框——磁路闭合:中柱↑ → 顶轭 → 外臂↓ → 底轭;
- 物理标签
Core/Gap/CoilL/CoilR/Air与.pro的Region[1..5]一一对应; - 安匝 NI = 25×3.44 = 86 A,左窗 +z、右窗 −z,中柱磁通向上;
- 网格纪律(04 篇 §5):气隙 0.03~0.08mm、常规 0.5mm、空气外圈 4mm。
复现命令(Debian 13,gmsh/getdp 仓库版):
gmsh inductor_ei.geo -2 -o inductor_ei.msh
getdp inductor_ei -msh inductor_ei.msh -solve Magnetostatics_a -pos mag
预期比对表(待 Linux 侧执行后填实测列):
| 量 | 手算预期 | GetDP 期望 | 状态 |
|---|---|---|---|
| 电感 L(能量法 L=2W'd/I²,d=叠厚) | 180 µH(一维磁路,无 fringing) | 手算与 FEMM 之间(FEMM 轴对称同参实测 227 µH,+26% 边缘磁通) | 待跑 |
| 气隙平均 B | 0.23 T(一维式 µ0·NI/lg) | 0.23~0.30 T(含边缘磁通) | 待跑 |
| 磁能 W'(每米深度) | ½LI²/d 量级 | 与 L 自洽 | 待跑 |
注意:2D 平面口径是“每米深度”,乘实际叠厚 d 才是真实电感(04 篇陷阱清单第 3 条);Windows 本机已用 FEMM 4.2 做了同参数轴对称交叉验证,结果与陷阱记录见 04_电磁场仿真 §7 与 sim/04_magnetic_fea/femm/femm_run_log.txt。
第 2 步:写 GetDP 物理文件(.pro)
创建 simple_coil.pro:
// ============================================================
// 磁静场:两个通电线圈 + 铁板 + 空气
// 求解磁矢位 A(z),从 B 场分布验证安培定律
// ============================================================
Include "Lib_Materials.pro" // 如果不存在就手动定义 mu0
// --- 常数 ---
mu0 = 4e-7 * Pi; // 真空磁导率 ≈ 1.257e-6 H/m
// --- 区域分组 ---
Group {
Air = Region[4];
Coil_P = Region[1]; // 电流 +z
Coil_M = Region[2]; // 电流 -z
Iron = Region[3];
Vol_Mag = Region[{Air, Coil_P, Coil_M, Iron}];
Sur_Pac = Region[{13, 14, 15, 16}]; // 外边界(A=0)
}
// --- 材料属性 ---
Function {
// 磁阻率 ν = 1/μ
nu[Air] = 1/mu0;
nu[Coil_P] = 1/mu0;
nu[Coil_M] = 1/mu0;
nu[Iron] = 1/(1000 * mu0); // 铁板 µr = 1000
// 电流密度 J(A/m²)——z 方向
// 线圈:N=10 匝 × I=1A / 截面积 = 10 / (2mm × 5mm) = 1e6 A/m²
Jz[Coil_P] = 1e6; // +z 方向(流出纸面)
Jz[Coil_M] = -1e6; // -z 方向(流入纸面)
}
// --- 边界条件 ---
Constraint {
{ Name A;
Case {
{ Region Sur_Pac; Value 0.; } // 外边界 A=0(磁矢位为零)
}
}
}
// --- 有限元公式(磁矢位 A_z,2D 平面)---
Formulation {
{ Name Magnetostatics_a; Type FemEquation;
Unknown {
A_z [ Vol_Mag ]; // 未知量:A 的 z 分量
}
Equation {
Galerkin {
// ∫ (1/μ) ∇A · ∇A' dΩ = ∫ J · A' dΩ
Integral { [ nu[] * Dof{Grad A_z} , {Grad A_z} ] ; In Vol_Mag ;
Jacobian Vol ; Integration GradSol ; }
Integral { [ -Jz[] * Dof{A_z} ] ; In Coil_P ; ... } // 简化示意
}
}
}
}
// 完整的 formulation 较长——实际使用时参考 GetDP 自带模板:
// /usr/share/doc/getdp/examples/templates/Lib_Magnetostatics_a_phi.pro
重要:上面的 .pro 是教学示意(省略了完整语法)。实际操作请用以下方法——直接跑 GetDP 自带的例子先验证环境,然后基于它修改。
第 2b 步(推荐路径):运行 GetDP 自带例子
# 复制自带示例到工作目录
mkdir -p ~/mag_sim && cd ~/mag_sim
cp /usr/share/doc/getdp/examples/examples/magnet*.pro .
cp /usr/share/doc/getdp/examples/examples/magnet.geo .
cp /usr/share/doc/getdp/examples/examples/magnet.msh .
cp /usr/share/doc/getdp/examples/templates/Lib_Magnetostatics_a_phi.pro .
cp /usr/share/doc/getdp/examples/templates/Lib_Materials.pro .
# 修正模板路径(Debian 的 examples 引用 ../templates/)
sed -i 's|../templates/|./|g' magnet.pro
# 生成网格
gmsh magnet.geo -2 -o magnet.msh
# 求解磁静场
getdp magnet -solve Magnetostatics_a -pos a
# 查看结果
head b_a.txt
# 应该输出 501 行 B 场数据(x坐标, y坐标, Bx, By, 0)
你应该得到:b_a.txt 含 501 行,格式为 元素号 节点号 x y z Bx By Bz。最大 B 约 0.12 T(永磁体在气隙中产生的典型值)。
第 3 步:从磁静场模型算电感
原理
仿真解出 B 场后,磁场储能:
$$W = \int \frac{B^2}{2\mu_0} \, dV \quad \text{(空气中)}$$
电感:
$$L = \frac{2W}{I^2}$$
操作步骤
- 在 GetDP 的
.pro文件 PostOperation 段加:
Print[ W_mag, OnRegion Vol_Mag, File "energy.txt" ]; // 磁能
- 从 energy.txt 读出 W(单位 J/m,2D 需乘模型深度 d)
- 电感 L = 2W/I² = 2W/(1A)² = 2W(设 I=1A)
比对手算
以 65W 反激变压器为例(设计篇 §9):
| 量 | 手算 | FEA 期望 |
|---|---|---|
| Lp(初级电感) | 180 µH | ±5%(2D 近似误差) |
| B_gap(气隙磁密) | 0.22 T | ±5% |
| B_core_max | 0.22 T | 应 < 0.25 T |
如果 FEA 电感与手算差 >10%,检查:① 气隙处网格是否够细;② 空气边界是否够远(≥5 倍磁芯尺寸);③ µr 是否正确设定。
第 4 步:进阶——用 FreeCAD 建模
FreeCAD 1.1.3 可以作为3D 建模前端(画磁芯 3D 模型 → 导出 STEP → Gmsh 导入网格):
- 打开 FreeCAD:
~/Appimage/FreeCAD_1.1.3-...AppImage - 切换到 Part 工作台
- 用 Box 工具画中柱、外臂、轭、气隙(3D 矩形体)
- 用 Boolean 工具组合/剪切
- 导出:File → Export → STEP
- 在 Gmsh 中导入:
gmsh model.step -3 -o model.msh(3D 网格)
对于 2D 轴对称模型,FreeCAD 不是必需的——Gmsh 自建几何更高效。FreeCAD 的价值在于复杂 3D 磁芯的建模。
精炼速查
工具链卡
| 工具 | 命令 | 作用 |
|---|---|---|
| Gmsh | gmsh xxx.geo -2 -o xxx.msh |
几何 → 网格 |
| GetDP | getdp xxx -solve Magnetostatics_a -pos a |
磁静场求解 |
| FreeCAD | AppImage 或 freecadcmd |
3D 建模(可选) |
物理公式卡
| 公式 | 含义 |
|---|---|
| B = ∇×A | 磁矢位→磁通密度 |
| ∇×(ν∇×A) = J | 磁静场 PDE |
| W = ∫B²/(2µ)dV | 磁能 |
| L = 2W/I² | 能量法提电感 |
| B_gap ≈ µ₀NI/l_gap | 气隙磁密(手算近似) |
陷阱清单
- GetDP 模板路径——
Include "../templates/"在 Debian 安装中须改为实际路径; - 2D 平面假设深度 1m——提取的电感须乘实际磁芯深度;
- 气隙网格不够细 → B 场误差大(气隙边缘磁通集中);
- FreeCAD 的 FEM 磁仿真依赖 Elmer(Debian 不自带)——用 Gmsh+GetDP 替代更轻量;
- 2D 近似的系统误差 ~5%(3D 端部效应)——手算 vs FEA 差 >10% 时先查网格。
上一级:教程