Jerkwin2017-06-23T11:15:05+08:00 Jerkwin
使用GROMACS计算径向分布函数2017-06-22T00:00:00+08:00 Jerkwin https://jerkwin.coding.me/2017/06/22/使用GROMACS计算径向分布函数 <![CDATA[
  • 2017-06-22 21:54:18

使用GROMACS计算径向分布函数和配位数比较简单, 只要了解一下gmx rdf程序的使用即可. 但即便是简单的工作, 有时候也需要我们稍微深入思考一下, 如何才能做得更快更好, 如何才能尽量减少重复运行所需的时间. 只有这样, 我们才能不断突破自己的心理舒适区, 提高自己. 否则的话, 每次都暴虎冯河, 自己既做得累, 也易生厌. 毕竟, 人, 是要做些有技巧性, 艺术性的东西的.

就以我最近要处理的问题来说明吧. 我跑了一个纤维素二聚体的模拟, 这个分子共有45个原子,


视图: 投影 正交    速度:
模型: 球棍 范德华球 棍状 线框 线型   名称
左键: 转动   滚轮: 缩放   双击: 动画播放开关   Alt+左键: 移动

Fig.1

跑完后, 要计算二聚体中每个原子与溶剂水中的氧原子OW, 氢原子HW的RDF, 从而确定每个原子的第一溶剂化层厚度.

要算RDF么, 首先要做出索引文件, 把二聚体的每个原子, OW, HW放到不同的组中. 简单. 执行

gmx make_ndx -f conf.gro

再使用下面的指令

a OW: 选择水中的氧原子

a HW: 选择水中的氢原子

splitat 1: 将组1拆分, 每个原子一个组. 组1是other也就是二聚体.

q: 保存索引文件, 退出程序.

这样我们就得到了索引文件, 可用于指定要计算的RDF了.

打开得到的索引文件看看, 各个组的排列顺序如下

[ System ]
[ Other ]
[ ROH ]
[ 4GB ]
[ 0GB ]
[ Water ]
[ SOL ]
[ non-Water ]
[ OW ]
[ HW ]
[ Other_HO1_1 ]
[ Other_O1_2 ]
[ Other_C1_3 ]
...
[ Other_H2_43 ]
[ Other_O2_44 ]
[ Other_H2O_45 ]

使用这个索引文件指定要计算的RDF不方便, 因为二聚体的原子编号和索引组编号不一致, 我们把它们调整到一致(注意, 索引组编号是从0开始的), 调整后, 索引文件顺序如下

[ System ]
[ Other_HO1_1 ]
[ Other_O1_2 ]
[ Other_C1_3 ]
...
[ Other_H2_43 ]
[ Other_O2_44 ]
[ Other_H2O_45 ]
[ OW ]
[ HW ]
[ Other ]
[ ROH ]
[ 4GB ]
[ 0GB ]
[ Water ]
[ SOL ]
[ non-Water ]

这样在计算RDF时, 只要指定1 46就可以算出二聚体的1号原子与OW的RDF了. 类似操作45次, 就能得到45个原子与OW的RDF了. 再类似操作45次, 得到45个与HW的RDF. 完成.

如果你每次都这么做上90次, 还要保证不输错数字, 那还是很能锻炼耐心的. 我却没有这么大的耐心, 所以就只能偷个懒了, 使用bash脚本

for((i=1; i<=45; i++)); do
  echo -e $i'\n46' | gmx rdf -f -n 
done

当然, 如果你bash版本支持, 你也可以使用

for i in {1..45}; do
  echo -e $i'\n46' | gmx rdf -f -n 
done

如果你还知道parallel, 那就更好了, 你可以并行执行RDF计算, 这会大大节省时间

paralle echo -e {}'\\n46' | gmx rdf -f -n ::: {1..45}

所以, 学习一点简单的bash语句, 你的生活可以更轻松. 学习的过程并不舒服, 可投入一段时间的不舒服, 换取以后更多时间的舒服, 你要如何选择呢?

