新建
关于经典分子动力学模拟,不可不知的力场知识
bnel1976@163.com
推荐镜像 :Basic Image:bohrium-notebook:2023-04-07
推荐机型 :c2_m4_cpu
赞 7
1
7
目录
关于经典分子动力学模拟,不可不知的力场知识
代码
文本
<
作为一个资深的分子动力学模拟从入门到入土患者 🥹 ,第一次看到Bohrium Notebook的推送,简直瞪大不大的双眼,心想难道破土🌼而出的机会来了?!又因为笔者学过的理论和公式,考完试就还给老师了😂 。所以,本文只涉及牛顿力学和基础的微积分知识,对入门者友好。费曼学习法告诉我们,输出是最好的输入。写一个Notebook倒逼自己输出一下。如果能帮到入门者一点点,那就太好啦~
代码
文本
代码
文本
<
分子动力学为什么能作为强大的工具揭开微观世界的奥秘呢?咱们还得从物理学的祖师爷牛顿聊起。
代码
文本
代码
文本
<
艾萨克·牛顿(Isaac Newton)爵士(尊称牛爵爷),于1687年发表了《自然哲学的数学原理》。这本书多重要呢?牛顿三大运动定律首次在这本书中发表,不仅如此,牛爵爷还在书中天才地论证了地面物体与天体的运动都遵循着相同的自然定律。牛爵爷的传奇故事有很多,咱们重新聊回牛顿运动定律。
代码
文本
<
牛顿运动定律,一言以蔽之,曰:给我初始条件,我就能预测未来。
代码
文本
<
假设一个质量为的粒子,沿轴运动并受某些力的影响。经典力学的任务是确定粒子在任意给定时间的位置:。一旦我们知道了位置信息,就可以由下面的运动学公式计算出速度、动量、动能,或其他感兴趣的动力学变量
代码
文本
<
那么如何预测呢?我们需要应用牛顿第二运动定律,
代码
文本
<
对于保守系统,力可以表示为势能函数的导数。就是这么巧,微观体系(例如原子、分子和粒子)通常被视为保守系统。这是因为在微观尺度下,四种基本相互作用(引力、电磁相互作用力、弱相互作用力、强相互作用力),通常只需要考虑电磁相互作用,而电磁力是保守力。那么现在,力的表达式又可以写为,
代码
文本
<
此时,牛顿第二定律的方程可以写为,
代码
文本
<
现在,给出具体的初始条件和势能函数形式,就可以预测单个质点未来的运动轨迹了。举个弹簧振子例子。代码实现如下:
代码
文本
[6]
import numpy as np
import matplotlib.pyplot as plt
m = 1
k = 1
dt = 0.01
n_step = 1000
v = 0
x = 1
v_vector = np.zeros(n_step)
x_vector = np.zeros(n_step)
for step in range(n_step):
v = v - (dt / 2) * k * x
x = x + dt * v
v = v - (dt / 2) * k * x
v_vector[step] = v
x_vector[step] = x
# 绘制位置和速度随时间变化的图形
time = np.arange(0, n_step) * dt
plt.plot(time, v_vector, label='Velocity')
plt.plot(time, x_vector, label='Position')
plt.xlabel('Time')
plt.grid(True)
plt.legend()
plt.title('Velocity and Position vs. Time')
plt.show()
代码
文本
<
单个质点的运动学和动力学方程可以通过叠加原理推广到质点系。此处省略推广。
代码
文本
代码
文本
<
现在考虑真正的微观世界。联系宏观世界和微观世界的常量是阿伏伽德罗常量(Avogadro constant),它的数值为6.02214076×10²³。后牛顿时代的科学家在牛顿力学的基础上,用概率统计的方法,建立了对由大量粒子组成的宏观物体的物理性质及宏观规律作出微观解释的理论物理学分支,统计力学。分子动力学的本质是统计力学的计算机实现,也被称为“拉普拉斯牛顿力学的展望”,即通过模拟自然力并洞察原子尺度上的分子运动来预测未来。
代码
文本
<
分子动力学来源于一个朴素的想法:从原子尺度对真实世界建模,如果知道原子和分子之间的相互作用的描述,那么设定初始条件后,就可以运用牛顿第二定律更新研究对象的运动轨迹,然后根据统计力学计算出感兴趣的性质,从而解释研究对象。
代码
文本
代码
文本
<
分子动力学模拟涉及的模型和算法如下所示。本文展开讨论势函数/力场模型。
代码
文本
代码
文本
<
Garbage in, garbage out
合理性意味着有效性,但有效性并不意味着合理性
上面的原则同样适用与选取分子动力学模拟的势函数或力场。力场模型的质量直接决定了模拟结果的好坏。
代码
文本
<
首先说明,物理学家习惯将描述多粒子体系中粒子之间相互作用的势能函数称为势函数,化学家称为力场,都是一回事儿。
代码
文本
<
根据叠加原理,多粒子体系总的势能可以写成单个粒子的势能加和,
代码
文本
<
如何表示单个粒子的势能?若只考虑两体相互作用,就是对势,势能函数可以写成以下形式:
代码
文本
<
若考虑三体及以上的相互作用,就是多体势,比如笔者使用过的Tersoff势函数。Tersoff势函数的表达式为:
其中, 是一个截断函数,当 时取值为 1,当 时取值为 0。截断函数为,
排斥函数 和吸引函数 为
键序为
其中,
在以上表达式中,有如下参数: , , , , , , , , , , 。
代码
文本
用python代码实现计算N个原子的总势能,势函数采样Tersoff势函数。
代码
文本
[36]
import numpy as np
def tersoff_pair_potential(R_ij, A, B, lamda, mu, beta, n, c, d, h):
"""
计算Tersoff势函数的成对势函数项。
参数:
R_ij: 原子i和原子j之间的距离
A, B, lamda, mu, beta, n, c, d, h: Tersoff势函数的参数
返回:
potential_energy: 原子i和原子j之间的势能
"""
# 计算截断函数f_C
R = R_ij
S = R + (S_ij - R_ij) * 0.5
f_C = 0.5 * (1 + np.cos(np.pi * (R_ij - R) / (S - R)))
# 计算成对修正函数f_R和f_A
f_R = A * np.exp(-lamda * R_ij)
f_A = B * np.exp(-mu * R_ij)
# 计算键序b_ij
zeta_ij = 0.0
for k in range(N):
if k != i:
R_ik = np.linalg.norm(positions[i] - positions[k])
g_ijk = 1 + c**2 / d**2 - c**2 / (d**2 + (h - np.cos(theta(positions[i], positions[j], positions[k])))**2)
zeta_ij += f_C * g_ijk # 直接使用f_C的值而不是调用它
b_ij = (1 + beta**n * zeta_ij**n)**(-1.0/(2*n))
# 计算势能
potential_energy = 0.5 * f_C * (f_R - b_ij * f_A)
return np.sum(potential_energy)
def theta(v1, v2, v3):
"""
计算角度theta(v1, v2, v3)。
"""
v1_v2 = v1 - v2
v3_v2 = v3 - v2
norm_v1_v2 = np.linalg.norm(v1_v2)
norm_v3_v2 = np.linalg.norm(v3_v2)
# 如果任意一个向量的模为零,则直接返回角度为零
if norm_v1_v2 == 0.0 or norm_v3_v2 == 0.0:
return 0.0
cos_theta = np.dot(v1_v2, v3_v2) / (norm_v1_v2 * norm_v3_v2)
# 添加一个容差,避免除以零的情况
cos_theta = np.clip(cos_theta, -1.0, 1.0)
return np.arccos(cos_theta)
# 示例用法
N = 3 # 假设有3个原子
positions = np.array([[0, 0, 0], [1, 0, 0], [0, 1, 0]]) # 原子的位置,每个原子的坐标为一个行向量
A = 1.0
B = 2.0
lamda = 0.1
mu = 0.2
beta = 1.0
n = 1.0
c = 1.0
d = 1.0
h = 1.0
S_ij = 3.0
total_potential_energy = 0.0
for i in range(N):
for j in range(N):
if i != j:
R_ij = np.linalg.norm(positions[i] - positions[j])
total_potential_energy += tersoff_pair_potential(R_ij, A, B, lamda, mu, beta, n, c, d, h)
print("总势能:", total_potential_energy)
总势能: 0.010368968896777964
代码
文本
<
力场通常用来描述分子体系。分子力学中的势能包括键合项,用于描述由共价键连接的原子间的相互作用,以及非键合项(也称为非共价项),用于描述长程静电和范德华力。
代码
文本
<
其中,共价和非共价贡献的组成部分由以下求和式给出。
代码
文本
<
不同的力场模型对于分子力场的每一项的表达式略有不同。下面举一个描述键相互作用的典型模型。
代码
文本
代码
文本
<
这个化学键模型假设化学键的振动满足胡克定律,弹簧振子模型又出现了。它的图像如下图所示。
代码
文本
<
根据不同的分类标准,可以有不同的力场分类。力场的分类如下图所示,图中没有完全枚举所有的力场模型,读者可以继续补充。
代码
文本
<
力场的选择通常需要以下问题:
- 所研究体系包含哪些相互作用
- 研究的体系的空间尺度
- 研究的问题的时间尺度
- 是否考虑极化、量子效应
- 是否发生化学反应
通常,多体势模型比对势模型准确,反应力场比分子力场准确,但是同时,也更消耗资金和时间,需要综合考虑准确和效率问题。
代码
文本
<
关于分子体系力场如何选择可以参考李继存老师的博文博文链接。
这是一个经典势函数库链接Interatomic Potentials。
代码
文本
<
对于做应用的科研人员来说,通常找力场的流程是:
1. 在文献中寻找相似的体系使用的力场;
2. 验证该力场是否适用于自己的课题;
3. 如果适合,开始课题研究;
4. 如果不适合,改进找到的力场(比较难);
5. 没有找到力场,开发新力场(巨难且耗时)。
代码
文本
<
经验力场本来的劣势,
- 可转移性差 当势项的函数形式变化时,来自一个原子间势函数的参数通常不能与另一原子间势函数一起使用。
- 精度不够 大多数力场依靠点电荷来重现分子周围的静电势,这种模型对各向异性电荷分布效果描述较差
代码
文本
对于找不到合适的力场,或者研究体系和问题正好落在经验势函数的劣势打击范围的情况,可以说,天下苦无合适的力场久矣。
代码
文本
传统力场 | 机器学习力场(ML-FF) | |
---|---|---|
定义 | 通过参数化固定的能量近似值描述分子体系 | 通过机器学习算法从高精度计算数据中学习原子能量和相互作用 |
目标 | 快速计算,适用于大尺寸系统和长时间尺度模拟 | 克服从头算法的系统尺寸限制,实现高准确性的原子级模拟,尤其在复杂系统和长时间尺度下表现优异 |
训练数据 | 不需要高精度计算数据,依赖于经验参数化 | 需要高精度DFT等数据来训练,确保可靠ML-FF在特定系统和应用中的准确性 |
特征工程 | 不涉及特征工程,使用固定的近似函数 | 将原子环境转化为通用描述符(特征),用于机器学习算法输入 |
优势 | 计算效率高,适用于大规模模拟 | 克服从头算法的限制,提供高准确性的原子级模拟,尤其在长时间尺度和复杂系统下表现优异 |
应用广泛,适合多个领域 | 可模拟高精度且较长时间尺度的动态过程,如扩散、晶化、沉积等 | |
快速生成和优化不同真实输入结构,减少昂贵计算数量,提高结构参数处理吞吐量 |
代码
文本
<
DeePMD-kit(Deep Potential Molecular Dynamics kit)是一个用于分子动力学模拟的开源软件包,它基于深度学习技术,用于构建和训练深度势能模型(Deep Potential)。
DeePMD-kit 的主要目标是通过使用深度神经网络来学习原子系统的势能面,并在分子动力学模拟中应用这些学习到的势能模型,以加速分子模拟的速度。相对于传统的计算量子化学方法,使用深度势能模型可以显著减少模拟的计算成本,从而允许更大规模、更复杂的分子系统进行模拟研究。
深度势能模型本质上是多体势模型,使用DeePMD-kit训练深度势能模型的流程如下图所示。
代码
文本
<
训练深度势能模型的开源工具包DeePMD-kit的出现,使以前很多没有合适的工具进行模拟的研究问题变为了可能。
代码
文本
<
探索案例见DeepModeling社区的文献。未来探索者可以在此页面初步分析研究的问题是否可以使用深度势能模型解决。
代码
文本
<
笔者看来,AI for 分子动力学模拟未来的趋势:
- 覆盖元素周期表的大模型
- 更好的机器学习模型
代码
文本
参考
- https://github.com/brucefan1983/Molecular-Dynamics-Simulation/
- https://en.wikipedia.org/wiki/Force_field
- Han Wang, Linfeng Zhang, Jiequn Han, and Weinan E. DeePMD-kit: A deep learning package for many-body potential energy representation and molecular dynamics. Comput. Phys. Comm., 228:178–184, 2018. doi:10.1016/j.cpc.2018.03.016.
- 哥伦布训练营——DeePMD-kit的原理介绍
代码
文本
已赞7
本文被以下合集收录
DeepMD-kit与lammps
bohrb27761
更新于 2024-06-19
13 篇3 人关注
MD
bohr61096f
更新于 2024-08-27
47 篇0 人关注
推荐阅读
公开
ML4CFD | 计算流体动力学中的机器学习JiaweiMiao
发布于 2023-09-16
2 赞
公开
宋璐-第11天-DP-Learn
宋璐
发布于 2023-12-20