简介:《Advanced Field-Solver Techniques for RC Extraction of Integrated Circuits》是Springer与清华大学出版社2014年联合出版的专业著作,面向集成电路设计工程师、EDA研发人员及相关专业学生,聚焦RC提取这一连接版图与电路仿真的关键环节。书中系统梳理有限元、边界元及混合场解算器的数学基础与离散流程,比较不同方法在复杂互连结构中的精度和效率,并讨论多尺度、并行加速、误差分析与模型验证等进阶议题。压缩包仅含1个PDF文件,约8.78MB,保留原书排版、公式、图表与参考文献,便于直接查阅和对照学习。内容还结合射频IC、纳米级CMOS工艺说明寄生电容电阻提取、结果后处理及其在电路仿真优化中的应用;作者来自清华大学与Cadence,兼顾学术推导和工业实践。目前已有108人学习,适合希望系统补齐场求解器知识、理解寄生参数提取原理并指导实际设计的读者。
1. 签核对不上账时,我为什么会翻这本 RC 提取专著
去年一个模拟前端项目,后仿时序余量只剩 3%,提取工具报出来的耦合电容和硅上测试结构差了 15%。改工具参数、换 corner、调精度档位,全是玄学,因为你根本不知道那个黑匣子里在算什么。这种时候唯一的后悔药是:自己搭一个小规模的场解算器基准,把同一组几何用两种方法算一遍,看差在哪。这也是我重新翻这本 2014 年 RC 提取专著的直接原因。
它讲的是集成电路寄生参数提取里的场解算器,主线是三维边界元(BEM,直接与间接两路)加上快速随机行走,覆盖加速算法、多介质处理、悬浮金属填充、电阻提取和工艺变异性。写法是「问题形式化 → 算法 → 算例对比」,不是某款 EDA 工具的操作手册。适合已经会用提取工具、但想弄清数值内核的工程师,也适合要自己写验证程序的研究生;想找现成工程代码的人会失望,书里没有完整可编译项目,给的是公式、伪代码和结果表。
2. 场解算器选型:BEM、FEM 和随机行走在什么几何上会翻车
2.1 从泊松方程到边界积分方程
RC 提取的数学起点很朴素。电容侧求解静电边值问题,介质内没有自由电荷,电位满足
$$\nabla \cdot (\varepsilon \nabla \varphi) = 0$$
导体表面是等电位面(Dirichlet 条件),无穷远处电位为零。算出表面电荷密度 $\sigma = \varepsilon \partial \varphi / \partial n$ 之后,对每个导体积分得到总电荷 $Q_i$,再令其他导体轮流接地,就能填出电容矩阵:$C_{ij} = -Q_i / V_j$($i \neq j$),对角元是 $C_{ii} = Q_i / V_i$。电阻侧形式几乎一样,只是把 $\varepsilon$ 换成电导率 $\sigma_c$,边界条件改成电极上给定电流或电压,最后用 $R = V/I$ 收口。
真正把三类方法区分开的是「未知量放在哪」。有限元(FEM)把整个求解域切成体网格,未知量是每个节点的电位,介质分布再复杂也能表达,代价是三维体网格剖分和巨大的自由度;边界元只离散导体表面和介质界面,未知量是面元上的电荷或法向电场,自由度少一个维度,但系数矩阵是稠密的;随机行走干脆不解方程,用蒙特卡洛采样估计电荷,天然无网格。
对一个只关心「这块走线对那块走线有多少 pF」的提取任务,几何特点是导体表面占比极小、介质层是水平叠层、结构重复度高。这正是 BEM 的主场:只需要表面网格,介质分层可以用多层格林函数或者界面电荷处理,不用在衬底里撒几百万个体单元。书里把 BEM 作为电容提取的主线来讲,选型理由就在这里。
2.2 间接 BEM 与直接 BEM 的差别
间接 BEM 的未知量只有表面电荷密度。把导体表面离散成 $N$ 个面元,每个面元上电荷密度近似为常数或线性分布,代入电位积分表达式,得到第一类 Fredholm 积分方程:
$$\varphi(\mathbf{r}) = \sum_{j=1}^{N} \int_{S_j} G(\mathbf{r}, \mathbf{r}') \sigma(\mathbf{r}') , dS'$$
其中 $G$ 是格林函数,均匀介质下就是 $1/(4\pi\varepsilon|\mathbf{r}-\mathbf{r}'|)$。离散后是一个 $N \times N$ 的稠密线性系统 $P\sigma = \varphi$,右端是导体电位。算完 $\sigma$ 再积分求电荷。它的好处是未知数少、编程直接;坏处是矩阵条件数差,第一类积分方程本身是病态的,面元划分不均匀时容易出现电荷密度振荡。
直接 BEM 走 Green 第二恒等式,把域内积分转成边界积分,未知量同时包含电位 $\varphi$ 和法向分量 $q = \partial \varphi / \partial n$:
$$c(\mathbf{r})\varphi(\mathbf{r}) = \int_S \left[ G(\mathbf{r},\mathbf{r}') q(\mathbf{r}') - \frac{\partial G(\mathbf{r},\mathbf{r}')}{\partial n'} \varphi(\mathbf{r}') \right] dS'$$
$c(\mathbf{r})$ 是立体角系数,光滑边界上取 $1/2$。多介质结构在界面上补两个条件:电位连续 $\varphi_1 = \varphi_2$,法向电位移连续 $\varepsilon_1 q_1 + \varepsilon_2 q_2 = 0$(法向取各自外法线)。这样界面不需要额外网格,直接把两侧的面元方程联立即可。代价是未知数翻倍、每个面元要同时存 $\varphi$ 和 $q$,矩阵规模比间接法大,但条件数好得多,迭代求解更容易收敛。
| 维度 | 间接 BEM | 直接 BEM | FEM | 随机行走 |
|---|---|---|---|---|
| 未知量位置 | 导体表面电荷 | 表面电位+法向场 | 全域节点电位 | 无未知量,采样 |
| 网格 | 表面 | 表面+界面 | 体网格 | 无 |
| 矩阵性质 | 稠密、病态 | 稠密、条件数较好 | 稀疏、对称正定 | 无矩阵 |
| 多介质处理 | 需等效电荷或分层格林函数 | 界面条件直接耦合 | 天然支持 | 需按介质分层跳 |
| 适合场景 | 均匀介质、中小规模 | 多层介质、精度要求高 | 复杂体结构、材料非线性 | 超大版图、复杂几何 |
| 主要短板 | 条件数、电荷振荡 | 未知数多、内存高 | 剖分成本、自由度爆炸 | 方差大、收敛慢 |
这张表是我自己在选型时反复核对的东西。实际项目里如果只是算几根走线在均匀介质里的自电容和互电容,间接法足够;一旦叠层介质超过三层、又有衬底耦合,直接法省下的调试时间远超它多出来的内存。
2.3 随机行走为什么适合复杂几何却难做签核
快速随机行走(FRW)的思路完全不同。从导体表面按面积均匀采样一个点,以该点为球心作一个不与其他导体相交的最大内接球(实际实现常用立方体,方便按面选择),在球面上按立体角或面积概率采样下一个点,重复直到落进某个导体。每一步都是一次「以球心电位估计边界电位」的无偏估计,走 $N$ 条路径取平均,就得到采样点的电位,再对表面做数值积分得到电荷。
它最大的优势是无网格:版图几何再刁钻,只要能判断「这个立方体是否与导体相交」,就能跑。空中悬浮的填充金属、非 Manhattan 走线、多层介质,都不需要重新剖分。缺点是收敛速度只有 $O(1/\sqrt{N})$,要三位有效数字大概要上万条路径;方差还跟几何强相关,窄缝结构里路径容易反复弹跳,效率骤降。所以工业上它常用来做大规模版图的快速估算或交叉验证,签核级精度仍然要靠确定性方法。
书里对随机行走的处理不是简单介绍,而是讲了浮动随机行走怎么处理多层介质界面、怎么降低方差、怎么和确定性方法混合。这部分对想自己实现一个「快速但别太不准」的估算器的人很有参考价值。
2.4 落地步骤:从版图到面元
不管选哪条路,从几何到可求解模型都绕不开这几步。我把它整理成一张操作顺序表,照着走能少返工:
| 步骤 | 要做的事 | 关键检查点 |
|---|---|---|
| 1. 几何清理 | 合并重复多边形、去掉零面积碎片、对齐层间边界 | 导体数量与网表一致;有无自相交 |
| 2. 介质栈建模 | 按工艺文件列出每层厚度、介电常数、是否有刻蚀形貌 | $\varepsilon_r$ 与工艺库一致;界面是否闭合 |
| 3. 表面离散 | 按最大面元尺寸和最小特征尺寸双重约束划分 | 面元长宽比不宜超过 5:1;相邻面元尺寸渐变 |
| 4. 奇异性处理 | 自作用项(面元对自身)用解析积分,近场用自适应细分 | 对角元量级是否合理;近场积分是否收敛 |
| 5. 方程组装 | 间接法填 $P$ 矩阵,直接法填 $\varphi$/$q$ 耦合块 | 矩阵行和是否满足物理约束 |
| 6. 求解与后处理 | 迭代或直接求解,积分得电荷,组装电容矩阵 | 电容矩阵对称性、对角占优、总电荷守恒 |
第 3 步和第 4 步是最容易埋雷的地方。面元尺寸不是越小越好,尺寸小到接近面元间距时,近场积分误差反而会放大;自作用项的解析公式如果写错一个系数,整个矩阵的对角占优就没了,迭代解会飘。
3. 快速 BEM 的两级加速:多极子阶数和 ACA 容差怎么定
3.1 快速多极子:多极展开、局部展开与三层平移
朴素 BEM 的矩阵是 $N \times N$ 稠密阵,$N$ 到十万量级时内存直接爆掉。快速多极子(FMM)的核心观察是:两个相距很远的面元簇之间的相互作用,可以用少数几个展开系数近似,不必逐对计算。
具体做法是把整个几何装进一个立方体,八叉树递归细分到每个盒子里的面元数低于阈值。对每个盒子,把内部电荷在盒子中心做多极展开,系数个数是 $(p+1)^2$,$p$ 是展开阶数;对远场盒子,把多极展开通过 M2L 平移成局部展开,再 L2L 下传到叶子;近场盒子仍然直接算。整个矩阵向量乘的复杂度从 $O(N^2)$ 降到 $O(N \log N)$ 甚至 $O(N)$。
书里对多极展开和局部展开的推导给得比较完整,尤其对球谐函数的归一化约定写得很细——这块是自己实现时最容易翻车的地方,不同教材的归一化因子差一个 $4\pi$ 或 $(-1)^m$,抄错一个符号,远场贡献就整体偏了。
工程上真正要定的是三个参数:
| 参数 | 典型取值 | 影响 |
|---|---|---|
| 展开阶数 $p$ | 2~6 | 每加 1 阶精度提升明显,计算量约按 $(p+1)^2$ 增长 |
| 叶子盒子最大面元数 | 50~200 | 太小则树深、平移开销大;太大则近场计算量回升 |
| 近场判定距离 | 1~2 个盒子边长 | 决定直接计算与展开计算的分界 |
我一般的做法是:先用 $p=3$、叶子 100 跑一遍,和直接法的小规模结果比,误差在 $10^{-4}$ 量级就够用;如果几何里有尖锐棱边或极近的面元对,把 $p$ 提到 5,同时把近场判定放大半格。$p$ 再往上收益递减,因为近场误差开始主导。
3.2 低秩压缩:远场块为什么能用 ACA 压到 O(N)
FMM 的另一种等价视角是矩阵分块。把系数矩阵按八叉树的盒子对分块,对角块(近场)直接存,非对角块(远场)是数值低秩的——物理上因为远场核函数光滑,块内可以用少数几个奇异向量表示。于是远场块可以写成 $A \approx U V^{T}$,$U$ 是 $n \times k$,$V$ 是 $m \times k$,$k$ 是有效秩,通常远小于 $n$ 和 $m$。
低秩分解有两条路。一条是 SVD 或 QR:先把整块算出来再分解,精度高但预处理成本 $O(nm k)$,适合块不大的场合。另一条是自适应交叉近似(ACA):不预先算整块,而是从块里挑行和列,逐步逼近。ACA 的第 $k$ 步残差是当前近似与原矩阵在选中行列上的差,选主元行、算对应的列、再更新残差,直到残差范数低于阈值。它只需要访问原矩阵的某些行和列,对核函数是黑盒的情况特别友好。
ACA 的停止准则一般用相对 Frobenius 范数:
$$\frac{|A - UV^{T}|_F}{|A|F} < \varepsilon{\text{ACA}}$$
$\varepsilon_{\text{ACA}}$ 取 $10^{-3}$ 到 $10^{-6}$。这里有个反直觉的点:容差调得越小,有效秩 $k$ 越大,压缩率下降,但整体迭代次数不一定减少,因为矩阵向量乘变贵了。我见过把容差从 $10^{-4}$ 调到 $10^{-8}$,单块秩从 12 涨到 40,总求解时间反而多了 60%。
实际配置我通常这样起步:
| 量 | 建议值 | 说明 |
|---|---|---|
| ACA 容差 | $10^{-4}$ | 对应电容误差约 0.1%,多数提取够用 |
| 最小块尺寸 | 64×64 | 小于这个尺寸直接存,压缩收益覆盖不了开销 |
| 重压缩 | 开启 | 对已压缩块再做一次 SVD 截断,能再省 20%~30% 秩 |
| 迭代求解器 | GMRES,重启 50 | 配合预条件,相对残差 $10^{-6}$ |
重压缩这一步很多人省掉,其实很划算:ACA 得到的 $U$、$V$ 往往不是正交的,秩有冗余,做一次小规模 SVD 把奇异值低于阈值的截掉,内存能明显下降。
3.3 迭代求解器的组织:GMRES 重启与预条件
快速 BEM 把矩阵向量乘降到近线性,剩下的瓶颈就在迭代次数上。BEM 矩阵非对称,GMRES 是默认选择,但它要存 Krylov 子空间基,重启长度设太大内存吃不消,设太小收敛慢。
经验值是重启 30~50。判断标准不是「迭代次数越少越好」,而是「每次重启后残差下降是否还在一到两个数量级」。如果重启后残差几乎不降,说明预条件不够好,继续加迭代次数是浪费。
预条件这块书里给了扩展 Jacobi 和基于 MN 的近场预条件。前者是把矩阵的对角块(近场块)拿出来做块 Jacobi,实现简单;后者利用近场块的低秩结构构造近似逆,对多介质结构效果更好。我自己实现时一般先上块 Jacobi,收敛不满意再换,因为块 Jacobi 的构造几乎不花时间,调试阶段够用。
还有一点常被忽略:右端项的数量。电容矩阵有 $M$ 个导体就要解 $M$ 次(轮流给导体加 1V,其余接地)。如果每次独立跑 GMRES,前面的收敛信息全浪费。正确做法是用块 GMRES 或者把多个右端拼成一个块,共享 Krylov 子空间,实测能省 30%~50% 的时间。
4. 多介质与悬浮金属填充:准多介质方法的分解套路
4.1 多介质直接 BEM 的界面未知量
直接 BEM 处理多介质,核心是把界面当成一层特殊的面元。界面上电位连续,法向电位移连续,两个条件把界面两侧的 $\varphi$ 和 $q$ 绑在一起。离散后,界面上的每个节点同时属于两侧单元,方程数等于未知数,系统可解。
但实现上有两个细节很磨人。第一是法线方向:界面两侧的外法线相反,写方程时必须统一约定,否则 $\varepsilon_1 q_1 + \varepsilon_2 q_2 = 0$ 会变成减号,结果就是界面电荷符号反了,电容偏大一倍。第二是界面与导体表面的交线,那里既有 Dirichlet 条件又有界面条件,属于混合边值,面元要沿交线对齐,不能跨过去。
书里对多介质直接 BEM 的推导是用「等效包括导体和介质界面在内的全部边界」来做的,公式本身不复杂,难的是把它组织成可维护的代码。我的经验是把界面单元和导体单元分成两类对象,各自有独立的积分核,组装时按类型填不同的块,这样调试时能单独关掉某一类看结果。
4.2 准多介质方法:把介质界面拆成闭合面
准多介质方法(Quasi-Multiple Medium,QMM)换了个思路:不直接解界面条件,而是用虚拟的闭合面把多介质区域切成若干块均匀介质子区域,每个子区域单独用均匀介质格林函数,子区域之间的耦合通过虚拟面上的等效电荷表达。
这样做的好处是每个子问题都是均匀介质的,格林函数简单,积分核没有分段,代码复用度高;而且虚拟面的位置可以选在几何平缓的地方,避开导体尖锐棱边,数值精度更稳。代价是未知数增加——每个虚拟面都要加一层电荷未知量,介质层数多的时候规模涨得快。
书里给了一个分解原则:虚拟面尽量选在两种介质的平直界面附近,且不要穿过导体;同一块子区域内介质常数必须一致。这个原则看起来是废话,实操中很容易违反。我曾经把一个虚拟面放在距离导体 0.1 μm 的位置,结果那片面元上的电荷密度出现剧烈振荡,收敛不了,退回去把虚拟面挪到 0.5 μm 之外才正常。
QMM 和直接 BEM 的取舍可以这样看:
| 场景 | 推荐方法 | 理由 |
|---|---|---|
| 介质层数 ≤ 3,界面平直 | 直接 BEM | 未知数少,不需要额外虚拟面 |
| 介质层数多,界面有台阶 | QMM | 每块均匀介质,格林函数简单,精度稳 |
| 有局部高介电常数区域 | QMM | 可把高介电区域单独切块,避免全场加密 |
| 内存受限 | 直接 BEM + 快速算法 | QMM 的未知数膨胀会抵消部分加速收益 |
4.3 悬浮金属填充的自由度消去
化学机械抛光后的版图里有大量悬浮金属填充(dummy fill),它们不接任何网络,电位未知但总电荷为零。直接把它们当普通导体处理会引入额外的未知电位,而且这些填充块之间、填充块与走线之间的耦合会让矩阵规模暴涨。
处理办法是把悬浮块的电位作为附加未知量,同时补一个电荷守恒约束:每个悬浮块的总电荷 $\sum_j q_j = 0$。这样方程数和未知数仍然匹配,但矩阵结构变成鞍点形式,条件数变差。书里给的做法是对悬浮块做自由度消去:先把悬浮块内部的电荷用其电位表达,再代入电荷守恒式,得到一个只含悬浮块电位的缩聚方程,规模等于悬浮块数量,远小于面元数。
实现时的关键是把悬浮块的面元分组,同一个块的面元共享一个电位未知量。分组信息来自版图的金属层连通性分析,这一步如果做错,把两个不相连的块并成一个,电荷守恒就约束错了,算出来的电容会系统性偏小。
还有一个坑:悬浮块数量多的时候,缩聚后的稠密块可能变成新的瓶颈。常见做法是对缩聚块再用一次低秩压缩,或者把悬浮块按空间位置聚簇,簇内直接消去,簇间用迭代。书里对这部分给了数值结果,悬浮块从几百到几千的规模,消去后求解时间基本线性增长。
4.4 系数矩阵组织与预条件:扩展 Jacobi 与 MN
多介质加悬浮块之后,系数矩阵是分块结构:导体-导体块、导体-界面块、界面-界面块、悬浮块耦合块。分块 Jacobi 预条件就是把每个对角块单独求逆,用块内求解代替全局求解。
扩展 Jacobi 比普通 Jacobi 多做了一步:把近场耦合也纳入对角块,相当于用更大的块做预条件,收敛更快但构造更贵。MN 预条件则是利用近场块的稀疏近似,构造一个近似逆,对界面密集的结构效果明显。
我自己的取舍标准是:面元数低于两万,用块 Jacobi 足够;超过五万且界面占比高,才值得上 MN。预条件不是越复杂越好,构造时间经常比它省下的迭代时间还长。
5. 避坑与排查:五条从公式到代码的血泪记录
5.1 电容矩阵不对称,非对角元符号乱跳
现象:算出来的电容矩阵 $C_{ij} \neq C_{ji}$,差 5%~20%,而且非对角元有的正有的负。
原因:两种可能。一是后处理时电荷积分的方向搞反了,面元法线朝内,积分出来电荷符号整体翻转;二是求解时只给导体加电压,忘了把其余导体接地,右端项设置错误。电容矩阵按定义应该对称,不对称一定是实现问题,不是数值误差。
解决:先检查法线一致性,所有面元法线必须指向求解域外;再检查每个右端项是否只在一个导体上设 1V、其余设 0V。我习惯在组装完矩阵后立刻做一次对称性检查,$\max|C_{ij}-C_{ji}|/\max|C_{ij}|$ 超过 $10^{-3}$ 就停下来查,不要等到跑完整个版图。
5.2 介质界面电荷符号反了,电容偏大一倍
现象:两层介质结构,算出来的电容正好是解析值的两倍左右,而且介质常数比越大偏差越明显。
原因:界面条件写成 $\varepsilon_1 q_1 - \varepsilon_2 q_2 = 0$,但 $q_1$、$q_2$ 是按各自外法线定义的,两个外法线方向相反,正确的形式应该是 $\varepsilon_1 q_1 + \varepsilon_2 q_2 = 0$。符号一错,界面等效电荷变成同号叠加,电容就翻倍。
解决:在代码里显式记录每个界面面元的法线方向,组装前打印一行「界面两侧 $\varepsilon q$ 之和」,正常情况下应该接近零。这个检查只花几秒钟,能省掉半天排查。
5.3 ACA 容差调小,误差却不降
现象:把 ACA 容差从 $10^{-3}$ 调到 $10^{-6}$,电容结果和直接法的偏差仍然停在 $10^{-2}$ 量级,不动。
原因:误差来源不在远场压缩,而在近场积分。面元自作用项的解析公式系数写错、或者近场自适应细分不够,都会引入固定偏差,跟 ACA 容差无关。另一种可能是面元网格本身太粗,离散误差主导。
解决:做一次分层验证——先把 ACA 关掉,全用直接法算小规模算例,和解析解比;如果直接法就偏,问题在积分或网格;如果直接法准、开了 ACA 才偏,再调容差。定位到哪一层再动手,别一上来就调容差。
5.4 悬浮金属导致矩阵奇异,迭代不收敛
现象:加入 dummy fill 之后,GMRES 残差降到 $10^{-2}$ 就卡住,重启多少次都不动。
原因:悬浮块的电位没有唯一解——所有悬浮块同时加一个常数电位,物理状态不变,矩阵存在零空间。如果没有显式施加电荷守恒约束,或者约束加在了错误的块上,矩阵就奇异。
解决:确认每个悬浮块都有对应的 $\sum q = 0$ 约束,且约束行与电位未知量的列一一对应;再检查是否有孤立的面元没有被分到任何悬浮块。实际调试时可以把悬浮块全部去掉跑一遍,能收敛就说明问题出在约束上。
5.5 单位制混用,结果差三个数量级
现象:电容值算出来是 $10^{-15}$ 量级还是 $10^{-18}$ 量级,全看当天心情。
原因:几何用 μm,介电常数用 F/m,格林函数里的 $1/(4\pi\varepsilon)$ 没有换算,长度单位没统一。BEM 的核函数对长度单位极其敏感,μm 和 m 混用就是 $10^6$ 的差别。
解决:在程序入口强制统一到国际单位制,几何读入后立刻乘 $10^{-6}$,所有中间量都按米算,输出前再换算成 fF 或 pF。我现在的习惯是变量名带单位后缀,length_m、eps_r、cap_F,看到不带后缀的浮点数就警惕。
6. 把书里的算例变成自测:三个基准与一份误差表
书里的数值结果没法直接复现,因为原始几何和网格没有随书发布。但可以自己构造解析解已知的基准,用来校验自己写的求解器或者评估商业工具。我常用三个:平行板、同轴电缆、两根平行圆导线。
import numpy as np EPS0 = 8.8541878128e-12 # 真空介电常数,F/m def parallel_plate(area_m2, gap_m, eps_r=1.0): """平行板电容:C = eps0 * eps_r * A / d""" return EPS0 * eps_r * area_m2 / gap_m def coaxial(length_m, r_in_m, r_out_m, eps_r=1.0): """同轴电缆电容:C = 2*pi*eps0*eps_r*L / ln(b/a)""" return 2 * np.pi * EPS0 * eps_r * length_m / np.log(r_out_m / r_in_m) def twin_wire(length_m, radius_m, spacing_m, eps_r=1.0): """两根平行圆导线:C = pi*eps0*eps_r*L / arcosh(D/(2a))""" return np.pi * EPS0 * eps_r * length_m / np.arccosh(spacing_m / (2 * radius_m)) # 基准一:1 mm^2 平行板,间距 1 um,介质 eps_r = 4 c1 = parallel_plate(1e-6, 1e-6, 4.0) # 基准二:长 1 mm 同轴,内径 5 um,外径 20 um c2 = coaxial(1e-3, 5e-6, 20e-6, 4.0) # 基准三:长 1 mm 双线,半径 2 um,中心距 20 um c3 = twin_wire(1e-3, 2e-6, 20e-6, 4.0) print(f"parallel plate: {c1*1e15:.3f} fF") print(f"coaxial: {c2*1e15:.3f} fF") print(f"twin wire: {c3*1e15:.3f} fF")这段代码只做一件事:给出解析值。参数说明很直接,area_m2、gap_m、length_m、radius_m全部按米传入,eps_r是相对介电常数。输出的单位统一乘 $10^{15}$ 转成 fF,方便和提取工具的结果直接对比。
有了解析值,就可以拿自己的 BEM 程序跑同样几何,填一张误差表。我自己的经验数据大致是这样:
| 基准 | 面元数 | 相对误差(间接 BEM) | 相对误差(直接 BEM) | 备注 |
|---|---|---|---|---|
| 平行板 | 200 | 0.8% | 0.3% | 边缘效应导致偏大,加密后收敛 |
| 同轴电缆 | 400 | 1.5% | 0.5% | 圆柱面用四边形面元逼近 |
| 双线 | 600 | 2.2% | 0.9% | 两线最近处需局部加密 |
误差来源主要是边缘和近场的离散误差,不是求解器本身。判断标准是:面元加密一倍,误差应该按一阶或二阶下降;如果误差不降反升,说明积分公式或者奇异性处理有问题。
最后一个技巧是关于验证顺序的。我以前图省事,直接拿一个复杂版图跑,结果和工具对不上,花了两天逐层排查,最后发现是介质栈里一层的介电常数抄错了一个小数点。从那以后我每次搭新模型,都强制走一遍「平行板 → 同轴 → 双线 → 单根实际走线 → 完整版图」的五级验证,每级都和解析解或上一级结果对齐,误差超阈值就不往下走。这个习惯听起来笨,但它把「黑匣子对不上账」变成了「第几级出问题」,排查时间从两天压到半小时。希望帮到你。
本文还有配套的精品资源,点击获取