3. 相场控制方程:Allen-Cahn方程与Cahn-Hilliard方程
好,咱们今天聊聊相场模型里最核心的两个方程。说实话,我刚接触相场那会儿,看到这两个方程就头大——长得像,但物理意义完全不同。后来在项目里踩过几次坑,才真正搞明白它们各自该用在什么场景。
3.1 序参量的物理意义
先说说序参量。这玩意儿说白了,就是描述微观组织状态的“标签”。
举个例子,你在模拟一个晶粒长大过程。每个晶粒内部原子排列有序,晶界处原子排列混乱。那怎么区分晶粒内部和晶界呢?我们引入一个变量 φ,让它等于 1 表示晶粒内部,等于 0 表示晶界区域。这个 φ 就是序参量。
我个人习惯把序参量分成两类:
- 保守序参量:比如浓度场,总质量守恒。Cahn-Hilliard 方程就是处理这类问题的。
- 非保守序参量:比如长程有序度,总量不守恒。Allen-Cahn 方程就是干这个的。
重要概念:序参量不是随便选的。它必须能区分不同的相或不同的晶粒取向。选错了序参量,模拟结果就是一团糟。
我记得有一次,一个学生问我:“老师,我模拟两个晶粒长大,用一个序参量行不行?”我说你想想看,一个序参量只能区分“是”和“否”,两个晶粒怎么区分?至少得两个序参量,一个表示晶粒A,一个表示晶粒B。
3.2 自由能泛函的构建
自由能泛函是整个相场模型的“发动机”。它决定了系统往哪个方向演化。
一般形式是这样的:
F = ∫ [ f(φ) + (κ/2)|∇φ|² ] dV
这里 f(φ) 是局域自由能密度,描述每个点的热力学状态。梯度项 (κ/2)|∇φ|² 描述界面能量,说白了就是界面处序参量变化带来的能量惩罚。
我建议初学者先理解双阱势能函数:
f(φ) = (φ² - 1)²
这个函数有两个最低点,φ = 1 和 φ = -1,分别对应两个稳定相。中间 φ = 0 是势垒,系统要越过这个势垒才能发生相变。
实战经验:我在做镍基高温合金模拟时,发现双阱势的参数对结果特别敏感。κ 值调大,界面变宽;调小,界面变窄。建议先做一维测试,找到合适的参数范围。
3.3 Allen-Cahn 方程
Allen-Cahn 方程描述非保守序参量的演化。它的形式很简单:
∂φ/∂t = -L · (δF/δφ)
其中 L 是迁移率,δF/δφ 是变分导数。这个方程的本质是:序参量沿着自由能下降最快的方向演化。
展开后得到:
∂φ/∂t = -L [ f'(φ) - κ∇²φ ]
你想想看,这个方程里没有守恒项,所以 φ 的总量可以变化。晶粒长大过程中,晶粒内部 φ = 1 的区域会扩大,晶界会移动,这就是 Allen-Cahn 方程在起作用。
避坑指南:我曾经在模拟晶粒粗化时,直接用 Allen-Cahn 方程处理浓度场,结果总质量不守恒,模拟结果完全不对。后来才意识到,浓度场是保守序参量,得用 Cahn-Hilliard 方程。
3.4 Cahn-Hilliard 方程
Cahn-Hilliard 方程处理保守序参量,比如浓度 c:
∂c/∂t = ∇ · [ M ∇ (δF/δc) ]
这里 M 是迁移率矩阵。这个方程的本质是:浓度梯度驱动扩散流,总质量守恒。
展开后:
∂c/∂t = ∇ · [ M ∇ ( f'(c) - κ∇²c ) ]
注意看,这里有个 ∇· 散度算子,这就是质量守恒的数学保证。我刚开始学的时候,总觉得这个方程比 Allen-Cahn 复杂,后来发现其实逻辑很清晰:
- 先算化学势 μ = δF/δc
- 再算扩散流 J = -M∇μ
- 最后算浓度变化 ∂c/∂t = -∇·J
核心区别:Allen-Cahn 方程是“反应主导”,序参量直接响应自由能变化;Cahn-Hilliard 方程是“扩散主导”,通过扩散流实现质量守恒。
3.5 两个方程的选择策略
在实际项目中,怎么选?我总结了一个简单的判断方法:
| 问题类型 | 序参量性质 | 推荐方程 |
|---|---|---|
| 晶粒长大 | 非保守 | Allen-Cahn |
| 相分离 | 保守 | Cahn-Hilliard |
| 马氏体相变 | 非保守 | Allen-Cahn |
| 扩散控制相变 | 保守 | Cahn-Hilliard |
嗯,这里要注意:有时候一个系统同时包含保守和非保守序参量,那就得耦合求解两个方程。我在做多相场模拟时,经常需要同时求解 Allen-Cahn 和 Cahn-Hilliard 方程,那才是真正的挑战。
3.6 数值求解要点
最后说说数值求解。我个人习惯用有限差分法,简单直接:
# 一维 Allen-Cahn 方程显式求解示例
for n in range(Nt):
# 计算拉普拉斯项
laplacian = (phi[2:] - 2*phi[1:-1] + phi[:-2]) / dx**2
# 计算自由能导数
f_prime = 4 * phi[1:-1]**3 - 4 * phi[1:-1]
# 更新序参量
phi[1:-1] += dt * L * (f_prime - kappa * laplacian)
这里有几个坑要注意:
- 时间步长 dt 不能太大,否则数值不稳定。我一般取 dt < dx²/(4Lκ)
- 边界条件要处理好。周期性边界条件最简单,但物理上不一定合理
- 网格尺寸要能分辨界面宽度,一般界面内至少要有 5-8 个网格点
我的习惯:每次跑新模型前,先做一维测试。一维算对了,再扩展到二维、三维。这样能快速发现参数设置问题,避免浪费计算资源。
好了,关于 Allen-Cahn 和 Cahn-Hilliard 方程,今天就聊到这儿。这两个方程是相场模拟的基石,理解了它们,后面的多相场、弹性能耦合等内容就好办了。
公众号:蓝海资料掘金营,微信deep3321