☰
Lumerical FDTD复现不对称光栅衍射效率:从建模到级次分解全解析
2026/10/7 11:29:10 网站建设 项目流程

在微纳光学仿真里,复现不对称光栅的衍射效率,绝对是我见过最容易“卡脖子”的工作之一。不是 Lumerical FDTD 本身难学,而是这类结构几乎把所有容易出错的点都占齐了:几何要参数化、边界条件不能用对称简化、材料色散影响大、效率提取还涉及衍射级次的判定。很多朋友手里拿着文献里的周期、齿高和材料折射率,跑了半天却怎么也算不出论文里的曲线,原因往往不是公式错,而是仿真设置和数据分析的细节没对齐。

这篇内容我只想盯住一件事:如何用 Lumerical FDTD 把不对称光栅的衍射效率稳定地复现出来,并拿到和实验或文献对得上的数值。适合正在做闪耀光栅、斜齿光栅、二值化非对称结构,或者准备把仿真结果作为后续设计依据的同学。我会把整个过程拆成设计思路、参数设置、数据提取和排错四个部分,最后再补一点自己常用的脚本化习惯,尽量做到让你能直接拿着参数上机跑。

1. 复现前必须先想清楚:不对称光栅的衍射效率从哪里来

1.1 复现不是“描图”,而是先定义物理模型

拿到文献参数(周期 T、占空比、齿高、侧壁角、材料折射率)之后,我一般不会立刻打开软件画图。先把物理模型定下来:结构在哪个方向周期排布,哪个方向均匀;入射光是从空气侧打还是衬底侧打;工作波长范围是多少;需要输出透射还是反射级次。很多“不对称光栅”指的不是简单的矩形光栅一侧斜,而是单周期单元内齿形左右不等,常见的有闪耀光栅、斜梯形齿、阶梯光栅。这类结构的设计目标通常是把能量集中到某一个非零级衍射级次,实现特定方向的分光、聚焦,或者做模式耦合。

我会先列一个参数清单,上面写清楚周期 T、齿顶宽 w1、齿底宽 w2、齿高 h、倾斜角 α、上下介质折射率 n1/n2、入射角 θ、波长范围 λ。列完这些,才能决定仿真维度。如果结构在 y 方向完全均匀,比如标准的线性闪耀光栅,就可以把模型压成 2D 仿真,FDTD 网格只在 x-z 平面展开,y 方向用周期边界或对称边界处理。很多非对称光栅其实就是二维线性光栅,2D 仿真能省大量内存,效率提取也简单得多。只有 y 方向也有变化,比如斜柱阵列、二维点阵,才需要老老实实上 3D。

1.2 FDTD 在衍射效率问题上比严格耦合波分析好在哪

做光栅效率,RCWA(严格耦合波分析)其实更快,很多专业光栅仿真工具也都是基于这个算法。但我做“复现”时仍然优先用 Lumerical FDTD,原因是文献里经常会出现圆角、侧壁粗糙、多层膜、缺陷这类细节,RCWA 处理起来建模很麻烦,FDTD 用几何对象和网格则能更自然地逼近真实结构。FDTD 的核心思路是把麦克斯韦方程组在空间和时间上离散,让光场在结构里逐步演化,处理非对称结构带来的高次衍射和模式耦合时,不会因为级次截断而产生额外误差。

代价也很明确:FDTD 需要小心控制边界条件、网格大小和监视器位置,否则很容易出现“算得又快又稳,但是结果不对”的尴尬情况。另外一个经常被忽略的点是,RCWA 通常直接把每个级次的效率输出给你,FDTD 默认只会输出监视器上的功率通量,衍射级次的拆分需要自己动手,或者调用分析和处理函数。只要理解了这一步,FDTD 的“不直接”反而能帮你看清楚每个级次的场分布和功率流向,调试起来更直观。

1.3 衍射效率的定义决定了监视器怎么放

衍射效率的一贯定义是:某个衍射级次的功率 P_m 除以入射光功率 P_inc。在 FDTD 里,功率是通过监视器面积分坡印廷矢量的法向分量得到的。透射式光栅,就在结构下方放透射监视器;反射式光栅,则在光源同侧放反射监视器。这里要注意一点:FDTD 的宽带平面波光源功率本身会随波长变化,你不能直接把透射监视器功率当成效率,而是要把“透射功率谱”除以“入射功率谱”。最稳妥的做法是无结构空跑一遍,把入射监视器的功率谱存下来,再用真实结构的结果去归一化。

