拓扑文件(.top)核心参数:原子类型、键、角、二面角、成对非键参数

咱们做GROMACS模拟,一开始就是写拓扑文件。说白了,拓扑文件就是分子的“身份证”,告诉GROMACS分子里有哪些原子、它们怎么连、互相之间怎么作用。我见过不少新手,参数抄来抄去最后跑出个离谱结果,回头一看——拓扑文件里原子类型写错了,或者键长参数乱填。

这一章咱们就把拓扑文件的几个核心参数讲透。你把它搞懂了,后面做什么模拟都不会慌。

3.1 原子类型——分子的“基本粒子”

每个原子在拓扑文件里都要有一个类型。类型决定了它的质量、电荷,以及它跟别的原子怎么相互作用。原子类型名你自己定,但同一套力场里不能重复。

核心规则:原子类型名称通常用大写字母+数字,比如 C、O、H1、OW。别用特殊符号,别用空格。

定义原子类型的格式很简单,就在 [ atomtypes ] 段下面:

[ atomtypes ]
;  type   mass    charge   ptype  sigma(nm)  epsilon(kJ/mol)
  C       12.01   0.0      A      0.34       0.42
  O       16.00   0.0      A      0.30       0.71
  H       1.008   0.0      A      0.25       0.13

这里 ptype 固定填 A,表示这是原子类型(不是虚拟原子)。sigma和epsilon是LJ参数,用于非键相互作用。

我个人习惯:原子类型命名尽量跟力场文件保持一致。比如OPLS力场里烷基碳常用 CT,那么我写拓扑时也用 CT,方便排查。

如果你用了多个分子(比如水和离子),不同分子的原子类型可以混合在同一个 [ atomtypes ] 段里。顺序无所谓,但别漏掉任何一个类型。

3.2 原子定义——给每个原子贴上“标签”

定义好原子类型后,在每个分子的 [ atoms ] 段里给具体的原子分配类型和电荷。比如水分子:

[ moleculetype ]
; molname  nrexcl
  SOL       2

[ atoms ]
; nr  type  resnr  residu  atom   cgnr  charge   mass
  1   OW    1      SOL      O      1     -0.82    16.00
  2   HW    1      SOL      H1     2      0.41     1.008
  3   HW    1      SOL      H2     2      0.41     1.008

注意 cgnr 是电荷组编号,同一电荷组内的原子电荷总和通常为零(或接近零)。这个在做长程静电计算时有用。

3.3 键参数——原子之间的“弹簧”

力场用谐振子模型来描述化学键。你需要定义 平衡键长 和 力常数。GROMACS支持多种键函数,最常见的是 1(谐振)。定义在 [ bondtypes ] 段:

[ bondtypes ]
; i   j   func   r0(nm)   k(kJ/mol/nm^2)
  C   O   1      0.123    502416.0
  C   H   1      0.109    284512.0
  O   H   1      0.096    462750.0

然后在每个分子的 [ bonds ] 段里引用这些类型:

[ bonds ]
; ai  aj  funct   r0      k
  1   2   1       0.123   502416.0
  1   3   1       0.109   284512.0

你可能会问:为什么 [ bondtypes ] 里已经定义了参数,分子里还要写一遍?其实可以只写 [ bonds ],参数直接填在分子定义里。但我建议把它们抽出来放在 [ bondtypes ]里,这样多个分子复用的时候,改一个地方就行。

我曾经踩过的坑:给一个蛋白配体复合物写拓扑,直接从旧文件复制了键参数,结果键长单位不一致(一个用nm,一个用Angstrom),导致键能爆炸。后来我养成了习惯——每次检查单位,nm就是nm,千万别混。

3.4 角参数——三原子弯曲

角的定义方式和键几乎一样,只是多了个原子。函数 1 也是谐振:

[ angletypes ]
; i   j   k   func   theta0(deg)   k(kJ/mol/rad^2)
  C   O   H   1      109.5        418.4
  O   C   H   1      120.0        460.24

在分子段内使用:

[ angles ]
; ai  aj  ak  funct   theta0  k
  1   2   3   1       109.5   418.4

注意角度单位是度,力常数用的单位是 kJ/(mol·rad²)。GROMACS内部会自动换算。

