☰
光子晶体BIC远场偏振与能带值计算:从仿真到工程验证
2026/10/26 16:04:05 网站建设 项目流程

简介:围绕光子晶体连续域束缚态的远场偏振特性与Q值能带分析,压缩包提供了一套面向COMSOL光学仿真学习者的配套资料。内容覆盖k空间模拟思路、能带与远场偏振计算方法、关键公式与文献探讨,并附有Matlab脚本可辅助复现数据与绘图,适合从事微纳光学、光子晶体器件研究的本科生或工程师快速入门。包内共15个文件,大小2.83MB,包括6个docx文档(理论与计算说明)、4个html页面(过程与结果展示)、4张jpg示意图(场分布、能带或偏振图)及1个txt说明文件,结构较清晰。文档与脚本相互对照,便于从理论、仿真到后处理形成完整链路,也方便掌握Q值扫描、远场偏振计算及结果后处理的具体方法。已有42人浏览学习,适合作为相关课题的仿真框架与文献分析参考。

1. 连续域束缚态远场偏振计算:先接受“无限Q值”是个理论值,再谈能带值

连续域束缚态(BIC)这几年在光子晶体领域热度很高,核心卖点是“Q值可以做到无限大”。但做过仿真的人很快就发现,这说法很劝退:你在任何一款数值工具里都算不出一个收敛的无限大Q,反而是在远场偏振图上,BIC附近会出现一个非常醒目的偏振奇点——复矢量场绕这个点转一圈,偏振相位正好转2π。这个现象和能带值直接绑在一起:BIC并不是孤立存在于某一个k点,而是由布里渊区里一整段能带演化出来的。本文要讲的,就是一套从能带值计算出发,到远场偏振投影、偏振奇点定位,再到空间能带值扫描验证的完整流程。适合做光子晶体器件仿真、激光器或传感器设计的人,目标是把“算BIC”从玄学变成可复现的工程步骤。

2. 能带值怎么算:光子晶体参数选型和MPB/RCWA色散计算的3个步骤

2.1 选晶格和材料:厚度、折射率与对称性决定BIC落在哪

第一步不是写代码,是选结构。BIC的出现条件高度依赖结构对称性,最常见的两个起点是方形晶格的介质柱阵列和空气孔阵列。介质柱阵列适合TE-like模式,空气孔阵列适合TM-like模式;如果你要做片上集成,通常选氮化硅或者硅薄膜,折射率对比越大,能带里的模式越容易在光锥内形成可观测的BIC。

厚度参数直接影响模式是否落在可辐射的范围。我一般把晶格常数a归一化为1,厚度先取0.5a,然后以0.1a为步长扫一遍。之所以这样扫,是因为BIC的位置对厚度非常敏感:厚度偏薄,模式频率太高,靠近甚至超出能带折叠区;厚度偏厚,模式会进入低频区,和衬底模式的相互干扰变多。折射率方面,硅(n≈3.48)或者砷化镓(n≈3.3)是高频端的选择,氮化硅(n≈2.0)适合想要更低材料损耗的场景。注意:折射率虚部一旦不为零,Q值会被吸收损耗限制住,BIC的数值特征会被淹没,所以做能带值初扫的时候先设无损耗材料。

对称性是另一个决定因素。在Γ点,由于晶格对称性,某些模式的远场展开系数为零,天然不辐射;在M点等高对称点也可能因为模式对称性和辐射波对称性失配而出现BIC。如果你想要BIC不在高对称点、而在一般k点出现,那就需要打破面内对称性,比如把圆形柱改成椭圆柱,或者引入双原子晶格。这个选择直接影响后续能带值的扫描范围,所以先定结构再算能带,不要反过来。

2.2 平面波展开的能带值读取:落在光锥内的模式才是BIC候选

结构定了以后,先用平面波展开法把能带结构算出来。这一步的目的不是拿Q值,而是拿到模式的频率随k的变化关系,也就是能带值本身。MPB是这一步最常用的工具,配置脚本很短,但要注意它默认是无限周期结构,对平板上下表面的辐射处理不精确,所以只用来做模式筛选。

以下是一个方形晶格介质柱的MPB输入文件,所有长度单位都以晶格常数a归一化:

; 光子晶体能带结构扫描:方形晶格介质柱 ; 作用:获得频带在 Gamma-X-M-Gamma 路径上的色散和模式场分布 ; 注意:光锥内的Q值和远场偏振需要转RCWA/FDTD,MPB只用于能带值初筛 (set! geometry-lattice (make lattice (basis1 (vector3 1 0 0)) (basis2 (vector3 0 1 0)) (size 1 1 no-size))) (set! default-material (make dielectric (epsilon 12.25))) (set! geometry (list (make cylinder (radius 0.25) ; 介质柱半径=0.25a (height infinity) ; 二维近似,柱高无穷 (axis 0 0 1) (center 0 0 0)))) (set! resolution 32) ; 网格分辨率,先取32,后续可收敛测试 (set! num-bands 12) ; 计算前12条能带 (set! k-points (list (vector3 0 0 0) ; Gamma (vector3 0.5 0 0) ; X (vector3 0.5 0.5 0) ; M (vector3 0 0 0))) ; 回到Gamma (run)

这个脚本里的核心参数是radius和resolution。半径0.25a是我常用的起始值,因为在这个占空比下,TE-like带在Γ点附近通常有足够宽的带隙和较平直的色散,方便观察模式是否进入光锥内。分辨率32在初扫阶段足够,但如果发现两条能带靠得很近,加密到64能避免误判模式序数。

跑完之后,把能带数据导出来,画出频率对k的曲线。判断候选BIC的标准是:这条能带进入了空气光锥之内,也就是它的频率高于对应k点上的空气色散线ω = c|k|。光锥外的模式是完全被引导的,不向自由空间辐射,没有远场偏振可言;光锥内的模式才有辐射通道,BIC就藏在这些通道消失的位置。

2.3 从频带到辐射通道:哪些模式值得做远场偏振计算

拿到能带值后,不是每条光锥内的带都值得做。先看两条关键信息:一是模式的色散斜率,二是模式本身的对称性。

色散斜率很平的区域,意味着群速度低,能量在结构里停留时间长,这种模式对外界参数变化非常敏感,是BIC和准BIC的多发区。我把这当作第一筛选条件:在能带图上找斜率接近为零的局部区域,把这些k点标记出来。

然后看对称性。对于方形晶格,TE-like模式的电场主要分布在面内,要让它不辐射,需要它的面内电场分布在远场投影下与自由空间平面波正交。具体到操作上,用MPB输出各个k点的模式场分布,观察Ez或Ex分量的空间对称性:如果模式在晶格镜像操作下是奇对称的,而对应的辐射平面波是偶对称的,这个点就是BIC候选。这个方法不保证100%准确,但能把候选点从十几个缩小到两三个,后续RCWA或FDTD计算量可以接受。

参数选型阶段常见的错误是直接拿实验结构的实测折射率代入MPB。实测材料往往有色散和微弱吸收,MPB初扫用了色散模型反而会让能带交叉判断变复杂。我习惯初扫只用常数折射率,等工作流跑通后再把材料色散加进去做二次验证。

3. 远场偏振计算的落地步骤:近场投影、琼斯矢量与偏振奇点追踪

3.1 近场布洛赫模式的远场投影:一个FFT能解决的事

BIC的远场偏振计算,核心是把近场监视器面上记录的布洛赫模式场,展开成自由空间的平面波。布洛赫模式的场本身具有周期性,展开系数对应的波矢是k_bloch + G,其中G是倒格矢的整数组合。辐射通道就是指那些在周围介质里能够传播的衍射级:对上方空气来说,条件是|k_bloch + G| < ω/c。

实际操作里,我从FDTD或RCWA拿到一个晶格周期内的近场监视器数据,取面内两个电场分量Ex和Ey,做二维FFT,就得到了各衍射级的复振幅。以下代码是一个可直接套用的近场转远场工具:

import numpy as np from scipy.fft import fft2, fftfreq def field_to_farfield(Ex, Ey, dx, dy): """ 把一个晶格周期内的近场监视器平面场展开为平面波系数。 参数: Ex, Ey : 复电场分量,形状为 (Ny, Nx) dx, dy : 监视器面的空间步长,单位与晶格常数一致 返回: AX, AY : 各倒格矢位置的复振幅 KX, KY : 对应的波矢坐标,单位与dx/dy匹配 """ Ny, Nx = Ex.shape AX = fft2(Ex) / (Nx * Ny) AY = fft2(Ey) / (Nx * Ny) KX, KY = np.meshgrid(fftfreq(Nx, dx) * 2 * np.pi, fftfreq(Ny, dy) * 2 * np.pi) return AX, AY, KX, KY # 使用示例:监视器分辨率为a/32,工作点Bloch波矢为 (0, 0) AX, AY, KX, KY = field_to_farfield(Ex_monitor, Ey_monitor, a/32, a/32)

