
复现2017年Optics Express上那篇多波长独立聚焦超构透镜论文是我这几年做超表面FDTD仿真里最折腾、也收获最大的一次。这片超表面的核心价值在于在同一片平面上用不同几何尺寸的亚波长纳米柱阵列同时为多个波长提供完全独立的相位分布让红光和蓝光各自聚到预设的不同焦点上。相比传统衍射透镜和单波长超构透镜这种“波长复用”思路相当于把一维问题做成了二维解耦背后绕不开的是对材料色散、相位匹配和近场耦合的深入理解。如果你正准备复现这类工作或者想入坑超表面多波长/消色差设计这篇博文会把我踩过的坑、验证过的套路和能直接抄的参数配置全部摊开来讲。我尽量说人话从物理概念到FDTD仿真的每一个步骤都有覆盖保证你看完能少走至少两星期弯路。1. 复现之前先把论文的核心思路吃透1.1 多波长独立聚焦问题比手段更值得先聊提到超表面透镜大家第一反应就是“相位不连续”“每个位置放一根纳米柱让透射光的相位从0到2π全覆盖然后叠加出球面波前”。这套逻辑在单波长下确实好用但一旦把波长从一束变成两束问题立刻就暴露了。传统衍射光学元件的色散关系由衍射方程决定焦点的位置和波长强相关。超表面单元本质上也是亚波长光栅等效折射率随波长变化更加剧烈。如果只改变纳米柱的直径那么它对红光能实现的相位变化对蓝光几乎是等比例变化的——这意味着你用一个旋钮调节红光相位时蓝光相位一定会被带着跑独立聚焦根本无从谈起。多波长独立聚焦的本质是想办法把“一个单元结构只提供一个相位自由度”这个限制打破。你至少需要两个独立可控的几何参数才能对两束波长各自负责。这里的生活化类比是单波长透镜是“一个温度旋钮的空调”多波长独立聚焦则是“两个旋钮的恒温混水阀”一个调热水、一个调冷水互不干扰。论文里的双纳米柱结构本质上就是为了凑出这两个独立的自由度。1.2 2017年OE论文的结构方案双纳米柱阵列那篇OE文章整体设计思路并不复杂但非常巧妙。它在每个周期单元内放了两根纳米柱柱A和柱B的直径可以单独变化。柱A的尺寸变化对波长λ1的相位响应更加敏感柱B则主要影响波长λ2两者在同一单元里共同工作。实际设计时我把λ1设为532nm绿光、λ2设为633nm红光材料选用TiO2基片为熔融石英。为什么双柱就能实现解耦严格来说两根柱子并不完全“各管各的”。真正的原因是系统多了柱B直径这个自由度后我们在匹配相位时可以同时满足两个波长的相位方程。也就是说目标不是让柱A对λ1敏感、柱B对λ2敏感而是通过计算扫描数据库找出一组(直径A直径B)让λ1和λ2的透过相位同时等于当前像素需要的两个目标值。这相当于在二维参数空间里做数值解耦多波长问题由此转变成一个“查表匹配问题”。这种方案相比级联多层超表面或者改变环境折射率的方案最大好处是加工上只多了一根柱子但设计自由度翻倍。复现时我们要注意论文里给出的单元周期、柱高、材料折射率每一组参数都是经过扫描优化后的结果别上来就改周期否则双柱的相位覆盖范围直接坍缩。1.3 复现路线与资源规划我习惯把复现拆成四个阶段阶段一单柱单元响应扫描。固定周期P和柱高h扫描直径D分别记录λ1和λ2下的透射幅度和相位建立“直径-相位”响应曲线。阶段二双柱单元联合响应扫描。把直径D1和D2同时扫描建立四维数据库即(D1, D2)映射到(φλ1, φλ2)。阶段三相位分布映射与布局生成。计算整个透镜的聚焦相位分布然后逐个像素从数据库里挑选最优的(D1, D2)组合。阶段四整体FDTD全波仿真。导入布局设置全场光源和场监视器提取焦点和效率。工具方面我用的商业软件是Lumerical FDTD Solutions配合MATLAB/Python做数据处理。计算资源上单柱扫描一次大约需要50个直径样本双柱扫描需要100x100一万组单元仿真。这里有个省时间的技巧对于对称圆柱结构入射光偏振固定时可以先扫单柱再挑出趋势比较好的区间做局部双柱细扫而不是上来就暴力打满整个参数空间。2. FDTD仿真环境与物理模型设置2.1 仿真工具选型与材料参数设定FDTD工具我手上比较常用的有两个一个是Lumerical界面完善、监视器操作方便适合做复杂超表面另一个是开源的MEEP脚本控制灵活适合批量扫参。实际复现双柱结构时我用的是Lumerical因为它的材料模型内置了TiO2的折射率色散数据省去自己去拼接数据库的麻烦。选型时另外需要考虑的点是并行效率MEEP用MPI跑多核Lumerical也支持多核并行但小结构单周期仿真根本吃不满计算资源瓶颈通常在数据库的I/O上。材料参数上TiO2在532nm和633nm的折射率大概在2.44左右和2.37左右消光系数小于1e-4可以忽略。基片熔融石英的折射率设为1.45。单元周期我取400nm既满足λ1和λ2的亚波长条件又给两根直径较大的柱留出足够的间距。柱高设为600nm这个高度能保证单柱相位覆盖超过2π。以上参数是多次扫描后验证过的稳定区间如果复现其他论文至少要保住“P λ_min / NA_eff”这个底线。2.2 边界条件、光源与监视器设置单柱或者双柱单元仿真时x和y方向用周期性边界条件Periodicz方向用PML吸收边界。光源用全场散射场光源或者平面波光源从上方垂直入射偏振设为x方向。监视器放在柱下方约0.5微米的位置记录S参数并输出透射复振幅。这里有个我一开始踩过的大坑监视器位置如果不固定相位参考面会漂移。扫描相位时我们关注的是柱体本身引入的相位变化而不是传播相位累积。所以要么把监视器固定在同一高度要么在每次计算后减去一个常数相位项即k0 * z_offset。两种方法都能用但固定高度更省事。我在每个单元仿真中都把透射监视器统一放在z -0.5μm处这样计算angle(E)时直接和参考数据作差即可。2.3 网格尺寸与收敛性判断FDTD仿真的准确性很大程度上取决于网格设置。对于TiO2纳米柱柱体内部场强变化很剧烈特别是共振波段附近网格太粗会把共振峰磨掉。初次扫描时我建议使用dx dy 20nmdz 10nm的网格来做粗筛锁定几个候选直径后再把这些候选结构加密到网格尺寸5nm重新仿真验证。这样能兼顾扫描速度和精度。验证方法很简单分别用20nm和5nm网格算同一个直径柱子在目标波长下的透射相位如果相位差小于0.05rad说明网格收敛了。如果差得很大继续加密或者检查共振强度。整个超表面整体仿真时网格必须在保证可用内存的前提下尽量细。我当时的做法是全场仿真区域网格设为10nm只在强共振的标准柱附近局部加密到5nm。虽然FDTD是均匀网格但在Lumerical中可以用网格覆盖区域实现局部细化。3. 从相位分布到超表面布局设计3.1 单波长聚焦相位分布的计算理想超构透镜的相位分布由球面波聚焦条件推出φ(r) -(2π/λ)(√(r² f²) - f)其中r是像素中心到透镜中心的距离f是设计焦距。这个公式的含义是透镜各点需要提供不同的相位延迟使透过波前变成汇聚球面波。需要注意的是相位本身呈螺旋递增直接计算时要用到acos的等价变形或者atan2来避免数值误差但实际工程里用上式逐点计算再取模2π就够。对于多波长情况我们需要分别计算两个波长各自的相位分布。因为焦距可以不同所以φλ1和φλ2可能是两套完全独立的分布。这种“波长复用”的自由度正是论文标题里Dispersion的精华所在不是要去补偿色散而是利用色散把不同波长的光送到不同位置。3.2 单元响应扫描与数据库搭建编写扫描脚本来获取每个直径在特定波长下的复透射系数。核心思路是改变直径D跑一次FDTD记录监视器处的Ez(或者E透射)然后计算振幅T |E|/|E_ref|和相位差φ angle(E) - angle(E_ref)。E_ref是从一个空白基底仿真中获得的参考场。这里建议先跑“单柱直径-D1扫描”即固定D2不放置扫描D1得到两条曲线φλ1(D1)和φλ2(D1)。再看这两个波长下的相位响应是否足够独立。如果φλ2(D1)变化很剧烈而φλ1(D1)变化平缓说明λ2对柱A的敏感度不高结构分离度不够需要调整柱间距或柱高。这一步其实是整个复现中最花时间的你可能需要反复调周期和柱高才能让两个波长相位覆盖范围都接近2π同时尽量降低两者之间的耦合。数据库搭建的关键点在于相位提取方式。很多新手直接看T和angle(E)时发现曲线剧烈跳变原因是相位被卷绕在-π到π之间。用unwrap函数处理是一方面更根本的是应该保证参考面固定一致。我在扫描脚本里增加了对相邻直径相位差的检查一旦出现超过π的突变就自动记录该点后续设计时避开。因为这些跳变点通常是结构发生共振模式的切换相位不稳定无法用于透镜设计。3.3 双波长相位匹配与单元组合挑选数据库建好后进入“给定目标相位对(φ_target_λ1, φ_target_λ2)找最优(直径A直径B)”的匹配阶段。我把这个过程类比成查字典目标相位对是词条结构组合是释义。建立索引时需要定义误差函数error sqrt(w1 * (φλ1 - φ_target1)² w2 * (φλ2 - φ_target2)²)。权重w1和w2通常都取1但如果你对某一波长聚焦效率要求更高可以适当加大该波长的权重。搜索策略上我从“近邻优先”入手。因为透镜的相位分布是连续变化的相邻两个像素的目标相位差很小上一组结构参数可以作为下一组搜索的初值参考。这样既减少搜索时间也避免选出的参数跳变过大导致相邻柱之间的工艺间距不够。实际匹配时我用K-D树在数据库里查近邻把计算时间压缩到毫秒级。如果目标相位对难以命中即误差超过0.1rad就回到步骤二在对应直径附近做局部加密扫描补充数据库。4. 整片超表面的FDTD复现与结果核查4.1 建模大型超表面的几种方式当你把一个个像素结构映射成具体直径后就得到了一个二维数组但怎么把它变成FDTD里可仿真的结构还需要仔细处理。最常见的三种方式是直接用Lumerical的shape import导入GDS文件适合有版图文件的情况在软件脚本里逐像素画圆柱把每个圆柱建模为圆柱体对象适合单元数较少的子区域仿真用自编网格填充法直接把折射率写入一个三维数组再用自定义材料导入适合极大规模规则阵列。我复现时采用的是“脚本画圆柱”方式因为双柱结构的数量通常在几千个左右直接脚本循环生成结构对象并不算慢。为了避免内存溢出我把超表面设计成圆形孔径直径20μm总共约2000个双柱单元。这样FDTD区域内大概是2000个对象内存压力可控。超表面整体仿真时边界条件不能再使用周期边界而应该使用PML。光源用全场平面波z方向从结构上方入射监视器则分别放在焦平面附近和透射场远区。Lumerical中使用全场散射场光源时可以直接获取整个透镜的透射场也方便后续做远场投影。4.2 焦距提取与聚焦效率怎么读数整体仿真跑完后我们需要验证两个波长是否真正独立聚焦。标准的验证动作是分别以λ1和λ2为光源波长在x-z截面放置二维场监视器观察透过超表面后的场强分布。理想情况下λ1在z f1处出现一个焦斑λ2在z f2处出现另一个焦斑。由于两束波长的聚焦位置不同在x-z图里会看到两个明显分离的高亮亮点。焦斑位置的提取可以用场扫描脚本实现。强度使用 |E|² 计算找到极大值点坐标那就是实际焦距。然后与理论焦距比较偏差一般控制在5%之内。如果偏差过大先检查相位映射是否准确再检查出射波前是否由于单元离散化而引入高阶衍射。聚焦效率的计算公式我建议定义成焦平面处半径为0.75 * λ/NA的圆域内Poynting矢量积分除以入射光总功率。NA由透镜半径和焦距近似给出0.75系数是用来规避焦斑中心场强波动的经验值。第一次算效率时我习惯把透射总功率也输出来如果透射率很低说明单元阵列里有大量反射或散射得优先排查单元结构。4.3 串扰、偏振和焦距偏差的三个核查维度多波长透镜和单波长透镜最大的区别在于两个波长共用同一片区域所以必须仔细核查互相之间的串扰。核查方法很直接当一个波长入射时在另一个波长对应的焦点位置观察场强是否足够低。以我的复现为例λ1入射时λ2理论焦点位置的强度大约是主焦斑强度的1/10以下说明两个通道的隔离度合格。偏振敏感度是第二个需要关注的点。纳米柱是圆柱对称的理论上对x偏振和y偏振响应相同但双柱结构破坏了对称性。如果原来设计的柱A和柱B排列在x方向那么x偏振入射和y偏振入射的效果会不同。我用圆偏振光做了一次交叉验证发现焦点轮廓依然存在但效率略有下降。所以复现时最好在论文所述的偏振条件下进行。焦距偏差的核查则要回到相位分布本身。通过近场扫描提取焦平面波前与理想球面波前做差计算波前像差RMS。RMS很小的话说明超表面聚焦性能接近衍射极限。如果RMS过大很可能是单元数据库里的相位值与实际模型的相位值不一致常见原因是扫描阶段参考面位置不同导致全局常数相位偏移这个不会影响聚焦位置但会影响焦点峰值强度。5. 复现入坑与排查心得5.1 网格收敛性测试别一上来就开全局细网格我一再强调网格收敛测试是因为它的影响实在太容易被忽视。纳米柱的共振模式对网格非常敏感。原来在20nm网格下扫出来的“合适”结构换到8nm网格后相位可能差0.2rad聚焦效果大打折扣。所以最稳妥的做法是先用20nm粗网格跑完整套设计流程得到一个理论上的布局然后挑出布局中出现频率最高的几组直径组合在8nm或5nm网格下重新仿真核对相位数据是否一致。如果一致说明粗网格下扫描的结果可靠如果不一致就必须用细网格重新扫描数据库。内存与时间的取舍上我有一次扫双柱联合数据库用了100×100一万组仿真每组约20秒总耗时五十多个小时。后来改成“先单柱筛选局部细扫”的策略数据库规模缩到2000组时间缩短到十小时以内但结果基本一致。所以建议新手前期不要急着把参数空间铺满而是先画出单柱相位曲线的趋势图再锁定敏感区间。5.2 相位跳变的原因与解法扫描曲线里那些猛烈的“毛刺跳变”往往是纳米柱进入了新的共振模式表现为透射相位在光谱上出现快速反转。从物理上看这些区域对应的单元透射率通常也极低不适合作为透镜相位单元。处理办法很简单扫描时记录T和φ筛选数据库时把T低于0.3的单元直接过滤掉。这样虽然缩小了参数空间但能保证每个像素的透射效率相对均衡。另外要注意的是相位unwrap时如果只按时间轴方向简单展开可能会把真正的模式切换点误判成普通的2π卷绕。我建议在扫描结束后把相位随直径变化的离散点画出来人工扫一眼有没有异常的陡峭台阶。如果台阶宽度只有一两个扫描步长八成就是模式切换点要果断剔除。5.3 多波长设计的近场耦合问题双柱结构里两根柱子靠得很近近场耦合不可避免。我在单柱数据库里算出的相位和真正放进双柱结构里测到的相位会有微小的偏移。这个偏移如果被忽略积累到整个透镜上就会表现为焦点位置偏移或者焦斑变糊。排查方法非常朴素把双柱结构放到FDTD里单独看它在两个波长下的透射相位然后和单柱数据库提取的相位对比。如果偏差大于0.1rad就需要以双柱仿真结果为基准重建数据库。此外双柱之间的距离如果小于制造工艺允许的最小间距也会引入额外的加工误差。设计布局时我一般会在匹配算法里加一个约束条件要求两根柱子的中心距不小于180nm。这样做既避免近场强烈耦合也为后续可能的加工留出工艺余量。最后再分享一个实操小技巧如果你复现时发现两个波长的焦点位置总是互换或者偏移先别急着调结构回头检查一下你自己编写的相位映射脚本是否在计算φ(r)时把波长代错了。我在复现第二版时就因为波长赋值顺序写反导致532nm的焦斑跑到了633nm焦距位置排查了两个通宵才发现是这种低级失误。这行当里越基础的东西越值得反复自查。