补充

上面的示例虽然用了gmx 5.x版本, 但做法还是基于4.x版本的. gmx 5.x版本的rdf实际支持一次计算多个组的RDF, 只要连续给出组编号就可以了. 这样得到的输出文件中, 含有多个RDF.

]]>
【转载】[在人间]第48期:一所山村小学的日常2017-06-01T00:00:00+08:00 Jerkwin https://jerkwin.coding.me/2017/06/01/【转载】[在人间]第48期:一所山村小学的日常 <![CDATA[

大华村小的一天,从清晨开始。尽管已经是早上九点左右,阳光依然没能穿透厚厚的晨雾。狭窄的山路上,零零星星地走着几个背着书包的孩子。尽管都是本村的孩子,但学校在山上,孩子们需要一大早就出门,走几十分钟的山路。

与此同时,代课教师陈芳也从家里出发了。背上的背篓里装满了土豆,手里还抱着一个大南瓜——这是她和35名学生的午饭。一路上,不时会碰到去上学的孩子。孩子们见了陈老师都很热情,除了问好,就是看看老师背篓里背了什么菜。“今天又是南瓜煮土豆”,孩子们猜到了今天的午饭菜式。

翻过一座小山,跨过一条小溪,顺着一条狭窄的土路往上爬,远远地听见几个孩子打闹的声音,一座瓦房出现在荒草中间——这就是大华村小。早到的孩子已经开始清扫教室门口的空地。陈芳说,因为地理位置偏远,条件艰苦,大华村小招不到正式的老师,最后村里只能让只有高中文凭的她过来试试。她没想到自己这一干就是六年,现在她已经习惯了这份工作,“不仅是老师,也是保姆和厨师”。

一放下东西,陈芳马上提着两个水桶到山下取水。因为学校没有自来水,中午做饭的水都要靠老师自己去打。

而此时,刚刚来到学校的另外一名代课老师郑江河老师开始安排早到的同学到教室前面除草。这也是每到开学,孩子们要做的第一件事情。

尽管孩子们年龄还小,但拔起草来却十分卖力,聪明的还用上了削铅笔的小刀。拔草的时候一名孩子的手被小刀划伤了,同伴关切地为她察看。

除了陈芳,学校还有一名代课教师。平时他们都有简单的分工。没上课前,陈芳忙着削土豆准备午饭,另外一名代课老师则忙着批改孩子们的作业。今天陈芳有些焦虑,“村里停电了,不知道什么时候能来!”原来学校只有两个大的电饭煲,一个是用来做饭,一个是用来煮菜的。平时上午最后一堂课前只要把准备好的土豆和南瓜切碎了加点水和盐往电饭煲里一放,到下课的时候就可以吃了。现在没电了,中午饭也没有着落。“实在不行,只有到村民家里用柴火煮了”,陈老师显得有些无奈。

“同学们赶紧回教室,我们上课了!”早上十点,陈芳放下洗了一半的土豆大喊一声,两名小朋友急匆匆地跑回教室。

目前整个大华村小学有两个班共35名学生,其中一个学前班19人,一个二年级16人。班上孩子的年龄跨度有点大,上课的时候,陈芳要不断地提醒走神的学生。因为学校条件比较差,每天上课的内容只有数学和语文两门课程。

今年五岁的冉小明是学前班里最小的孩子,父母都在外面打工,平时都跟爷爷奶奶一起生活。因为上学还不到一个月,课堂上的他经常走神。整个大华村一千多人,年轻人都到广州等沿海城市打工,剩下的都是年老的。有劳动能力的六七十的老人承担了家里所有的农活,年纪更大的只能将家里的地承包给别人,或者干脆丢荒。因此,大华村有很多像冉小明这样的留守儿童。

大华村小的教室里没有电灯,窗户也只是用塑料薄膜草草地封起来,但上课的时候,孩子们却劲头很足。陈芳说,冬天风大的时候孩子们经常冻得全身发抖。