我经常看到有人提取效率时直接拿透射监视器的总功率画曲线,这在单级次占绝对主导的设计里勉强能用,但对不对称光栅这种能量分散到多个级次的结构,一定要做级次分解。级次分解的方法我在第 3 部分详细展开,这里先记住一个结论:总功率曲线只能告诉你“透射了多少”,不能告诉你“每个方向分了多少光”,而后一个问题才是非对称光栅设计的核心。

2. 模型搭建与关键设置:不对称光栅的每一个几何量都有物理后果

2.1 用多边形参数化非对称齿形,不要拿矩形硬拼

在 Lumerical FDTD 里建非对称齿形,最稳的方式不是用几个矩形叠在一起,而是用多边形对象,比如 addpoly,或者通过脚本逐点定义截面轮廓。以闪耀光栅为例,截面是一个三角形加一个竖直边,你可以把四个顶点坐标定义在周期单元内部,从 x=0 到 x=T,左边缘竖直上升到齿高,再从齿顶斜切到齿底。更方便的做法是写一个脚本函数,输入 w1、w2、h,返回多边形顶点,之后做参数扫描时只需要循环改参数,不用每次手动拉模型。

这里有一个我踩过的坑:多边形顶点处 FDTD 网格容易产生局部场增强,效率曲线会出现非物理毛刺。如果你发现某个波长点效率突变,而周围点都很平滑,多半是顶点网格没处理好。我的做法是在几何上给顶部和底部加一点很小的倒角,或者把局部网格加密到顶点附近。倒角半径取 10–20 nm 就能明显改善收敛,代价是结构略微偏离理想模型,所以在最终报告里一定要注明等效尺寸,不要默默加倒角却不说。

2.2 材料数据:库里找不到折射率时怎么处理

Lumerical 自带材料库有常见的介质,但文献里的不对称光栅往往用到特殊膜系或复合折射率,比如镀铝闪耀光栅、TiO2 薄膜、Si3N4 波导等。库里有相近材料时,不要直接套用,因为折射率实部虚部差一点,效率曲线尤其在共振区就会有明显偏移。文献给了折射率数据,就先列成表格,按波长或能量插值,再在软件里通过导入文件或拟合材料色散模型来建立自定义材料。

特别要小心“k 值很低但并非零”的材料,比如金属在近红外的吸收不可忽略,介质膜在吸收边附近的 k 也不能当零处理。不对称光栅经常用来做金属-介质混合结构,把光耦合到表面等离激元,这类仿真能量损耗路径多,效率看起来会偏低。如果你和文献对不上,先检查是不是材料吸收模型没设置对,而不是急着去调几何。

2.3 光源、边界和网格:三个最容易让效率“漂”的设置

不对称光栅在 x 方向是周期性结构,应该用布洛赫边界来处理斜入射。很多人的效率复现失败,就是在这里把周期边界设成了普通 periodic,甚至用了 PEC/PMC。普通 periodic 只支持零度入射,入射角不为零时,相邻周期单元之间必须带有相位延迟,这一项要是错了,所有衍射级次的功率分配都会跑偏。Lumerical 里的 Bloch 边界就是要设置入射角对应的 k 向量分量,斜入射时必须确保光源角度和布洛赫边界的相位设置一致。

网格方面,我的默认策略是整体 mesh accuracy 设为 2,然后在光栅齿形区域加一个覆盖整个结构的网格覆盖区,网格大小取最小几何特征尺寸的 1/10 到 1/20。举个例子,周期 500 nm、顶尖宽度 30 nm 的结构,局部网格至少建议 5–10 nm,z 方向因为有垂直界面和斜侧面,可以更细一点。判断网格够不够,不是看效率曲线平不平滑,而是做一次“网格翻倍测试”:网格细化一倍,如果效率变化小于 0.005,就可以认为收敛了。我见过网格从 20 nm 降到 10 nm 后某个高级次效率改变 0.1 以上的情况,那属于根本没过收敛关。与实验或文献对齐前,先跑网格收敛,省得后面所有调参都建立在沙地上。

边界条件也要单独说。2D 仿真里,x 方向用布洛赫边界,z 方向上下用 PML。如果结构在 y 方向均匀,y 方向边界随意,但为了让 2D 近似成立,仿真区域在 y 方向保留很小的宽度就行。3D 仿真且 x、y 都有周期性时,两个方向都要用布洛赫边界。PML 层数默认 8 层比较稳,斜入射时太薄的 PML 会吸收不完全,反射波混进监视器里,效率曲线就会出现均匀的高频波纹,这种波纹看起来很像噪声,但其实是边界没处理好。

