# 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 的目标：

1. **匹配**：波从物理域进入 PML 时反射尽量为 0（“完美匹配”）。
2. **吸收**：波在 PML 内沿拉伸方向指数衰减。
3. **外截断**：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`）写法：

```matlab
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`：

```matlab
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 块非对角）
```

要点：

1. 在 \((\rho,\phi)\) 下 \(\Lambda\) 对角；
2. 变到 \((x,y)\) 后出现交叉项 \(xy\)；
3. 每个高斯点用该点的 \(\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 时：

1. **网格**：外层增加 PML 壳体（面/棱/角分区），JSON/`domain` 能识别 PML 区域。
2. **材料**：在体积分点，若属于 PML，按坐标算 \(s_x,s_y,s_z\)，得到 \(\boldsymbol{\Lambda}\)，再 \(\varepsilon\leftarrow\varepsilon\Lambda\)，\(\mu\leftarrow\mu\Lambda\)。
3. **组装**：沿用现有 curl-curl 弱形式；PML 单元用复张量材料即可。
4. **边界**：PML 最外表面用 PEC（或现有简单条件）；开放方向用 PML 替代或与 SBC 分工（例如：侧向 PBC，纵向 PML）。
5. **验证**：平面波/点源，看物理域驻波是否消失、PML 内场衰减、与 COMSOL 对比。

优先实现顺序建议：

1. 2D 矩形公式理解透（本指南 + `FemAssemble.m`）；
2. 3D 单轴面 PML（只有 \(\pm z\)）；
3. 完整盒式（含棱、角）；
4. 再考虑 CFS-PML 等改进。

---

## 9. 常见误区

1. **以为 PML 是边界条件** — 它是体层 + 材料，不是单纯边界积分。  
2. **只改 \(\varepsilon\) 不改 \(\mu\)** — 匹配会破坏，反射变大。  
3. **PML 太薄 / 网格太稀** — 理论再完美也会数值反射。  
4. **\(R_0\) 盲目加大** — 剖面过陡 → 色散/病态。  
5. **角区漏标** — 角上必须多方向同时拉伸，否则角反射明显。  
6. **和 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. 读完本文件第 1–6、10 节。  
2. 对照 `PML公式汇总.docx` + `FemAssemble.m` 推一遍 \(S_x,\Lambda\)。  
3. 跑 `FemRectanglePML.m`，改 \(m,R_0,d\) 看场图变化。  
4. 选读 Chew 复数拉伸 / 3D PML 两篇。  
5. 设计 OpticsFEM：domain 标记 + 积分点 \(\Lambda(x,y,z)\)。

---

## 12. 术语速查

| 术语 | 含义 |
|------|------|
| PML | 完美匹配层 |
| ABC | 吸收边界条件（表面型近似） |
| CFS-PML | 复数频移 PML（改善低频/掠入射等） |
| 拉伸因子 \(s\) | 复数坐标映射的导数 |
| \(\Lambda\) | 把拉伸写成材料各向异性的张量 |
| \(R_0,d,m\) | 强度、厚度、剖面阶次 |
| 匹配 | \(\varepsilon,\mu\) 同变换，界面理论零反射 |

---

*文档目的：把本文件夹中的分散知识点收成一条可执行的理解路径，便于后续在 3D OpticsFEM 中实现笛卡尔盒式 PML。*
