中文

分子动力学入门:你的第一个LAMMPS模拟

什么是分子动力学

MD通过在每个时间步求解牛顿运动方程(F=ma)来模拟原子运动。给定了初始位置、速度和力场(势能函数),MD预测系统如何随时间演化。

对于生物材料研究,MD可以回答:

  • 胶原微纤维的杨氏模量是多少?
  • 水分子如何与丝素蛋白表面相互作用?
  • 蛋白质在拉伸载荷下会发生什么?

安装LAMMPS

LAMMPS来自Sandia国家实验室,是最广泛应用的开源MD代码。

方法一:预编译二进制(推荐新手)


sudo apt install lammps        # Linux (Ubuntu/Debian)
brew install lammps             # macOS
# Windows: https://packages.lammps.org/windows.html

方法二:Conda(跨平台)


conda create -n lammps -c conda-forge lammps -y
conda activate lammps

验证安装:


lmp_serial -h

LAMMPS输入脚本结构

一个LAMMPS输入文件有四个基本部分:


# 1. 初始化
units           real        # 能量: kcal/mol, 距离: 埃
atom_style      full        # 原子带电荷、分子ID
boundary        p p p       # 所有方向周期性边界

# 2. 系统设置
region          box block 0 30 0 30 0 30
create_box      2 box       # 2种原子类型
create_atoms    1 random 500 12345 box

# 3. 力场
pair_style      lj/cut 10.0
pair_coeff      1 1 0.155 3.166  # O-O LJ参数

# 4. 运行
velocity        all create 300.0 12345
fix             nvt all nvt temp 300.0 300.0 100.0
thermo          100
dump            traj all custom 100 dump.lammpstrj id type x y z
run             10000

第一个模拟:水盒子

用TIP3P模型模拟500个水分子在室温下:


# water.lammps
units           real; atom_style      full
bond_style      harmonic; angle_style     harmonic

read_data       water_box.data
pair_style      lj/cut/coul/long 10.0 10.0
kspace_style    pppm 1e-5

minimize        1e-4 1e-6 1000 10000     # 能量最小化
velocity        all create 300.0 12345
fix             nvt all nvt temp 300.0 300.0 100.0
run             50000                     # NVT平衡
fix             npt all npt temp 300.0 300.0 100.0 iso 1.0 1.0 1000.0
run             100000                    # NPT生产

关键参数

参数含义典型值
--------------------
timestep积分步长1.0-2.0 fs
cutoff非键作用截断距离10-12 埃
temperature系统温度300 K(室温)
NVT恒粒子数/体积/温度平衡阶段
NPT恒粒子数/压力/温度生产阶段

常用力场

力场适用参考文献
---------------------
OPLS-AA蛋白质、有机分子Jorgensen (1996)
CHARMM36蛋白质、核酸Best (2012)
AMBER ff19SB蛋白质Tian (2020)
ReaxFF反应体系、断键van Duin (2001)
Martini粗粒化生物分子Marrink (2007)

轨迹分析


import MDAnalysis as mda
from MDAnalysis.analysis import rdf

u = mda.Universe("water_box.data", "dump.lammpstrj")
oxygen = u.select_atoms("type O")
rdf_oo = rdf.InterRDF(oxygen, oxygen, nbins=200, range=(0, 10.0))
rdf_oo.run()

常见问题

问题解决
------------
"Lost atoms"错误减小timestep或增大neighbor list skin
能量不收敛更长最小化或用更软的初始条件
模拟太慢用GPU(Kokkos)或更粗的力场

参考资料

💬 Questions or Feedback?

This blog is actively maintained by a PhD researcher. Reach out on GitHub for collaborations or corrections.

View on GitHub