光子晶体BIC仿真:从COMSOL能带计算到远场偏振与拓扑荷提取
2026/9/12 14:57:34 网站建设 项目流程

简介:这是一份面向光子晶体与微纳光学研究者的COMSOL仿真与理论分析资料包,聚焦连续域束缚态(BIC)的远场偏振特性及Q值能带计算,同时覆盖k空间模拟与Matlab脚本实现,适合具备一定电磁仿真基础、正在开展BIC相关课题的高校师生或工程师使用。资源包共15个文件,大小约2.83MB,类型包括docx文献笔记、html技术分析页面、jpg结果截图与txt说明文档,docx和html用于梳理理论推导与仿真思路,jpg直观展示远场偏振和能带分布,整体结构清晰,便于按需查阅。目前已有41人学习下载。内容既包含基于COMSOL的连续域束缚态远场偏振仿真模型,也附有Matlab脚本用于k空间与Q值提取,同时整理了相关文献与深度探讨,可帮助读者快速复现计算流程、理解BIC物理图像,并进一步拓展到更复杂的光子晶体能带结构研究。

1. 光子晶体的 BIC:为什么远场偏振比色散关系更重要

看到“连续域束缚态”这个词,大部分人的第一反应是能带曲线上那个尖锐的 Fano 共振峰,或者一个理论上可以做到无穷大 Q 值的模式。但真正做器件的人会告诉你,BIC 的价值从来不在 Q 值本身,而在于它强迫远场辐射通道发生拓扑性关闭,这种关闭会在 k 空间留下一个明确的偏振奇点。如果你只把 Q 值从 COMSOL 里拉出来画个趋势线,那等于只拿到了结果的一半。另一半,也就是远场偏振的演化轨迹,才是决定这个模式能否应用在涡旋激光器或非线性频率转换里的关键。实际上,从近场模式到远场偏振,中间隔着一次不平凡的矢量场投影,投影的相位参考没定对,后面算偏振椭圆率、拓扑荷都是错上加错。下面我把基于 COMSOL 光子晶体仿真和 Matlab 脚本的完整流程拆开讲,先解决能带和 Q 值怎么算,再给出远场偏振的具体提取方式。

2. COMSOL 建模篇:构建单元、布洛赫边界与特征频率搜索

2.1 周期性晶格与仿真单元矩形设置

要进行能带计算,首先要确定模型维度。很多初学者习惯直接建一个三维全波模型,把单元结构、衬底、上层空气一次全建出来。这样虽然能求,但代价是每求解一个特征值都要花费数十秒,扫描一条完整的高对称路径通常需要二十到四十个点,累计时间难以接受。实际做光子晶体仿真时,更标准做法是用二维模型配合面外波矢来等效,或者建立三维薄板模型但把 x 和 y 方向的边界设置成周期性边界条件。

这里以最常见的介质柱型光子晶体板为例:正方晶格,晶格常数a = 800 nm,介质柱半径r = 120 nm,板厚度t = 220 nm。在 COMSOL 的射频模块或波动光学模块下,使用特征频率研究。几何上只需建立单个电介质柱和周围空气域,柱体上方留出空气层,底部可以暂时不设衬底。材料先设置成无损耗介质,折射率n = 3.5。必须强调,使用无损耗材料是能带计算的一个核心前提,因为只有损耗为零,特征频率的虚部才能纯粹反映辐射损耗,从而代入 Q 值公式。如果一开始就加入吸收损耗,虚部里混杂了材料吸收,你提取出的 Q 值就不是 BIC 本身的辐射 Q,后面的分析全部失去意义。

几何构建完成后,需要设定周期性条件。COMSOL 中有两种常见方式:一是直接使用“周期性条件”功能中的 Floquet 周期边界,二是通过“端口”配合扫频。能带计算应当使用前者,因为特征频率研究和 Floquet 边界能直接给出复数特征值。这里要特别检查一下源边界和目标边界的对应关系,以及相位因子的方向变量是否一致。周期边界条件的相位因子本质是exp(i*k*(r - r_source)),如果源和目标设反了,k 的符号就会反转,最终画出来的能带沿 k 方向是镜像错误的。这个问题在视觉上不容易发现,因为能带看起来仍是连续的,只有当你拿 Γ 点模式与已知文献对比时才会发觉频率对不上。

