开关电源知识库

电磁仿真手把手教程 —— 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 示例):

复现命令(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}$$

操作步骤

  1. 在 GetDP 的 .pro 文件 PostOperation 段加:
Print[ W_mag, OnRegion Vol_Mag, File "energy.txt" ];  // 磁能
  1. 从 energy.txt 读出 W(单位 J/m,2D 需乘模型深度 d)
  2. 电感 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 导入网格):

  1. 打开 FreeCAD:~/Appimage/FreeCAD_1.1.3-...AppImage
  2. 切换到 Part 工作台
  3. 用 Box 工具画中柱、外臂、轭、气隙(3D 矩形体)
  4. 用 Boolean 工具组合/剪切
  5. 导出:File → Export → STEP
  6. 在 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 气隙磁密(手算近似)

陷阱清单

  1. GetDP 模板路径——Include "../templates/" 在 Debian 安装中须改为实际路径;
  2. 2D 平面假设深度 1m——提取的电感须乘实际磁芯深度;
  3. 气隙网格不够细 → B 场误差大(气隙边缘磁通集中);
  4. FreeCAD 的 FEM 磁仿真依赖 Elmer(Debian 不自带)——用 Gmsh+GetDP 替代更轻量;
  5. 2D 近似的系统误差 ~5%(3D 端部效应)——手算 vs FEA 差 >10% 时先查网格。

上一级:教程