因为和同伴起了点小摩擦,一名学前班的孩子趁老师不注意跑到学校旁边的田里躲了起来。陈芳找遍了半个山头才把他找回来。“因为没有经过幼儿园的教育,加上平时在家被爷爷奶奶宠坏了,性格比较野,所以教起来很费劲。”

已经中午十二点半,电却还没有来。不得已,陈老师只好提着菜和米到旁边的村民家里用柴火做饭。因为柴火做饭比较慢,已经过了一点半吃饭的点,饭却还没有做好,孩子们有些等不及了,三三两两地从课堂偷跑出来去看看老师的饭有没有做好。

一点五十分,当看见老师提着两桶饭菜走回学校的时候,孩子们已经早早地拿上了自己的碗筷守在门口。“孩子们应该都饿坏了!”陈芳有些愧疚。

因为今天的午饭比平时晚了半小时,刚打到饭菜的孩子们随地蹲下就狼吞虎咽起来。今天陈芳在村民家里要了些火腿肠跟土豆和南瓜一起煮,孩子们吃得很开心。“有时候也给他们加点肉。不过得等到附近有村民家杀猪才行”。

吃过午饭,孩子们在空置的教室里玩游戏。2009年之前这里还有四个班,但现在学生人数越来越少,原有的四间教室空置了三间。

学校里只有一个篮球,但孩子们都不会玩,只是没事儿时好奇地在草地上踢上两脚,玩腻了就丢在教室的角落里。

现在孩子们最喜欢的是过年时大人们给自己买的蜘蛛侠塑料小人。班上有一两个学生有这样的玩具就能把其他孩子们聚在一起。

大华村小下午只有一节课,两点四十五开始,三点半结束。因为学校的教室里没有电灯,下午很早教室里就已经暗下来了,特别是冬天的时候。加上教室的的窗户都没有玻璃,为了挡风只用了一些塑料薄膜遮起来,光线就更差。图为刚刚放学的孩子们,兴奋地冲出教室。

学前班要比二年级的同学早放学,郑婷每天放学都要在窗户外等着哥哥一起放学回家。陈芳说,一般老师不会给孩子们布置太多的作业。因为现在是农忙时节,很多年级大一点的孩子还需要帮家里做一些家务。

2009年之前,大华村小还有四个班,现在学生人数越来越少,只能招到两个班的学生。很多家长在外面打工赚了钱都到镇上买房子,将孩子送到中心小学念书;条件更好一些的干脆把孩子接到自己打工的地方上学去了。目前学校只能招收低年级的学生。孩子们上到四年级就要到几公里以外的溪口村小学上学。

放学后的大华村小学显得异常地安静,五岁的冉小明在学校前面逗留了一会儿。父母在外打工,爷爷奶奶正忙着家里农活,没有人有时间照顾他。冉小明说,希望自己快快长大,以后就可以跟着爸爸妈妈一起生活了。

]]>
四种计算自由能方法的原理示例教程2017-05-24T00:00:00+08:00 Jerkwin https://jerkwin.coding.me/2017/05/24/四种计算自由能方法的原理示例教程 <![CDATA[

【按】本教程以一个简单实例对计算自由能的四种方法进行了示例. 教程没有过度讲解原理, 而是从实际操作出发, 教你如何手动计算. 知晓了具体的计算操作过程对理解其他自由能计算程序的计算原理和计算结果很有帮助. 故翻译此教程供参考.

在本教程中, 我们将要计算Cu(I)和Cu(II)离子之间转移一个电子导致的自由能变化.

问题: 这个自由能差值有多大呢?

由于我们已经知道要计算的自由能差值的参考值, 所有我们可以验证模拟结果的合理性和精确性. 我们将逐步进行, 使用互不相同却又有联系的几种方法进行计算:

  • 自由能微扰(Zwanzig)
  • 接受比例(Bennet)
  • 热力学积分(Kirkwood)
  • 非平衡近似(Jarzynski)

体系设置

