# 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。*