我先把话说在前头:这个项目名字听起来挺唬人,但本质上就是一件事,把一维光子晶体在给定晶格参数下的能带结构算出来,再沿着布里渊区扫描得到布洛赫本征态,最后用 Wilson 线的思路把每一条能带的 Zak 相位积分出来。整个过程最难的不是 COMSOL 建模,也不是 Matlab 写公式,而是两个软件之间的数据衔接、相位规范处理,以及能带交叉时的模式追踪。我做完这一整套之后最大的感受是:物理上没多难,工程上全是细节。
这篇文章我会把这趟从 mph 文件到 Matlab 脚本的完整路径写清楚,包括 COMSOL 怎么设置 Floquet 边界条件、怎么把每个 k 点的本征场和坐标导出来,再讲 Matlab 端怎么离散化算 Zak 相,最后把我在实际跑数据时踩过的一组坑整理成排查清单。适合刚接触光子晶体拓扑计算的研究生,也适合做超材料或声学系统、光学微腔计算的人参考。算 Zak 相这件事,原理公式十行就能写完,但只要你漏掉一个周期性规范,结果就会差出一个 π,整个过程就是这么敏感。
1. 从 Berry 相到 Zak 相:到底在算什么,以及为什么必须 COMSOL 加 Matlab 双人搭档
1.1 先花三分钟把 Zak 相的定义彻底捋清楚
先说物理背景。Zak 相本质上是 Berry 相在周期性体系里的特殊形态,它描述的是布洛赫波函数绕完整个布里渊区一圈后,累积的几何相位。具体定义大家都很熟悉:
[
\theta_n = i \int_{-\pi/a}^{\pi/a} \langle u_{nk} | \partial_k u_{nk} \rangle , dk
]
这里的 (u_{nk}) 是布洛赫模的周期部分,也就是满足 (u_{nk}(x+a)=u_{nk}(x)) 的那个函数,(n) 是能带序号。很多入门资料会告诉你 Zak 相只有 0 和 π 两个取值,前提是体系具有空间反演对称性。一旦体系失去了某个关键对称元素,Zak 相就会变成任意的连续值。一维光子晶体里最常见的讨论对象是 0 相和 π 相的交替,这决定了能带边缘是“有效电介质型”还是“表面阻抗型”,进而影响界面态是否存在。
在数值计算里,我们通常不会直接对 (k) 做解析积分,而是把整个布里渊区离散成 (N) 个点 (k_1, k_2, \ldots, k_N),然后使用 Wilson 型离散公式:
[
\theta_n = -\sum_{i=1}^{N-1} \arg\langle u_{n}(k_i) | u_{n}(k_{i+1}) \rangle
]
离散化的时候有一个隐含前提是相邻两点之间的相位差足够小,不能跳过一个 2π。如果布点太疏,内积相位接近 ±π,这时 unwrap 和累加都会出问题。这条公式看起来很朴素,但它在数值实现时对应着一整套操作:在 COMSOL 里把布洛赫函数算出来,然后把它们拿到 Matlab 里做高维内积,再沿着 k 路径累加相位。
1.2 一维光子晶体:验证和展示 Zak 相的天选体系
为什么这个题目要落在“一维”上,而不是二维三维?因为一维体系结构最简单,能带基本上是二维可视化,Floquet 边界条件也只有一个方向的波矢分量要扫。一维光子晶体就是两种折射率材料交替周期排列,原胞里厚度分别记作 (d_A) 和 (d_B),晶格常数 (a=d_A+d_B)。只要给定折射率比和占空比,就能算出前几条能带。
光子晶体的本征方程和 Schrödinger 方程在数学结构上有对应的关系,所以电子能带论里面的 Berry 相、拓扑不变量这些概念都可以平移过来使用。但光子体系直接得到一个额外的便利:不需要考虑费米能级,能带的填充完全由你关注的频率范围决定。这条性质在实验解释时特别舒服——你想研究哪条带,把频率调过去就行。
我在实际建模时用的参数是 (d_A=0.5a)、(d_B=0.5a),材料 A 取折射率 1.0(空气缝隙),材料 B 取折射率 3.5(硅层),晶格常数 (a=1,\mu m)。这样做的好处是计算时间短,归一化频率 (a/\lambda) 的色散图非常漂亮,而且前两条带的 Zak 相恰好有清晰的 0/π 切换,方便对照理论。
1.3 为什么不用纯 COMSOL 一条龙,也不建议纯 Matlab 梭哈
单论画能带,纯 COMSOL 已经能出漂亮的色散曲线。但 Zak 相不是能带图上的直接输出量,它需要你拿到本征函数之后,在连续 k 点之间做内积和相位累加。COMSOL 对特征值和场分布的后处理能力很强,但对这种“跨参数模式追踪 + 相位累积”的专业操作,脚本化程度不够灵活,每次改动规范就要重新搭建一堆节点,效率低。
纯 Matlab 传家宝式手写一维光子晶体也是可行的,画几条色散曲线非常快,严格说也能算 Zak 相。难点在于当你后面想扩展:加入材料损耗、色散介质、非线性材料、或者把 1D 结构改成 2D 波导阵列时,手写代码的成本会迅速失控。COMSOL 负责精确建模和高效求解 PDE,Matlab 负责灵活后处理和相位算法,两者分工是最舒服的搭配。所以我选择了 COMSOL 建模仿真 + Matlab 数值后处理这种混合工作流。mph 文件承担中间交换媒介,Matlab 用 Livelink 直接打开,工程链路很省事。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. COMSOL 端建模:从 mph 文件开始搭一维光子晶体
2.1 几何、材料和求解域设置
打开 COMSOL,组件选择二维空间维度,物理场接口用“波动光学”模块里的“电磁波,频域”,研究类型选择“特征频率”。二维模型意味着整个结