首先, 使用你熟悉的分子编辑软件创建两个铜离子, 将其保存为pdb文件. 然后, 修改文件使两个铜原子处于不同的组中(两个离子具有不同的组编号. 如果你不确定, 请查看pdb文件的格式说明). 此外, 将两个组都命名为CU1+, 其原子名称都是CU. 使用相同组名称的原因在于, 在我们将要使用的GROMOS力场中, 这两个离子所用的Lennard-Jones参数不同, 这会导致后面的处理变得比较复杂. 在这里我们不关心原子类型的精确性, 但对于更精确的工作, 你应该也考虑改变原子类型.

将两个离子置于4x4x4 nm^3立方盒子的中心. 假定你的pdb文件为2Cu.pdb, 可使用如下命令:

gmx editconf -f 2Cu.pdb -c -box 4 4 4 -o 2Cu_in_box.gro

接下来, 我们要使用pdb2gmx来自动生成体系的拓扑文件. 在此之前, 要检查下原子名称是否如我们所要求的那样. 使用熟悉的文本编辑器打开你创建的坐标文件2Cu_in_box.gro, 其内容类似下面:

two copper ions in a box
2
    1CU1+    CU    1   0.000   0.000   0.000
    2CU1+    CU    2   0.000   0.000   2.000
4.00000   4.00000   4.00000

如果你的文件如上面所示(否则请修改), 可以使用pdb2gmx命令

gmx pdb2gmx -f 2Cu_in_box.gro

运行命令后会提示你选择力场和水模型, 我们选择GROMOS96 54a7力场和spc水. 查看得到的文件, 特别是topol.top文件, 其中包含了体系的拓扑信息, 两个铜离子所带的电荷. 对于第一个铜离子带1+电荷而第二个铜离子带2+电荷的情况, 我们称其为状态A; 当第一个铜离子带2+电荷而第二个铜离子带1+电荷时, 我们称其为状态B. 本教程的目的是计算状态A和状态B之间的自由能差值. 试着理解拓扑文件中有关电荷的设置. 我们将通过更改这些电荷来创建状态A和B对应的拓扑文件.

由于我们要计算的是两个离子在水中进行电子转移导致的自由能差值, 我们使用GROMACS的solvate命令自动向盒子中添加水分子:

gmx solvate -cp conf.gro -cs spc216.gro -p -o solvated.gro

最后一个选项保证自动更新拓扑文件. 查看修改后的拓扑文件. 你也可以使用熟悉的查看程序查看溶剂化后的体系solvated.gro(或先使用editconf其转换为pdb文件再查看). 你可以看到加入的水看起来比较有序, 我们首先要进行能量最小化消除体系中过大的相互作用力. 你可以使用下面的mdp文件. 查看GROMACS手册中mdp的有关关键词, 学习并理解每个选项的含义.

integrator           = steep
nsteps               = 500
comm-mode            = Linear
nstcomm              = 1
comm-grps            =

emtol                = 100
emstep               = 0.01

nstxout              = 0
nstvout              = 0
nstfout              = 0

nstlog               = 500
nstenergy            = 500

nstlist              = 5

ns_type              = grid
pbc                  = xyz
rlist                = 0.9

coulombtype          = PME
rcoulomb-switch      = 0
rcoulomb             = 0.9
epsilon-r            = 1
vdw-type             = Cut-off
rvdw-switch          = 0
rvdw                 = 0.9

DispCorr             = EnerPres

fourierspacing       = 0.12
pme_order            = 4
ewald_rtol           = 1e-05
ewald_geometry       = 3d
epsilon_surface      = 0
optimize_fft         = no

Tcoupl               = berendsen
tc-grps              = System
tau_t                = 0.1
ref_t                = 300

Pcoupl               = berendsen
Pcoupltype           = isotropic
tau_p                = 0.5
compressibility      = 4.5e-5
ref_p                = 1.0

gen_vel              = yes
gen_temp             = 300
gen_seed             = 1993

