☰
FDTD复现色散调控多波长独立聚焦超构透镜全流程
2026/10/2 3:36:13 网站建设 项目流程

开头直接进入主题:

做超表面仿真这几年,最让我觉得有复现价值的,就是2017年OE上那篇“色散调控多波长独立聚焦”的论文。当时看到它的时候,第一反应是“这事还能这么干”,第二反应是“我这套FDTD流程能不能把它跑通”。后来陆陆续续在Lumerical FDTD里复现了那套超构透镜结构,踩了不少坑,也摸出了一些比较靠谱的参数套路。这篇文章就把我从论文解读、模型搭建到仿真结果分析的完整过程拆开讲一遍,给同样想复现多波长独立聚焦超构透镜的兄弟做个参照。

1. 论文核心解读与设计思路分析

1.1 多波长独立聚焦超构透镜是个什么概念

传统透镜的焦距一般和波长绑定,要么做消色差,要么做色散补偿,很难让不同波长的光“各走各的路”还在同一块镜片上。而“多波长独立聚焦”指的是在同一片超构透镜上,不同设计波长各自拥有完全独立的焦点位置,它可以不遵循常规色散规律,甚至故意“不讲道理”地让红光和蓝光聚焦在完全不同的横向位置或轴向深度。

这种能力在光谱成像、波长分束、多光谱传感里特别有用。比如一个紧凑型光谱相机,前端只需要一片透镜,就能把不同波长的光分开并聚焦到探测器不同的区域,省掉了传统分光元件和体积庞大的光学系统。

论文的核心思路是:不去消除超表面单元的色散,反而利用色散本身的自由度去构造相位-波长响应。传统超表面设计只给每个位置分配一个相位,而这篇论文让每个位置对每个波长都提供独立可控的相位,相当于在波长维度上做了“解耦设计”。

1.2 2017年OE论文的技术路线拆解

这篇论文给我印象最深的,不是它用了很复杂的结构,而在于它把焦点位置作为优化目标,直接推导出每个位置在每个波长下需要的相位,然后用一种“介质柱阵列”的单元结构去实现。

结构上用的是非晶硅(a-Si)圆柱或类似的高折射率介质柱,排列在二氧化硅衬底上。每个单元就是一个纳米柱,直径和高度一起决定了它对某个波长的透射相位,而由于色散的存在,同一根柱子在不同波长下给的相位并不一样。论文的精髓,就是人为设计这种“相位随波长变化的斜率”,让每个柱子在两个甚至多个波长下同时满足各自的理想相位值。

复现的时候要格外注意:一般论文会给出设计波长、材料折射率、柱高和周期,但不会把每个位置的几何尺寸全列出来。你需要自己根据目标相位反向去找直径,这一步是最耗费计算精力的,也是后面FDTD仿真最容易出问题的地方。

1.3 为什么选FDTD做超表面仿真而不是别的方法

超表面单元通常几百纳米尺度,整体透镜可能几十微米甚至上百微米。如果拿严格耦波法(RCWA)做,它可以快速算周期结构,但对非周期的聚焦透镜无能为力;如果拿光束传播法(BPM)做,它对强散射和高折射率对比结构的精度又不够。

FDTD的好处在于它直接在时域离散化麦克斯韦方程组,不假设介质的均匀性,也不限制结构的复杂度,所以对纳米柱这种强散射体、大折射率阶跃、近场共振效应都很适用。虽然我很多工作也用RCWA做快速筛选,但最终的聚焦透镜验证必须回到FDTD上,因为它能同时给出完整的近场分布、相位分布和焦点处的聚焦效率。

用FDTD复现这篇论文,要注意它不是跑一次就完事的。整个流程通常是“单元库扫描 → 根据相位反查尺寸 → 全镜面仿真”。单元库扫描本身就要跑几十上百组仿真,好在这一步可以用脚本批量跑,把时间压下来。

2. 超表面模型搭建与仿真参数配置