2.2 设置 Floquet 周期边界与 k 空间扫描

在 COMSOL 参数表中定义扫描变量,这一步直接决定你能拿到什么样的 k 空间能带数据。建议建立参数kxky,它们作为晶格倒空间中的坐标。在特征频率研究的参数化扫描中,把kxky同时作为扫描维度。

# COMSOL 参数表配置说明 # lambda_0 = 1.55[um] # 工作波长 # a = 0.8[um] # 晶格周期 # r = 0.12[um] # 介质柱半径 # h = 0.22[um] # 介质板厚度 # kx = 0 # 倒空间 x 分量,由扫描定义 # ky = 0 # 倒空间 y 分量

此处kx的单位在 COMSOL 中需要根据模型几何使用的单位保持一致,通常直接给1/m或者无量纲归一化值。扫面路径建议沿高对称线进行,也就是Γ -> X -> M -> Γ。在Γ -> X段,固定ky = 0,逐步增加kx,每步约取a / 40作为步长。到了X -> M段,kx固定在倒空间边界值,ky从 0 扫到边界值。最后M -> Γ段则让kxky同时减小。这里每个点的特征频率求解,都是在上一步的解基础上作初始值,所以连续性很好,不会出现模式跳变。

一个比较关键的设置是特征频率研究里的“期望模式数”。光子晶体板在目标频率附近通常会存在多个模式,包括横电模式和横磁模式。如果只填一个,求解器会随机返回一个;填太多,又会增加大量无效模式求解时间。经验上在目标频段 0.7 到 1.2 倍之间,模式数 6 到 8 个就足够覆盖感兴趣的两个能带。求解后按实部频率排序,通过查看电场分布图判断模式是类横电还是类横磁。此外,还应开启“搜索该值附近”选项,填入一个初始猜测频率,如c / (a*n_eff)附近的值,能显著加快收敛。

2.3 提取 Q 值与能带数据

特征频率扫描得到的是一个复数频率f = Re(f) + j*Im(f)。其中实部是模式频率,虚部代表辐射损耗和材料损耗的总和。在无耗材料下,Q 值的计算公式为:

Q = Re(f) / (2 * abs(Im(f)))

当扫描点非常靠近 Γ 点或某些高对称点时,BIC 的辐射损耗理论上趋向于 0,此时虚部基本由数值噪声决定,频率虚部可能在1e-41e-6之间无规律跳动。把这个真实值直接代入,计算出的 Q 值会在1e51e8之间剧烈震荡,绘制在对数坐标轴上就是一条竖线乱刺的曲线,完全没法看。在实际项目处理中,我一般是在后处理时对 Q 做一次截断:当Q > 10^7时,将其值赋为10^7,并加一个标记。这个处理并非掩盖物理事实,而是绘图需要,因为真正无限大的 Q 值在数值结果里不可能出现,截断上限能保留趋势又不破坏标度。如果要做收敛性验证或发表图,完整虚部数据还是要保留,截断只用于趋势图。

数据导出建议使用 COMSOL 的“全局计算”功能,把kxkyRe(f)Im(f)一次性导出到文本文件。导出时需要勾选“每个扫描参数作为单独列”,这样后续用读取工具解析时,k 路径的重建会方便很多。

3. 远场偏振计算:球面上坐标定向投影与相位奇点

3.1 为什么要从近场算远场

近场分布看起来是电磁场在结构周围的振荡形态,比如介质柱内部电场增强,或者表面电场束缚。但BIC的远场特性不同于普通模式,它的偏振态并不是直接看几个切面电场分量就能确定的。从近场到远场,需要借助 Stratton-Chu 公式做一次外推,把边界上的切向电场和磁场积分到无穷远球面上。COMSOL 的远场计算逻辑正是如此,它把计算域边界上的场投影到设定的远场方向上,得到一组复振幅。

