COMSOL计算光子晶体能带折叠光子晶体这玩意儿玩的就是周期性结构对电磁波的控制能带折叠说白了就是不同传播模式在特定频率区间重叠。今天咱们直接拿COMSOL开搞手把手整一个二维六方晶格光子晶体的能带计算。先整模型结构在COMSOL的模型开发器里用Append Geometry节点画个六边形蜂窝晶格。这里有个偷懒技巧——用参数化曲线生成器直接调取晶格参数% 晶格生成脚本片段 a 1e-6; % 晶格常数 r 0.4*a; % 介质柱半径 theta 0:pi/3:2*pi; x_points a*cos(theta); y_points a*sin(theta);这段代码生成六边形顶点坐标配合COMSOL的几何构建循环自动生成蜂窝结构。注意这里的r值别超过0.5a否则相邻介质柱会粘连导致结构异常。材料设置要注意介电常数交替分布。用参数化材料特性时记得勾选在模型中包含空间变化选项。对于TE波分析电场主要在面内分布这时候材料参数的梯度方向设置会影响收敛速度。COMSOL计算光子晶体能带折叠边界条件才是重头戏周期性边界得玩明白。在Floquet端口设置里kx和ky这两个波矢分量要参数化扫描% 参数扫描设置 k_values linspace(0, pi/a, 20); study model.study.create(std1); study.set(param1, kx, range, k_values); study.set(param2, ky, range, k_values);这里有个坑当扫描路径经过布里渊区高对称点时比如Γ-M-K-Γ路径必须分段设置扫描参数否则会漏掉关键能带特征。求解器设置建议改用迭代求解器并开启多核计算。看到这种报错别慌Failed to converge using default solver. Try using a direct solver or refining mesh.八成是介质界面处网格不够细用边界层网格功能局部加密就能解决。计算完成后在后处理模块用特征频率排序% 数据提取脚本 freqs mphglobal(model, freq,dataset,dset1,solnum,all); band_data reshape(real(freqs), [], length(k_values));这里注意要取实部频率虚部对应的是损耗机制。把不同k点对应的频率连起来就是能带图当看到某些频段出现多个模式交叉时那就是能带折叠在搞事情。最后说个骚操作在结果里添加电场模分布动画拖动k点滑动条实时观察布洛赫波的变化。当波矢扫过布里渊区边界时注意观察电场相位跳变——这玩意儿就是能带折叠的直观体现周期性边界导致波函数必须满足特定相位匹配条件。搞完记得导出数据用Python画个三维能带图from mpl_toolkits.mplot3d import Axes3D fig plt.figure() ax fig.add_subplot(111, projection3d) ax.plot_surface(KX, KY, bands, cmapviridis) ax.view_init(30, 45) # 这个视角最能体现能带折叠当看到能带像折纸一样上下翻卷恭喜你成功捕捉到光子禁带和导带的交界区域。下次有人跟你扯能带工程直接把这张三维图甩他脸上。