ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Lumerical FDTD从零搭建二维光子晶体透射谱仿真全流程

Lumerical FDTD从零搭建二维光子晶体透射谱仿真全流程 很多刚接触Lumerical FDTD的朋友第一个想仿的模型往往就是光子晶体。原因很简单光子晶体是周期性结构物理图像清晰核心性质是光子禁带做一次透射谱仿真就能直观看到禁带的存在非常适合用来验证自己是否真的把仿真环境搭对了。但问题也出在这里——网上讲光子晶体概念的教程一抓一大把讲Lumerical FDTD怎么一步步建模、设光源、放监视器、跑通脚本的却不多大部分新手卡在了“软件装好了却不知道从哪下手”这一步。这篇文章我就用一套完整的脚本带你从零搭起一个二维光子晶体透射谱仿真环境跑通之后你会对FDTD仿真的整个链路有非常具体的体感之后再迁移到其他结构就顺理成章了。我选二维正方晶格介质柱型光子晶体作为第一个案例。介质柱材料用硅背景是空气晶格常数取0.6微米柱半径0.12微米扫描波长范围1.2到2.0微米。这个配置下预期在1.4到2.0微米之间能看到明显的透射下降那就是光子禁带的位置。下面从整体思路、物理模型、脚本解读、问题排查四个层面把整个搭建过程讲透包括为什么这么设参数、为什么用这个边界条件、脚本里每一行在干什么以及新手最容易踩的坑。1. 项目概述与整体思路拆解1.1 为什么第一个FDTD项目选光子晶体“搭建仿真环境”这句话听起来像只是装个软件但实际做起来它指的是整整一条链路几何建模、材料设置、求解区域配置、边界条件选择、光源激励、监视器布置、求解器运行、结果提取与判断。任何一环出错最后出来的图都可能是一堆没有物理意义的振荡。这也是为什么很多人照着论文里的结构去仿却怎么都复现不出别人的结果。光子晶体是走通这条链路的最佳训练场。它是周期排布的介质结构具有光子带隙特定频率的光无法在其中传播。这个性质在透射谱上会表现为一个很宽的透射低谷特征非常明显一旦你的仿真环境有误这个谷要么位置不对、要么根本出不来。换句话说光子晶体自带“仿真对错判断标准”这一点比仿一个简单的波导弯道或金属纳米颗粒要友好得多。而且光子晶体的建模套路可以平移到超表面、光栅、声子晶体等一大类周期结构上。你只需要把圆柱改成方柱、椭圆柱、空气孔或者把周期排列方式从正方晶格换成三角晶格仿真框架完全不用动。所以花一两个小时把这个环境跑通后面做任何周期性光学结构你都是在复用这套流程。1.2 整体流程设计从建模到出图的四个阶段我在给新手指导时习惯把整个仿真流程拆成四步每一步对应一个必须想清楚的问题。第一步是几何建模。你要明确结构长什么样晶格常数多大、柱半径多少、排几列几行、用什么材料、背景是什么。这一步决定你仿的是一个什么物理系统。第二步是求解区域与网格。FDTD方法本质上是在一个有限的计算区域内离散求解麦克斯韦方程组所以你要设置计算区域大小、维度2D还是3D、网格精度、边界条件。第三步是激励与探测。你需要一个光源把光注入结构再用监视器记录透过结构后的光场信息。第四步是求解与结果判读。运行仿真后提取透射数据、绘制光谱、判断禁带位置是否符合预期。那为什么推荐直接用脚本而不是全程用GUI点鼠标说实话Lumerical的图形界面很直观适合观察结构长什么样但纯靠GUI做参数扫描是非常痛苦的。你改一次半径就要重新点一遍菜单而脚本模式下所有参数都是变量循环、扫描、批量处理都极其方便。更重要的是脚本可以保存下来回头换结构、换参数只需要改几行这本身就是一种可复现的“仿真环境”。2. 核心参数与物理模型设计2.1 晶格、半径比、材料光子晶体模型的关键参数先讲三个最核心的结构参数因为它们直接决定禁带的位置和宽度。第一个是晶格常数a。光子晶体的禁带位置和a成正比这是一个尺度关系把整个结构放大两倍禁带波长也放大两倍。估算a有一个很实用的经验公式对于正方晶格介质柱结构、TM偏振电场沿柱方向禁带中心大约在归一化频率f a/λ ≈ 0.3到0.35附近。如果你想禁带中心在1.55微米附近光通信波段那a就应该取0.5到0.6微米。我脚本里取的0.6微米对应禁带中心大约在1.7到2.0微米左右。第二个是半径比r/a。它控制禁带的宽度和位置。r/a太小介质柱对光的散射太弱禁带打不开r/a太大柱子几乎连成一片结构接近反晶格禁带也会退化。对于正方晶格介质柱0.2到0.3是比较保险的范围新手可以从0.2起步。要注意r/a的取值和背景折射率、柱材料折射率是耦合的换了材料体系最优r/a也会变。第三个是材料折射率。光子晶体产生禁带的根源是介质柱和背景之间存在折射率对比度。对比度越大禁带通常越宽。硅在近红外波段折射率约3.45背景用空气折射率1对比度足够大是我最常用的选择。新手最容易犯的错误是把材料折射率设成1.45这是二氧化硅的值或者忘记给柱子赋材料导致柱子和背景没有折射率差那当然不会出现禁带。2.2 FDTD求解区域边界条件、网格与维度的选择为什么第一个项目选2D而不是3D因为2D仿真在物理上对应的是无限长的柱体计算量小通常几十秒到几分钟就能跑完非常适合快速验证思路。同时二维模型保留了光子晶体最核心的物理——周期性和带隙你完全可以靠2D结果判断环境是否正确。3D仿真要引入有限柱高、刻蚀深度、衬底等额外变量新手阶段没必要一上来就碰。求解区域设置里最关键的是边界条件。我的做法是光传播方向也就是x方向用PML吸收边界模拟光跑出计算区域后不反射回来y方向也用PMLz方向因为是2D仿真、结构在z方向无限延伸、场沿着z方向均匀所以用periodic周期边界。这里有个容易踩的细节对于2D仿真z方向的边界条件实际上很少影响结果但如果你突然想做3D仿真却忘了把z方向的periodic改成PML光会在z方向来回反射产生大量虚假振荡。网格精度方面Lumerical的mesh accuracy参数范围是1到8。新手先设3跑通流程确认物理上对了之后再提高到4或5做收敛性验证。不要一上来就设7或8否则一个简单的二维结构也可能让你等上几个小时。2.3 光源与监视器让光子以特定偏振穿过光子晶体光源选择上新手最常用的是平面波。它适合模拟一束光垂直入射到有限厚度的光子晶体上简单直接物理图像清楚。还有一种模式光源适合做波导耦合后面进阶再用。我这个项目里用平面波波长扫描范围1.2到2.0微米覆盖禁带区域。偏振的选择很关键。对于正方晶格介质柱TM偏振电场沿柱子轴向即z方向的禁带通常比TE偏振明显得多。Lumerical的平面波里polarization angle设置为90度时对应TM设置为0度时对应TE。我脚本里写的是90度。很多新手跑完说看不到禁带结果一查偏振设成了0度在r/a0.2的配置下TE方向禁带很窄容易被透射谱里的振荡淹没。监视器方面我在光子晶体后方放一个功率监视器记录透射光的总功率。关键点是监视器的位置要离结构边界足够远一般建议至少离开一个工作波长我取的是3倍晶格常数大约1.8微米避免收集到结构表面附近的倏逝场。再加一个时间监视器作用是判断仿真是否收敛——如果时间监视器里的信号已经衰减到接近零说明能量已经跑出了计算区域仿真可以正常结束。3. 完整脚本分析与逐段解读3.1 脚本结构总览与运行方式下面就是这套环境的核心完整可运行的Lumerical脚本。脚本文件后缀是.lsf打开Lumerical FDTD后在Scripting窗口里新建文件粘贴执行即可。如果你习惯用GUI也可以在Model Library里新建项目然后把脚本一行行敲进去对照着看。脚本结构是四段式参数区所有可调参数集中在最上面、建模区FDTD区域、圆柱阵列、边界条件、激励与探测区平面波光源、功率监视器、时间监视器、运行与后处理区run、提取数据、绘图。这样的组织方式方便你以后做参数扫描只改最上面的参数区下面代码不用动。# photon_crystal_transmission.lsf # 2D 正方晶格介质柱光子晶体透射谱计算 # 适用版本Lumerical FDTD 2020 R2 及以上 um 1e-6; # ---- 物理参数 ---- a 0.6*um; # 晶格常数 r 0.12*um; # 圆柱半径, r/a 0.2 n_cols 5; # x方向柱列数, 决定光子晶体厚度 n_rows 7; # y方向柱行数, 决定光束覆盖宽度 lam_min 1.2*um; # 波长扫描起点 lam_max 2.0*um; # 波长扫描终点 # ---- 清理环境防止上次运行的残留对象 ---- deleteall; # ---- FDTD 求解区域 ---- addfdtd; set(name,FDTD_region); set(dimension,2D); set(x,0); set(y,0); set(z,0); set(x span,8*a); set(y span,6*a); set(z span,1.5*um); set(mesh accuracy,3); set(x min bc,PML); set(x max bc,PML); set(y min bc,PML); set(y max bc,PML); set(z min bc,periodic); set(z max bc,periodic); # ---- 光子晶体圆柱阵列 ---- x_centers -2*a : a : 2*a; # 对应5列 y_centers -3*a : a : 3*a; # 对应7行 for (i 1:length(x_centers)) { for (j 1:length(y_centers)) { addcircle; set(x, x_centers(i)); set(y, y_centers(j)); set(z, 0); set(radius, r); set(material, Si (Silicon) - Palik); } } # ---- 平面波光源 ---- addplane; set(name,source_plane); set(injection axis,x); set(direction,forward); set(x,-3.0*a); set(y,0); set(z,0); set(x span,0); set(y span,5*a); set(z span,1.5*um); set(wavelength start,lam_min); set(wavelength stop,lam_max); set(polarization angle,90); # TM: 电场沿z轴 # ---- 透射功率监视器 ---- addpower; set(name,trans_monitor); set(x,3.0*a); set(y,0); set(z,0); set(x span,0); set(y span,5*a); set(z span,1.5*um); # ---- 时间监视器 ---- addtime; set(name,time_monitor); set(x,3.0*a); set(y,0); set(z,0); # ---- 运行 ---- run; # ---- 提取结果并绘图 ---- T getresult(trans_monitor,T); lam T.lambda*1e6; # 转换为微米 Tval T.T; plot(lam,Tval,Wavelength (um),Transmission (a.u.));3.2 建模段解读为什么是5列7行边界条件凭什么这样设先看FDTD区域。我把x方向跨度设为8倍晶格常数比结构本身的5列柱跨度4倍晶格常数向外各留了2倍晶格常数的空间这是为了给PML边界留出缓冲距离。PML边界虽然是吸收边界但它对倏逝波还是有反射离结构太近反射就会被监视器接收到污染透射谱。y方向跨度6倍晶格常数而圆柱阵列y方向7行覆盖的跨度刚好也是6倍晶格常数。也就是说光源和监视器的y方向尺寸5倍晶格常数略小于结构高度确保收集到的透射光都经过了完整的光子晶体不会从边上绕过去。这是一个很重要的细节如果光源比结构还宽一部分光会直接从晶格旁边绕过去到达监视器禁带会被“漏光”填满看起来透射谷就变浅了。圆柱阵列用了一个双重循环把5列7行共35个圆柱依次创建出来。循环里每一次addcircle都会新增一个圆柱对象位置由x_centers和y_centers决定。这种写法的好处是以后你想改成三角晶格只需要改这两个数组的赋值方式思路非常清晰。材料和折射率方面我用的“Si (Silicon) - Palik”是Lumerical材料库里的内置材料包含硅在整个波长范围内的实测光学常数精确度高。如果你用的版本里搜不到这个名字也可以手动添加一个固定折射率3.45的材料替代效果差异不大。3.3 光源、监视器与结果提取为什么这样放、这样取数光源放在x -3.0a处也就是阵列左侧。方向设置为forward表示向正x方向传播。z方向跨度1.5微米因为是2D仿真这个值不会影响实际物理但必须设置否则软件可能报错。监视器和光源的x位置是关于阵列大体对称的光源在左侧距阵列边缘一列柱的距离监视器在右侧同样距阵列边缘一列柱的距离。为什么用功率监视器而不是场监视器因为功率监视器直接给出透射功率T数据省去了自己积分坡印廷矢量的麻烦对新手最友好。运行完成后用getresult函数从监视器里提取数据。变量T包含多个字段其中lambda是波长数组T是透射功率数组。我把波长换算成微米单位再画图这样横坐标看起来更直观。如果你用的是较新版本的Lumerical某些版本里T数据也可能存放在别的字段名里如果这行报错就先用m getresult(trans_monitor,P)看看结果结构里有哪几个字段再改成对应的字段名。3.4 做一次对照实验没有光子晶体时的透射谱单跑一次透射谱你会看到绝对透射功率在禁带位置出现一个坑但很多人会问这个透射率是百分之多少要回答这个问题最可靠的做法是做一个参考仿真把所有圆柱删除其他设置完全不变再跑一次得到无结构时的透射功率T_ref。透射率就是T/T_ref。这么做可以把光源光谱形状、监视器光谱响应等系统因素全部归一化掉。操作很简单在脚本里添加一个参数include_rods设置为1时建圆柱设置为0时跳过圆柱循环。先跑include_rods0拿到T_ref并保存成变量再改成1跑一遍得到T_rods然后用T_rods除以T_ref画图。如果嫌麻烦不做对照直接看绝对透射的下降趋势也够用了毕竟禁带位置和相对深度是主要信息。有一点要提醒无结构时的透射谱并不是平坦的直线因为光源本身的强度随波长有起伏空气间隙里也会有法布里-珀罗型干涉。所以不要看到“有结构透射谱”里有些小波动就觉得是假的对照实验能帮你区分哪些是真实禁带、哪些是光源本身的包络。4. 运行结果的关键判读与常见问题排查4.1 一个仿真结果“对”还是“错”怎么判断脚本跑完、曲线画出来之后最关键的问题来了这个结果对吗我一般从三个特征判断。第一是否在预期波长范围出现明显透射谷。按照我们前面算的正方晶格介质柱、r/a0.2、硅材料、TM偏振禁带应该在1.4到2.0微米附近。如果你的谷出现在完全不同的位置先检查是不是a或者r填错了。第二禁带深度够不够。在一个设计合理的二维光子晶体里禁带内的透射功率应该比通带低一到两个数量级也就是透射曲线上出现一个非常深的谷。如果谷很浅大概率是y方向的行数太少或者是光源宽度超出了结构范围导致漏光。第三禁带边缘和通带区域有没有明显的不规则振荡。FDTD本身在频域上会有一定数值振荡但如果振荡幅度大到把禁带都淹没了那就要怀疑网格精度不够或者PML反射太强。适当提高mesh accuracy如果禁带形状基本不变说明网格收敛了。我的经验是只要这三点都对上了你的仿真环境就基本搭建成功了这个二维光子晶体模型可以直接作为后续所有周期结构仿真的模板。4.2 高频问题排查速查表新手在实际操作里遇到的问题我整理成了一张排查表基本涵盖了95%的情况。现象可能原因处理方法仿真一直不结束auto shutdown level太小、结构Q值太高、时间监视器没布好检查时间监视器是否收敛确认shutdown level设为1e-5左右透射谱里完全没有禁带偏振设置错误、材料折射率没设置、r/a太小确认polarization angle90检查圆柱材料尝试增大r/a透射谷位置和理论预期偏差很大晶格常数a或波长单位弄错检查a0.6e-6还是0.6检查是否用了纳米单位混淆透射谱振荡非常密集网格精度不够、PML离结构太近提高mesh accuracy增大PML和结构之间距离脚本报object找不到版本不同、对象名被自动修改用getresult前先列出全部对象名核对大小写材料库里找不到Si材料版本精简或材料库路径问题用addmaterial添加常数折射率3.45的材料替代光似乎从结构旁边漏过去了光源宽度大于结构横向尺寸把光源y方向跨度调小保证所有光都经过光子晶体2D仿真提交时报三维Z方向错误z span未设置或参数类型错误给光源、监视器都设置z span值注意单位4.3 新手最容易踩的三个环境坑第一个坑是“2D仿真里的圆柱到底代表什么”。很多新手以为2D仿真里画一个圆代表一个有限高度的柱子其实是错的。在二维FDTD里这个圆代表了在z方向无限延伸的柱体的一个截面。这正好是理想光子晶体的模型没有问题但如果你以后在3D里做同样的结构必须额外设置柱子的高度并且柱高对禁带深度影响很大。建议在脚本注释里写明白这一点避免三个月后回来看到模型时产生困惑。第二个坑是PML离结构太近。我见过有人把FDTD区域设置成刚好包住圆柱阵列觉得这样节省计算空间。在2D仿真里这点计算量微不足道但PML边界紧贴结构会导致吸收不彻底产生反射表现为透射谱上叠加周期性波纹。我的习惯是至少留出2到3倍晶格常数的缓冲距离宁可区域大一点也不要跟边界做邻居。第三个坑是盲目提高mesh accuracy。新手看到结果不好第一反应是把网格精度拉满。这种做法在2D仿真里风险不大顶多多等几分钟但它治标不治本。网格精度只是数值收敛性的一个因素物理模型错了网格再细也没用。正确顺序是先确认物理模型和边界条件没问题再通过对比mesh accuracy3和4的结果做收敛性检查而不是一上来就追求最高精度。5. 从环境搭建到进阶下一步该怎么走5.1 从透射谱到能带结构验证光子晶体性质的第二把尺子透射谱能告诉你光子晶体在某个方向上有没有禁带但它有局限它只反映了光沿某个特定方向入射时的行为。真实的光子晶体带隙是方向相关的完整描述需要能带结构图。Lumerical里可以用Bandstructure计算器在周期边界条件下对第一布里渊区的高对称点进行波矢扫描得到频率和波矢的关系禁带在能带图中表现为一片没有能带存在的空白区域。我建议你跑通本文的透射谱仿真后再花半天时间做一次能带计算。透射谱和能带图相当于两个互补的验证工具能带图告诉你理论上禁带在哪透射谱告诉你实验上透过率在哪下降。两个结果能对上你的仿真环境就是真正可靠的。5.2 性能优化与三维迁移的实用建议二维仿真通常很快但如果你以后转到三维计算量会暴涨好几个数量级。我在实际项目中用过的优化手段按优先级排序是先用二维做全局参数扫描确定最优参数再用三维只验证几个关键点三维仿真尽量利用对称边界条件比如结构关于x轴对称时可以把计算区域减半网格精度先粗后细用粗网格筛选趋势用细网格生成最终数据。Lumerical支持GPU加速但版本不同、GPU的显存和驱动都有影响实际加速效果差异很大。建议查一下官方文档关于GPU加速的支持矩阵别在老旧版本上白折腾。另外如果你后续要做波导耦合、谐振腔Q值计算这类课题可以从本文的透射谱脚本出发把平面波换成模式光源把功率监视器换成模式监视器再利用FDTD的Q值自动提取功能。整体框架不需要变你只是在已有的环境里替换“激励”和“探测”两个模块这就是当初把脚本结构设计清楚的回报。我在实际带新人做项目时发现最容易出成绩的路径就是先完整跑通一个结构简单、物理清晰、自带验证标准的仿真而不是急着去复现复杂的论文结构。光子晶体透射谱这个案例会把FDTD仿真的所有关键环节都过一遍而且跑完你就有了一个可以长期复用的脚本模板。等你哪天需要仿超表面、仿光栅、仿等离激元翻出这个脚本改改结构参数和材料就可以直接开工了。
返回列表