将以上设置保存为em.mdp, 然后使用grompp创建运行mdrun所需的输入文件:

gmx grompp -f em.mdp -c solvated.gro -p topol.top

正常情况下会得到topol.tpr. 如果出现错误或警告, 检查并修正它们.

得到topol.tpr后, 我们可以使用mdrun进行能量最小化(最速下降方法)

gmx mdrun -v

能量最小化完成后检查得到的结构. 这一步中, 设定的能量收敛阈值达到与否并不重要, 因为我们只是为了消除由未正确放置的水分子导致的过大相互作用力. 你可以使用熟悉的分子查看软件来检查结构. 如果一切都看起来正常, 添加3个Cl-作为抗衡离子使体系满足电中性. 在Ewald和PME方法中, 电中性是很重要的. 我们使用genion命令来自动完成这个工作. 运行这个命令需要一个tpr文件, 因此, 我们首先需要使用grompp创建一个tpr文件, 我们使用confout.gro(即能量最小化后的结构)作为输入结构文件

gmx grompp -c confout.gro -f em.mdp -p topol.top

然后使用genion

gmx genion -s topol.tpr -p topol.top -nname CL -nn 3 -nq -1 -o neutral.gro

提示时选择溶剂SOL组.

对得到的结构neutral.gro进行能量最小化可能会更好, 但由于体系比较简单, 不进行这一步也无大碍.

接下来, 进行100 ps的平衡模拟, 我们不知道在这段时间内体系能否充分达到热力学平衡, 但我们先忽略这个问题吧.

问题: 根据哪些信息你可判定体系已经充分平衡了?

我们进行等温模拟, 使用所谓的弱耦合方法. 所用的npt.mdp文件如下. 请确保你理解其中选项的作用以及使用的原因.

integrator               = md
tinit                    = 0
dt                       = 0.002
nsteps                   = 50000
init_step                = 0
comm-mode                = Linear
nstcomm                  = 1
nstxout                  = 500
nstvout                  = 0
nstfout                  = 0
nstcheckpoint            = 1000
nstlog                   = 500
nstenergy                = 500
nstlist                  = 5
ns_type                  = grid
pbc                      = xyz
rlist                    = 0.9
domain-decomposition     = no
coulombtype              = PME
rcoulomb-switch          = 0
rcoulomb                 = 0.9
epsilon-r                = 1
vdw-type                 = Cut-off
rvdw-switch              = 0
rvdw                     = 0.9
DispCorr                 = EnerPres
fourierspacing           = 0.12
fourier_nx               = 0
fourier_ny               = 0
fourier_nz               = 0
pme_order                = 4
ewald_rtol               = 1e-05
ewald_geometry           = 3d
epsilon_surface          = 0
optimize_fft             = no
Tcoupl                   = berendsen
tc-grps                  = System
tau_t                    = 0.1
ref_t                    = 300
Pcoupl                   = berendsen
Pcoupltype               = isotropic
tau_p                    = 0.5
compressibility          = 4.5e-5
ref_p                    = 1.0
gen_vel                  = yes
gen_temp                 = 300
gen_seed                 = 1993

使用这一输入文件, 你可以创建tpr文件, 然后使用mdrun运行得到的tpr文件:

gmx grompp -c neutral.gro -f npt.mdp
gmx mdrun

自由能微扰(FEP)

平衡后, 我们进行1 ns的成品模拟, 并使用得到的轨迹进行FEP计算. 将mdp文件中的模拟步数改为1 ns对应的值, 然后进行模拟, 每ps保存一次构型. 这一模拟所用时间大约是平衡模拟的10倍.

模拟完成后, 我们使用mdrun-rerun选项来计算轨迹中每一帧的 $V_B-V_A$. 因而-rerun所用的拓扑文件应对应于状态B(即第一个铜离子带+2电荷, 第二个铜离子带+1电荷). 将我们前面使用的状态A的拓扑文件另存为其他文件名, 如topol_B.itp, 并修改[ atom ]段的电荷使其对应于状态B.