这段代码有两处需要特别说明。第一,FFT归一化已经除掉了总点数,但如果你希望振幅对应实际物理强度,还要再乘监视器面积和布洛赫波矢相关的相位因子。这个因子对偏振相位没有影响,但如果你要用远场绝对值反推辐射功率,必须补上。第二,fftfreq返回的顺序不是从零开始的递增排列,而是正负频率交错排列的结构,画图前最好用np.fft.fftshift整理一下,否则偏振相位图会看起来像被切了一刀。

监视器面的位置也有讲究。太靠近结构表面,会捕捉到大量倏逝波分量,这些分量不属于远场辐射;太远,场幅度衰减到噪声水平。经验值是把监视器面放在结构上方半个到两个晶格常数处,并保证这个面完全落在一个周期单元内。

3.2 偏振环流参数与BIC奇点的定位

远场系数拿到之后,定义一个琼斯矢量u(k) = (AX, AY)。在普通漏模的位置,AX和AY都是非零复数,它们的比值决定了远场偏振态;但在BIC位置,AX和AY同时趋向于零,远场辐射消失。这就是BIC在远场图上的指纹——不是偏振从一个态跳变到另一个态,而是场的复振幅在这一点归零。

判断BIC是否存在的标准方法,是看琼斯矢量复平面的相位θ = arg(AX + iAY)在BIC附近如何变化。当沿着一个包围BIC的闭合路径走一圈,θ会累积变化±2π,对应的拓扑电荷q = ±1。这个绕数是拓扑量,不受网格微小扰动影响,这正是远场偏振法比单纯看Q值可靠的地方。

我经常在项目里用下面的函数计算绕数:

def winding_number(theta_on_path): """ 计算一条闭合路径上的偏振相位绕数。 theta_on_path:路径上各采样点的相位角,单位弧度,未展开。 """ unwrapped = np.unwrap(theta_on_path) delta = unwrapped[-1] - unwrapped[0] return int(round(delta / (2 * np.pi)))

使用这个函数前要做两步预处理。第一步,相位采样点必须沿闭合路径均匀分布,我习惯在候选BIC周围取正方形回路,每边取8到12个k点。第二步,np.unwrap只能处理相邻相位跳变不超过π的情况,如果k点间距太大,相位跳变超过π,unwrap会失效。此时需要加密采样点,而不是强行滤波。拓扑电荷的符号与晶格对称性相关:在Γ点,通常能看到一对电荷相反的BIC,或者一个电荷为±1的中心奇点。

3.3 空间谱的采样密度:偏振图要多少点才可信

远场偏振图容易画,但采样密度不够会画出一个假奇点。相位场的数值梯度对相邻点距离很敏感,如果步长太大,两条相邻采样点之间的相位差可能超过π,unwrap直接翻车。我这里给一张我自己常用的采样密度参考表。

扫描阶段k范围(单位:2π/a)步长用途
全局初扫整个第一布里渊区0.02定位候选BIC大致区域
BIC局部加密候选点附近 ±0.020.002确认偏振相位旋转
收敛验证候选点附近 ±0.0040.0005核对奇点位置和绕数

这张表的含义很直接:BIC附近的相位变化剧烈,必须比全局扫描密一个量级。025网 أيضًا行 法律风险。判断网格是否足够的标准是:把当前步长减半,重新算一遍绕数,如果结果不变,说明这个奇点是拓扑稳定的;如果绕数变了,说明采样点把相位跳变混成假奇异了。千万不能满足于出图好看,我因为跳过收敛验证翻过一次车,后来把所有BIC结论都强制加上这个减半步验证。

4. 空间能带值扫描:把偏振奇点钉在(kx,ky)相图里

4.1 扫描网格设计:BIC附近的k间距和收敛标准怎么定

空间能带值,指的是能带频率、Q因子和远场偏振在一整片(kx, ky)平面上的连续分布。只算单个k点,只能知道“这里有个BIC”,算不出“这个BIC周围能带怎么弯曲、偏振怎么旋转”。所以第四章要做的,就是把2.2节和3.1节的计算封装成一个函数,然后在k平面上扫描。

常见做法是写一个两层循环,把每个k点的能带频率、Q值和琼斯相位存进字典里:

import numpy as np def scan_band(kx_list, ky_list, band_at_k): """ 扫描(kx, ky)网格,得到能带值和远场偏振相位。 band_at_k:一个外部求解函数,输入(kx, ky),返回: f —— 模式频率 Q —— 辐射Q因子 AX, AY —— 远场琼斯振幅 """ results = {} for kx in kx_list: for ky in ky_list: f, Q, AX, AY = band_at_k(kx, ky) results[(kx, ky)] = { "f": f, "Q": Q, "theta": np.angle(AX + 1j * AY) } return results # BIC局部扫描示例:围绕(0, 0)点加密 kx_fine = np.arange(-0.02, 0.021, 0.002) ky_fine = np.arange(-0.02, 0.021, 0.002) res = scan_band(kx_fine, ky_fine, my_rcwa_solver)

这里的band_at_k函数可以包装RCWA、FDFD或者Lumerical的本征模求解器。扫描前先确认k点的单位和你用fftfreq时的单位一致,我见过有人把频率单位弄混,结果Q值峰位置整体偏移了一个倒格矢长度。扫描网格是矩形还是六边形取决于你的晶格类型,方形晶格用矩形网格没问题,三角晶格最好用六边形采样,否则BIC周围的相位旋转在斜方向上会因为采样不对称而产生假的椭圆畸变。

收敛标准方面,我通常用两个判据:一是Q峰值对应的k坐标在网格减半后移动不超过一个步长;二是峰值Q值的变化小于10%。两个判据同时满足才认为当前网格密度足够。这里要注意,FDTD算出来的Q值有上限,常见的上限在10^4到10^6之间,具体取决于仿真边界和时域长度。所以不要指望在BIC点本身看到无穷大,看到Q值比周围高出两个数量级,并且偏振绕数正确,就说明BIC被定位了。

4.2 能带值与Q因子二维图:如何读出一组稳定的BIC轨迹

扫描结果出来后,最直观的呈现是把Q值取对数,用颜色填充图画在(kx, ky)平面上。BIC会表现为一块极亮的区域,周围的Q值快速下降。这个亮区在空间能带值图中通常不是孤立的一个像素,而是沿着一条能带轨迹拉开的长条状结构。

这条轨迹的物理意义很重要:它说明BIC并不是只在某个精确k点存在,而是可以沿着一维k路径连续存在。在完整的二维光子晶体里,BIC往往表现为一个点;但在介质柱高度、半径这些参数连续变化时,这个点会扫过一条轨迹。这时候,空间能带值的价值就体现出来了——你同时看频率曲面和Q值曲面,会发现BIC轨迹恰好落在某个等频率线的极值脊上。频率曲面在BIC处出现局部的平直化,群速度为零,这是能带值与远场偏振互相印证的信号。

我读图时,会先画一张全范围粗扫的Q值图,圈出所有疑似亮区;再对每个亮区做局部细扫。如果某个亮区在细扫后Q值反而下降,多半是模式串扰或者网格台阶造成的假峰,直接丢掉。如果细扫后Q值单调上升且相位绕数稳定在±1,这个BIC才进入候选清单。一个项目里扫出三五个候选BIC很正常,但真正能满足绕数稳定和能带轨迹连续的,往往只有一个。

4.3 出现模式反交叉时怎么处理:能带值的取舍与误判

扫描空间能带值时最麻烦的问题,是不同模式之间的反交叉(anti-crossing)。两条不同对称性的能带在k空间里靠得很近时,数值求解器会错误地把模式序数互换,导致你追踪的这条能带在某一段突然跳到另一条带上去。表现出来就是Q值峰在某个k点突然跌落,相位图也跟着乱掉。

遇到这种情况,先不要加密网格。我通常做两件事:第一,把模式场分布调出来看,在反交叉点两侧各选一个k点,比较Ez或Ex的空间分布。如果模式分布从一个形状突变到另一个形状,基本可以确定能量带追踪中断了。第二,检查求解器的模式排序设置。RCWA或FDFD大多按频率升序输出模式,但如果两条带频差很小,排序会不稳定,需要显式开启模式追踪,或按模式重叠积分重新排序。

反交叉本身不是错误,它反映的是实际物理中的模式耦合。但在BIC分析里,我们只关心单一能带的远场偏振行为,所以必须把追踪目标锁定在同一个模式上。我用一个简单办法处理:在扫描前先在高对称点算出前几条模式的场分布模板,然后在扫描过程中实时计算当前模式和模板的重叠度,重叠度低于阈值就报警。这样虽然慢一点,但能避免把两条能带的偏振数据混在一起,最后画出来的空间能带值才是干净的。

5. 光子晶体BIC远场偏振计算的避坑:5个会让结果偏离的案例

5.1 Q值加密不上去,永远卡在几千

