10 KiB
PML 理解指南
面向:将频域有限元光学仿真(OpticsFEM)扩展到 PML 吸收边界。
材料来源:本目录 2022-11 PML&&ABC 中的公式汇总、二维 MATLAB/COMSOL 示例,以及相关文献。
1. 一句话结论
PML(Perfectly Matched Layer,完美匹配层)是一种“体吸收层”:在计算域外侧铺一层特殊区域,让向外传播的波几乎无反射地进入并在层内衰减;在频域 FEM 里,它通常不改弱形式结构,只把该区域的 \varepsilon,\mu 换成各向异性复数张量。
和你已有边界对比:
| 类型 | 作用位置 | 本质 |
|---|---|---|
| ABC | 外表面 | 近似吸收边界条件 |
| SBC(散射边界) | 边界面积分 | 一阶/高阶辐射条件近似 |
| PML | 体积区域 | 复数坐标拉伸 → 等效材料 |
PML 一般比简单 ABC/SBC 反射更小,尤其适合宽角度、开放域散射;代价是:多一层网格、材料变复张量、参数需要调。
2. 为什么需要 PML?
开放域问题(散射、天线、波导辐射)的真实物理域是无限的,计算机只能算有限区域。硬截断(PEC/PMC)会把出射波反射回来污染解。
PML 的目标:
- 匹配:波从物理域进入 PML 时反射尽量为 0(“完美匹配”)。
- 吸收:波在 PML 内沿拉伸方向指数衰减。
- 外截断:PML 外侧仍用 PEC 等简单条件;因为场已衰减,反射可忽略。
Berenger(1994)最早提出分裂场 PML;Chew 等人用复数坐标拉伸统一解释,并推广到 3D,这正是 FEM 最常用的视角。
3. 核心思想:复数坐标拉伸
3.1 直观理解
普通坐标 x 是实数。在 PML 里把法向坐标改成复数:
\tilde{x} = \int^{x} s_x(x')\,dx'
其中拉伸因子 s_x 带虚部。平面波 e^{-jkx} 变成 e^{-jk\tilde{x}},虚部使振幅沿传播方向指数衰减,而阻抗匹配保证界面无反射。
3.2 频域 Maxwell 的等价写法
在拉伸坐标系里写 Maxwell,再映回原坐标,等价于:原方程形式不变,但材料变成
\boldsymbol{\varepsilon}' = \varepsilon\,\boldsymbol{\Lambda},\qquad
\boldsymbol{\mu}' = \mu\,\boldsymbol{\Lambda}
\boldsymbol{\Lambda} 由各方向的 s_x,s_y,s_z(以及几何:笛卡尔/柱坐标)决定。
\varepsilon 与 \mu 乘同一个 \Lambda:波阻抗不变 → 匹配;虚部 → 损耗。
3.3 与变换光学的关系
变换光学说:坐标变换可用材料张量等效。PML 是“把实空间映射到复数空间”的特例。因此:
- 矩形 PML:单轴拉伸,
\Lambda对角; - 圆/柱 PML:先极坐标拉伸,再转到笛卡尔,
\Lambda一般非对角。
推导时用到雅可比矩阵;本目录的 .nb 和《变换光学硕士论文内容汇总》就是在练这件事。
4. 矩形(笛卡尔)PML —— 优先掌握
对 OpticsFEM 的盒状计算域,3D 盒式笛卡尔 PML 最实用。先把 2D 矩形搞懂即可推广。
4.1 单方向(例如只在 +x 侧)
设 PML 从 x=x_0 开始,厚度为 d,多项式阶次为 m,则常见形式:
s_x(x) = 1 - j\,\left(\frac{x-x_0}{d}\right)^{m}\frac{(m+1)R_0}{2\,d\,k_0}
本目录 MATLAB(FemAssemble.m)写法:
Sx = 1 - 1i*((averX-x0)/d)^m * (m+1)*R0/(2*d*k0);
Lambda = [1/Sx, 0, 0;
0, Sx, 0;
0, 0, Sx];
eps' = eps * Lambda;
mu' = mu * Lambda;
含义:
- 只拉伸
x方向; \Lambda = \mathrm{diag}(1/s_x,\, s_x,\, s_x)(2D TE/边元写法里常出现这种对角结构);- 物理域
s_x=1,\Lambda=\mathbf{I}。
4.2 三维盒式 PML(实现时要记住)
3D 中每个方向独立拉伸 s_x,s_y,s_z(角点、棱边多方向同时非 1):
\boldsymbol{\Lambda} =
\begin{pmatrix}
s_y s_z / s_x & 0 & 0 \\
0 & s_x s_z / s_y & 0 \\
0 & 0 & s_x s_y / s_z
\end{pmatrix}
- 面中心:只有一个
s\neq 1; - 棱:两个
s\neq 1; - 角:三个
s\neq 1。
网格分区时必须把 PML 面/棱/角 标成不同 domain,或在单元积分点按坐标判断落在哪一类区域,再算对应的 s_x,s_y,s_z。
4.3 参数直觉
| 参数 | 含义 | 调参经验 |
|---|---|---|
d |
PML 厚度 | 通常 \sim 0.5\lambda\sim 1\lambda 或若干层单元 |
m |
电导剖面阶次 | 常取 2~4;太大则陡峭难分辨 |
R_0 |
理论反射相关强度 | 越大吸收越强,过大可能数值病态 |
k_0=2\pi/\lambda |
波数 | 进入 s 的无量纲化 |
经验:先保证厚度够、网格在 PML 内有几层,再调 R_0,m。
5. 圆形(柱)PML —— 理解即可
圆形计算域时,沿径向 \rho 拉伸。本目录 FemAssemble3.m:
sigma = ((rho-rho0)/d)^2 * R0/(d*k0);
s1 = 1 - 1i*(d/(2*rho))*sigma; % 与角向相关的因子
s2 = 1 - 1i*sigma; % 径向拉伸
aa = s1/s2; bb = s2/s1; cc = s1*s2;
% Lambda:极坐标对角张量 → 转到笛卡尔 (x,y) 的 3×3 矩阵(xy 块非对角)
要点:
- 在
(\rho,\phi)下\Lambda对角; - 变到
(x,y)后出现交叉项xy; - 每个高斯点用该点的
\rho计算(材料随空间变化)。
若你的 3D 域是矩形盒子,先不必实现圆 PML;公式用来加深“拉伸 → \Lambda”的理解。
6. 频域 FEM 里 PML 怎么进方程
矢量 Helmholtz / 边元弱形式(示意):
\int_\Omega
(\nabla\times\mathbf{N})\cdot\mu_r^{-1}(\nabla\times\mathbf{E})
- k_0^2\,\mathbf{N}\cdot\varepsilon_r\mathbf{E}\,dV
= \text{右端(源/边界)}
PML 区域只需:
\varepsilon_r \leftarrow \varepsilon_r\boldsymbol{\Lambda},\qquad
\mu_r^{-1} \leftarrow (\mu_r\boldsymbol{\Lambda})^{-1}
本目录组装(FemAssemble.m)对应:
S_{ij}=\int (\nabla\times N_i)\cdot\mu'^{-1}(\nabla\times N_j),\quad
T_{ij}=-k_0^2\int N_i\cdot\varepsilon' N_j
因此:弱形式、基函数、自由度编号可以不动;改的是材料求值。
外边界仍可加 PEC/Dirichlet;PML 外侧场应已很小。
7. 本目录代码怎么对照读
7.1 矩形示例(建议先跑通)
| 文件 | 作用 |
|---|---|
FemRectanglePML.m |
主程序:读 COMSOL 网格 → 组装 → 求解 → 画场 |
FemAssemble.m |
矩形 PML 核心:domain==2 时构造 S_x,\Lambda |
demo.mph |
带分区的网格/模型 |
阅读线索:domain 区分物理域与 PML → 算 S_x → \varepsilon',\mu' → 仍组装 S+T。
7.2 圆形示例
| 文件 | 作用 |
|---|---|
FemCirclePML.m / FemCirclePML2.m |
主程序 |
FemAssemble3.m / FemAssemble2.m |
圆 PML:\sigma,s_1,s_2,\Lambda |
demo2.mph / demo3.mph |
圆形分区模型 |
7.3 辅助
BF_Et.m、BF_curlEt.m、GetGuassPoints.m:边元与积分;
GetExEy.m、plotEt.m:后处理看波是否在层内衰减、物理域是否干净。
7.4 文档与文献(需要时回查)
| 材料 | 何时看 |
|---|---|
PML公式汇总.docx |
查 s,\Lambda 公式 |
二维矩形有限元PML.docx |
矩形推导与实现说明 |
二维圆有限元PML.docx |
圆域推导 |
变换光学硕士论文内容汇总.docx + .nb |
坐标变换推导 |
| Chew:complex stretching / 3D PML | 理论根源 |
| Berenger 1994 | 历史与原始思想 |
lec06_*.pdf |
课堂式扫盲 |
8. 和 OpticsFEM(你的 C++ 工程)怎么衔接
你现有能力大致是:体组装 + SBC 面积分 + PBC 等。接入 PML 时:
- 网格:外层增加 PML 壳体(面/棱/角分区),JSON/
domain能识别 PML 区域。 - 材料:在体积分点,若属于 PML,按坐标算
s_x,s_y,s_z,得到\boldsymbol{\Lambda},再\varepsilon\leftarrow\varepsilon\Lambda,\mu\leftarrow\mu\Lambda。 - 组装:沿用现有 curl-curl 弱形式;PML 单元用复张量材料即可。
- 边界:PML 最外表面用 PEC(或现有简单条件);开放方向用 PML 替代或与 SBC 分工(例如:侧向 PBC,纵向 PML)。
- 验证:平面波/点源,看物理域驻波是否消失、PML 内场衰减、与 COMSOL 对比。
优先实现顺序建议:
- 2D 矩形公式理解透(本指南 +
FemAssemble.m); - 3D 单轴面 PML(只有
\pm z); - 完整盒式(含棱、角);
- 再考虑 CFS-PML 等改进。
9. 常见误区
- 以为 PML 是边界条件 — 它是体层 + 材料,不是单纯边界积分。
- 只改
\varepsilon不改\mu— 匹配会破坏,反射变大。 - PML 太薄 / 网格太稀 — 理论再完美也会数值反射。
R_0盲目加大 — 剖面过陡 → 色散/病态。- 角区漏标 — 角上必须多方向同时拉伸,否则角反射明显。
- 和 SBC 混用时职责不清 — 同一方向不要又厚 PML 又强 SBC 却不做对比验证。
10. 最小心智模型(背下来即可动手)
出射波 → 进入 PML 层(无反射匹配)
→ 复数拉伸方向上指数衰减
→ 外边界反射被压到可忽略
数学: s(x) 复数拉伸
实现: ε' = ε Λ(s), μ' = μ Λ(s)
FEM: 弱形式不变,只换材料
矩形单轴(记忆版):
s_x = 1 - j\left(\frac{x-x_0}{d}\right)^m C,\quad
\Lambda=\mathrm{diag}\!\left(\frac{1}{s_x},\,s_x,\,s_x\right)
3D 完整版用 s_x,s_y,s_z 填对角 \Lambda(见第 4.2 节)。
11. 建议自学顺序(压缩版)
- 读完本文件第 1–6、10 节。
- 对照
PML公式汇总.docx+FemAssemble.m推一遍S_x,\Lambda。 - 跑
FemRectanglePML.m,改m,R_0,d看场图变化。 - 选读 Chew 复数拉伸 / 3D PML 两篇。
- 设计 OpticsFEM:domain 标记 + 积分点
\Lambda(x,y,z)。
12. 术语速查
| 术语 | 含义 |
|---|---|
| PML | 完美匹配层 |
| ABC | 吸收边界条件(表面型近似) |
| CFS-PML | 复数频移 PML(改善低频/掠入射等) |
拉伸因子 s |
复数坐标映射的导数 |
\Lambda |
把拉伸写成材料各向异性的张量 |
R_0,d,m |
强度、厚度、剖面阶次 |
| 匹配 | \varepsilon,\mu 同变换,界面理论零反射 |
文档目的:把本文件夹中的分散知识点收成一条可执行的理解路径,便于后续在 3D OpticsFEM 中实现笛卡尔盒式 PML。