开放域波动(PML 与端口)

开放域上的频域波动问题除了 复数值有限元方法 — Helmholtz 中介绍的复值亥姆霍兹装配之外,还需要两个要素:在边界上驱动和吸收波的方法(端口 / 一阶吸收边界条件),以及吸收 outgoing 辐射而不产生反射的完全匹配层(PML)。两者均以小型、可组合算子的形式提供:

examples/wave/ 中的两个完整示例展示了它们的用法 —— 一个通过端口驱动的声学谐振器,以及一个包裹在 PML 框架中的光子微盘。

亥姆霍兹谐振器(声学,端口)

examples/wave/helmholtz_resonator/helmholtz_resonator.py 求解一个带有颈缩侧腔的二维管道 —— 经典的亥姆霍兹谐振器 —— 由入口处的平面波端口驱动。所有壁面均为刚性(自然诺伊曼边界条件);端口同时注入入射波并吸收反射波:

\[\frac{\partial p}{\partial n} + i k\, p = 2 i k\, p_0 \quad\text{在 } \Gamma_{\text{port}} \text{ 上}。\]

在弱形式中,这对应于常规刚度/质量矩阵对之上增加的一个边界矩阵和一个边界载荷 —— 整个实现仅需四行代码:

列表 12 examples/wave/helmholtz_resonator/helmholtz_resonator.py(核心部分)
from tensormesh import robin_operator, port_source

K = LaplaceElementAssembler.from_mesh(mesh)(points)
M = MassElementAssembler.from_mesh(mesh)(points)
B = robin_operator(mesh, inlet_mask)          # boundary mass on the port
e = port_source(mesh, inlet_mask)             # incident load

A = K - k**2 * M + 1j * k * B
p = A.solve(2j * k * p0 * e)                  # complex sparse solve

扫描频率并读取入口处的输入阻抗 \(Z(f) = p_{\text{avg}} / u_{\text{in}}\),即可得到谐振谱;基频位于 357 Hz,腔体压力增益约为入射幅值的 12 倍。

亥姆霍兹谐振器在谐振时的压力场与声压级

图 46 谐振时的声场:总压力(上)和声压级(下)。腔体以近乎均匀的高压振荡,而管道保持安静 —— 经典的压力节线横贯颈部。

频率扫描的输入阻抗

图 47 扫描过程中的输入阻抗 \(|Z|/Z_0\) —— 亥姆霍兹谐振和管道谐波表现为峰值,其间存在反谐振点。

光学环形谐振器(光子学,PML)

examples/wave/optical_ring_resonator/optical_ring_resonator.py 是一个二维 TM 光子学求解:硅总线波导通过倏逝耦合将光导入硅微盘(\(n = 3.48\)),周围为二氧化硅包层(\(n = 1.44\)),拉伸坐标 PML 框架使计算域表现为开放域。面外电场 \(E_z\) 服从 PML 修正的亥姆霍兹方程

\[\nabla\cdot(\mathbf\Lambda\,\nabla E_z) + k_0^2\,\varepsilon_r\, s_x s_y\, E_z = \text{source}, \qquad \mathbf\Lambda = \operatorname{diag}(s_y/s_x,\ s_x/s_y),\]

其中层外 \(s_x = s_y = 1\)。可复用的库调用路径仅需三次调用:

from tensormesh import cartesian_pml, AnisotropicLaplaceElementAssembler
from tensormesh.assemble import ScaledMassElementAssembler

Lam, s_prod = cartesian_pml(mesh.points, bounds=[(0, L), (0, L)], thickness=d)
K = AnisotropicLaplaceElementAssembler.from_mesh(mesh)(pts, point_data={"A": Lam})
M = ScaledMassElementAssembler.from_mesh(mesh)(pts, point_data={"c": eps_r * s_prod})
E = (K - k0**2 * M).solve(source)

(该示例本身通过内联装配器逐求积点计算 \(\varepsilon_r\) 和拉伸函数,以获得更锐利的 Si/SiO₂ 界面;cartesian_pml 路径复现了相同的算子,并与二维汉克尔格林函数的相关性达到 0.994。)模态软源以定向方式将导波总线模式发射向微盘。

谐振时的波导耦合硅微盘

图 48 谐振时,微盘在耳语廊模式中点亮 —— 明亮的方位角瓣环(左:\(\mathrm{Re}\,E_z\),右:\(|E_z|\)),总线波导在耦合点之后明显衰减,PML 框架吸收辐射场。

光学示例的材料、发射平面与 PML 框架

图 49 设置:材料、双向定向发射平面以及 PML 框架。若无 PML,硬壁边界会将辐射囚禁为驻波,幅值约为原来的 8 倍。

运行示例

cd examples/wave/helmholtz_resonator && python helmholtz_resonator.py
cd examples/wave/optical_ring_resonator && python optical_ring_resonator.py

两者均提供返回诊断信息的 run_demo(...) 函数,以及 --no-plot / --output 标志;光学脚本还接受 --lam0-nm--order--mesh-h-nm(使用 P1 单元时,数值色散会将物理 1.55 µm 的谐振蓝移至默认的 1512 nm)。

下一步