现象:网格分辨率从32加到64,PML层数也加了,BIC处的Q值顶多从3000涨到5000,怎么都上不去。原因:FDTD的时域衰减信号只记录到了平稳段之前,或者PML的反射率在某一个入射角下特别差,泄漏模的能量在边界处被反射回仿真区,形成伪驻波。解决:把时域监视器的记录时间加长到模式衰减幅度的1/20以下,同时用两层PML,最外一层设成金属边界。更快的检查方法是算一下同一结构在非BIC k点的Q值,如果那边Q值异常低,说明是边界问题而不是BIC问题。

5.2 偏振相位图在BIC附近变成一锅粥

现象:AX和AY的幅度在BIC附近趋近于零,相位角在相邻几个k点之间随机跳变,绕数怎么算都不稳定。原因:远场复振幅趋近零时,数值噪声主导了相位,真实物理信号已经被淹没。解决:不要直接对BIC正上方那一个点的相位做判断,而是取BIC周围一个半径约0.005·2π/a的圆形路径,在路径上均匀采样,用第3.2节的绕数函数计算。绕数是积分量,路径上个别点的噪声会互相抵消,比单点相位可靠得多。

5.3 粗扫和细扫给出的BIC位置不一致

现象:全局粗扫时Q值峰在(kx, ky)=(0.01, 0),局部细扫后峰跑到(0.012, 0.002),相差明显。原因:全局网格的步长是0.02,BIC的真实位置可能落在某两个采样点之间,粗扫的峰是相邻几个点的平均结果。解决:把粗扫峰周围的3×3邻域单独拿出来做二次扫描,步长设为粗扫的十分之一。如果二次扫描的峰依然落在加密网格的边界上,就继续加密,直到峰位置不再移动。

5.4 TE和TM模式混用,偏振相位图互相矛盾

现象:同一个结构,用TE-like模式计算得到一个BIC,切换到TM-like模式计算,偏振奇点消失了。原因:平面波展开时,远场琼斯矢量取的是面内分量,但不同仿真工具对TE-like和TM-like的定义不一致,导致实际提取的AX、AY并不是同一套物理分量。解决:在代码里显式指定远场提取的是哪个电场分量,固定用面内Ex和Ey,不依赖工具的默认模式命名。另外,注意监视器面如果刚好落在结构的对称面上,某些电场分量本身为零,也会造成相位无意义。

5.5 实验样品测不到预测的BIC

现象:仿真里Q值峰、偏振绕数都完美,样品加工出来后反射谱在预测频率附近却只有很宽的谷,没有尖锐共振。原因:加工误差打破了面内对称性,比如刻蚀侧壁倾斜、柱体椭圆化,BIC变成了高Q准BIC,Q值从理论上的无限大降到实验可测的几百或几千。解决:做设计时不要只看理想结构,把厚度偏差±5%、侧壁角90°±2°、占空比±3%这三个参数各扫一遍,看BIC是否还落在工作波长范围内。如果Q值对某一参数的斜率太大,说明这个BIC对加工公差过于敏感,应该调整结构设计而不是怪测试设备。

6. 验证与进阶:用拓扑电荷把仿真结果推向可加工的器件设计

仿真里找到BIC,只完成了一半;另一半是验证这个BIC在真实器件里能被观测到。最直接的验证方法,是用偏振分辨的反射谱测量来对照远场偏振计算结果。在BIC对应的波长和入射角附近,实验反射谱会呈现一个非对称的Fano线型:因为这个位置远场辐射通道是关闭的,入射光无法和模式耦合,反射率在共振点附近会有一个极窄的凹陷。用线偏振光分别测TE和TM两个通道,对比实验反射凹陷的中心频率和仿真能带值,偏差在加工公差范围内就说明BIC定位是可信的。

进阶一点的做法,是把偏振奇点的拓扑电荷和能带值梯度结合起来做设计容差评估。具体技巧是:在仿真的(kx, ky)平面上,分别计算沿kx方向和ky方向的能量梯度∂ω/∂kx和∂ω/∂ky,然后对厚度和占空比各做一组扫描,画出这两组梯度随参数的变化。如果某组参数下能量梯度在BIC附近接近零,说明该BIC在k空间的稳定性好,即使实际入射角有偏差也能工作;如果能量梯度很陡,器件对入射角极敏感,就应该在实验方案里预留角度调节机构。

我最后的习惯是,每完成一批BIC仿真,都会把k网格再对半加密重扫一次,Q峰位置移动超过一个步长就判定为“不收敛”,回去检查模式追踪而不是直接写报告。这套验证流程看着繁琐,但能挡住大部分实验翻车事故。希望帮到你。

本文还有配套的精品资源,点击获取

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

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

立即咨询