2.1 单元结构与初始参数选择

复现时我用的单元结构是单个圆柱纳米柱,这是多数超表面论文最基础的配置。实际参数我参照常见做法设了这么一组:

参数数值说明
单元周期 P450 nm需要小于最短设计波长半波长
柱高度 h600 nm决定相位覆盖范围
衬底材料SiO2基底折射率约1.45
柱材料a-Si折射率随波长变化,色散明显
设计波长633 nm / 780 nm两个独立焦点

这里强调的是,周期必须足够小,这样才能避免高阶衍射,保证每个单元只工作在透射波的零阶通道里。我的经验是,单元周期P最好小于最短工作波长的0.7倍左右,比如633nm下用450nm就很稳。柱高直接决定了相位覆盖的完整性,太矮相位覆盖不到0~2π,太高会增加仿真时间和内存占用,600nm算是比较平衡的选择,实际可以扫几个值对比。

2.2 FDTD仿真区域与边界条件设置

超表面单元扫描阶段,建议用对称边界条件来缩小计算区域。比如圆柱结构具有旋转对称性或镜像对称性,可以分别使用anti-symmetric和symmetric边界,把x/y方向的仿真区域压缩到一个单元的四分之一。我常用的是“Lumerical FDTD Solutions”软件,它支持这类对称边界设置。

这时候仿真区域大概只有450nm × 450nm,网格可以用比较密的级别,z方向覆盖柱体上下各1μm左右。边界条件方面,x/y方向用periodic,z方向用PML,这是单元仿真的标配。PML厚度我记得设了24层,另外给结构上下留出几百纳米的空隙,防止场分布被边界吸收层干扰。

做全镜面仿真时就不能用periodic了,x/y方向必须改成PML,因为超透镜整体不是周期结构。这时候仿真区域要大得多,会有明显的内存压力。我当时把整个透镜弄成直径60μm的圆形区域,仿真耗时非常夸张,后来不得不改用子区域拼接的思路,或者把网格拉粗一点来换取速度,后面我会专门说。

2.3 材料模型与色散数据的处理

这块特别容易踩坑。论文里用到的非晶硅,在不同波长下的折射率变化不能用一个常数替代,否则完全复现不出独立聚焦效果。具体来说,633nm下非晶硅的折射率大概在3.65+0.05i附近,而780nm下实部会降到3.45左右,虚部也更低。这就是色散的来源,也是设计空间的一部分。

如果你用的是孤立圆柱,那么色散主要由材料本身带来。我在Lumerical里直接用内置的a-Si(Palik)材料数据,但要注意Palik数据覆盖范围,如果设计波长在数据范围之外,就需要手动补充或外推。更稳的做法是自己用椭偏仪测量薄膜折射率,但对复现论文来说没必要,直接用公开数据就行。

复现时建议先算出两种设计波长下材料的折射率实部和虚部,确保材料窗口里没有高吸收区域。如果吸收损耗太高,聚焦效率会大打折扣,甚至看不到清晰的焦点。对于633和780nm这对波长,a-Si吸收都不大,但780nm处更干净。

3. 多波长独立聚焦的实现与结果验证

3.1 相位分布设计与波长解耦原理

多波长独立聚焦的难点在于,同一根柱子同时要满足不同波长的相位需求。最简单思路是把不同波长的相位分布拆成独立的透镜相位公式来算。

直角坐标系下,给定焦距f和波长λ,理想透镜的相位分布是GMMO公式,具体为φ(x, y, λ) = 2π/λ × (√(x² + y² + f²) - f)。这里f可以是正的也可以是负的,代表会聚或发散。

既然有两个波长,那么每个柱子的理想相位就有两组数值。问题变成了“找到一根特定的柱子,它的实际相位在633nm下等于φ₁,在780nm下等于φ₂”。这要求单元库足够密集,需要扫描足够多的柱径,然后在二维相位空间中找到同时满足两个条件的交点。