关键点是,投影球面的半径必须处于远场条件之下,同时模型外部必须添加完美匹配层。否则边界反射会污染远场幅值,导致偏振椭圆取向完全失真的。我在第一次做一个类似结构时省了完美匹配层,只用散射边界,结果远场ExEy分量的幅值出现明显的干涉波纹,但当时误以为是物理上的偏振不均匀。后来加了完美匹配层并留出至少lambda / 2的间隔,结果立刻干净了。这里建议使用 COMSOL 内置的球形完美匹配层域,并将远场边界设置在完美匹配层内表面外一个波长处。

还有一个容易被忽略的问题:周期结构的远场不是连续的球面分布,而是分成离散的衍射级次。在计算远场之前,需要去查阅 COMSOL 的远场设置中是否有针对周期性结构的衍射级次选项。对于亚波长晶格,我们研究的就是零阶衍射,高于零阶的都处于倏逝波范围。如果设置了错误的衍射级次,得到的远场偏振就不再是 BIC 对应辐射通道的真实表现。

3.2 偏振椭圆率与偏振角计算

在拿到远场复振幅之后,计算偏振可以按照以下步骤进行。假设导出的两个正交切向分量为Ex_cosEx_sinEy_cosEy_sin,重组为复数形式:

import numpy as np # 从COMSOL导出的远场分量,分别为实部和虚部 Ex = Ex_cos + 1j * Ex_sin Ey = Ey_cos + 1j * Ey_sin # 计算两个分量之间的相位差 delta = np.angle(Ey) - np.angle(Ex) # 计算偏振椭圆长轴方位角 psi # 需要处理 cos(delta) 符号和分母为零的情况 denom = np.abs(Ex)**2 - np.abs(Ey)**2 psi = 0.5 * np.arctan2(2 * np.abs(Ex) * np.abs(Ey) * np.cos(delta), denom) # 计算椭圆率角 chi chi = 0.5 * np.arcsin(np.clip(2 * np.abs(Ex) * np.abs(Ey) * np.sin(delta) / (np.abs(Ex)**2 + np.abs(Ey)**2), -1, 1))

这里arctan2函数是为了避免在分母接近零时产生角度跳变。np.clip则是防止数值溢出导致反正弦函数输入超出定义域。计算完成后,psi对应的就是偏振长轴相对于实验室坐标系的旋转角。围绕 BIC 在 k 空间绕一圈,psi会旋转整数倍的 π,而这个整数就是我们常说的拓扑荷。

如果仅仅看某个 k 点的偏振椭圆,计算速度很快;但若要观察整个 k 空间网格上的偏振分布,必须要保证远场投影方向的一致性。一般是设置观测方向固定在 z 轴上,也就是theta = 0, phi = 0,这样所有 k 点的远场才具有可比性。如果选取了不同的thetaphi,偏振椭圆的参考系会跟着旋转,数据分析就会变成一场灾难。我在项目处理中习惯写一个脚本,把所有 k 点的远场分量的实部和虚部存入一个三维数组,再一次性矩阵化算完所有偏振角,效率远高于逐点循环。

4. Matlab 脚本实战:能带绘图与 Q 值筛选

4.1 解析 COMSOL 导出文件

从 COMSOL 导出的文本文件,表头会包含模型信息和解算器信息,需要在数据处理中跳过。常见格式是逗号分隔或制表符分隔。使用readmatrix时要注意指定NumHeaderLines,否则第一行被误认成数据。以下脚本给出实际操作中读取数据并生成 Q 值的完整逻辑:

% 跳过表头,读取数值部分 데이터 data = readmatrix('band_data.csv', 'NumHeaderLines', 9); % 列顺序一般按照导出时的设置 kx = data(:,1); ky = data(:,2); freq_real = data(:,3); % 单位可能为 Hz freq_imag = abs(data(:,4)); % 转换单位到 THz,便于绘图 freq_real = freq_real * 1e-12; freq_imag = freq_imag * 1e-12; % 计算品质因子 Qfactor = freq_real ./ (2 * freq_imag); % 针对 BIC 点虚部消失导致的超大 Q 值,设置绘图截断上限 Qfactor_plot = min(Qfactor, 1e6);

