分子动力学模拟基础

做分子动力学模拟,说白了就是让原子在力场里“跑”起来。你想想看,我们得先告诉软件:原子长什么样?它们之间怎么相互作用?初始位置在哪?然后才能一步步能量最小化、平衡、生产。这一套流程看起来琐碎,但每一步错一点,后面全白干。我刚开始接触GROMACS时,就因为拓扑文件写错了一个电荷,跑了三天发现体系爆炸了……嗯,从那以后我再也不敢跳过检查步骤了。

力场 - 模拟的“物理规则”

力场定义了原子间的相互作用势能。没有力场,你就是在瞎跑。常见的力场有OPLS、CHARMM、AMBER等,各有各的适用场景。我个人习惯用CHARMM36做蛋白质模拟,OPLS做小分子配体。

力场通常包含这几类参数:

  • 键伸缩(Bond stretch)
  • 角弯曲(Angle bend)
  • 二面角旋转(Dihedral torsion)
  • 非键相互作用:范德华(Lennard-Jones)和静电(库仑)

每个原子被分配一个“原子类型”,力场文件里记录了这些类型的参数。GROMACS用.itp文件存放力场定义,顶层的forcefield.itp会包含所有类型。我曾遇到过一个问题:用OPLS跑小分子,结果电荷参数和实验数据对不上。后来发现是原子类型选错了,把sp2碳当成了sp3。

关键点:力场的选择必须和实验条件匹配。水模型也要一致——比如TIP3P配合CHARMM36,SPC/E配合OPLS。

拓扑文件 - 分子的“身份证”

拓扑文件描述了分子内部连接关系、原子质量、电荷和成键信息。GROMACS通常使用.top作为主拓扑,其中#include嵌入多个.itp片段。我个人建议将每个分子的拓扑单独写成一个.itp,方便复用。

一个典型的.top文件结构如下:

; 体系拓扑文件 example.top
#include "ffGROMACS53a6.ff/forcefield.itp"
#include "protein.itp"
#include "ligand.itp"
#include "solvent.itp"

[ system ]
Protein-Ligand Complex in Water

[ molecules ]
Protein         1
Ligand          1
SOL             12345
NA              15
CL              12

注意看[ molecules ]部分,它告诉GROMACS体系中每个分子拷贝数。写错了会导致原子数不匹配。我记得有一次,我跑完能量最小化发现体系体积异常,排查了半小时才发现溶剂分子数多写了一个0。

小技巧:用gmx pdb2gmx生成拓扑时,加上-ignh可以忽略原始PDB中的氢原子,由GROMACS自动加氢。这对pH依赖的质子化状态很有用。

起始结构 - 别让原子“打架”

起始结构通常来自X射线衍射、核磁共振或同源建模得到的PDB文件。但PDB文件直接拿过来用往往有问题:缺少氢原子、键长不合理、原子间重叠严重。必须做预处理。

我常用的流程:

  1. 用gmx pdb2gmx生成带拓扑的GRO结构。
  2. 检查是否有多余的原子或缺失的残基。
  3. 用gmx editconf定义盒子大小(如立方体、菱形十二面体)。
  4. 用gmx solvate填充溶剂。
  5. 添加离子中和净电荷。

为什么一定要先加盒子再溶剂化?因为盒子外的原子会在周期性边界条件中被“镜像”回来,产生人工相互作用。我曾经跳过盒子定义直接用gmx solvate,结果体系无限膨胀……教训深刻。

能量最小化 - 给体系“松筋骨”

起始结构通常带有较大的原子间斥力(比如两个原子距离太近)。直接做动力学,步长太小跑不动,或者直接崩掉。所以先做能量最小化,让体系落在一个局部势能底部。

GROMACS中常用最陡下降法配合共轭梯度法。我的典型em.mdp文件:

; em.mdp
integrator      = steep
nsteps          = 5000
emtol           = 1000
emstep          = 0.01
nstxout         = 0
nstlog          = 500
nstenergy       = 500

能量收敛判据emtol设为1000 kJ/mol/nm,一般够用。如果是刚性体系(如晶体),可以放到500。运行命令:

gmx grompp -f em.mdp -p system.top -c solvated.gro -o em.tpr
gmx mdrun -v -deffnm em

跑完后检查能量:gmx energy -f em.edr -o potential.xvg,看势能是否趋于常数。如果能量振荡不停,说明最小化没收敛,需要增加步数或调小步长。

注意:如果体系含配体且力场参数不到位,能量最小化可能永远不收敛。这时候要用gmx check检查配体拓扑是否正确,或者用CGenFF重新生成配体力场。

平衡模拟 - 让体系“适应环境”

能量最小化只是找到了一个低能构型,但温度和压力还不对。平衡阶段分两步:

  • NVT平衡(等温等容):先将温度升高到目标值(如300 K),通常做100 ps。
  • NPT平衡(等温等压):再跑100 ps,同时控制压力和温度,让体系密度稳定。

平衡阶段的.mdp文件区别主要在热浴和压浴设置:

; nvt.mdp(片段)
integrator      = md
nsteps          = 50000
dt              = 0.002
tcoupl          = V-rescale
tc-grps         = System
tau_t           = 0.1
ref_t           = 300

; npt.mdp(在以上基础上增加)
Pcoupl          = Parrinello-Rahman
pcoupltype      = isotropic
tau_p           = 2.0
ref_p           = 1.0
compressibility = 4.5e-5

跑完NPT后,检查体系体积和密度是否稳定。如果体积一直在降,说明体系还在“收缩”,需要延长平衡时间。我一般跑NPT至少200 ps,直到密度波动在±1%以内。

平衡完成后,就可以开始生产模拟了。但要注意,平衡的轨迹不要用于数据分析——那不科学。

一张图看懂整体流程

下面这张SVG图总结了我刚才讲的核心流程,从力场选择到平衡模拟,每一步都标出来了。你可以把它贴在实验记录本上,每次跑模拟前扫一眼,避免漏步骤。

分子动力学模拟基本流程 力场选择 拓扑文件生成 起始结构准备 能量最小化 NVT平衡 NPT平衡 生产模拟 ⚠ 注意:平衡阶段必须顺序执行(NVT后NPT),不可颠倒。 能量最小化不收敛时,检查原子重叠或力场参数。 生产模拟需要单独的.mdp文件,平衡轨迹不要用于分析。

这张图把六步串起来了。你可能会问:为什么是六步而不是三步?因为NVT和NPT虽然都是平衡,但分别控制温度和压力,分开跑更容易诊断问题。我在做膜蛋白模拟时,NPT跑了500 ps密度还没稳,后来发现是水的力场选错了——用TIP4P代替了TIP3P。

好了,力场、拓扑、起始结构、能量最小化、平衡模拟,这一套下来,你就拥有了一个可以跑的、物理合理的初始体系。后面的生产模拟和数据分析,就是在这个基础上“跑”和“看”的问题了。