
各位做光学计算和光子器件设计的朋友肯定对COMSOL Multiphysics不陌生。它在光子晶体能带仿真这块可以说是最常用的工具之一但也是最容易让人“翻车”的地方。尤其是正方晶格光子晶体作为入门频率最高、概念最基础的模型很多人以为就是“画个格子、设个参数、跑一下”这么简单真正上手才发现布洛赫边界条件怎么设、布里渊区路径怎么扫、简并模式怎么区分都是坑。这篇文章就围绕COMSOL中正方晶格光子晶体能带仿真这一主题把整个流程从物理背景、几何建模到特征频率扫描、数据导出再到后处理和问题排查完整走一遍。适合刚接触光子晶体能带计算的研究生、做器件设计的工程师以及任何想搞清楚“能带结果到底是怎么算出来的”的人。我会直接把我在实操中验证过的设置和步骤放出来包括边界条件写法、扫描路径选择、求解器参数整理最后再把常见的报错和反直觉现象列出来逐条分析。1. 内容整体设计与思路拆解1.1 从物理模型到COMSOL求解流程的整体认识光子晶体是介电常数周期变化的材料结构其核心物理特征是出现光子带隙也就是特定频率范围内电磁波无法在结构内传播类似于半导体中电子禁带。实际上光子晶体就是“光学的半导体”它把电子带理论中周期势场的思想搬到电磁波上。而能带结构就是给定波矢k求解满足布洛赫周期性条件的电磁本征频率ω(k)将k扫过第一布里渊区的高对称路径就得到了能带图。很多人觉得COMSOL做能带仿真是个“黑盒”其实它背后就是求解一个本征值问题。对于二维正方晶格光子晶体通常求解面外传播模这里分电场极化E极化也就是TM模式和磁场极化H极化也就是TE模式。COMSOL的波动光学模块提供三种可用的物理场接口我自己最常用的是“电磁波、频域”接口下的“特征值”求解。需要注意的一点是光子晶体能带仿真通常不需要设置激发源直接求解无源波动方程的特征频率即可这是很多新手困惑的地方。从流程上看COMSOL实现能带仿真的技术链路是先参数化几何和材料然后建立单位单胞模型并添加Floquet周期边界条件再把波矢扫描参数化最后用特征值求解器扫描计算提取频率数据即可。整条链路中最关键的是波矢方向和边界条件的对应关系这也是决定结果对错的核心因素。1.2 为什么选择正方晶格作为入门模型二维正方晶格光子晶体是所有光子晶体结构中最简单、对称性最高的一种。它的晶格矢量正交倒格子仍是正方晶格布里渊区也是正方形高对称点只有Γ、X、M三个点路径是Γ-X-M-Γ。这意味着扫描路径很容易实现也不容易弄混边界条件。对比三角晶格蜂窝结构它们的布里渊区是六边形高对称点更多K、M等路径写法也要复杂得多。从物理角度看正方晶格虽然简单却包含了光子晶体最核心的现象对TE模式通常有较大带隙TM模式带隙则比较小甚至没有这主要是由于电场在介质柱和空气背景中的边界连续性条件不同。也就是说正方晶格刚好可以让你理解什么是“模式偏振相关的带隙行为”这是后续做波导耦合、微腔设计的重要基础。所以不管是教学还是项目起步正方晶格都是练兵的最佳模型。我自己的体会是把正方形格子吃透了再去碰三角格子、异质结构和拓扑光子晶体思路会顺畅很多。因为能带仿真本质上就是“画晶胞、加边界、扫波矢”这三板斧晶格对称性只影响波矢路径的写法和倒格矢定义物理逻辑是统一的。1.3 COMSOL版本选择与模块配置COMSOL从6.0开始界面和求解器内核都没有本质变化所以6.4和旧版本5.6在操作路径上基本一致。这个仿真需要用到COMSOL的“Wave Optics Module”也就是波动光学模块。没有这个模块的话光靠AC/DC模块虽然可以勉强叫“电磁波”但材料光学属性、折射率定义、散射边界条件等光学专业功能都不全效率和结果准确性都不理想。还有一个容易忽略的点是能带仿真本身是二维平面内求解但选择“2D”空间维度即可没必要用3D。二维模型求解资源小、速度极快一个普通的正方晶格晶胞模型网格数通常在几千到几万左右普通笔记本就能轻松跑完这也是入门首选的原因。需要注意的版本细节是COMSOL 6.x版本的“电磁波、频域”接口中特征值求解器的选项变得更加复杂新增了一些针对大规模问题的特征求解器如FEAST、SLEPc等。但二维小模型完全不需要开这些高级选项默认的MUMPS加上ARPACK即可稳定出结果。这里也是我在帮学生调模型时发现的一个常见误区明明是小模型非要去调整求解器结果越搞越乱。2. 核心细节解析与实操要点2.1 材料参数与归一化单位的物理内功光子晶体的能带计算有一个特殊之处通常不看绝对频率而是看归一化频率。归一化公式是归一化频率等于晶格常数乘以频率除以光速。之所以这么做是因为光子晶体能带结构满足标度不变性——只要结构的几何形状和介电常数对比不变只是整体缩放尺寸归一化能带就不变。这不仅让结果具有普适性还能避免“用绝对单位导致数值太小而收敛困难”的问题。实际建模时我喜欢把晶格常数a设为1微米介质柱半径r设为0.2a即200纳米这就可以直接对照文献里的横坐标。此时仿真频率范围为0.2 到 1.2对应归一化频率后续换算成真实频率也很方便。材料方面背景介质设为空气折射率n1介质柱选择硅、二氧化钛或砷化镓常用折射率在3.0到3.5之间。这里必须注意COMSOL的“折射率”定义方式波动光学模块中的材料折射率是复数形式nnik色散关系的实部用于计算相速度虚部用于吸收损耗。如果做无损耗能带虚部保持0即可。有个小细节值得强调很多新手在定义硅材料时直接把折射率填成3.45但在频域特征值求解中这其实是无色散假设下的近似值。对于见诸文献的典型硅薄膜结构在近红外区域这个近似是可接受的但如果要做宽频高精度计算应该引入材料的折射率色散模型。COMSOL的“材料”节点里可以用“折射率”材料类型直接定义也可以用插值函数表达折射率随波长的变化。2.2 正方晶格单胞几何与Floquet周期性边界条件二维正方晶格的单胞就是一个正方形边长就是晶格常数a。介质柱位于单胞中心半径通常设为0.2a。这个几何构建用COMSOL的参数化几何即可开放几何尺寸设定1微米乘1微米中心画一个半径为0.2微米的圆从正方形中减去圆形得到空气孔背景。或者反过来介质柱嵌入背景也是同样操作。常见的结构是介质柱型dielectric pillar即圆形高折射率柱周期排列在空气背景中另外一种是空气孔型air hole结构正好反过来能带特性也有差别。重点在于边界条件设置。光子晶体的无限周期结构通过在单胞边界上施加Floquet周期性条件来模拟。COMSOL中Floquet周期边界在“电磁波、频域”接口下的“周期”节点中设置。对于正方晶格需要定义两组周期边界x方向的一组y方向的一组。每组对应边界对必须分别设置波矢分量。这里有个非常容易错的点Floquet边界条件的波矢写法。COMSOL里的“周期性边界条件”界面下有两种选项一种是通过“波矢”直接设定另一种是通过“来自波矢变量”的方式设置。我推荐用后者因为可以定义一个全局变量kx和ky扫描时统一控制。两个方向边界对中一边设为“源”边界另一边设为“目标”边界目标边界上的相位关系就是exp(ikxa)或exp(ikya)。进一步说对于面内2D平面波展开电场和磁场表达式中都含有exp(i*(kxxkyy))的布洛赫相位因子这个因子已经由Floquet边界条件自动处理了不需要在物理方程中额外加上。但需要注意一个矛盾点如果建模时把几何尺寸设成a1微米那么Floquet边界条件中的波矢分量不再是反正切形式的“相位差/长度”而是周期性边界条件中直接输入波矢位移。在这类本征值问题里正确做法是把“波矢”按kx*kx这样直接以1/m为单位设置比如扫描到X点时kxpi/a换算成pi/1微米。为什么必须换算成1/m因为COMSOL内部的电磁场方程统一使用国际单位波矢单位也是rad/m。若在几何尺寸为微米时直接输入“pi”实际传播相位就是pi rad/m完全错误。这是无数新手第一次算能带时出现“能带频带错乱”的头号原因。我的经验是直接把a定义成参数在边界条件的波矢输入框里写成kx/a这样单位换算自动正确。2.3 特征模式偏振TE与TM的本质区别二维光子晶体的本征模式按偏振分为两种一种电场沿着z方向面外方向磁场在面内这就是TM横磁模式又通常叫E偏振另一种是磁场沿z方向电场在面内就是TE横电模式也叫H偏振。在COMSOL里需要明确指定求解哪种偏振两种模式的方程不同。TM模式电场沿z可以用“电磁波、频域”接口直接求解电场z分量的亥姆霍兹方程。在界面设置中只需要将面外极化设为“电场面外”即可在波动光学模块的“电磁波、频域”物理场中有极化选择。TE模式则对应“磁场面外”同样在极化设置中切换。也可以用一个模型同时求解两种偏振方法是分别添加两个物理场接口在各自的特征值设置中指定面外场。不过这样会增大矩阵规模二维模型通常可以接受我还更推荐分开计算这样后处理更容易区分结果。关于带隙差异的物理根源简单说就是介质柱型正方晶格在TE模式下电场沿空气区和介质柱区之间的边界条件导致更强的有效折射率对比从而容易出现较大带宽的完整带隙在TM模式下因电场连续条件更宽松带隙往往在低填充率下消失。理解了这一点你在设定扫描模式时就能预判结果而不是等算出来才知道。3. 实操过程与核心环节实现3.1 从零开始搭建几何、材料与物理场配置的完整步骤下面我给出一个可以直接复现的操作流程。启动COMSOL后模型向导选择“二维”勾选“波动光学”模块中的“电磁波、频域”求解方式选“特征值”。点击完成进入建模环境。第一步是全局参数。在“全局定义”下添加参数表设置参数数值说明a1e-6 [m]晶格常数r0.2e-6 [m]介质柱半径eps_d12.25介质柱介电常数硅n3.5eps_b1.0背景介电常数空气kx0布洛赫波矢x分量扫描变量ky0布洛赫波矢y分量扫描变量n_mode8每次扫描点计算的本征态数量在几何节点中创建一个1微米乘以1微米的正方形再在其中中心画一个半径为0.2微米的圆。布尔操作里选择“差集”用正方形减去圆形得到带孔背景。如果你要做介质柱型结构就反过来把圆形材料当作介质背景设为空气这时直接把圆形设置成硅材料即可正方形背景为空气。我个人更推荐从空气孔型开始因为在COMSOL中边界条件仿真介质孔更容易收敛。第二步定义材料。在“材料”节点里添加一个新材料。在材料属性中把“相对介电常数”设置为两个域各自的值。简单做法是背景域用默认材料“空气”内置空气的介电常数是1介质域手动新建材料在“折射率”或“相对介电常数”中填入3.5或12.25。建议直接使用介电常数定义因为能带计算中对比度直接决定带隙宽度。第三步设置物理场。在“电磁波、频域”接口中在“极化”中选择相应电场或磁场面外。把两个域的“电磁模型”设为“无源”方程类型默认即可。由于是特征值求解不需要设置入射波和端口只保留方程。第四步是Floquet周期条件的实现。在物理场右键添加“周期性条件”类型选择“Floquet周期”。然后选择边界对。x方向周期边界选择左边和右边的边界注意要排除几何顶点。x方向设置波矢为kx。y方向同理波矢为ky。这里需要注意COMSOL中的“从波矢变量”在有些版本里不在周期边界设置中直接显示而是在“周期性条件”的属性里。按下“Floquet周期性”后界面会出现一个“波矢”输入框类型设置为“从波矢变量”变量名填kx和ky注意不同方向可能显示一样的变量要手动区分。由于几何是微米尺度直接交给COMSOL的“波长”网格设置往往会出问题。最好使用“用户控制网格”最大单元尺寸设为0.05微米介质柱边界用较细的边界层。介质柱边界有强烈折射率突变这直接决定了高次模式精度。如果你希望能带前几支频带足够平滑网格质量太粗会导致谱线扭曲或出现伪模。算例中网格单元数通常在1万左右求解非常快。3.2 波矢扫描路径与布里渊区高对称点能带图里横坐标不是均匀的波矢而是沿第一布里渊区边界的高对称路径。正方晶格的倒空间基矢为b1(2pi/a,0)b2(0,2pi/a)。第一布里渊区是中心位于Γ点、范围为[-pi/a,pi/a]的正方形。高对称点是Γ(0,0)X(pi/a,0)M(pi/a,pi/a)。常规路径是Γ→X→M→Γ。扫频过程中k点取点顺序和密度会影响能带曲线的光滑度。实操中我会把路径分为三段Γ到Xkx从0到1ky保持0X到Mkx固定为1ky从0到1M到Γkx和ky同时从1降到0为了在一个模型中扫描整条路径有两种方法。一种是直接参数化扫描在“研究”节点中设置辅助扫描变量用步长控制k值。另一种是更技巧性的做法定义三个区域然后对“全局参数”中的kx、ky连续变化。我推荐前者简单直观。定义辅助扫描时把kx设为参数sxky设为参数sy然后在“研究1”里的扫描节点中分别设置三个扫频区间。COMSOL的“参数扫描”可以叠加多个扫描我在实际操作中会直接建立一个“全局参数扫描”然后把三个扫描区间写成三个分别的定义但要注意这样会导致最终能带横坐标上有重复的M点。更规范的方案是在全局参数中新增一个“扫描索引入口”参数sweep_index用if语句来映射kx和ky当sweep_index在0到1之间时kxpi/a*sweep_indexky0在1到2之间时kxpi/akypi/a*(sweep_index-1)在2到3之间时kxpi/a*(3-sweep_index)kypi/a*(3-sweep_index)这种用参数化函数控制波矢的做法能把整条路径变成一个单参数扫描后处理非常方便能带曲线横坐标直接对应sweep_index即可。对于初学者来说写成三个分离段直接扫也行但会导致横坐标不够连续。3.3 特征值求解器设置与能带数据导出在“研究”节点下特征值求解设置非常关键。COMSOL默认的特征值设置中“搜索特征值附近”的值是0。这个设置对光子晶体能带仿真有一个常见问题因为求解的是有限个特征值如果从0开始搜索前几个最靠近0的特征值通常是属于静默模数值伪模所以你会看到能带图上出现非常低的“表面模”。正确做法是设置“搜索特征值附近”为一个大于0的频率基准比如设为中心频率中心频率 归一化频率1乘以光速除以晶格常数。对于a1微米中心频率就是c/a3e14 Hz换算成THz就是300 THz。若你想计算前8条能带可以在“搜索特征值附近”填3e14点击“特征值数”填8即可。由于归一化频率范围通常覆盖0.2到1.2对应实际频率为60 THz到360 THz设置“搜索特征值附近”为200 THz左右并请求“特征值数”为8一般就能覆盖所有低阶模式。这个“附近”频率相当于你要求的带阶次中心太低了会把低阶伪模当成目标太高则漏掉低阶模。经验和建议是先从中心频率为0开始跑一次根据最低几条物理能带所在的频率范围再重新设置搜索中心。这个迭代步骤值得做能让你完全掌控结果。求解完成后在结果节点中创建一个一维绘图组。横轴选择扫频参数纵轴选择“特征频率”直接把全部特征频率画出来。但如果扫描是分三段横坐标上会有三段不连续这时建议用上述单参数映射方案。后处理中还能使用“全局计算”直接把每个扫描点的各特征值写入电子表格导出为文本再交给Python或Origin画最终图。这里我习惯直接用COMSOL自身绘图因为可以立即对照带宽。需要提醒的是本征值结果列出的频率是“角频率”除以2π单位是Hz。如果你想画归一化频率那么纵轴公式写成eval/freq_a其中freq_ac/a。在COMSOL的表达式框里可以直接写freq/3e14就可以在纵轴直接得到无量纲归一化频率方便和文献比对。4. 常见问题与排查技巧实录4.1 特征值太乱区分物理模与伪模几乎所有新手在第一次算完光子晶体能带后都会遭遇一个诡异问题能带图底端出现几条几乎水平的直线频率极低且不随波矢变化这是典型的伪模。它们来自求解区域边界上的数值奇点、局部网格缺陷或者特征值搜索范围太低。排除伪模的方法有几个检查网格质量。把最大网格尺寸减半观察这些伪模的频率是否剧烈变化。物理模对网格收敛敏感度低伪模则相反通常网格加密后会消失或迁移。使用“搜索特征值附近”指定合理的起始频率。这是最彻底的办法。在结果标绘中筛选模式用电场模分布判断。物理模的场分布在单胞内呈现清晰的驻波图案伪模则往往在边界角落堆集。我自己最常用的做法是直接看场分布在结果节点添加二维绘图组把每个模式的表面电场画出来逐个人工检查。光子晶体前几条能带的模式分布非常规整一眼就能看出物理模因为物理模的节点数和场斑数目有明确的规律性。4.2 Floquet边界条件方向配错导致能带断裂另一个高频坑在X→M段kx固定为π/aky变化这时如果你在周期边界中把x方向波矢写成kxy方向也错误地关联到kx变量就会出现能带不连续甚至出现类似“带隙闭合”的假象。检查的办法非常简单在周期边界设置框中两个方向的波矢必须分别绑定对应的变量名而且变量值要符合倒空间的坐标关系。按下“绘制”按钮看边界上的相位是否随扫描变量正确变化。另外Floquet周期边界中“源”和“目标”的方向设置颠倒导致相位差反号结果上相当于波矢取负号。由于正方晶格布里渊区具有中心对称性能带图E(k)E(-k)其实是对称的所以取反号不会改变色散曲线但如果后续做拓扑光子晶体、谷自由度模拟波矢符号就非常重要了。4.3 网格与求解准确度的“三角权衡”光子晶体能带的网格密度选择是有讲究的。网格太粗高频支的色散曲线会出现明显棱角、带宽变窄甚至伪带隙网格太细虽然精度提高但特征值求解耗时也上升。二维模型中每支频带对应特征值数量有限推荐经验是空气孔周围边界层加3层网格最大尺寸小于0.1a。比如a1微米时最大尺寸100纳米已经足够精确前5条能带的频率误差通常在0.1%以下。如果你只需要带隙边界这个精度完全够用。还有一个非常实用的技巧不要直接用“特征频率”搜索次数很多比如一次请求20个特征值这会显著增加内存和时间成本。更合理的做法是分段求解先用8个特征值扫一遍找出目标带隙频率区间再对目标区间只求2到3个特征值提高局部精度。这在后续做导模和缺陷模时尤其实用。4.4 能带图横坐标处理与数据导出规范COMSOL默认输出的扫频图横坐标是按照扫描步长均匀分布的但物理横坐标实际应该是布里渊区路径长度。如果你直接用sweep_index画图横轴只是索引号。为了和专业文献一致我通常在绘图组中定义一个新的表达式“横坐标平均波矢路径”其计算公式是第一段积分0到π/a第二段积分π/a 从0到π/a第三段积分路径长度继续累加在绘图时可以直接定义横轴线用函数k_path(kx,ky)来计算这是在COMSOL里画专业能带图的最规范方式。不过如果只是内部参考直接用扫描索引也未尝不可但在论文或报告中最好换算成功率。5. 高阶扩展从能带到实际器件设计的桥接5.1 缺陷模与波导耦合的建模思路算清楚完整带隙位置之后最直接的器件应用就是在完整光子晶体中引入点缺陷或线缺陷构造微腔和波导。COMSOL里的处理方式是在大超胞中删除一个或一排介质柱然后仍然用Floquet边界条件但此时超胞尺寸远大于单位晶胞布里渊区折叠会导致能带图出现很多额外分支。这里我必须强调如果你在超胞外用Floquet周期性条件那扫描波矢的单位和方向仍然沿用单位晶胞的写法和物理意义但超胞尺度改变了倒空间。超胞的倒空间周期是2π/(a*N)所以原来的高对称点折叠到更小的布里渊区中能带图上会产生一系列折叠带。这个操作本身不难难在如何从折叠带里分辨出缺陷模。我的实战技巧是在计算缺陷模时单独用“本征模”方式求解超胞得到缺陷模频率后再回到单位晶胞能带图对照看该频率是否落在带隙中更好判断是否局域。线缺陷波导仿真通常用超胞加散射边界条件来提取导模色散和标准能带计算略有不同需要额外引入波导激励和端口。这个方向深入做下去非常值钱因为能带结构只是起点靠能带调制的群速度、慢光效应、拓扑边界态才是现在的研究热点。5.2 参数扫描如何系统优化带隙宽度能带计算的价值在于指导优化。在COMSOL中把介质柱半径r设成扫描参数对每个半径值重新计算能带就可以系统提取光子带隙随结构参数的变化趋势。实现上很简单全局参数r从0.1a扫描到0.45a步长0.02a每组都跑同样的波矢路径。计算量大约增长为原来的20倍对于二维晶胞来说仍然是可接受的。有一个特别需要注意的点是COMSOL的参数扫描默认会保留所有求解结果内存占用随着扫描次数线性增长。建议在“研究设置”中勾选“扫描时仅存储最后一个解”或手动在每个扫描点导出数据后清空存储否则跑几十个点后内存容易爆。优化带宽时我一般会定义全局计算表达式带隙相对宽度为带隙宽度除以带隙中心频率。通过在结果中提取相邻两条能带极值点用“最大”和“最小”投影算符求差。这个过程可以在COMSOL中写表达式自动计算也可以用后处理导出到表格再在Python里运算。从实操角度讲后者更可靠因为COMSOL的算子投影在能带数据连续但模式交叉时容易误判。5.3 模式分类与带隙来源的物理分析完成能带仿真后很多人画完图就结束了但实际还可以从模式场分布反推带隙形成的物理机制。比如正方晶格介质柱模型的TM带隙来自介质柱中电场集中和背景空气区形成强烈耦合差异TE带隙则受边界连续条件影响更大。将每个波矢点的场图导出来看能直观理解介质柱和空气波导之间的模式排斥效应。这种分析能力比仿真本身更重要。我在实际项目中经常需要通过能带形状判断结构是否处于“狄拉克点”或“平带”状态这直接决定了后续拓扑态和慢光器件设计。例如在正方晶格中调低介质柱半径Γ点处前三支模会出现四重简并对应偶然狄拉克点这在拓扑光子晶体设计中是重要资源。能带仿真成为“认知工具”它不只是产出图像更是探索物理新机制的关键步骤。5.4 从COMSOL到其他工具的数据协同COMSOL的优势是建模灵活、后处理丰富但它的能带计算速度相比专用平面波展开法如MIT Photonic BandsMPB慢了不止一个量级。实际工程项目中我常采用协同流程用MPB快速扫描参数空间寻找近似最优结构再用COMSOL精细建模验证结果因为MPB假设结构无限周期并且只支持特定网格形式对复杂缺陷、各向异性和非线性材料不适应。两条路线可以互为交叉验证对高质量研究几乎是标配。如果把能带数据导出为CSV再用Python读入做带隙分析可以画出版权清晰的图。我建议在COMSOL“导出”选项卡中用“数据”导出特征频率每列是一个模式的频率行是扫描点。注意模式顺序在不同扫描点之间可能发生交换能带“交叉”这是由模式简并引起的。如果你在绘图组里直接画原始数据能带曲线会发生交叉跳跃看起来像是带隙里出现模式实际这只是一个排序问题。解决方法是按照波函数对称性对模式重新编号或者使用连续的能带追踪算法。这部分工作放到Python或MATLAB里处理最顺手。6. 一些使用体会COMSOL做光子晶体能带仿真最容易走弯路的地方往往不在物理建模而在对求解器设置和边界条件细节的理解。很多时候折腾了半天最后发现只是波矢单位写错或特征值搜索范围不对。这也提醒了我做这类仿真一定要养成记录“版本化”建模参数的习惯每次修改几何或物理设置时保留一个副本否则很难定位问题是哪一步引入的。我个人的建议是入门时坚持用最简单的单位晶胞模型把流程跑通确认能带图和文献吻合后再升级到复杂结构。不要一开始就追求用超胞算缺陷模、用拓扑结构算边界态基础不稳时很容易把错误结果当作新发现。最后分享一个自己一直保留的操作每算完一组能带我都会把最低三个模式的电场分布图导出来存成图片。这不仅是检查伪模的手段更是在后续写论文和汇报时非常重要的物理直观素材。能带图只是数据和骨架空间场分布才是真正帮助你理解结构物理本质的钥匙。