脚本执行逻辑是先把行数据切割成独立列,然后对频率进行单位换算。Q 值计算时,分母中2 * freq_imag的系数来自品质因子的标准定义。处理完成后,Qfactor_plot用于绘图,而Qfactor则保留原始数值,供后续寻找 BIC 精确位置或分析虚部收敛趋势时使用。截断上限设置为1e6是因为在这个量级,继续分开显示已经不会影响能带图中尖峰形状的辨识度。

4.2 生成能带图和 Q 值趋势线

能带图需要把倒空间路径映射到一维距离轴。在高对称路径Γ-X-M-Γ上,距离按倒空间坐标差值累加。例如Γ点为[0,0]X点为[pi/a, 0],那么这段距离就是pi/a,之后再累加下一段。重新整理数据之后,就能绘制出横轴均匀的能带图。

% 计算 k 空间路径距离 k_dist = zeros(size(kx)); for i = 2:length(kx) if i > 1 dk = sqrt((kx(i)-kx(i-1))^2 + (ky(i)-ky(i-1))^2); k_dist(i) = k_dist(i-1) + dk; end end % 按距离排序,避免连线错乱 [k_dist_sorted, idx] = sort(k_dist); freq_sorted = freq_real(idx); Q_sorted = Qfactor_plot(idx); figure('Position', [100, 100, 800, 450]); yyaxis left; plot(k_dist_sorted, freq_sorted, 'b-o', 'LineWidth', 1.2, 'MarkerSize', 5); ylabel('Frequency (THz)'); ylim([min(freq_sorted)*0.98, max(freq_sorted)*1.02]); yyaxis right; semilogy(k_dist_sorted, Q_sorted, 'r-s', 'LineWidth', 1.2, 'MarkerSize', 5); ylabel('Q factor (log scale)'); xlabel('k path (Γ-X-M-Γ)');

这段代码使用双纵轴,是因为频率和 Q 值的量纲和数量级差异过大。左轴展示色散关系,右轴以对数坐标展示 Q 值。在绘制 BIC 时,右轴会在对应位置出现一个尖锐的单点凸起,这个位置旁边的频率值就是 BIC 的束缚频率。通过对 Q 值排序后取前几个峰值的索引,可以反向定位到对应的 k 点坐标,进而明确 BIC 位于哪条高对称线上。

4.3 远场偏振的矢量场图绘製

远场偏振图展示的是 k 空间网格上的偏振方向分布,可以直接用quiver绘制,每个箭头代表该 k 点的偏振长轴方向。对 BIC 而言,远场偏振在奇点周围形成涡旋分布,这种涡旋结构直接证明 BIC 的拓扑性质。

% 假设已经从多个 k 点提取远场分量 Ex, Ey % 这里使用二维网格表示 k 空间网格 kx_grid = linspace(-1, 1, 31); ky_grid = linspace(-1, 1, 31); [kx2, ky2] = meshgrid(kx_grid, ky_grid); % Ex_data 和 Ey_data 是 31x31 复数矩阵 Ex = Ex_data; % 复数远场 x 分量 Ey = Ey_data; % 复数远场 y 分量 % 计算偏振长轴角度 delta = angle(Ey) - angle(Ex); psi = 0.5 * atan2(2 * abs(Ex) .* abs(Ey) .* cos(delta), abs(Ex).^2 - abs(Ey).^2); % 绘制矢量场图 figure; quiver(kx2, ky2, cos(psi), sin(psi), 'AutoScale', 'off'); axis square; xlabel('kx (2π/a)'); ylabel('ky (2π/a)');

这里cos(psi)sin(psi)构成偏振矢量的两个分量。由于atan2返回的角度范围在-π/2π/2之间,绘制时箭头方向不会出现突然反转。若观察到箭头在某个点周围绕圈,就说明这里存在偏振奇点,可进一步使用后续章节中的相位积分验证拓扑荷。

5. 排错与进阶验证:数值噪声、网格收敛与拓扑荷

5.1 如何判断 Q 值虚部收敛

特征频率虚部收敛是光子晶体仿真中最容易翻车的地方。理论上 BIC 的虚部为零,但实际网格离散化会引入额外辐射路径,相当于给模式加了一个假的损耗通道。网格越粗,这个假损耗越大。初学者最典型的错误是,用一套标准网格算出一个Q = 1e5的结果,然后认为 BIC 就是有限 Q 值,其实完全是网格限制。

