303 lines
10 KiB
Markdown
303 lines
10 KiB
Markdown
# 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。*
|