如果你在接触硅光子学或者集成光学,环形谐振器(Ring resonator)大概率是你绕不开的一个结构。无论是滤波、调制还是传感,它的身影无处不在。而 Lumerical 作为光子学仿真领域最常用的工具之一,官方正好提供了一个完整的环形谐振器案例,适合拿来做 FDTD(时域有限差分法)学习的进阶练习。
这篇博文是这个学习系列的第三篇,聚焦在环形谐振器案例的第一部分。我会按实际做项目时的顺序来走一遍:从物理原理到几何建模,从网格设置到光源监视器配置,最后聊一下第一轮仿真跑完的预期结果和常见问题排查。如果你已经跑通了 Lumerical 的基础例子(比如直波导、弯曲波导),想进一步弄清楚谐振器件是怎么一回事,这篇文章应该能帮你少走不少弯路。
1. 为什么要拿环形谐振器当“系列第三篇”的练手目标
1.1 环形谐振器是光子集成里的基础元件
先聊点实际的。环形谐振器在硅光子学里的地位,差不多相当于“滤波器+开关+传感器”三合一。它的结构不复杂,一根直波导旁边放一个环形波导,两者之间留一条窄缝;可是物理过程一点都不简单,涉及模式耦合、相位积累、谐振增强、Q值、自由光谱范围等一系列概念。
如果你只仿真过一根直波导,那你看到的只是光顺着波导走,透射率接近100%。但加上一个环之后,情况就变了:某些波长的光会被“吸”进环里,在环内反复绕圈,直波导输出端对应波长的光强会明显掉下去。这种波长选择性行为就是滤波器的核心。
对做仿真的人来说,环形谐振器是一个特别理想的 FDTD 练手对象,因为它在小尺寸内浓缩了多种物理效应,而且结果对网格、边界、光源设置都非常敏感。仿真结果和理论预期能不能对上,直接反映你对 FDTD 基本操作的掌握程度。
1.2 这个案例到底在验证什么物理现象
这个案例涉及的原理可以用一句话讲清楚:光在环形波导中传播一圈的光程,如果正好等于波长的整数倍,就会形成谐振增强。写成公式就是:
[ 2\pi R \cdot n_{eff} = m\lambda ]
其中 ( R ) 是环半径,( n_{eff} ) 是模式的有效折射率,( m ) 是整数,( \lambda ) 是真空波长。满足这个条件时,环内的光强会累积增强,而直波导总线中对应波长的光会被耦合到环中,导致直通端透射谱出现凹陷。
这个案例里会用 FDTD 做一次宽谱脉冲仿真,输入一个时间短脉冲(覆盖较宽的波长范围),然后通过监视器收集时域信号,再经过傅里叶变换得到频域透射响应。这样做的好处是一次仿真就能获得整个波段的透射谱,不需要逐波长扫。
1.3 先从官方案例的目录结构开始认识项目
Lumerical 官方实例库里的 Ring resonator 案例,文件组织方式分几个模块:几何结构脚本、材料设置、光源与监视器配置、参数扫描脚本(通常在第二部分),以及后处理分析脚本。第一部分的重点通常放在搭建几何模型、配置 FDTD 求解器、运行基础透射谱仿真。
一个实用的学习建议:不要直接双击打开文件然后点运行,而是先打开 Lumerical 的脚本编辑器,一行一行过。这个案例的脚本文件本身就是最好的“项目文档”,每一行都对应一个建模动作。你先读脚本,再回到 GUI 里对照操作,比自己漫无目的地点鼠标高效得多。
2. 几何建模阶段:先把结构尺寸和耦合区搭对
2.1 波导、间隙、半径这些核心尺寸怎么定
几何建模是一个仿真项目的基石。对环形谐振器而言,最关键的尺寸参数有四个:直波导宽度、环形波导宽度、耦合间隙(gap)、环半径。官方案例里这些参数通常在脚本顶部定义成变量,方便后续参数扫描。
以下是常见的典型取值:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 波导宽度(w) | 500 nm | 保证1550nm附近单模传输,过高会引入多模 |
| 环半径(R) | 5 μm(也常见2~10 μm) | 半径决定 FSR 和弯曲损耗 |
| 耦合间隙(gap) | 100~200 nm | 间隙越小耦合越强,但过小会带来加工和网格难题 |
| 仿真波长范围 | 1500~1600 nm | 覆盖 C 波段,便于观察谐振峰 |
波导宽度取 500nm 是有讲究的。在绝缘体上硅(SOI)平台,硅芯层厚度通常为220nm,这个截面下500nm宽度能维持横向单模传输,避免多模干涉把谐振谱搞复杂。如果你用更宽的波导,比如800nm以上,高次模会参与耦合,透射谱波形会发生明显畸变。
间隙的选择也很有趣。它越小,直波导与环之间的倏逝波耦合越强,透射谱的凹陷越深。但是间隙太小,比如50nm左右,FDTD网格稍微粗一点就容易出现数值耦合误差,导致仿真结果偏离实际物理。建议第一部分先用150nm左右的标准值跑通流程,再后面扫描参数。
2.2 材料与衬底设置
材料部分是仿真里容易被忽略但很重要的一环。Lumerical 的材料库中可以直接调用硅(Si)、二氧化硅(SiO2)等标准光学材料。硅在1550nm附近的折射率大约是3.476,而二氧化硅大约是1.444。这个折射率对比度很高,使得光场被强烈限制在硅波导中,弯曲半径可以做到很小而不产生显著辐射损耗。
在建立几何体时,有一个细节要注意:实际SOI结构中,硅波导下面是埋氧层(BOX),上面是空气或上包层。如果案例为了简化只设置了硅波导和衬底,你可以在 Material 属性里选择Si (Silicon) - Palik,衬底选择SiO2 (Glass) - Palik。如果做的是更完整的三层结构,记得把波导埋入SiO2层中,而不是悬浮在空气里。悬浮结构和带包层的结构,计算结果在有效折射率上会有细微差异,可能影响谐振波长的位置。
材料设置正确之后,最好做一次确认:切换视图到截面方向,检查波导和衬底的相对位置。我见过不少人做完几何体后,发现波导被错误地放到了衬底内部或者悬空,导致模式场分布不对,花了很多时间排查。
提示:Lumerical 里几何体的 z 轴位置要和材料层的堆叠顺序对应。建议用相对坐标而不是绝对坐标,比如把衬底上表面设在 z=0,波导中心放在 z=波导高度/2,这样调整尺寸时不容易出错。
2.3 建模完成后必须做的一次“自查”
几何建模阶段最怕的就是“看着对了,实际上错了”。我在刚开始学Lumerical时犯过一个经典错误:直波导和环形波导没有放在同一个高度平面上。从俯视图看一切正常,切换到三维视图才发现环在波导上方几百纳米处,两者根本没有物理接触,当然也不会有耦合。
所以每做完一个几何体,我建议你强制自己完成三步自查:
- 切换到三维视图,旋转视角检查结构空间位置是否正确;
- 在主截面(如 y-z 平面)查看波导的高度和层叠关系;
- 选中直波导和环,打开 Object Tree 里的属性面板,核对坐标数值。
这个自查流程看起来简单,但能帮你省下后面排查“结果不对”的绝大部分时间。物理结构对不上,后边的仿真设置再精细都是白搭。
3. FDTD仿真区域、网格和边界条件:多数运行报错的根源都在这
3.1 仿真区域范围怎么圈
FDTD方法是在一个有限区域里把麦克斯韦方程离散化后做时间步进的。仿真区域的大小直接决定了计算量和边界反射的干扰程度。这个案例的仿真区域不需要覆盖整个器件,而只需要覆盖耦合区域和一段直波导即可。
具体来说,仿真区域 x 方向要覆盖环形波导的外侧和直波导的内侧,留出至少 1~2 个波长的空间给 PML(完美匹配层)吸收边界。y 方向同理,直波导两端要伸出仿真区域一定距离,让模式光源和监视器有足够的位置。z 方向则包含衬底上部、波导层以及上方空气区域,通常取 1~2 μm 就够了。
还有一点,FDTD 仿真区域的边缘不能紧贴着波导结构。因为 PML 本身虽然能吸收电磁波,但需要一定距离才能发挥最佳效果。如果结构离边界太近,倏逝场会被边界扰动,导致透射谱出现波纹。一般来说,结构到 PML 的距离至少要有半个自由空间波长的距离。
3.2 网格精度与局部网格覆盖:计算精度和速度的平衡
网格设定是 FDTD 仿真的核心操作,没有之一。Lumerical 的默认网格是基于结构的非均匀网格,通过mesh accuracy参数控制整体精细度。这个参数从 1 到 8,数值越大网格越密,计算速度也越慢。
对于这个案例,我通常建议把mesh accuracy设置在 2~3。这不是说越高越好,而是考虑到内存和时间的性价比。硅波导内的模式场分布变化剧烈,但波导外的场变化相对平缓,全局加密会造成大量网格点浪费在不需要精细的地方。
更高效的做法是添加一个mesh override region,只把耦合区域和波导截面的网格局部加密。比如在直波导与环的耦合区设置一个尺寸为 800nm x 800nm(x-y平面)的小区域,网格步长设为 10~15 nm。这样能有效分辨耦合区域的倏逝场变化,又不至于让整个仿真区域都变得极密。
来算一笔账,假设仿真区域为 10μm x 10μm x 2μm,使用均匀 20nm 网格,网格点数量大约是 500 x 500 x 100 = 2500万个。如果是三维 FDTD,每个网格点需要存储若干电磁场分量,内存占用很快就会超过 8GB,计算时间也很可观。而局部加密后,同样宏观看粗网格,只有关键区域加密,整体计算量能下降好几倍。
3.3 边界条件选型与 PML
边界条件在 Lumerical 的 FDTD 求解器里通过boundary conditions设置,最常用的是 PML。PML 是一种人工吸收边界,它能吸收入射到边界上的电磁波而不产生反射。默认的 PML 参数一般足够用,但有一个细节值得注意:PML 的层数和吸收效率会影响低频/长波长成分的反射情况。
如果你仿真得到的透射谱在两端出现奇怪的振荡,而且你确认光源和监视器设置没问题,那就要怀疑是不是 PML 反射造成的。此时可以在 PML 设置里把层数从默认值调高,比如从 8 调高到 16,看看谱线振荡是否减弱。不过这对本篇第一部分的基础跑通来说不是重点,先知道这个排查方向就行。
除了 PML,某些对称结构可以用 symmetry boundary 来减半或四分之一化仿真区域。环形谐振器案例里,如果结构在 x-z 平面具有对称性,而光源的偏振模式也对称,就可以在 y 方向设置对称边界,这样能显著降低内存和计算时间。但是要提醒一句:对称性用对了能省一半资源,用错了会得到完全错误的结果。建议第一次跑通时先关掉对称性,确保结果无歧义,变熟悉后再尝试使用。
4. 模式光源和监视器:注入方式决定结果质量
4.1 模式光源怎么添加和验证
几何和网格都准备好之后,下一步就是给这个系统“注入光”。在 FDTD 仿真中,光源的类型有很多种,但在这个案例中应该使用mode source,因为它能按照指定的模式场分布向波导中注入光。
模式光源的原理是:先在一个垂直于传播方向的截面上,用 FDE(有限差分特征模)求解器计算波导的导模场分布,然后用这个场分布作为初始激励。这样做的好处是,你注入的光就是波导真正支持的局域模式,而不是一块均匀光斑,后者会在波导中激发大量辐射模,导致结果很难解释。
添加模式光源的步骤一般是:在直波导的输入端创建一个二维光源平面,选择Mode类型,设置光源中心的位置、方向、波长范围。Lumerical 会提示你运行一次模式计算,选择你要注入的模式阶数。对于 500nm 宽的直波导,基模是 TE 模(电场主要在水平方向),通常选择模式阶数 0。
这里有一个新手经常踩的坑:模式光源平面的位置不能太靠近波导末端或结构突变处,不然模式的边界条件会受影响。最稳妥的做法是,把光源放在离耦合区域至少 2~3 μm 的上游位置,让光在被耦合进环之前已经演化为稳定的波导模式。
4.2 透射监视器与场监视器的布局
监视器是收集仿真结果的工具。FDTD 时域仿真最终输出的是电磁场随时间的变化,而我们需要的是频域响应,所以 Lumerical 会通过傅里叶变换把时域信号转换为频域数据。监视器的本质是记录某个平面或体积上的场信息。
在这个案例中,至少要设置以下监视器:
| 监视器类型 | 放置位置 | 作用 |
|---|---|---|
| 透射监视器(Transmission) | 直波导输出端,距离耦合区足够远 | 计算输出功率透射谱 |
| 场分布监视器(Frequency-domain field profile) | 耦合区域上方或内部 | 观察谐振模式分布 |
| 反射监视器(可选) | 光源后方 | 查看反射率,判断器件回波 |
透射监视器的核心理念是功率归一化。它的输出并非绝对功率,而是经过归一化的透射率,通常用输出功率除以一束参考仿真中光源注入的功率。Lumerical 会自动做归一化,前提是监视器要放在离结构足够远的地方,确保只收集到波导中的导模功率,而不包含辐射模或边界反射。
监视器尺寸也要注意。透射监视器应当完全覆盖波导截面,但不用太大。一般取比波导截面各方向略大几百纳米即可。太大容易收集到背景噪声,太小则会漏掉部分模场能量,导致透射率偏低。
还有一点想特别提一下:Lumerical 里你可以在同一个监视器上记录多个频率点的场数据。但监视器记录的数据量是会显著影响内存的,高频点越多,内存占用越大。第一部分跑透射谱的话,可以先设置 300~500 个频率点,等确定了谐振波长大致位置后,再做高分辨率的细化仿真。
4.3 仿真时间与收敛判断
FDTD 仿真是在时间域上推进的,它不会“自动知道”什么时候该停,而是根据能量衰减情况判断。这个阈值叫auto shutoff level,默认是 1e-5,也就是当监视器检测到电磁能量衰减到峰值能量的 1e-5 时自动停止。
对于普通波导结构,这个默认值已经够了。但环形谐振器有个特殊之处:当谐振发生时,光会在环腔里持续振荡较长的时间,也就是腔的 Q 值较高时,能量衰减速度很慢。如果你发现仿真很快自动停了,但透射谱还不够平滑,可能是能量还没衰减完就被阈值截断了。
对于高质量因子(高 Q)谐振器,有时需要手动把仿真时间拉长,或者把auto shutoff level调低到 1e-6 甚至更低。这相当于告诉求解器:再等等,腔里的能量还没放完。不过在这篇第一部分的基础例子里,Q 值一般不会非常高,默认设置通常可以跑完。
判断仿真是否收敛有一个笨但有效的办法:把透射监视器仿真的时域场图打开,看能量曲线是不是在整个时间轴上平滑衰减。如果在某段时间出现了“起伏”或者“平台”,说明腔体在反复振荡,需要延长仿真时间。
5. 第一部分收尾:看一眼初步透射谱,并排查最常遇到的三个幺蛾子
5.1 预期结果长什么样
按照上述步骤跑完后,在透射监视器里打开 transmission 数据,对比输出端和输入端的功率,你应该会看到一条在 1500~1600nm 范围内总体接近 1(或 0dB)的曲线,但在某些特定波长处出现向下的凹陷。这些凹陷就是环形谐振器的谐振点,对应的波长满足前面提到的谐振条件。
一个个间隔出现的凹陷之间的波长差,就是自由光谱范围(FSR)。FSR 的理论值可以由下面公式估算:
[ FSR = \frac{\lambda^2}{n_g \cdot L} ]
其中 ( n_g ) 是群折射率,( L = 2\pi R ) 是环的周长。以半径 5μm 的硅环为例,周长约31.4μm,群折射率约4.2左右,1500nm 波长下 FSR 大约在17nm附近,和你仿出来的凹陷间隔应该量级一致。
如果你看到的凹陷间隔远大于估算值,或者干脆只有一两个凹陷,那有可能是环的弯曲损耗太大,导致谐振太浅,或者模式注入的偏振不对。这些问题在第一部分不用太纠结,先把透射谱的形状跑出来,心里有个数就行。
5.2 结果不对时按什么顺序排查
第一轮仿真跑完,结果不理想是非常正常的。关键是排查顺序要对,不要一上来就怀疑软件本身,更不要盲目调网格精度。我的排查顺序通常是:
- 先看结构几何:波导是不是在同一平面?间隙尺寸是否和预期一致?这个环节最容易出问题,也最容易被忽略;
- 再看光源:模式光源注入的阶数、中心波长、偏振方向是否正确?如果不确定,先解一个模式看电场分布;
- 然后是监视器:输出监视器的位置是否离耦合区足够远?尺寸是否覆盖波导截面?
- 最后才动网格和边界:如果谱线毛刺多,优先考虑 PML 反射;如果谐振峰位置偏移,才考虑网格精度不够导致有效折射率算不准的问题。
我自己的经验是,80%以上的“结果不对”都是几何放置或者光源设置的问题,真正需要调网格的反而只有少数情况。所以别一上来就全局网格拉到 7,那是把调试成本推给计算资源,属于典型的用战术勤奋掩盖战略懒惰。
5.3 关于脚本、窗口布局这几个软件本身的小坑
最后聊几个 Lumerical 软件本身的使用细节,都是实际操练中很容易碰到的。
第一个是脚本调用。Lumerical 的脚本接口非常强大,官方案例基本都提供了.lsf脚本文件。我强烈建议你学会直接调用脚本而不是全靠 GUI 操作。原因很简单:手动建模步骤多、重复性高、难以复查;脚本可以逐行执行,每一步都看得清清楚楚,而且改参数后重跑极其方便。如果你目前不太习惯敲命令,也可以先用 GUI 做一遍,再对照官方脚本理解每个命令对应什么操作,这样两条腿走路进步更快。
第二个是窗口布局问题。有时候不小心拖动窗口后,Object Tree、脚本编辑器或者布局视图错乱了,看起来特别别扭。Lumerical 的各个窗口都可以通过 View 菜单重置布局,一般不需要重装软件。另外,双击布局视图上的空白处可以快速缩放适配全屏,这个快捷键使用频率极高,建议记下来。
第三个是报错信息的处理。Lumerical 报错时会在脚本底部的输出窗口给出错误行号和简要说明。很多人看到红色报错就慌了,其实多数报错原因很直白,比如几何体名称引用错误、参数变量未定义、材料名称拼写错误。按行号点进去排查,通常几分钟就能定位到问题。如果你照着官方案例的脚本改,习惯性先搜索报错信息里的关键词,在官方论坛和文档里能快速找到解决办法。
环形谐振器第一部分的仿真到这里基本就跑通了。你手上应该已经有了一张带谐振凹陷的透射谱,也对 Lumerical 的建模、网格、光源、监视器这套完整流程有了更具体的体感。下一步可以进入系列的第二部分,用参数扫描看间隙和半径对谐振波长、Q值、消光比的影响,那才是环形谐振器仿真的真正重头戏。