你想想看,如果角度力常数太大或太小,分子构象就可能扭曲。一般力场文件里这些值都已经经过量子化学计算,咱们直接用就行,除非你有特殊理由不改。

3.5 二面角参数——扭转的“门闩”

二面角描述四个连续原子之间的扭转势。它比较复杂,因为可能有多个势能项(比如Ryckaert-Bellemans函数)。GROMACS里二面角函数有很多种,常用的是 1(周期性)和 9(RB势)。

这里展示一个典型的周期性二面角:

[ dihedraltypes ]
; i   j   k   l   func   phase(deg)   kd(kJ/mol)   multiplicity
  C   C   O   H   1      0.0          0.42          1
  C   C   O   H   1      180.0         0.15          3

在分子里引用时,多个同类型的二面角可以合并成一行(用 9 函数更容易处理)。但你如果觉得麻烦,可以直接在分子段里写。

我个人的经验:二面角是最容易出错的参数。我记得有一次跑一个多肽,二面角参数漏了,结果GROMACS报错说“missing dihedral for atom pair”。排查了半天,发现我在 [ dihedraltypes ] 里少写了一个原子组合。

避坑提示:二面角参数必须覆盖分子中所有连续的四个原子。你可以写 [ dihedrals ] 段,也可以用 [ dihedraltypes ] 加通配符。建议初学者先在分子段里逐条写,确认无误后再抽象到类型段。

3.6 成对非键参数——LJ与静电

非键相互作用包括Lennard-Jones和库仑静电。参数已经在 [ atomtypes ] 里定义了sigma和epsilon,GROMACS会自动组合(例如用Lorentz-Berthelot规则)。

但有时你需要手动指定某些原子对之间的非键参数(比如1-4相互作用)。这时用 [ pairtypes ] 段:

[ pairtypes ]
; i   j   func   sigma(nm)   epsilon(kJ/mol)
  C   C   1      0.34        0.42
  C   O   1      0.32        0.55

然后在分子内的 [ pairs ] 段引用:

[ pairs ]
; ai  aj  funct   sigma   epsilon
  1   4   1       0.34    0.42

一般力场会自动处理1-4比例因子(比如将LJ和静电缩小一半)。你如果不放心,可以在 [ defaults ] 段里设置 nbfunc 和 comb-rule。

注意:不要手动把1-2和1-3也写成非键对,那会破坏拓扑结构。GROMACS会忽略你写的 [ pairs ] 段里的错误原子对,但最好还是按规则来——只有1-4和更远的原子才写。

一张图理清拓扑参数关系

下面这张SVG图把拓扑文件中各个参数段的关系画出来了。你可以当个“地图”用。

拓扑文件的核心参数结构 分子拓扑 原子类型 质量、电荷、LJ参数 键参数 平衡键长、力常数 角参数 平衡角度、力常数 二面角参数 周期、相位、势垒 成对非键参数 1-4 LJ、静电比例 分子实例 [ moleculetype ] 参数类型段(atomtypes, bondtypes, …)定义力场参数;分子实例段引用这些参数并指定具体原子。

实战中别忘了检查全局段

拓扑文件最开头还有一个 [ defaults ] 段,控制非键组合规则和1-4缩放因子。很多人跳过去不改,结果不符合自己用的力场。

[ defaults ]
; nbfunc  comb-rule   gen-pairs   fudgeLJ   fudgeQQ
  1        2           yes         0.5       0.5

这里 nbfunc=1 表示LJ用 C6-C12 形式;comb-rule=2 是Lorentz-Berthelot规则。这两个一般别改,除非你很清楚自己在做什么。

总的来说,拓扑文件的编写就是个“定义-引用”的过程。先在大脑里理清你的分子有哪些原子、怎么连接,再照着 [ moleculetype ] → [ atoms ] → [ bonds ] → [ angles ] → [ dihedrals ] → [ pairs ] 的顺序依次写。每写一个段,就检查一遍原子序号是否正确。我见过有人把原子序号写反,结果GROMACS报bond length out of range。

最后一个小总结:参数段(带types的)是模板,分子段是实例。用模板可以轻松切换力场,实例负责具体分子。掌握这个思想,拓扑文件就不会乱。