2.4 监视器放在哪里,决定效率稳不稳

透射监视器不能贴着光栅表面放。光栅近场区域有大量倏逝波,监视器离结构太近时,这些衰减模式还没完全消失,会被当成透射功率的一部分,导致效率数据虚高。我通常把透射监视器放在光栅底面以下至少一个波长(在衬底介质中)的距离,如果仿真区域高度有限,退一步也要大于半个工作波长。反射监视器放在光源和结构之间,注意不要挡光路,可以用 Lumerical 里常见的方式在光源上方单独放监视器,同时把入射功率独立归一化。

监视器的横向尺寸同样重要。衍射级次传播角度越大,横向扩展越宽,如果监视器宽度不够,高角度级次会“跑出”监视器,最后少算。我的经验是按理论最大衍射角留出 1.5 倍余量。更严格的做法是在监视器平面上做傅里叶分解,用衍射级次分析组自动判断,而不是盲目把监视器加宽。

3. 衍射效率的提取:从坡印廷通量到每一级次的功率

3.1 用空间傅里叶分解拆出各个衍射级次

既然效率定义是 P_m / P_inc,手里只有监视器上的功率通量,怎么拆?这里的关键是衍射级次在空间频率上是分立的。对 x 方向周期、y 方向均匀的结构,任一衍射级次对应的横向波矢是 kx_m = kx_inc + m * 2π / T,其中 kx_inc 是入射光的横向波矢,m 是整数级次。只要在监视器平面上对复场做一维傅里叶变换,就能得到每个 kx_m 位置处的振幅,再根据振幅计算该级次携带的轴向坡印廷通量,最后除以入射功率,就是该级次的衍射效率。

在 Lumerical 中,我通常会这样处理:先跑一次空结构仿真,记录入射监视器的功率谱;再跑真实结构仿真,把透射监视器上的时域场做频域分解,再做空间 FFT;最后把落在每个衍射级次位置的功率分量提取出来。如果你不想自己写这段数据处理,可以在软件的对象库中找光栅级次分析组,它会把“空间 FFT + 级次识别 + 效率归一化”打包好,你只需要确认分析平面的位置和级次范围。

下面给一个 Lumerical 脚本风格的示意,方便理解逻辑,实际使用时请按自己的对象命名调整:

# 示意脚本:获取透射监视器场并做空间FFT select("transmission_monitor"); E = getdata("E"); H = getdata("H"); x = getdata("x"); # 对横向场做一维FFT kx = 2*pi*linspace(-1/(2*dx), 1/(2*dx), length(x)); # 示意 # 根据光栅方程找各级次位置 kx_m # 对每个级次附近的傅里叶系数积分,得到功率占比

这里尤其要提醒:不要直接在监视器总功率上乘一个系数来代表某个级次,那是“玄学复现”。不对称光栅的能量往往明显不均匀地分配到好几个级次上,必须真正做空间频率分解。

3.2 TE 和 TM 都要算,偏振会让级次分布完全不同

不对称光栅的衍射效率通常有很强的偏振依赖,金属光栅和高折射率介质光栅尤其明显。不要只跑一个偏振就下结论。在 Lumerical 中,TE 和 TM 对应平面波光源的不同偏振设置,可以建两次数值实验,或者用同一个结构扫描偏振角。对 y 方向均匀的 2D 结构,TE 和 TM 的场分量可以分别只求解 Ey 或 Hy,能以较小内存拿到结果。

复现文献时,务必先确认文献的偏振定义和你的设置一致。不同论文对 TE/TM 的定义有差异,有的以电场矢量是否平行于光栅槽为准,有的以入射面内的偏振方向为准。这个差异看起来是标签问题,但会让特定级次的效率完全对不上。我遇到过一组数据,TE 效率在文献里对应的是平行于槽的偏振,在我这边却默认成了垂直于槽的偏振,整整差了一个数量级。

3.3 与文献数值对不齐时,先查这六个地方

复现阶段最大的挫败感来自于“计算收敛了但曲线偏离文献”。我的排错顺序是:几何尺寸(占空比、侧壁角正负号是否搞反)→ 材料折射率(文献给的是退火后还是沉积态)→ 布洛赫边界相位 → 偏振定义 → 监视器位置 → 级次分解窗口。六项里前三项大约占了故障原因的八成。

