开放域波动(PML 与端口)¶
开放域上的频域波动问题除了 复数值有限元方法 — Helmholtz 中介绍的复值亥姆霍兹装配之外,还需要两个要素:在边界上驱动和吸收波的方法(端口 / 一阶吸收边界条件),以及吸收 outgoing 辐射而不产生反射的完全匹配层(PML)。两者均以小型、可组合算子的形式提供:
robin_operator()/port_source()—— 罗宾 / 阻抗 / 平面波端口条件的边界矩阵 \(\int_\Gamma c\,N_iN_j\,\mathrm dS\) 和入射载荷,基于FacetBilinearAssembler构建(FacetAssembler的双线性对应物);cartesian_pml()—— 拉伸坐标 PML 张量 \(\mathbf\Lambda\) 及质量缩放,供AnisotropicLaplaceElementAssembler和ScaledMassElementAssembler使用。
examples/wave/ 中的两个完整示例展示了它们的用法 —— 一个通过端口驱动的声学谐振器,以及一个包裹在 PML 框架中的光子微盘。
亥姆霍兹谐振器(声学,端口)¶
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 修正的亥姆霍兹方程
其中层外 \(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 框架吸收辐射场。¶
图 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)。
下一步¶
复数值有限元方法 — Helmholtz —— 这些算子所基于的复值装配。
声子晶体(布洛赫-弗洛凯) —— 周期性对应物(布洛赫-弗洛凯边界条件取代吸收边界条件)。
模态分析 —— 本征模态而非受迫响应。
FacetBilinearAssembler详见 API 参考 —— 编写您自己的边界双线性形式(阻抗、辐射阻尼等)。