使用状态B的拓扑文件创建新的tpr文件, 最好使用与以前不同的文件名(state_B.tpr). 更好的做法是创建一个新的目录并在其中进行新的计算. 你需要将输出选项设置为1, 即每一步都输出, 因为前面得到的轨迹仅包含每500步(即每ps)一次的快照.

得到新的tpr文件后, 将前面属于状态A的轨迹文件复制到工作目录下重命名为traj_A.trr, 然后运行:

gmx mdrun -rerun traj_A.trr -s state_B.tpr

使用energy命令抽取edr文件中的能量并选择势能(为什么?), 分别抽取状态A和状态B对应的势能. 利用这些能量, 根据Zwanzig方程计算自由能,

问题: 自由能差值为多少? 误差来源于哪里? 为什么这么大?

误差来源于重叠不够. 我们对构型空间的抽样不充分, 其中的水分子取向倾向于产物状态.

为减小误差, 我们要使用更小的步骤进行FEP计算. 考虑根据更小的步骤来计算自由能, 如 Cu++Cu2+ → Cu1.1++Cu1.9+, Cu1.1++Cu1.9+ → Cu1.2++Cu1.8+ 等等. 当然, 这种步骤在现实中是没有的, 因为不存在非整数电荷, 但由于自由能是状态函数, 所以我们可以选择任意的路径来计算它. 总的自由能是所有这些小步骤的自由能差值之和:

其中

如果你不擅长编程, 可以创建 $n$ 个子目录(或更多), 将状态A的拓扑文件复制到每个子目录中. 然后, 在子目录 $i$ 中将第一个铜离子的电荷改为 $1+i/n$, 第二个铜离子的电荷改为 $2-i/n$. 然后mdrun -rerun所有的模拟, 并计算总的 $\D F$.

问题: 误差变小了么? 为什么(回想分布拖尾现象)?

为了便于进行后面的教程, 保存系综(即轨迹) $i$ 中计算的 $V_{i+1}-V_i$ 到文件中.

接受比例

FEP方法是非对称的, 而且我们已经看到, 即便使用非常小的微扰步骤, 我们得到的自由能结果与参考值0仍有差距. 为解决这一问题, 我们将使用 Bennet 接受比例方法处理我们得到的FEP数据.

当满足下面的条件时, 每一FEP步骤的统计误差最小

累加对所有快照进行, 对应的势能保存在edr文件中(每nstenergy一次). 自由能的最佳值为满足上面方程的 $C$, 即 $\D F=C$, 由于 $C$ 出现于方程的两边, 我们只能对其进行数值求解. 最直接但可能并非最高效的求解方法是, 从小到大逐渐增加 $C$ 的值, 计算方程两边的值, 直至 $C$ 满足方程. 我们可以先使用大的间隔对 $C$ 进行扫描, 即相邻 $C$ 值的间距较大. 根据所得的初始扫描结果, 我们可以取使方程左右两边差值最小的 $C$ 值, 然后在第二次扫描中围绕此值进行更精细的扫描.

为了使用多步FEP计算中的数据, 我们也需要后向的FEP数据, 即, 从最后一点 $n$ 开始, 对每一步骤 $i$ 我们需要计算

其中的累加 $i$ 遍及 $n$ 到1. 现在我们只使用系综 $i$ 中 $V_{i-1}-V_i$ 的数据. 你需要创建并保存这些数据.

现在你有了每一步骤 $i$ 中正向和反向FEP的 $V_A$ 和 $V_B$ 数据, 查找每一步骤 $i$ 中的最佳 $C$ 值. 个人建议用Excel, MatLab或Mathematica进行. 或者, 如果你知道如何写脚本, 并知道一点awk的话, 会更容易.

问题: Bennet接受比例方法估计的自由能差值为多少?

热力学积分

在这一部分, 我们将使用GROMACS来进行热力学积分计算. 自由能的估计值为

