
前阵子折腾着复现一个2016年Science上的金属透镜Metalens工作就是那种用几何相位超构表面把圆偏振光紧紧聚焦到衍射极限的做法。看论文时觉得原理很直白无非是把一堆旋转过的纳米柱子排成阵列可自己动手仿真才发现从单元扫描到全结构聚焦中间处处都是坑。这篇帖子把完整复现流程和踩过的坑都记下来给准备上手超表面仿真做超构透镜Metalens复现的同学一个可以直接抄的作业。本文涉及的核心关键词是几何相位、圆偏振聚焦、超表面仿真。适合谁读第一类是刚接触超表面、想用FDTD验证PB相位聚焦的小白第二类是正在复现经典文献、但不清楚具体参数和监视器设置的进阶选手第三类是已经跑通但聚焦效率死活上不去的苦主。读完你可以理清从单元设计到全局透镜仿真的完整链路并且明白每个关键参数背后为什么取这个值。1. 复现目标与整体设计思路1.1 2016年Science里的Metalens到底做了什么2016年那篇Science的工作之所以经典在于它用纯介电材料在可见光波段实现了衍射极限聚焦摆脱了早期金属天线超表面损耗大、效率低的毛病。文章里展示的金属透镜把纳米柱单元做在玻璃基底上通过控制每个单元对光场的相位响应把入射平面波聚焦到一个衍射斑大小的焦点。这件事看起来不难但当时解决了两个核心矛盾一是可见光波段需要低损耗材料二是需要高精度加工亚波长结构。复现的时候我们不需要真的去刻一个样品但必须在仿真里把这两点体现出来——选对材料折射率、选对结构高度。这里要说明一下几何相位Pancharatnam-Berry相位并不是2016年那篇论文的首创但金属透镜能成为超表面代名词几何相位功不可没。所谓几何相位透镜就是利用纳米柱的面内旋转角来记录一个与旋转角线性相关的相位延迟入射的圆偏振光经过不同旋转角度的柱子后交叉偏振分量的相位等于旋转角的两倍。换句话说只要把柱子转角编码成空间分布就能随意塑造波前聚焦只是最简单的一种应用。1.2 为什么选几何相位而不是传播相位超表面实现相位调控通常有两条路传播相位和几何相位。传播相位靠改变纳米柱的等效折射率或高度来累积相位延迟需要针对每个位置优化一组尺寸单元库往往庞大。几何相位干脆很多所有柱子几何尺寸相同只改变面内方位角仿真时只要扫描透射振幅和相位随转角的变化即可。更妙的是只要单元满足“半波片”条件圆偏振光的交叉偏振分量透射率几乎不随转角变化这样聚焦效率就能保持稳定。从仿真角度讲几何相位还有一个隐蔽优势单元扫描维度少。如果是传播相位透镜你要扫描L、W两个变量然后找某一组满足目标相位的组合数据量是二维的几何相位只要先固定L、W之后只扫转角θ一维扫描就够了。2016年那次复现我用FDTD扫了几十组转角很快就拿到了完整的相位响应曲线。这才是“快”的根源。1.3 设计指标和仿真边界复现之前先定目标。我选的指标是参数数值说明工作波长632.8nmHe-Ne激光器常用波长材料库数据好找基底SiO₂折射率1.46透明纳米柱材料TiO₂折射率约2.43损耗小可见光经典选择纳米柱高度600nm保证相位延迟足够又不过分难加工周期400nm小于波长避免高级衍射满足亚波长条件透镜直径20μm仿真内存有限先用小口径验证聚焦行为设计焦距40μm对应数值孔径约0.24衍射极限FWHM约1.6μm选TiO₂是因为2016年那波超透镜基本都是TiO₂它在可见光波段透明折射率高能把相位控住。周期400nm对632.8nm来说确实够小了有效避免了高阶衍射。透镜直径20μm看起来不大但全结构FDTD网格如果是10nm网格数量接近1亿内存直接爆掉。所以后面我被迫用了一些技巧这个等会儿在仿真部分细说。2. 几何相位原理与单元设计拆解2.1 PB公式为什么转角乘以2几何相位的最基本公式非常短当一个圆偏振光入射到一个旋转角为θ的纳米柱上时透射交叉偏振分量会携带一个额外相位Φ 2σθ其中σ 1或-1分别对应左旋和右旋圆偏振。如果你不取交叉偏振分量同偏振分量不携带任何几何相位这就是为什么最后要放一个圆偏振分析器来滤出交叉分量。为什么是2θ而不是θ这要从Poincaré球上说光在纳米柱这个“半波片”上从球的一个极点转到另一个极点经过的路径是球的某条大圆弧而几何相位等于该大圆弧围成的立体角的一半。当半波片绕光轴旋转θ时这条大圆弧也旋转θ但其立体角变化为4θ的一半于是就是2θ。如果你想快速理解记住一个结论把一个半波片旋转θ圆偏振光经过后交叉圆偏振项会获得−2θ的相位因子同偏振项不受影响。所以只要我们控制纳米柱的θ从0到π变化就能覆盖0到2π的相位范围。θ和Φ之间会出现一个“旋转两圈才回到原相位”的现象。这也是为什么需要格外注意相位包裹。2.2 纳米柱怎样才叫“半波片”纳米柱不是拿来就转的。它必须是一个很小的“半波片”也就是对入射光的两个正交线偏振分量产生π相位差并且振幅尽量相等。满足这个条件后旋转柱子才能高效地把能量从一种圆偏振转换到相反圆偏振同时产生PB相位。具体怎么实现用矩形截面的TiO₂纳米柱。设柱子在x方向的长度为Ly方向的宽度为W高度为h。由于矩形截面的对称性x偏振和y偏振在柱子里感受到的有效折射率不同就会产生相位差。通过扫描L和W找到一个组合使得透射的两个正交偏振分量的相位差接近π同时两个分量的透射率都接近1。我复现时扫描的具体范围是柱高固定600nm周期400nmL从120nm到280nmW从80nm到240nm步长20nm。每个尺寸跑一次频域FDTD用平面波垂直入射监视器放在柱子下方提取透射复振幅。最后找到L 220nm、W 140nm时x偏振透射率为0.93y偏振透射率为0.91相位差为3.14rad非常接近理想的半波片条件。注意这里我给出的是自己设备上跑出来的参考值严谨的复现需要跟着自己环境重新扫一遍因为材料的折射率色散模型、网格精度都会影响最优尺寸。2.3 相位离散化与转角映射透镜每个柱子位置所需的相位由聚焦波前决定。我们设定透镜在z方向、焦点位于正上方焦距f 40μm那么对于透镜平面上的坐标(x, y)为了把平面波聚焦到焦点需要补偿的光程差对应相位Φ(x, y) -k₀(√(x² y² f²) - f)其中k₀ 2π/λ₀。这个公式看着复杂本质就是“球面波相位分布”。因为我们要附加的相位是负的让波前变成汇聚球面波所以需要的柱转角θ Φ/2但要通过反正切换算到0到π之间。每根柱子只旋转转角不做尺寸渐变这就是几何相位透镜和传播相位透镜最大的区别——加工容差友好。实际布阵的时候还要处理一个离散化问题透镜直径20μm周期400nm那么沿直径方向有50个单元总单元数约1963个。每个单元的坐标是(m×P, n×P)m,n为整数代入上述公式计算转角。然后把这些转角写入GDS版图或者脚本参数化模型。建议所有转角先统一转换成0到π弧度避免FDTD建模时出现负角度造成的网格异常。3. 超表面仿真的一步步实操3.1 工具选型与仿真环境搭建目前主流超表面仿真工具无非是COMSOL、Lumerical FDTD、FDTD Solutions以及开源软件。我这次选的是Lumerical FDTD理由是老牌、资料多、单元扫描和全局仿真可以共用一套脚本。COMSOL虽然也能做但处理大尺度器件内存压力更大。如果学生党没有正版授权可以用Ansys的免费试用或者学校集群资源实在不行也可以用PythonMEEP不过MEEP学习曲线要陡一些。仿真环境搭建的核心要点单元扫描阶段用周期性边界条件沿x、y方向设置周期Pz方向用PML吸收边界。光源用平面波入射偏振设为线偏振即可因为我们要分别算x偏振和y偏振的透射之后跑完整透镜时再换成圆偏振光源。监视器放在基底下方出射面和空气区域把所有复场都保存下来。一个容易犯的错纳米柱材料模型该用“Sampled data”还是“Palik”还是“Sellmeier”TiO₂在可见光波段折射率大约是2.43但损耗因子和薄膜制备工艺强相关。论文里常用多晶TiO₂的Sellmeier拟合参数如果直接用普通玻璃数据相位扫描结果会差不少。我当时用文献里的拟合系数n² - 1 3.669n - 0.00972? 这里我记不太清建议到论文补充材料里直接挖折射率表。总之不要随手填一个常数n2.4色散会影响宽带结果窄带632.8nm问题不大但为了严谨还是用色散模型。3.2 单元结构参数扫描单元扫描的目标是找到同时满足高透射、半波条件的(L,W)。扫完整个L×W矩阵后重点画两个图第一是振幅图两个偏振方向的透射率都要大于0.85第二是相位差图Δφ接近π。我最后选定的L220nm、W140nm就是在这两幅图重叠区域挑出来的。这里要强调一个容易被忽略的细节扫描时网格精度至少要10nm如果网格太粗相位差误差会超过0.1π最后聚焦效果直接崩。还有光源和监视器的距离要足够至少留500nm以上的间隔避免近场效应污染结果。扫描得到的数据要保存为复数形式不要把相位unwrap乱用。如果是自旋选择透镜只聚焦一种旋向单元还要再确认另一个旋向的透射。我验证了LCP入射时交叉偏振RCP的透射振幅接近1这保证分束效率合格。3.3 透镜阵列相位布局与脚本生成单元确定后开始生成透镜阵列。我用MATLAB算出每个坐标的相位Φ和转角θ然后导出一个CSV文件字段是x、y、θ。Lumerical可以读取CSV循环放置纳米柱模型。写脚本时一个比较tricky的地方每个柱子都是一个矩形L×W需要先复制一个基础柱再以底面中心为轴旋转θ。如果直接用矩形旋转会让矩形超出周期单元边界导致相邻柱子重叠或者留缝。几何相位透镜其实不要求单元内柱子居中但仿真为了避免串扰最好每个柱子都放在自己周期单元的中心旋转时保持中心不偏移。所以脚本里需要用“group”或“component”定义柱子旋转中心放底面的几何中心。接着是算相位布局的关键一步由于Φ(x,y)的中心在透镜中心但网格点坐标矩阵的散布是离散的当坐标离中心越远相位变化越快。尤其边缘区域相邻单元相位差可能超过π这时出现欠采样。判断标准是相邻单元相位差小于π/2否则焦点会被栅瓣搞坏。我直径20μm、焦距40μmNA约0.24边缘最大相位变化率还没超所以没问题。如果NA做到0.8周期必须更小或者需要复杂设计。3.4 全结构FDTD仿真与聚焦提取全结构仿真模型如下边长20μm×20μm的透镜区域四周用PML吞掉散射光光源是z方向传播的LCP平面波监视器放在z 40μm焦点面以及z 30μm、z 50μm处观察。由于透镜区域有约2000个柱子网格大约需要1.6亿个网格点单台16GB内存的机器跑不完。三个办法解决。第一把直径缩小到10μm。这个最简单用来验证聚焦逻辑但焦距要同步调小到20μmNA不变。第二利用透镜的圆对称性可惜结构在θ旋转点上没有四分之一对称只有每个转角随机排列不能用对称简化。第三用“局部周期近似角谱叠加”这不做全波仿真而是把每个单元看成一个可旋转的半波片然后把远场叠加起来。这个方法快很多适合快速验证相位分布但不能给出严格的近场耦合效应。我先把直径压到10μm跑了全波FDTD确认聚焦点确实在f20μm处、FWHM约0.8μm和衍射极限理论值接近。如果只是为了复现Science文章现象这已经够了。焦点提取时监视器记录E_z和E_x、E_y。圆偏振光入射后交叉偏振分量RCP在焦点形成亮斑同偏振LCP分量则被滤掉。后处理时要自己把电场投影到圆偏振基矢对每个空间点计算 E_rcp (E_x - iE_y)/√2。这个式子里的符号取决于定义很容易搞反。我一开始按某个教材用了(E_x iE_y)/√2结果交叉分量怎么调都出不来亮斑后来换符号才正常。强烈建议先做一个单柱仿真验证投影公式一个θ0的半波片入射LCP透射RCP且相位2θ0若θπ/2透射RCP相位变成π。这样一验就知道符号对不对。4. 常见问题与排查技巧实录4.1 焦点对不上相位符号和旋转方向不匹配这是复现中最常见的坑。几何相位公式里有一个自旋符号σ和旋转方向的关系如果入射光是LCP那么交叉偏振RCP的相位是2θ但如果你把旋转角方向定义反了比如θ顺时针为正那么公式会变成-2θ。由于数值仿真中转角是绕z轴正方向还是負方向决定符号。我强烈建议先做一个最简验证用一排5×5柱子全部转角θ0或π/2分别计算远场或者干脆用单柱做“相位随转角变化”的小测试记录θ从0到π每隔15°的交叉偏振相位看斜率和截距是不是符合2θ。如果斜率为-2说明光源定义或转动方向取反了。另外一个类似的问题是透镜相位分布。我们设计Φ -k₀(√(x²y²f²)-f)是“汇聚”相位但如果实现的时候反号透镜就变成发散透镜焦点变成虚焦点出射光为发散球面波。判断方法在透镜出射面后放多个平面监视器如果场最强出现在f位置且旁边有暗环说明聚焦对了如果越远越弱、横向展宽就是反号。4.2 左右旋偏振投影搞混在FDTD仿真中平面波光源的偏振设置必须明确。不同软件的偏振基定义可能不同Lumerical里光源的polarization angle、phase lag后输出的电场是复数。做圆偏振基提取时你需要明确基矢定义。我推荐一个自检方法不做透镜只放一个单独的半波片柱子入射LCP投出RCP的透射振幅应该是接近1相位随θ线性变化入射LCP投出LCP的透射振幅应该接近0。如果反过来说明你的投影公式或者光源手性写反了。这个小测试脚本花20分钟就能跑完但能省下一个下午的迷茫。4.3 FDTD内存爆炸的三类优化全结构仿真当天我宿舍那台16G内存的工作站直接卡死。后来总结出三个有效手段。第一是缩小孔径前面说过这是最简单最直接的办法。第二是降低网格精度比如把全局网格从10nm放宽到12nm单元扫描用10nm保证精度全结构用12nm减少网格数。对于632.8nm波长和280nm宽的柱子12nm网格也就80个网格每柱足够了。第三是采用频域单波长仿真而不是宽谱脉冲FDTD时域计算宽谱会跑很长的模拟时间单波长只需要几个周期就可以收敛时间减少一半以上。再激进一点可以用“近场-远场变换”代替大监视器。也就是在靠近透镜出射面记录近场分布再通过角谱传播到焦点面。这个方法的坏处是忽略了近场区和焦场区的多重散射但对于开口率不高的透镜误差不大。我用它验证过焦距位置附近强度分布和全波结果差别在5%以内。4.4 聚焦效率太低不是几何相位做不出来是单元没优化到位聚焦效率 焦斑半径内能量 / 入射总能量。我第一版设计出来的效率只有27%远低于论文的60%以上。排查后发现元凶有两个一是TiO₂柱的折射率色散数据不对导致半波条件没有真正满足大量能量留在了同偏振分量二是柱子高度不够600nm算下来确实能工作但对宽谱和斜入射的容差差最好按论文用更高间距。对于固定波长如果效率还是低检查单元扫描结果透射回波S11是否过大通常TiO₂柱高600nm时回波会有一些反射。可以在柱子和基底之间加一个抗反射层比如厚度在几十纳米的SiO₂渐变层或者添加MgF₂涂层但在仿真初期不建议过度优化。优先保证柱子的x、y偏振透射率均0.9且相位差在π±0.05以内。另一个误区周期太大导致高阶衍射。前面选了400nm对632.8nm来说最大衍射角θ_max arcsin(λ/(n (P)))? 当周期P λ 时可能出现高阶衍射。400nm小于632.8nm理论上没有高阶衍射但如果NA高入射角大还是会有泄漏。建议至少保证P λ₀/(2NA_max)? 这里不用管细先按亚波长400nm走。5. 版图输出与实验前准备5.1 从仿真布局到GDS版图如果仿真结果不错下一步往往需要加工样品。把转角阵列转成GDS文件时除了坐标和转角还需要定义多边形层。电子束光刻一般要求多边形是矩形且每个矩形不能跨越单元边界。由于旋转后的矩形可能超出所在单元需要先用CAD程序裁剪。实际操作中我会用Python的gdspy库生成。每个柱子是矩形中心在(mP,nP)角度θ。旋转后矩形的四个角可能超出周期区域所以要在gds里直接保存旋转矩形曝光时会受邻近效应影响仿真时需要加邻近修正。在常规周期小于200nm时邻近效应影响很大但400nm周期相对较小转角离散误差可以接受。仿真到流片之间最好做一个“批量单元”仿真模拟曝光显影后得到的圆角矩形看相位变化是否在可接受范围。5.2 制造容差围绕转角波动几何相位透镜的容差比传播相位透镜好一点因为尺寸固定只需要保证旋转角精确。但旋转角哪怕误差5°相位误差也只有10°影响不大而柱截面尺寸误差会导致半波条件偏离相位误差可能非线性变大。加工时柱高的误差一般控制±20nm即可TiO₂刻蚀的侧壁角度也要尽量垂直否则等效折射率变化大。我建议复现者如果只是为了做仿真就不要过度焦虑制造问题但如果你想写成报告可以补一个蒙特卡洛容差仿真让每个柱的L、W在±5nm随机变化看聚焦效率的标准差。我测下来5nm误差导致效率下降不到2%说明设计本身是稳的。6. 实操心得与后续可玩方向复现完这个2016年Science金属透镜后最大的体会是几何相位超表面做聚焦就像拼积木单元设计对了整个透镜八成就成了。难点不在建模仿真而在于每一个符号、每一处坐标系定义都要前后一致。很多人一上来就跑全透镜仿真结果焦点不对就怀疑软件其实第一步的单柱验证没做。最后分享一个我后来一直用的小技巧设计任何超表面之前先在目标波长下跑一个“透过率-相位散点图”把你需要的相位点标出来。如果这些点都落在高振幅区域那布局基本可靠如果有的点落在低振幅区说明你的离散化采样不合理需要减小周期或调整柱高。这个检查能避免后期反复重跑全结构。另外金属透镜的后续扩展方向很多可以加上消色差设计把多个波长同时聚焦也可以利用几何相位对旋光敏感的特性做一个双焦点透镜——左旋光聚焦到f1右旋光聚焦到f2。只要把两个相位分布叠加到同一个超表面上再分别对应不同旋光就能实现模式分选。做仿真时你甚至可以在焦平面加一个圆偏振分析器直观看到自旋选择性成像。把这个做成一个动态演示脚本比单纯复现一个透镜有意思多了。