资讯动态

COMSOL声子晶体能带计算全流程:三角与六角晶格建模实战

发布时间:2026/10/17 1:28:54 来源:尧图企业网站定制
搞振动与噪声方向的人对“声子晶体”这个词都不会陌生。简单说它就是固体版的光子晶体把两种或多种弹性模量、密度差异明显的材料做成周期性排列弹性波在里面传播时会像电子在晶格中那样被“调制”最终在特定频率范围内完全无法传播这就是所谓“弹性波禁带”或者叫带隙。声子晶体能带计算就是这个领域最基础也最关键的一步——你连能带结构都算不准后面的隔振、降噪、波导设计全都没法谈。COMSOL 是算这类问题很顺手的工具但说实话网上教程大多停留在“给你个模型照着点”真正讲清楚为什么这么建模、为什么用这种扫参方式、为什么跑出来一堆零频模态的文章少之又少。尤其做三角晶格triangular lattice与六角晶格honeycomb/hexagonal lattice时一个很容易犯的错是搞错原胞形状和布里渊区高对称点路径结果能带图上该有带隙的地方长满杂散模态还以为是软件的问题。这篇文章我按自己完整跑通的经验写从单元胞几何怎么建、材料参数怎么配到 Bloch-Floquet 周期边界、Γ-M-K-Γ 路径的参数化表达式再到后处理出图最后把几年里踩过的坑汇总成一张排查表。文章默认你用 COMSOL 6.x但 5.4、5.5 的模型树差异不大照着找就能找到对应功能。适合刚接触声子晶体、整天在为论文第一张图发愁的研一新生也适合在工程振动筛选中已经把模型跑得半熟、但不确定结果可不可信的工程师。1. 先搞清楚我们在算什么声子晶体与能带结构1.1 一根杆上的弹簧就是最朴素的声子晶体别被“声子晶体”这四个字吓住它的物理图像比名字朴素得多。想象一根拉紧的绳子上面每隔一段距离拴一个不同质量的小球你把一个脉冲打进去会在某些频率下被弹回来某些频率下能传过去。周期结构对波的这种选择性就是声子晶体的雏形——只不过在真实计算里小球变成了圆柱或方块绳子变成了基体材料周期单元叫做原胞unit cell。周期性带来的本质变化是原本连续介质里波数 k 和频率 ω 的关系是一条直线或几条直线现在因为材料性质在空间里周期调制波数与频率之间展开成一系列能带band。能带与能带之间的频率范围如果没有任何实数波数解就形成禁带band gap。落在禁带里的弹性波或声波无论你怎么激发都只能衰减不能传播——这是隔振降噪、声学隐身、波导分流等几乎所有应用的物理基础。我经常用一个类比帮助学生理解晶格是“滤镜”它把连续频率谱切成一段一段让一部分频率通过通带一部分频率拦下禁带。所谓计算能带结构本质就是求解一个带 Floquet 周期条件的特征值问题。特征频率对应“能带在哪”特征模态对应“波在这个频率上长什么样”。理解到这一层你就知道自己打开 COMSOL 到底在算什么东西后面操作就不会像背菜谱一样盲目。1.2 能带、禁带和布里渊区这三个概念必须同步理解能带结构图横轴是波矢 k纵轴是频率 ω。波矢是波在周期晶格里的“准动量”它只在第一布里渊区First Brillouin Zone, FBZ内有意义超出部分可以通过倒格矢折回。第一布里渊区的形状由晶格决定三角晶格和六角晶格的第一布里渊区都是一个正六边形。因为正六边形具有很高的旋转对称性我们不需要在整个布里渊区上逐点扫波矢只扫“不可约布里渊区”Irreducible Brillouin Zone, IBZ边界就够了。对这两种晶格IBZ 边界就是 Γ-M-K 三条边构成的闭合三角形所以标准的 k 路径写为 Γ-M-K-Γ。注意这三条边扫完基本就能反映整个布里渊区边界的色散情况完整带隙判断严格说还要检查整个 IBZ 边界但对绝大多数设计这三段路径已经能给出可靠的带隙范围和趋势。这里有个新手容易混淆的概念三角晶格和六角晶格在实空间里是不同的但二者在倒空间动量空间都是正六边形的布里渊区所以扫参路径长得一模一样。区别只在于同一个原胞里放了一个散射体还是两个散射体。这个区别会直接在能带图上暴露出来——六角蜂窝原胞因含两个散射体其振动模态在 K 点附近的色散行为与三角晶格明显不同。你把这一点理解到位后面处理 k 路径表达式时就知道为什么很多模板能用同一个扫参代码。1.3 为什么偏偏选三角晶格和六角晶格为什么这里专门拿三角晶格和六角晶格举例两个原因。第一个是实用原因这两种晶格在声子晶体文献里出现频率极高。把圆柱散射体按等边三角形的网格排列就得到三角晶格把两种位置的圆柱错落放置就得到蜂窝六角晶格。三角晶格因为周期单元小、散射体排布紧凑通常是实现最宽完整带隙的“性价比”选择蜂窝晶格则因为含双散射体、晶格对称性降低在近些年热门的狄拉克锥、谷输运、声学拓扑绝缘体里大放异彩。第二个是教学原因这两种晶格都属于同一套“六方倒格子”体系它们的能带计算流程高度相似——同样的菱形原胞、同样的正六边形布里渊区、同样的 Γ-M-K-Γ 路径。一个单元胞里是一个圆柱还是两个圆柱区别只在几何绘制和材料分配。也就是说你只要把三角晶格的模型真的跑通一次六角晶格基本就是“改几何 改网格”的事。这种可迁移性比做正方晶格能学到的东西多得多。有一点我必须提醒正六边形布里渊区对应的是“六次对称”晶格而不是说六角晶格一定只有一个散射体。网上很多文章把 triangular lattice 直接叫成“六角晶格”把 honeycomb lattice 也叫“六角晶格”导致新手以为它们是同一个东西实则是两个概念。后面章节我会严格区分本文的“三角晶格”指每个原胞一个散射体的三角布拉维晶格“六角晶格蜂窝”指每原胞两个散射体、石墨烯式排布的六角蜂窝晶格。建模时务必区分清楚否则原胞里面数散射体数错了能带图怎么都对不上。2. 建模第一步单元胞几何与材料2.1 三角晶格的菱形原胞怎么画用 COMSOL 画三角晶格最稳妥的方式不是直接画一个大三角阵列而是画一个“菱形原胞”。这个菱形就是三角布拉维晶格的最小周期单元边长等于晶格常数 a夹角是 60°/120°。两个晶格基矢量取 a1(a,0)a2(a/2, √3 a/2)菱形四个顶点依次为 (0,0)、(a,0)、(3a/2, √3 a/2)、(a/2, √3 a/2)。在二维几何里用“Polygon”多边形节点按这四个顶点逆时针连起来即可。散射体圆柱画一个圆圆心放在菱形中心 (3a/4, √3 a/4) 最省事因为这样它在四个顶角处不会产生半个圆的悬空部分网格生成更干净。当然你也可以把圆心放在 (0,0)这样圆会被周期边界切成四份COMSOL 照样能算只是网格和视图看起来没那么舒服。实测下来圆心放中心模型更稳。晶格常数 a 和散射体半径 r 的关系直接决定带隙的位置和宽度。经典的铅/环氧体系中r/a≈0.35~0.4 时第一完全带隙通常最宽r/a 太小散射太弱带隙基本关闭r/a 太大散射体之间太近网格容易退化。建议第一次算的时候设 a1 mm、r0.35a把几何量都固定下来再谈其他。2.2 六角晶格蜂窝是“两个原子”的原胞六角蜂窝原胞的晶格基矢量跟三角晶格一模一样依然是 a1(a,0)、a2(a/2,√3 a/2)但原胞里要放两个散射体分别放在 A 位和 B 位。最常用的取法是 A 位在 (0,0)B 位在 (a1a2)/3也就是笛卡尔坐标 (a/2, √3 a/6)。如果你让 A 位在菱形中心B 位相对中心偏移 (a1a2)/3几何上也是一样的只要保证两个散射体之间的相对位移是 (a1a2)/3周期条件就不会出问题。两个散射体的半径可以相同也可以不同。半径相同且材料相同时结构具有石墨烯式的 C6 对称性在 K 点附近会出现狄拉克锥如果两个散射体半径或材料不对称对称性降到 C3狄拉克锥会打开成带隙这是声学拓扑结构设计最基本的手段之一。第一次建模我建议先把两个散射体改成相同跑一遍看能带图有没有明显的“X 形”交叉再改其中一个半径观察带隙如何张开关闭——这个练习能让你对能带结构跟对称性的关系有很直观的认识。画六角原胞和画三角原胞的区别仅仅在于“圆的数量、圆心位置”和“材料分配”。菱形外框完全不变周期边界完全不变扫参设置完全不变。这也是我前面强调可迁移性的原因真正的模型差异只在几何节点里多了两个圆、材料节点里多了一个域选择。2.3 材料参数怎么选铅/环氧的经典组合声子晶体的核心条件是散射体与基体之间存在足够的“阻抗失配”说白了就是刚度和密度差异要大。文献里最经典的组合是铅圆柱嵌在环氧树脂基体里铅重而软环氧轻而有一定刚度两者声速差一个量级散射强烈带隙很容易打开。常用材料参数表各向同性线弹性材料弹性模量 E (GPa)泊松比 ν密度 ρ (kg/m³)横波波速估算 (m/s)铅40.80.3711340约 720环氧树脂4.350.371180约 1100钢2100.307850约 3200铝700.332700约 3140横波波速 c_s sqrt(E/(2ρ(1ν)))。带隙的中心频率粗略估计是 f ≈ c_s/a。所以当 a1 mm、取环氧的 c_s≈1100 m/s 时第一带隙大约在几百 kHz 量级。这个估算非常有用你设特征频率搜索范围时如果知道大概频率量级就不会傻乎乎地从 0 开始搜白白引入一堆刚体模态。后面求解器设置我会再讲。材料数据在 COMSOL 里从“Materials”节点添加选“内置材料库”或手动输入都可以。有一点要特别提醒几何尺寸用毫米还是米直接决定频率结果。COMSOL 默认是国际单位制如果你按 mm 画图就把它当成以米为单位的数值来处理——也就是说 1 mm 的边就输入 0.001而不是输入 1。很多人画图图省事输入 1然后发现特征频率差了一千倍回来排查半天。你也可以在设置里把“Geometry”的“Scale”统一换算但我个人还是习惯老老实实按米输入模型树里一眼能看出来不容易出错。2.4 三个几何细节参数、布尔与圆边界写几何前先在“全局定义 → 参数”里把 a、r、A 位、B 位坐标都定义成参数后面改参数扫参时就不用动几何。比如定义a0.001[m]、r0.35*a、xA0、yA0、xBa/2、yBa*sqrt(3)/6。COMSOL 参数支持带单位的表达式非常方便。第二个细节是布尔操作。如果你用圆去“减掉”基体的一部分或者让两个散射体重叠建模方式会不同声子晶体常见做法是基体菱形域 插入圆域三个域在“Form Union”时自动合并成一个大域域编号里可以分别识别基体、散射体 A、散射体 B。合并后材料分配按“域号”选择即可。如果圆和基体边缘相切或相交得很厉害Form Union 可能会报“几何退化”这时先检查 r 是否过大。第三个细节是网格源。菱形原胞的对角线夹角是 60°直接自由三角形网格没问题但如果你在后面要研究散射体大小的影响网格必须跟着圆边界变化所以要给圆边界设置“尺寸”属性让网格最大尺寸绑定到 r 的表达式上。这个我会在第 4 章细讲。3. 物理场、周期边界与求解器设置3.1 选“固体力学”还是“压力声学”算声子晶体能带第一步选模块。如果你关心的是弹性波在固体里的传播比如铅/环氧、钢/橡胶、地层隔振选“固体力学Solid Mechanics”二维模型默认用平面应力但体波/面内弹性波更适合平面应变假设。你可以直接在“线弹性材料Linear Elastic Material”节点里把默认模型改为“平面应变Plane strain”。如果研究对象是水或空气背景里的刚性柱/弹性柱比如水下声学超材料、消音器里的周期声学结构那选“压力声学Pressure Acoustics”更合适把每个周期单元里的流体声场用 Floquet 条件处理。压力声学比固体力学少一个矢量自由度算得快很多但只能描述声波、不能描述剪切波。你在各高校论文里看到的“声子晶体”有些其实是二维声学晶格acoustic crystal要用对模块不然算出来的带隙物理含义都变了。本文后面以“固体力学 平面应变 铅/环氧”为主线展开如果做声学晶体只需要把物理场换成压力声学、去掉材料分配那步其余周期边界和扫参逻辑完全通用。3.2 Bloch-Floquet 周期条件一句话讲透能带计算的核心边界条件就是 Floquet 周期条件。简单说一个周期结构里相邻原胞的位移场不是完全相同的周期重复而是多了一个相位因子的“周期调制”u(ra_j) u(r)·exp(-i k·a_j)。这个相位由波矢 k 决定。当 k0 时退化为普通周期条件k 从 Γ 点沿边界走相位逐渐变化就得到一条条能带。COMSOL 里加这个条件的位置物理场节点下“周期性Periodic Condition”。方法是把原胞的两组相对边界配对左边右边是一组下边上边是另一组注意定出源边界 Source 和目标边界 Destination。在“周期性”设置里选“Floquet 周期”再输入 k 矢量分量 kx、ky单位 rad/m。因为 k 要在整个 Γ-M-K-Γ 路径上扫描所以 kx、ky 不能写死要写成全局参数 q 的函数。COMSOL 在“参数”里支持 if 嵌套表达式。这也是新手最容易出问题的地方下一小节专门展开。3.3 特征频率研究模态数、搜索基准、参扫方式能带计算的求解本质是给定一个 k求解特征值方程得到该 k 对应的本征频率。COMSOL 的“特征频率Eigenfrequency”研究步正是干这个的。你需要设置三个东西需要的特征频率个数、搜索中心频率、以及是否做参数化扫描。个数一般设 10~20 个。太少高频截止不够带隙看不完整太多计算量和内存翻倍尤其做参数扫描时非常拖节奏。搜索中心频率是关键默认在 0 附近搜索会找出一堆刚体模态和低频杂散模态建议用前面材料表粗估的 c_s/a 作为搜索中心比如 1e6 Hz 量级。COMSOL 6.x 中在“特征频率”研究步的设置项里把“搜索特征频率在……附近”改成手动输入一个正频率比如“5e5”。参数扫描要用“参数化扫描Parametric Sweep”节点包裹特征频率研究扫描变量就是 q。每次求解器会对每一个 q 独立算特征值然后整套结果存在一个“解数据集”里后处理时可以一次性提取全部能带。扫描步长用 Δq0.02~0.05 通常足够画图平滑如果只想看趋势0.1 也够算完再局部加密。3.4 Γ-M-K-Γ 高对称路径与参数表达式把上面的 q 定义为 0~3 的标量模拟路径长度q∈[0,1] 走 Γ→Mq∈[1,2] 走 M→Kq∈[2,3] 走 K→Γ。为了避免写错最稳妥的方式是先用倒格子基坐标 k1、k2再换算成直角坐标 kx、ky。对 a1(a,0)、a2(a/2,√3a/2) 的三角基倒格子基 b1(2π/a)(1,-1/√3)、b2(2π/a)(0,2/√3)任意波矢 k k1·b1 k2·b2。各段路径上 k1、k2 的表达式Γ(0,0) → M(0.5,0)M(0.5,0) → K(1/3,1/3)K(1/3,1/3) → Γ(0,0)。写成单参数 q 的分段函数k1 if(q1, q/2, if(q2, 0.5-(q-1)/6, (3-q)/3)) k2 if(q1, 0, if(q2, (q-1)/3, (3-q)/3))再定义直角坐标分量kx 2*pi/a * k1 ky 2*pi/a * (-k1/sqrt(3) 2*k2/sqrt(3))然后周期边界里填 kx 和 ky 这两个表达式。这里有个等价简化因为 Floquet 条件只要求 k 在相邻原胞间的相位差你用 k1、k2 本身其实也能通过“在 x、y 方向上的投影”实现但直接用上式最不易出错。我当年就是嫌麻烦直接把 kx0.5*q 之类写死结果到 M-K 段整段路径算出来的能带图完全不对白白跑了两天。提示上面表达式里的if是 COMSOL 支持的分段函数写法逻辑是“条件成立取前者否则取后者”嵌套两层就能覆盖三个路径段。每个路径段的表达式在边界处连续数学上没问题如果扫参时某些点求解失败优先检查 q 是否超出了 [0,3] 范围。4. 实操从新建模型到能带图4.1 2D 模型向导与几何绘制打开 COMSOLModel Wizard选择二维2D→ 固体力学 → 特征频率研究。然后在全局定义里把 a、r、坐标、q 等参数全部定义好。几何用 Polygon 画菱形再用 Circle 画一个或两个圆圆心坐标用 xA、yA、xB、yB 表达式代入。最后“Form Union”合并。建议给每个域起一个容易辨认的名字比如“matrix”“scatterer_A”“scatterer_B”这样第 2 章的材料分配不会选错域。COMSOL 里对几何实体按“域 1、域 2”编号也可以右键节点重命名。实际上在“选择”那里可以通过“物理域”标签把命名写到选择表达式上简单的做法是记住域号材料节点里逐个选。4.2 网格划分与收敛性网格划分对特征频率结果的影响很大。经验法则是每个最小波长至少要有 6~8 个网格单元但在还没算出频率前我们不知道最小波长所以常用做法是在“自由三角形网格”里设一个全局“最大单元尺寸”为 a/15 或 a/20同时给散射体圆周加一个“尺寸”节点让圆周附近更细。第一次算完用 a/20 和 a/30 各跑一遍如果前几条能带频率差异在 1% 以内说明网格收敛了如果差异明显加密网格重算。网格收敛性检查花的时间不多但能挽救你论文里全部结果的可信度我强烈建议养成习惯。另一个网格技巧是把圆边界的网格“单元数”固定比如圆周方向固定 60~80 个单元再配合全局尺寸能避免不同半径参数下网格形态跳变这对参数化研究非常重要——否则你扫 r 的时候能带图的细微抖动不一定是物理的而是网格在变。4.3 周期边界与扫参求解物理场节点下添加“周期性”选两组相对边界左侧、右侧一组下侧、上侧一组类型设为“Floquet”输入 kx、ky 表达式。注意 COMSOL 会要求你指定“源边界”和“目标边界”并且确保两个边界的网格划分拓扑一致——最稳妥的是在网格节点里加“复制面Copy Face”操作把源边界的网格复制到目标边界上。这一点很容易被忽略你周期条件设了、扫参设了但两侧边界节点不匹配求解器会报“损坏的网格”或者莫名其妙地少很多模态。然后添加“参数化扫描Parametric Sweep”参数选 q值给 range(0,0.02,3)把特征频率研究拖进去。求解器里如果遇到内存不够可以把“特征频率搜索”改成“区域”并限制搜索中心频率范围求解器用默认 PARDISO 或 MUMPS 都行我测试大量小模型用 PARDISO 稳定性更好。4.4 后处理画能带曲线求解完成后派生值或 1D 绘图都能提取能带。我最常用的做法新建“一维绘图组1D Plot Group”数据集选择全部解x 轴数据选“表达式 q”y 轴选“freq”频率单位 Hz添加“全局”绘图选择求解结果中的所有特征频率。这样每一组 q 值得到一个频率点阵散点图看起来就是一条条能带。如果要让每个模态分支用不同颜色可以在“着色方式”里按解或特征频率编号来区分。更漂亮的能带图我一般把 COMSOL 的结果用“表格”导出成 txt/csv再丢到 Origin 或 Python Matplotlib 里画横轴换成三段路径的累计长度或直接标注 Γ、M、K、Γ 刻度纵轴换成归一化频率 fa/c。COMSOL 里也能做但批量标注高对称点坐标很麻烦外部绘图更灵活。导出时注意把 q 和 freq 两列都选上别漏。提示能带图里的频率可以是特征频率的实部表示若出现复频率说明该波矢点上存在衰减模态。实际出现“负频率”或“零频点”时多半是刚体模态或后处理没剔除别急着纳入能带。5. 常见问题与排查技巧实录5.1 零频刚体模态为什么扎堆现象扫参结果里第一二条“能带”横在 0 Hz 附近数值小到可以忽略而且模态形态是整个原胞平移。原因无外部约束的弹性体存在刚体位移零特征值k0 时 Floquet 退化为周期边界刚体模态保留。解决办法不是加约束加了就改动了物理模型而是后处理时剔除频率小于某个阈值的模态或在求解器里把“搜索中心频率”设在物理频率附近让低阶噪声移出关注范围。我建议在“特征频率”设置中多要一两个冗余模态剔除掉 0 附近的剩下的用起来更从容。5.2 高频能带飘、模态缺失怎么办现象低频能带很光滑高频能带发生波浪起伏、数值发散或者相邻 q 点间跳了一大截。原因基本是网格不够细加上高频模态的局域波长短需要更多网格单元。对策把全局最大单元尺寸从 a/15 缩到 a/25 甚至 a/30或者在散射体边界和基质界面加局部细化。另外一个隐蔽原因是“搜索中心频率”设置得太低求解器在高频段丢失特征值。COMSOL 在固定“所需模态数”下低频模态容易全找到高频模态可能漏这时可以适当增多所需模态数或把搜索中心调高半量级。还有一点当能带交叉时后处理连线会“跳支”——不同模态在交点处互相连续画成折线看起来是穿错了。解决办法是导出去外部绘图按“特征频率编号”逐条画线再人工整理或者在 COMSOL 里用“按频率排序”而不是“按模态编号排序”。5.3 扫参计算太慢的提速办法完整 Γ-M-K-Γ 路径步长 0.02意味着约 150 个 q 点 × 12 个模态算起来确实要几分钟到半小时。提速办法先用粗扫描 q 步长 0.1 摸清趋势确认带隙大致范围后再对禁区附近局部加密减少模态数到 8~10如果你只关心最低几支带在“网格操作”里开启“复制面”避免重复划分在“研究”设置里关闭“生成默认绘图”省掉后处理占用内存。COMSOL 求解器并行线程数也可以调实测性能好的机器开满多线程150 点的小模型通常在十分钟以内。5.4 别急着信带隙验证带隙的两种手段能带图上出现一条频率范围横跨整个路径而没有任何能带穿过这就是候选带隙。但我吃过亏只沿 Γ-M-K 边界扫和完整布里渊区内部模态对不上表面上看起来的带隙其实被内部模态“填满”。所以严格的完整带隙应当检查整个 IBZ 内部或至少增加几组内部点而不仅仅边界。另一种更工程化的验证是直接建一个有限大比如 5×5 或 8×8周期的真实结构在一侧加边界载荷另一侧做频率扫描透射谱看带隙频率是否确实大幅衰减。透射验证虽然多花一点建模时间但能让你论文里的带隙结论站得住脚。我在投稿时多次被审稿人要求补充这类验证现在都是顺手就把两种手段都做出来。5.5 问题排查速查表现象最常见原因处理办法零频附近一簇扁带k0 刚体模态搜索中心上移、后处理剔除高频带抖动、不收敛网格偏粗加密网格、局部细化、收敛性检查能带在交叉点“跳支”特征值按模态编号排序外部按频率排序连线扫到某 q 点求解失败参数超出 [0,3]、表达式不连续检查 if 表达式、检查 q 范围边界节点不匹配报错周期边界两侧网格不一致加“复制面”网格操作频率量级完全不对单位搞错mm 当 m 输统一用 SI 且按米输入几何带隙看起来很大但透射验证无禁带只沿边界扫内部模态穿越检查 IBZ 内部、透射谱验证按我个人的习惯每次跑完声子晶体能带我都会多看两个地方一是 Γ 点附近的低频支和第一条带隙上下边界的模态形态二是在交叉点附近加密 q 步长看是否真的有交叉。前者能帮你判断带隙的成因是布拉格散射还是局域共振后者能避免把数值靠近当成模态劈裂。另外一个小技巧把归一化频率 fa/c 作为默认输出单位换晶格常数时可以直接复用整套结论。你把这套流程跑通了三角、六角晶格之间真的就只是“多画一个圆”的差别祝早日跑出自己的第一条漂亮能带。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