说了你可能觉得抽象,我举个例子。假如在某个位置,633nm需要的相位是1.1π,780nm需要的相位是0.9π,你手里有两根候选柱子。第一根柱子633给1.15π、780给0.85π,第二根柱子633给1.05π、780给0.95π。单看都不算匹配,要找到误差最小的那根,就需要定义总误差函数,比如把两个波长下的相位误差平方相加再求最小。

3.2 单元库扫描与尺寸反查的实操流程

我通常的做法是用脚本批量扫描柱径,从80nm到320nm,步长5nm,一共49组仿真。每组仿真之后提取端口下方的透射复振幅,也就是利用S参数去反推出幅度和相位。这需要用监视器放置在单元底部,记录基模透过系数。

关键技巧是,在FDTD里设置两个波长监视器,一次扫描就能同时拿到两种波长下的相位和透过率数据。写脚本时要把“尺寸-波长1相位”和“尺寸-波长2相位”存成两张表,再合并起来。

扫完之后,用插值构造连续查找表。对于透镜上每个坐标点,先算好两波长下的目标相位,然后在查找表里寻找最小距离的候选柱径。注意这里的距离要用周期的最小差法来算,因为在2π周期上,满足1.9π和0.1π这两个值是相邻的,如果不做周期展开,会错判误差很大。

我建议这个流程在Python里走一遍:先导入扫描结果,做循环对每个点搜索最佳柱径。这里有个实际经验:当两个波长都有较高的透过率要求时,某些极端的相位组合可能没有合适的柱子,这时可以适当忽略一个点的误差,或者把权重调开。因为后面全镜面仿真用的是整片透镜,单点误差并不致命。

3.3 全镜面FDTD仿真与焦点判定

当所有位置的柱径都确定之后,就要把整个超构透镜的结构导入FDTD。我用的是Lumerical里的结构组,直接把每个圆柱和衬底搭在一起。这一步最容易出问题的是结构重叠和尺寸冲突,特别是相邻柱子挨得太近,网格会很难处理。

全镜面仿真时,入射光源用平面波比较直观,如果只关心聚焦效果,可以用高斯光束近似。最好在透镜上方放置功率监视器和电场监视器,在预计焦平面附近扫一组z方向切片,观察焦斑分布。

判断独立聚焦成功与否,要同时看横向光斑和轴向强度分布。横向光斑可以用半高全宽(FWHM)来衡量,轴向强度分布则可以看到能量是否真的汇聚在预设焦距处。我复现时,两波长的焦点都出现在预设位置附近,轴向偏移小于几个微米,这个精度已经足够说明设计方法有效。

如果发现焦点位置偏了,优先怀疑相位设计误差,也就是单元库扫描精度不够,而不是整个设计流程的问题。这时候可以加密扫描步长,比如从5nm改成2nm,重新选尺寸,通常能明显改善。

4. 复现过程中的常见坑与排错速查

4.1 单元扫描结果不收敛怎么办

单元库仿真的周期边界下,你要重点检查网格精度和z方向的吸收边界。网格尺寸通常设置为全局网格步长Δx = Δy = Δz = 10nm,最佳做法是对柱体区域做局部mesh override,把网格细化到5nm甚至2nm。这样能捕捉到高折射率对比界面上的强局域场。

如果发现扫描相位分布很“毛糙”,不光滑,十有八九是网格不够密。另外,扫描时不要只取固定波长的瞬态场,要用整个模拟带宽内的频域监视器来提取复S参数。我在早期犯过一个错误,就是用time monitor来傅里叶变换得到相位,结果相位精度总是不够,换成frequency domain monitor后一次就干净了。

还有一点是,单元仿真里光源的偏振方向要明确写清楚。大多数超表面论文都是线偏振入射,如果用了圆偏振却忘了写polarization,得到的相位响应就会完全乱掉。

4.2 全镜面仿真内存不足和耗时过长