另外,“衍射效率”这个说法也分“绝对效率”和“相对效率”。有的文章把反射损失扣掉了,有的没有;有的把衬底界面的菲涅耳反射单独扣除,有的直接报告一定厚度衬底后的透射效率。复现前先弄清楚这个定义,否则再怎么调结构,和文献数据之间都存在一个固定比例关系。我的习惯是先跑一个极限情况,比如零入射角、简单矩形光栅,用光栅方程和能量守恒(效率之和等于 1 减去反射和吸收)去核对,确认基础流程可靠后,再逐渐引入不对称齿形和斜入射。这样定位问题会非常快。

4. 常见问题与排查实录:我踩过的那些坑

4.1 效率曲线带高频振荡

这恐怕是 FDTD 光栅仿真里最常见的现象。原因无非几类:光源脉宽太长导致频谱分辨率不足,监视器太靠近光栅导致倏逝波干扰,或者 PML 吸收不彻底。排查方法很简单:先把监视器向后移几百纳米,再把光源脉宽缩短,例如中心波长 800 nm 时,把光源带宽范围覆盖到 650–1000 nm,如果振荡还在,就检查 PML 层数和材料吸收。

还有一种很容易误判的情况:斜入射时,某个衍射级次刚好在分析波长范围内达到消失临界角,效率会在那一带“跳崖”式下降。这不是数值错误,而是物理上的级次截止,比如突然从传播级次变成倏逝波,能量重新分配到其他级次。遇到这种跳变,不要尝试用网格或滤波把它磨平,否则你反而会把真实的物理现象掩盖掉。

4.2 某一衍射级次总是少一截

大部分时候是被监视器“切”掉了。±1 级在衬底里的衍射角可能到 30° 以上,监视器只要短一点,高级次就跑到监视器外部。如果用 FFT 分解的方法,级次功率是在整个周期单元上积分得到的,不存在“跑出去”的问题,所以分析组比直接读监视器总功率更可靠。确需用总功率监视器时,建议把宽度留到理论最大衍射角对应的 1.5 倍余量。

另一个隐蔽原因是入射光本身有尺寸效应。Lumerical 中的平面波源在激励平面上是有限宽度的,边缘会有衍射扩展。如果光源的横向尺寸不够大,入射到光栅上的实际场不是纯平面波,会产生本地衍射噪声。解决方法是把光源加宽,并且让光源区域和周期性边界匹配好,避免光栅边缘出现非周期性的截断。

4.3 参数扫描太慢怎么办

不对称光栅经常要做占空比扫描、齿高扫描、入射角扫描。每次人肉改模型再手动跑,效率极低。我的做法是把整个建模仿真脚本化:函数输入是 T、w1、w2、h、angle,输出各个级次的效率光谱,然后交给参数扫描工具批量执行。跑完后自动保存结果到文件,统一画图。批量扫描时记得关闭图形刷新,并定期保存进度,仿真中断后不需要全盘重来。

再分享一个非常实用的经验:先做粗网格扫描定位趋势,找到可能的高效率区,再对局部做细网格精确计算。网格收敛测试很费时,但如果一开始就用最细网格扫全参数空间,相当于在一个小时内干三天的活。我一般会把“粗扫 + 细验证”的时间分别记录,方便后续复现或写论文时交代清楚。至于优化算法,等第 1 轮趋势扫出来后再上也不迟,直接开始优化往往会把计算资源浪费在没有物理意义的区域。

5. 一点个人习惯和可扩展方向

做到这里,复现不对称光栅衍射效率的完整路线就聊得差不多了。核心总结起来就是三句话:先用物理模型定方向,再用参数化几何和网格收敛保精度,最后用级次分解而不是总功率下结论。

如果后续要做设计优化,我建议把 Lumerical 的脚本和 Python 联动起来,做贝叶斯优化或者遗传算法搜索;也可以在 FDTD 结果的基础上先用 RCWA 做快速粗扫,再用 FDTD 验证最优参数。对更复杂的斜柱阵列,也就是 y 方向也存在周期性的结构,2D 要拉成 3D,内存占用可能涨几十倍,强烈建议先在 2D 模型里把级次分布和效率量级确定下来,再决定是否值得做 3D 验证。

最后讲一个我自己的调试习惯:每次仿真开始前,在项目文件夹里放一个“复现状态.md”,记录结构参数、边界设置、网格尺寸和当前效率值。这类工作经常要反复回溯,尤其是参数扫描跑完几百个点之后,再好的记忆也不如一份能完整复述的设置记录。如果你今晚就要跑第一组数据,我的建议是先从一个零入射角的简单介质光栅开始,验证效率之和满足能量守恒,再切换到不对称斜齿结构,这样你至少能少踩一半的坑。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询