多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

COMSOL仿真弯月型BIC:斜入射SBC线偏振激励全流程详解

COMSOL仿真弯月型BIC:斜入射SBC线偏振激励全流程详解 光做BICBound State in the Continuum连续谱束缚态仿真的人估计都体会过那种感觉原理全懂文章也看了不少结果一落到COMSOL里模式找不到、边界报错、偏振乱飞。尤其是弯月型这类带曲率、带周期性的微纳结构再加上斜入射那真是一步一个坑。最近我自己就在搞这个方向把一套基于散射边界条件Scattering Boundary ConditionSBC做斜入射线偏振激励的方法彻底跑通了。今天不扯理论空话直接把这套流程掰开揉碎给你看怎么建弯月结构怎么配Floquet周期怎么在SBC上把斜入射的线偏振平面波“注入”进去扫频、取透过率、挖Q因子每一步该注意什么全写明白。这篇文章适合正在用COMSOL做超表面、纳米光子、等离激元共振仿真的朋友。不管你现在是刚入门看教程还是已经被某个稀奇古怪的报错卡了两天下面这套操作应该都能帮上忙。先说清楚我这里用的是波动光学模块的频域求解版本不同菜单位置会稍有差异但逻辑是通用的。1. 先想清楚弯月型BIC的物理图像与仿真目标1.1 什么是BIC为什么它值得大费周章BIC是个听起来反直觉的概念一个模式明明处在连续辐射谱里——也就是说能量按理说能往外跑——但它就是被“锁”在结构内部不向远场泄漏。打个比方你在一堆排水管中间放一个木桶周围水都在流动桶里的水平静得几乎不动。这就是BIC与外部通道完全解耦辐射损耗为零理论Q因子趋向无穷。但真实的实验里无穷Q没有意义任何结构都受材料损耗、加工误差限制。更重要的是完全BIC不辐射仪器根本“看”不到它。所以大家真正关心的是准BICquasi-BIC稍微打破对称性、或者给一个斜入射的面内波矢模式就从一个不说话的“幽灵”变成一个极窄的Fano共振峰。这个峰线宽极窄、场增强极高对传感器、激光器、非线性频率转换都是宝贝。仿真里你需要做的是重现这条“从BIC到准BIC”的路径。1.2 弯月型结构凭什么能出BIC弯月结构说白了就是两个圆相交再取差集形成一个月牙形。建模不难但它有几个对BIC特别友好的特点。第一面内对称性好。标准弯月结构天然带有镜面对称轴这种对称性可以直接保护某个模式让它满足对称性保护BICsymmetry-protected BIC的条件。第二可调的对称破缺参数多。你可以改变圆心偏距、双圆半径差、甚至给弯月加一个缺口任何破坏镜像对称的操作都能把Q因子从“无穷”拉回有限值范围可调非常适合作参数扫描。第三弯月结构在高折射率介质材料比如硅、氮化镓里能同时激发磁偶极子和电偶极子共振容易在连续谱中形成干涉型BIC线型也好看。用COMSOL去验证有没有BIC最常见的策略就是正入射时找消失的共振斜入射时看Q因子回落、Fano线型出现。1.3 斜入射到底改变了什么很多人误以为斜入射只是把入射角度改一下这么简单实际上它引入了一个关键物理量面内波矢 k∥。BIC通常出现在倒空间的高对称点比如 Γ 点也就是正入射。你在 Γ 点给了模式一个对称性保护它不辐射。一旦斜入射k∥ 从零变成某个有限值对称性的保护条件失效模式开始和连续谱耦合Q因子从无穷降到有限。所以做斜入射扫描本质上是在扫 k∥验证这个模式是不是真的具备BIC属性。如果某个共振峰的角度依赖关系符合“共振波长随角度移动、线宽随角度增大而增宽”的规律那基本可以判定你找到了准BIC。而斜入射时线偏振为什么难设置是因为在斜入射条件下TE波和TM波在周期结构里不再独立它们的定义都随入射面旋转如果直接填一个固定的电场分量背景场很可能不是横波结果当然乱套。2. 方案选型斜入射线偏振光到底该选SBC还是端口2.1 周期性端口的坑你可能也踩过很多教程讲COMSOL的周期性结构都喜欢用“端口Port”加“周期性条件”的组合正入射时确实顺滑。但斜入射一进来问题就来了。端口类型如果要算衍射级次斜入射意味着高阶衍射级次开启或关闭你得手动给每个衍射级配一个端口TE/TM还要分别定义S参数一大堆稍微哪个方向没搞对能量就不守恒。我一开始也想用端口结果花了大半个下午才搞清楚哪个端口对应哪个衍射级最后透射率还是莫名不闭合。端口方案适合正入射、需要S参数矩阵的情况。但咱们做BIC归根结底要看的是共振峰位置、线宽、Q因子和场分布并不需要那些精确到小数点后四位的透射系数。这时候用散射边界条件注入平面波反而简单粗暴。2.2 SBC当光源本质是“边吸收边发射”散射边界条件最初是拿来当吸收边界用的波打到边界上不反射。但COMSOL给它留了一个后门——在SBC的设置里可以开启“入射场”Incident Field或者“背景场”Background Field。选成“背景场”之后这个边界的行为就变成了它仍然吸收外来的散射波但同时向计算域内部注入你定义好的平面波。我的理解是SBC像一扇门门外的光往里照同时门里反弹回来的光又被门吸掉。这比端口轻量太多因为只关心一个入射通道不需要考虑衍射级次分配。代价是它的吸收并不完美对超高Q模式会有一点伪反射这部分后面细说。2.3 一套完整的边界搭配方案SBC再方便也不能单打独斗。斜入射条件下的周期结构必须有Floquet周期边界来建立布洛赫波矢的一致性。拿一个常规的3D介质超表面单元举例x和y方向都是周期方向z方向是光的传播方向。我的搭配方式是z方向的下边界面SBC开启背景场注入斜入射平面波。z方向的上边界面SBC关闭背景场只吸收透射波。x和y方向Floquet周期性条件周期矢量的x分量设置为kx k0*sin(theta0)y分量保持为0。这套方案最大的好处是不引入衍射级次的复杂性把所有注意力集中在共振本身。实际算下来的结果跟文献里用严格耦合波分析RCWA算的光谱几乎对得上。前提是Floquet周期里的kx和SBC背景场里的kx必须一致这一点是最容易踩雷的后面我会专门讲。3. 实操搭一个可复现的斜入射线偏振BIC模型3.1 模型向导与全局参数新建模型的时候选三维添加“波动光学”模块下的“电磁波频域ewfd”接口研究选“频域”。这里提醒一下老版本里叫“射频模块”里的“电磁波频域”功能一样别找不到。进入模型后第一步不是画几何而是把全局参数先定义好。我就是因为一开始图省事没写参数表后面改一个入射角要把表达式翻个底朝天。建议至少设置这些参数参数名含义示例值lambda0入射波长1550 nmtheta0入射角相对z轴0.1 radalpha0线偏振方位角0.1 radP周期单元边长900 nmR1弯月构成圆半径350 nmR2偏置圆半径300 nmoffset圆心偏距100 nmt结构厚度220 nm其中最关键的是入射波矢的表达式。斜入射面我选在xz平面内所以波矢分量写为kx emw.k0 * sin(theta0)ky 0kz emw.k0 * cos(theta0)注意这里必须用emw.k0或者2*pi*f/c_const这样扫频的时候kx才会跟着频率自动更新。如果你图省事写成一个固定数值扫出来的光谱就是错的——这是所有角度扫描里最隐蔽的错误之一。3.2 弯月几何建模的正确姿势几何建模的思路很直白在一个周期单元里画两个圆然后做差集。具体步骤是在“几何”里新建一个“工作平面”在平面上先画一个半径R1的圆作为主圆再画一个圆心偏移了offset、半径R2的圆。然后做布尔操作“差集”用主圆减去偏置圆就得到一个月牙形的面。之后把这个面沿z方向“拉伸”t的高度就是一个完整的弯月结构。实际操作中有两个细节值得注意。第一差集之后圆弧边界的网格质量会很差曲率大的地方容易出现细长三角形。建议在圆角区域多切几段边界线方便后面布网格种子。第二弯月结构放在周期单元里要留足够的空气间隙。如果弯月外缘离周期边界太近相邻周期之间的近场耦合会变小BIC特征就不明显了。最开始我为了结构占比高把弯月画得几乎顶到边界结果共振峰宽得没眼看。后来把周期单元加大到900nm弯月最大尺寸控制在700nm以内峰一下就尖了。材料上用高折射率介质比如硅相对介电常数设eps_r 11.9对应折射率约3.45。如果材料损耗没开得到的Q因子是纯辐射Q更贴合理想BIC图像。建议先跑无损耗版本把物理搞清楚了再加损耗。3.3 边界条件设置SBC注入斜入射线偏振的最细步骤这一步是整个流程的核心。在ewfd接口下把下边界入射面选为“散射边界条件”然后在SBC的设置窗口里找到“入射场”部分选择“背景场”。这里COMSOL会让你输入背景电场的三个分量。斜入射下的线偏振平面波电场分量的表达式是E0x cos(alpha0) * cos(theta0)E0y sin(alpha0)E0z -cos(alpha0) * sin(theta0)这个表达式不是随便拍的。入射面在xz平面波矢方向是(sin(theta0), 0, cos(theta0))。为了让电场垂直于波矢也就是满足横波条件k·E 0E的z分量必须和x分量保持反相位关系。上式带进去你可以自己验证点积恒为0。而且归一化条件下|E0|^2正好等于1单位是V/m这样入射功率就是一个干净的值。如果你只想要纯粹的s偏振TE让alpha0 0就能得到电场沿y方向想要p偏振TM把alpha0设成pi/2或者调整表达式。实际操作中alpha0可以直接作为参数扫描观察不同线偏振角度下的模式激发差异。别忘了背景场的波矢分量也要填进去在背景场设置里输入kx、ky、kz的表达式。有时候不同版本里平面波的波矢方向是靠“方向向量”填的那就填(sin(theta0), 0, cos(theta0))效果一样。上边界设置同样加一个SBC但“入射场”保持关闭。它的任务就是吸收透射波别让反射波回来干扰共振。3.4 Floquet周期条件斜入射最容易翻车的地方接下来处理横向周期边界。选中x方向的一组相对边界面添加“周期性条件”条件类型选“Floquet周期性”。把周期矢量里的x分量设为kxy分量设成0。y方向那组边界同样设置周期矢量x分量和y分量都按同样的方式填。这里最大的坑是Floquet周期里的kx和SBC入射波里的kx必须严格使用同一个表达式不能一个填表达式一个填数字。我之前有一版模型一个用emw.k0*sin(theta0)另一个图省事填了k0*sin(theta0)结果完全不对。原因是COMSOL默认的k0在不同模块下面定义可能不同甚至可能报未定义变量。统统用emw.k0或者统一定义一个全局变量k0 2*pi*f/c_const就能避免这种阴间错误。另外周期性条件对“源面”和“目标面”的配对有要求。选择边界的时候注意COMSOL里通常会自动匹配方向如果提示“未找到对应边界”可以手动切换“目标边”的映射方向。尤其是圆角结构的边界网格还在微调阶段配对不成功很常见。3.5 网格与求解策略高Q模式的生存条件网格是微纳光子仿真里决定成败的一环。BIC对应的模式Q值很高意味着场被强烈局域在结构内部和表面网格稍粗共振直接被抹掉。我的经验是最大单元尺寸至少要lambda0/(n_eff*20)对折射率3.45的硅结构来说1550nm波长下最大网格在20nm左右。频率扫描第一步先用粗扫找到共振位置再在共振附近做细扫。粗扫步长10nm精扫步长可以到0.05nm甚至更细。频率分辨率跟不上Fano线型的谷底和峰顶都看不清Q因子自然算不准。频域求解器的设置我用的是直接求解器MUMPS不要用迭代求解器。高Q结构的矩阵条件数很差迭代法不容易收敛报错还难查。如果模型较大可以开参数化扫描但注意参数扫描里每次求解都从上一次解开始对高Q模式其实有帮助不会导致收敛变差。3.6 后处理透过率、Fano线型和Q因子提取扫完频第一件事是做出射面的透过率曲线。在“定义”里建立积分算子比如intop_out把上边界选中。然后在“派生值”里做“全局计算”写表达式-intop_out(emw.nPoavz) / P_inc其中P_inc是入射功率。由于入射电场振幅设为1V/mP_inc 0.5*norm(E0)^2/eta0eta0是真空波阻抗约376.73欧姆。注意边界法向方向可能朝上也可能朝下加不加负号取决于你模型的坐标设定。先跑一个没有结构的纯空气模型看看透射率是不是1很快就能确定符号对不对。透过率曲线上准BIC共振表现为一个不对称的Fano线型透射率在一个很窄的波长范围内突然从接近1掉到一个深谷再回升。线型宽度用半高全宽FWHM表示Q因子就按公式Q lambda0 / Delta_lambda估算。如果粗扫找不到谱线先用正入射跑一遍看有没有对称保护的BIC存在斜入射角度从很小的0.01 rad起步慢慢加大你会看到共振峰从无到有变得越来越宽。4. 常见问题快查与避坑记录4.1 偏振填了(1,0,0)结果啥都不是有些新手偷懒电场直接填(1,0,0)觉得反正是线偏振。问题是斜入射时波矢方向不等于z轴一个纯x方向的电场并不垂直于波矢会出现非物理的纵向电场分量。背景场不再是一个真正的平面波边界会激发出乱七八糟的模式谱线一团糟。检查方法很简单算一下k·E如果结果不是0这个“线偏振平面波”就是不横的改表达式。所以务必用上面给的那组含theta0、alpha0的公式直接在全局参数里定义好别手填。4.2 共振峰太宽、找不到BIC特征出现这种情况优先级最高的怀疑对象是网格。BIC模式的场分布高度集中在结构内部网格粗了数值耗散大Q因子被压得很低共振峰就被“磨”平了。试着把最大网格尺寸下调到λ/30如果峰明显变尖那基本就是网格的问题。第二个怀疑对象是kx没有随频率更新。如果你把kx写成固定数值那么扫频时每个频率点对应的波矢大小是随频率变的但你的边界条件却用了一个不变的kx两者不匹配相当于每个频率都在用不同的入射角共振被“平均”掉。把kx表达式改成emw.k0*sin(theta0)问题立刻消失。第三个怀疑对象是共振根本不在你扫的波长范围里。先用正入射跑一个宽谱比如1200nm到1600nm找到所有谷和峰再决定斜入射细扫的范围。4.3 高Q模式下SBC“露馅”了SBC毕竟不是完美吸收体总有一点点伪反射。Q值在10^3量级时完全没问题但等你做准BIC优化Q推到10^5以上SBC的反射就会和辐射损耗耦合起来结果表现出Q饱和——怎么加密网格Q都上不去。这时候该切换到PML完美匹配层方案。做法是在模型z方向上下各加一段PML域把原来的SBC移到PML外侧同时在PML内侧边界用背景场注入。PML对宽角度入射的吸收效果远好于SBC能保住高Q读数。代价是模型内存翻倍。我自己的习惯是先用SBC快速扫描定位找到最佳几何参数附近再换PML精确算。4.4 透过率大于1或者能量不守恒透过率超过1通常不是物理问题而是归一化算错了。COMSOL算坡印廷通量时如果积分边界上含了结构表面部分表面电流会贡献额外项结果就会偏大。把积分算子只选在空气区域的出射面上别选整个边界面。纯空气模型校验一次符号和数值都确认无误再看真实结构的结果。4.5 问题速查表现象首要排查项次要排查项共振峰找不到波长范围不对网格太粗共振峰过宽Floquet波矢没更新周期性条件配对错误透射率恒等于1背景场没开启E0表达式错误高Q饱和SBC伪反射PML未使用求解不收敛迭代求解器频率步长过大这套排查逻辑我用了好几轮基本能覆盖90%的BIC仿真翻车现场。5. 进阶把Q因子、角度响应和本征模一起榨出来5.1 用参数扫描扫弯月偏心距准BIC一个很重要的调控手段是几何对称破缺弯月结构最方便的就是圆心偏距offset。这个参数一变镜像对称被打破原来被保护的BIC泄漏出来Q因子快速下降。操作上在“研究”里开一个参数扫描把 offset 作为辅助参数比如从0扫到200nm步长25nm。频点精扫放到每次参数扫描的内层这样不会因为外层粗扫导致漏峰。跑完以后把多个 offset 对应的透射谱叠在一张图上你会特别直观地看到Q因子随对称破缺的演变offset 0时谱线几乎看不见offset越大Fano峰越宽、越明显。这张图放论文里特别有说服力。5.2 用特征频率直接算精确Q透过率谱提取Q是间接手段受限于频率扫描分辨率。要拿到某个准BIC模式的精确Q更干净的方式是用“特征频率”研究。新建一个研究类型选“特征频率”在ewfd接口里把SBC的“入射场”全部关掉——特征频率研究里不需要外部光源只需要边界吸收。求解以后COMSOL会给出复数特征频率实部是共振频率虚部表示辐射损耗速率。Q因子的关系是Q Re(f) / (2 * abs(Im(f)))我算过一个offset50nm的弯月结构谱线拟合Q和特征频率Q基本对得上误差在5%以内足够说明两种方法一致性。用这个方法还有个好处可以一次性把好几个模式的Q都拉出来不用一个一个峰去拟合。5.3 角度分辨光谱的自动化输出做BIC的论文几乎都少不了一张“角度-波长”二维图。在COMSOL里这个可以直接用参数扫描实现把 theta0 设为外层扫描参数从0扫到0.3 rad每步0.01 rad波长作为内层扫描参数。跑完后在结果里用一维绘图组的“所有参数值”叠加或者直接在二维绘图中用“参数”作为x轴、“波长”作为y轴画颜色图一张经典的角度分辨光谱就出来了。有个节省时间的小技巧先用SBC快速把小角度、粗波长步长跑一遍确认共振轨迹再决定要不要上PML和加密。COMSOL的角度扫描慢是出了名的别一上来就精细扫全局。6. 一点个人经验玩BIC仿真这么长时间最大的感受是这类问题急不得但也不需要把它想得玄乎。物理图像搞清楚了——不就是对称性保护、波矢失配、泄漏率调控嘛——剩下的纯粹是设置能不能跟上的问题。SBC加Floquet周期这个组合天然适合斜入射线偏振下的BIC验证配置直观、参数可控、出图方便先用它跑通主流程配合同步更新kx的小技巧基本不会出大乱子。最后再分享一个解决顺序先正入射粗定位再小角度斜入射细描线型先用SBC验证物理图像真要抠高Q再切PML。这个顺序能省掉大量反复调试的时间。COMSOL的光学仿真就是这样九分准备一分求解设置对了结果自然会顺着物理规律走到你面前。
返回列表