60μm直径的透镜直接全镜面仿,网格步长10nm,横纵网格量都过亿,我的工作站16GB内存根本扛不住。试了几种策略后,我录得以下做法最实用:先把单元扫描得到的柱径图导出成位图或矩阵,然后在FDTD里用Import结构的方式生成几何,避免用CAD矢量建模造成的大量面片描述。

再就是把网格步长从10nm逐步放松到20nm,对比焦点结果,如果焦点位置和FWHM变化不明显,说明可以接受。对超表面来说,相位对几何尺寸敏感,但对网格步长并非无限敏感,20nm通常也能给出可用结果。

如果内存还是吃紧,可以把仿真区域从圆形改为方形,再把边界附近的单元可忽略掉。但要注意,这种截断会引入边缘衍射,可能会轻微影响焦斑。实在不行就分割成扇区,每次仿真1/4透镜,再用场叠加原理把焦点位置的重建出来。这种“拼接法”截断边界电位会有一定误差,但作为快速验证是可行的。

4.3 焦点没出现或聚焦效率低

如果全镜面仿完一扫投影面,连光斑都没有,那大概率问题出在相位匹配上。复盘时我会逐个检查三个地方:第一个是单元库扫描时的基准面相位是否符合论文给定的体系,第二个是目标相位公式里有没有把2π/λ中的波长单位搞错(微米和纳米混用真是重灾区),第三个是透镜口径边缘的相位是否和中心连续衔接。

聚焦效率低的常见原因是单元透过率不够。有些高深宽比的柱子,在某个波长下会激发很强的局域共振,导致反射增加,能量没进来。这时候要回看单元扫描结果,如果透过率低于70%,就要考虑优化柱高或改用上下加匹配层的设计。

另外我也犯过一个低级错误,因为工程上习惯直接把x方向相位梯度设成连续函数,导致相邻柱子相位差过大的地方出现强耦合,局部焦点被扭曲。解决办法是在设计时把目标相位做一次像素级平滑,尤其是边缘剪裁处,但别平滑过头,否则焦点位置又会偏移。

4.4 复现论文时如何快速对齐结果

我踩过很多次坑之后,总结出一套比较稳的对齐方法:第一,先把论文里给出的相位分布图直接数字化提取出来,和你的设计结果对比,保证整体趋势一致,而不是只看单个焦点位置;第二,如果论文给出了某个波长的焦斑剖面图,直接用能量分布曲线做对比,看FWHM的相对值;第三,自己准备一张“尺寸-相位-波长”的二维误差表,把关键位置的相位误差控制在0.1π以内。

我觉得保持实时记录特别重要。每次修改参数后,都重新保存一次仿真任务,并把柱径图和焦点图导出,标注好日期。否则你会陷入“上一次明明出光斑了,但这次改了什么看不出”的窘境。这是纯经验,但真的很救命。

5. 从复现到自主设计的体会

当初复现2017年OE这篇论文,纯粹是想证明“色散工程可以做到独立聚焦”这条路走通。复现完之后,我开始在这个基础上尝试做三波长甚至四波长的独立聚焦设计,难度确实翻倍,但核心逻辑没变,还是那份查找表、单元库和全镜面仿真的组合拳。

我个人的经验是,FDTD仿真在超表面领域不是“跑一下出结果”那么简单,它更多是一套验证和诊断工具。论文里的漂亮结果背后,是大量的单元扫描、相位匹配和尺寸反查迭代。你要有耐心把每一个步骤都拆成可验证的小环节,这样才能真正把论文里的结果复现出来,而不是只会搬结论。

最后分享一个小技巧,很多人在扫描单元库时习惯把监视器放在柱体正下方,但这是不够的。最好同时在柱体上下两个位置各放一个监视器,用两者之差来真正算透射复振幅,前面的结果容易受反射波干扰。这一点我做了很久才意识到,希望对你有帮助。

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

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

立即咨询