最好在新的目录中进行这一部分的计算. 如前面一样, 我们将使用10个步骤进行计算. 因此, 你需要创建10个子目录, 并将mdp文件复制到每个子目录中. 在每个mdp文件中添加下面的关键词来启用热力学积分

free-energy     = yes
init-lambda     = 0
delta-lambda    = 0
sc-alpha        = 0
sc-sigma        = 0.3

我们可以用初始init-lambda关键词控制labmda的值, 将其设置为0, 0.1, 0.2,…1, 对应于每一子目录.

使用这些设置, GROMACS会对状态A和B之间的相互作用函数进行线性内插. 因此我们同时需要设定状态B, 只要简单地在拓扑文件中添加状态B的信息(电荷)即可

[ atoms ]
;   nr    type  resnr residue  atom  cgnr charge  mass    typeB  chargeB  massB
    1     CU1+      1   CU1+   CU    1    1       63.546   CU1+   2       63.546
    2     CU1+      2   CU2+   CU    2    2       63.546   CU1+   1       63.546

在每一子目录中进行固定 $\l$ 值的模拟, mdrun的输出文件之一为dhdl.xvg, 其中包含了随模拟时间变化的 ${\partial V \over \partial \l}$. 你可以使用analyze命令来计算平均值和误差估计随 $\l$ 的变化. 当得到 $\left<{\partial V \over \partial \l}\right>_\l$ 与 $\l$ (0到1)的关系后, 你也可以使用analyze命令计算从0到1的积分.

问题: 热力学积分给出的自由能为多少? 是否好于FEP和BAR?

Jarzynski方法

创建一个新的子目录, 并复制用于热力学积分计算的mdp文件和拓扑文件. 在本部分中, 我们将进行很短时间的慢增长模拟. 慢增长是热力学积分的连续形式, 其中的 $\l$ 作为时间的函数连续变化, 因此, $\l(t_{init}) = 0$, $\l(t_{final}) = 1$. 在mdp文件中, 增加下面的选项(在这个例子中我们进行20 ps的模拟)

dt               = 0.002
nsteps           = 10000

free-energy      = yes
init-lambda      = 0
delta-lambda     = 0.0001

我们创建许多子目录, 每一个都进行短时间(几ps)的慢增长模拟. 如果你会写脚本的话, 会更容易.

执行完所有模拟后, 可以使用anlyze程序计算所有模拟的非可逆功

gmx analyze -f dhdl.xvg -integrate

注意, x值是以ps为单位的时间, 从0到20. 因此你需要将所得的功除以20使得 $\l$ 处于0到1之间, 间隔正确. 得到这些功后, 你可以使用你熟悉的数据分析程序创建一个直方图, 并试着将其拟合为高斯函数, 使用Jarzynski 方程(指数平均)来计算可逆功

问题: 要得到准确的自由能估计值, 需要多少个慢增长步骤?

结论

我们已经使用不同方法计算了自由能. 显然, 不应该使用非对称的自由能微扰方法, 但当它与对称的Bennet接受比例方法一起使用时, 能够给出精确的自由能估计值. 热力学积分也是对称的, 当 $\l$ 间隔足够小, 相应 $\l$ 系综间有重叠时, 这种方法同样能够给出精确的自由能估计值. 前面三种方法假定体系哈密顿量的变化足够缓慢, 体系始终处于平衡态, 因此, 这些方法都被称为平衡方法. 然而, 由于采样时间的限制, 实际情况很少这样. 与平衡方法相反, Jarzynski方法用于远离平衡的体系. 尽管考虑到我们的限制, 这听起来不错, 但由于平均问题, 需要非常多的模拟才能得到精确的自由能估计值. 最后的结果就是你并不能节省多少模拟时间. 这样, 具体使用哪种方法依赖于你要研究的问题, 要由你来决定使用哪种方法.

在此教程中, 我们仅仅改变了电荷, 但所用方法是通用的, 我们也可以改变成键相互作用. 然而, 对于构型改变, 基于伞形采样的其他方法通常更合适.

]]>