最近重跑了一批Comsol声子晶体的能带模型,把三角格和六角格两种晶格从头到尾过了一遍。说句实话,能带计算这个方向,真正拦住人的往往不是物理,而是软件里的那几个关键开关:布洛赫周期边界怎么加、布里渊区高对称点怎么切、能带曲线怎么一张图画完。标题里的“神秘面纱”其实没那么玄,只要把周期性结构的数学化到Comsol里一套固定操作,三角格和六角格就是同一套流程的两个变体。这篇文章面向正在学声子晶体、或者刚开始用Comsol做周期结构仿真的同学,以二维固体声子晶体为背景,把能带计算的物理、建模、扫参和出图全流程拆开讲清楚,最后附上我实测中踩过的坑和排查办法。
1. 先搞清楚能带图在算什么
1.1 周期性结构为何会“截住”某些频率
声子晶体就是弹性模量和质量密度周期性变化的结构,最常见的是基体里周期排布柱子或者孔洞。当一个弹性波在这种周期介质里传播时,会反复被散射;当波长和晶格常数在同一个量级时,散射波之间出现相干叠加,某些频率的波在任意方向都无法传播,这就是完全带隙。基于这个原理,可以做振动隔离、声波滤波、波导和能量收集,所以能带计算成了这类研究的第一道工序。
很多新手一上来直接看能带图,觉得就是一堆点连成线,没啥了不起。但真正有价值的信息全在“哪些频率区间没有曲线经过”——那一块空白区域就是带隙,也就是结构能“禁掉”的频率范围。算能带本质上是在回答一个问题:一个无限大的周期结构中,弹性波能承载哪些频率?以及哪些频率会被杀死,死在哪个波矢方向。
1.2 布洛赫条件把无限周期压缩成一个单胞
理论上,无限周期结构的自由度是无穷多的,直接建模不可能。但如果结构满足平移周期对称性,弹性波场就能写成布洛赫形式:位移场等于一个周期性包络函数乘上相位因子,其中波矢 k 成了外参数。代入线弹性运动方程后,问题变成:给定 k,解一个以频率为特征值的广义特征值问题。这个特征值问题的维度仅和一个单胞的自由度相当,从而把无限周期问题降到了有限尺寸。
所以能带计算的核心流程就是:对一个单胞建模,然后让波矢 k 在不可约布里渊区边界上走一圈,在每个 k 点解一次特征频率。Comsol里的“特征频率”研究做的正是这件事。理解了这一层,你后面看到所有设置都不会慌——几何是单胞,边界条件是布洛赫周期,扫描参数是 k,输出是频率,四者扣起来就是完整的能带图。
2. 三角格与六角格:格点一样,故事不一样
2.1 基矢、倒格子与第一布里渊区的对应关系
在很多教程里,“三角格”和“六角格”经常混着写,因为它俩确实同属六方晶系,第一布里渊区都是正六边形,高对称路径也都是 Γ-M-K-Γ。但实际计算时,人们常说的三角格指单胞内只有一个散射体的简单位点阵;六角格则指蜂窝状复式格子,比如石墨烯那样的结构,单胞里有两个不等价散射体。
从能带形态上看,这两种格子的差异非常明显。简单三角格能带相对“整洁”,带隙打开主要靠填充率和散射体与基体之间的阻抗比。六角格因为多了第二套散射体,结构自由度更高,往往在较小填充率下就能打开宽带隙,并且 K 点附近会出现狄拉克锥——两条能带线性相交于同一个频率点。这也是近几年拓扑声子晶体研究特别偏爱六角格的原因。
不过好消息是,二者的布里渊区路径完全一致,因此Comsol建模流程高度相似。你先跑通三角格,再改单胞内容去算六角格,只是几何和边界配对的差异,其他设置几乎原样复用。
2.2 单胞切分:从平行四边形单胞到双原子基
建模时首先要选好单胞。二维六方晶格的常用实空间基矢是这样的:
a1 = (a, 0) a2 = (a/2, sqrt(3)*a/2)这两个基矢夹角60°,围成的平行四边形就是最方便做周期边界条件的单胞。三角格的话,单胞内只要放一个散射体,通常放在中心位置;六角格(honeycomb)则要在这个平行四边形里放两个不等价的散射体或孔洞位置,一般取分数坐标 (0,0) 和 (1/3, 1/3) 附近的错位点,形成蜂窝排列。
千万别直接拿正六边形做单胞去加周期条件。六边形单胞虽然看着直观,但六条边界要分成三组对边分别配对,相位关系很容易弄错,而且Comsol里边界配对数量一多,新手往往漏掉一对,结果算出一堆莫名其妙的边界局域模。平行四边形单胞只有两组相对边界,对应基矢方向,配对干净利落。
2.3 Comsol几何建模的关键操作
在Comsol里搭几何时,我习惯把晶格常数 a、散射体半径 r 这些全部设成全局参数。不要直接在几何里写死数字。后续你要扫填充率、换材料,改参数重算远比改几何快得多。建议至少定义这几个参数:
a = 0.02[m] 晶格常数 r = 0.007[m] 散射体半径几何构建步骤:
- 用“多边形”创建一个平行四边形单胞,顶点坐标用 a1、a2 写出;
- 用“圆”在单胞中心放散射体,如果是六角格就再放第二个圆并错开位置;
- 使用“差集”把散射体从基体中抠掉,或者直接保留两个域做两相材料。
如果你是做实心柱阵列,那就保留基体域和柱体域两个域,分别指定不同材料;如果做孔板,则用差集把孔洞挖空。做二维模型时,建议用“二维”空间维度,物理场用“固体力学”,并注意在“平面应变”和“平面应力”之间选型——声子晶体通常是无限长柱子或厚板上的孔,用平面应变更贴切。
3. 波动周期条件的落地:Floquet边界与扫参路径
3.1 Floquet周期性的设置与k矢量单位
Comsol的“固体力学”接口里有一个“周期性条件”节点,选“Floquet周期性”,然后需要为单胞的每一对相对边界指定源边界和目标边界。对平行四边形单胞来说,就是两条相邻边作为源,两条对边作为目标;三条边不,四边形的两组对边刚好配对。
关键的坑在于波矢 k 的填写。Comsol的Floquet边界条件里,k 分量的单位是 rad/m,而且必须是直角坐标分量。但文献里的高对称点通常写成约化坐标 (k1, k2),以倒格子基矢 b1、b2 为基准。两者之间必须换算,不能用约化坐标直接填进去。
换算公式不复杂。已知实空间基矢 a1、a2,倒格子基矢 b1、b2 满足关系 a_i · b_j = 2π δ_ij,对上面的 a1、a2 可以解出:
b1 = (2π/a) * (1, -1/√3) b2 = (2π/a) * (0, 2/√3)如果某个点的约化坐标是 (x, y),则实际波矢为:
kx = x * b1x + y * b2x ky = x * b1y + y * b2y把这个 kx、ky 填到Floquet周期性里,才和单胞的几何对得上。
3.2 Γ-M-K-Γ路径的单参数连续化写法
高对称点路径是整个计算里最容易绕晕的一步。六方晶格第一布里渊区的高对称路径一般为 Γ → M → K → Γ,每段之间插值。以约化坐标为例,一个常用的取法是:
Γ = (0, 0) M = (0.5, 0) K = (1/3, 1/3)当你用Comsol求解时,最省事的方式不是同时扫描 kx、ky 两个参数,而是只扫描一个路径参数 t,用表达式把 t 映射到约化坐标的连续路径上。我惯用的写法是这样的:
t = 0 ~ 3 // 三段各占1个单位长度 // 第一段 Γ→M x_red = if(t < 1, t, if(t < 2, 0.5 - (t-1)/6, (3-t)/3)) y_red = if(t < 1, 0, if(t < 2, (t-1)/3, (3-t)/3))这段表达式在 t=1 时从 Γ 段的终点 (0.5, 0) 平滑过渡到第二段起点,t=2 时进入 K → Γ 段,回到原点。然后按照上一节的换算公式:
kx = x_red * (2*pi/a) + y_red * 0 ky = x_red * (-2*pi/(sqrt(3)*a)) + y_red * (2*pi/(sqrt(3)*a))在Comsol里把这两个表达式设成全局参数或变量,Floquet边界条件里直接引它们即可。t 作为扫描参数从 0 扫到 3,步长设 0.025 左右,求解器会自动在每个 k 点解一组特征频率,最后画图时横轴直接用 t,能带图自然就连起来了。
3.3 辅助扫描与直接参数扫描的取舍
这里多讲一句广大新手容易混淆的操作。Comsol里扫参数有两条路:一是添加“参数化扫描”节点包住特征频率研究,二是直接在特征频率研究步骤的“研究设置”里启用“辅助扫描”。表面看都是循环解算,但辅助扫描更适合能带这种“一维连续参数”场景,因为它和后处理耦合得更自然。
如果用参数化扫描同时扫 kx、ky 两个参数,结果会在解管理器里生成一个参数矩阵,每个解对应一组 (kx, ky)。画能带图时你得自己按路径顺序手动整理数据,非常痛苦。用辅助扫描只扫 t,并把路径映射表达式放在参数或变量里,求解结果天然按照路径顺序排列,绘图时选一下就会得到完整能带。我强烈建议新手直接走这条路线。
4. 一步一步算出第一条能带
4.1 物理场、材料与几何的搭配
以一个可以完全复现的二维声子晶体为例,我推荐你做“环氧树脂基体 + 钨圆柱阵列”。这在文献里已经研究得很透,参数如下:
| 材料 | 杨氏模量 E (GPa) | 泊松比 ν | 密度 ρ (kg/m³) |
|---|---|---|---|
| 环氧树脂(基体) | 4.35 | 0.37 | 1180 |
| 钨(散射体) | 354 | 0.35 | 19100 |
晶格常数取 a = 20 mm,柱半径 r = 7 mm。钨和环氧的阻抗差很大,带隙特征明显,容易在结果里看出“空白频率区间”。
物理场方面,新建“固体力学”接口后,模型默认二维平面应力,建议在“二维”物理场设置里把“层”类型改为“平面应变”,或直接通过“厚度”机制做近似。声子晶体的二维模型代表无限长柱体截面,平面应变比平面应力更接近真实情况。材料赋值时注意基体域和散射体域分别指定,别让材料覆盖整个几何——否则散射体消失,能带结构完全错误。
4.2 网格与求解器的经验参数
网格对能带的影响很大,但也不需要追求极致细密。我的经验是:自由三角形网格,基体区域最大单元尺寸取 a/10 左右,散射体边界局部细化到 a/30,这样既能捕捉圆形边界的几何曲率,又不会把自由度撑得太大。一个单胞求解一次特征频率,通常在一分钟内出结果,非常适合反复调参。
求解器设置要动两处关键项。第一,“特征频率研究”的特征值搜索范围。默认只求解靠近1 Hz的6个特征值,这对能带计算远远不够。我一般把搜索基准点设到 0,并让每次求解覆盖 12~20 个特征频率,搜索范围写成类似 range(0, 50, 100000) 的形式,单位Hz,范围覆盖到 100 kHz。第二,辅助扫描里把 t 的步长从 0 到 3 每步 0.05,先跑通流程;如果看到曲线交叉位置有毛刺,再局部加密到 0.02。
4.3 能带提取与归一化绘图
计算完成后,新建一维绘图组,绘图数据选“特征频率”,x 轴数据仍然用 t,y 轴数据选 freq 或者你自定义的归一化频率。这里有个实用小技巧:文献里的能带图横轴通常标注 Γ、M、K、Γ,纵轴用归一化频率而不是绝对频率。你可以自定义一个变量:
omega = 2*pi*freq Omega = omega * a / (2*pi*c_t)其中 c_t 是基体横波速度,环氧约 1160 m/s。然后在绘图的“替换表达式”里把这个 Omega 填进去,纵轴就变成无量纲约化频率。这样算出来的能带图可以在不同晶格常数之间直接比较,投稿时也符合惯例。
绘图时还有一个细节:默认情况下Comsol会把每个参数步的结果用不同颜色区分,曲线看起来比较乱。在“一维绘图组”里打开“图例”设置,把图例换成“t”的值,并关闭自动图例,就能得到一条整体贯通的多色曲线。或者直接把数据导出成文本,用自己熟悉的绘图脚本重画,我个人其实更推荐后者——能带图想画得专业,最终一步都绕不开数据导出和二次绘图。
5. 能带计算中绕不开的几个坑
5.1 模式跳变和伪交叉如何分辨
算完能带后,你大概率会看到某些看似交叉的曲线在高频段跳来跳去。低频几条带一般很干净,到了高频段,一条“连续”的带突然变成另一个模态,颜色和数据都接不上。这是因为特征频率求解器在每个 k 点独立求解,默认按特征值大小排序,而真实物理模式在某一段路径上频率高低可能互换,导致排序“跳档”。
我的处理办法分两步。第一步,判断带隙位置时根本不需要管模式跳变:把所有频率点铺开后,只要某个频率区间在全部 k 点上都没有点,它就是完全带隙,模式归属紊乱不影响这个判断。第二步,如果一定要追踪某一支模式,就把 t 步长加密到 0.01,然后在每个步进上查看对应模态的位移场形貌,人为确认连续变化的那些频率点,必要时把“搜索基准点”设为上一 k 点的特征频率,强制求解器回找同一支。
另外记住一个底层规律:一维参数扫描中,两个模式“真的交叉”需要额外对称性保护,无对称性的情况更多是反交叉——曲线靠近后又分开,看起来像两条带擦肩而过。如果发现两条带在非高对称点处劈开,说明它们之间发生的是反交叉,并不是你算错了。
5.2 网格相关性与特征值遗漏
网格太粗会导致高频带严重偏离,甚至个别特征频率被完全漏掉。最常见的问题不是“画出来的频率偏高”,而是“某些高频模式没解出来”——特征值搜索数量是固定的,如果某个 k 点附近特征频率密集,可能出现计算模式数不足,导致能带图在某个区间突然少了一段。
排查方法很简单:在几个关键点(Γ、M、K)分别用粗网格和细网格计算前 20 个特征频率,对比差值和数量。差值控制在 1% 以内,且特征值数量一致,再跑全路径扫描。如果求解器提示“找不到足够的特征值”,就把“特征值搜索”的目标数量从 12 增加到 20,或者把搜索范围上限提高。网格不是越密越好,还要考虑求解时间——我一般用“散射体表面网格细化,基体区域均匀”这个组合,既能保证圆柱边界几何精度,又不会让整体自由度假性爆表。
5.3 边界配对错误和零频率刚体模
周期边界配对是新手最容易翻车的地方。平行四边形单胞的两组对边,在Floquet周期性节点里必须一一选中。如果漏掉了一组边,模型就退化成“沿某个方向有限大”的结构,能带图里会出现大量平行平带,频率还会偏低,看起来像结构变软了。
另一个“伪模式”来源是零频率刚体运动。无约束的单胞模型允许整体平移和旋转,所以特征频率结果里总有几个接近 0 Hz 的刚体模式,能带图左侧那几条从 0 出发的水平线多半不是真实弹性波传播模式。处理办法:画能带时把低于某个阈值的频率点手动筛掉,或者直接忽略它们,不影响带隙分析。判断一个模式是否真实,最靠谱的是看位移场分布:布洛赫波模式在单胞内部有周期性的振动形态,而刚体模式整个单胞只是整体平移,一眼就能分辨。
5.4 高对称点简并与K点狄拉克锥的验证
六角格的 K 点是经典检验位。理论上,蜂窝晶格在 K 点存在狄拉克锥,两条线性色散带在同一个频率点相遇;Comsol计算时,应该在该点得到两个几乎相等的高精度频率值。如果你的结果里这两个频率差得比较大,先检查网格对称性——三角形网格不是完全旋转对称的,但足够精细时误差应该很小。如果误差超过0.1%量级,优先加密网格、或者用对称化网格重新生成,再检查几何里两个不等价散射体是否真的错开了位置。
三角格在 Γ 点也会出现简并,表现为多个模式频率重合。简并频率与单频模式的性质完全不同:简并意味着同一频率存在多种振动形态,对应的位移场往往可以通过旋转或镜像变换互相转换。验证时用场图工具把简并点的几个模式调出来,比对位移场是否呈现相应的对称性,这是确认计算正确性非常直观的途径。
6. 我个人操作中积累的几条心得
这套流程跑过几次之后,我再回头总结能带计算这件事,最大的体会是:能带图本质上是在“参数化观察”特征值的连续演化,物理图像清晰,但软件操作必须讲究次序。你先用最粗糙的几何和最粗网格把整条路径跑通,确认带隙的大致位置,再逐渐加密网格、增加特征值个数,而不是一上来就追求完美曲线。
另外一个小建议:把所有关键参数、材料参数、约化坐标换算表达式写成全局参数而不是硬编码在几何和边界条件里。这样你就可以很轻松地扫填充率、扫材料组合、甚至把三角格改成六角格后继续复用同一套周期边界设置。Comsol模型如果设计得好,换晶格只需要改几何和边界配对,其余脚本化程度高的部分可以原封不动。
最后一个经常被忽视的经验,是在得到能带图后顺手做一次“有限周期验证”。建一个 8×8 或 10×10 的有限周期阵列,做谐响应或瞬态仿真,把带隙内外的频率分别激励一下,看声波是否真的被阻挡住。这一步虽然比能带计算多花不少时间,但能帮你确认带隙是真实存在的物理效果,而不是周期性边界条件下的人为产物。对做工程应用或者写论文的人来说,有限周期验证都是让结果更有说服力的关键一步。我在实际项目中就把这一步当成标配,模型跑完能带之后,永远跟着一个有限阵列的传输响应。