要判断收敛性,做法是对同一结构依次剖分 3 至 4 组网格,从粗糙网格到极细网格,每个方向加密一倍。记录每个网格下的 Q 值,绘制log(Q)对网格尺寸的曲线。真正的 BIC 点,Q 值会随着网格加密持续上升,并且斜率趋于稳定,也就是说每加密一倍,Q 值大致提升一个固定的比例。如果 Q 值在某个网格尺寸后开始波动不变,说明已经收敛到了数值极限,可以接受。如果不加密就无法继续上升,那说明仿真结果没有稳定在 BIC 的物理行为上,需要检查边界条件或模式识别是否正确。

5.2 偏振涡旋拓扑荷的判定

偏振涡旋的拓扑荷是描述 BIC 性质的重要指标,它定义为在 k 空间绕行偏振奇点一圈时,偏振长轴方向角psi的总变化量除以。实际计算时,可以选取以奇点为中心的圆周路径,依次提取路径上各点的远场分量,然后计算展开后的相位:

% 在闭合路径上计算拓扑荷 % 假设已经沿圆周取了 100 个采样点对应的 Ex, Ey theta_path = atan2(ky_points, kx_points); % 极角 psi_wrapped = 0.5 * atan2(2 * abs(Ex_p) .* abs(Ey_p) .* cos(delta_p), abs(Ex_p).^2 - abs(Ey_p).^2); % 由于 psi 在 (-pi/2, pi/2) 之间缠绕,这里用 unwrap 恢复连续变化 psi_unwrapped = unwrap(psi_wrapped * 2) / 2; % 展开时乘以 2 再除以 2 % 拓扑荷 charge = round((psi_unwrapped(end) - psi_unwrapped(1)) / (2 * pi));

这里隐藏细节在于unwrap的操作对象。由于psi的真实物理变化范围是-π/2π/2,而绕 BIC 一圈时psi应连续变化 π 的整数倍,所以先把psi乘以 2,使变化范围扩展到π,再执行相位展开,最后把结果除以 2,恢复实际角度。取round是为了消除数值噪声带来的微小偏差。如果计算出的charge+1-1或更大整数,可以判定该奇点对应的拓扑荷。

结构对称性会直接决定拓扑荷的数值。四方晶格 Γ 点上的对称性保护型 BIC 通常对应charge = 1的涡旋。如果网格剖分时没有保持结构完整对称,可能得到非整数的charge,此时应先检查网格剖分而不是怀疑物理模型。实际处理中我常用两个不同旋转角度的模型互为验证,只有当两次计算均给出相同整数结果时,才认为拓扑荷计算可靠。

5.3 结合理论文献的边界设定与参数复核

资料包中的文献和文档,虽然看起来只是背景阅读材料,但它们其实是排除模型错误的重要依据。和文献结果对照不顺时,核心检查点有三个:衬底折射率是否设成了无限衬底、边界条件是否错用成理想导体边界、以及远场投影的积分面是否放置在了过于靠近结构的位置。

先看衬底,很多论文的计算模型是悬浮膜结构,也就是上下都是空气。如果你用有衬底结构,模式的泄漏通道和远场辐射方向都会发生重大变化,能带图上表现为 Q 值整体下调、BIC 频率移动。再看边界,周期性结构要求在 k 空间区分布洛赫周期边界,但有些初学者把上下边界也设置成了周期边界,就相当于造了一个纵向也无限周期的结构,和物理事实完全不符。正确的做法是上下方向使用完美匹配层加散射边界,水平方向使用 Floquet 周期边界。最后看远场积分面,积分半径不宜过小,至少应在结构上方一个波长以上,同时保持积分面与完美匹配层内边界平行。只要这三个位置设置得物理自洽,COMSOL 算出的远场偏振结果与文献里的远场偏振图就能在拓扑结构上高度吻合。每当我拿到一个新模型,总是先按这三个维度检查一遍,通常五分钟内就能定位绝大多数仿真数据对不上的原因。

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

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

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

立即咨询