刚接触LAMMPS,有一个问题想请教大家: 我想在整个MD模拟过程中,固定某几个原子始终不动,请问该如何实现? 具体用什么命令和关键词? 谢谢!!! 返回小木虫查看更多
这个有多种方法可以实现。 首先你把这几个原子放在一个group里面(比如group1),把其它原子放在另外的group(比如group2)里面。然后,你至少可以选择如下几种方法: 1. 运动方程不对这几个原子积分, 只对group2积分(但我不能确定这个时候group1里面的原子对其它原子的力的作用是否还存在(你可以作一个测试,对于一个构型手工计算一下这几个原子旁边的某一原子的势能,和程序输出的该原子的势能比较一下——用computer pe/atom命令) 2. 运动方程对所有原子积分,但是对group1里面的原子,每一步都标定它的速度,让它们的速度(或温度)为零。 3. 运动方程对所有原子积分,令group1里面的原子的初速度为零,然后用 fix setforce命令,把它们的受力搞成零。 [ Last edited by 老虎大王 on 2009-12-15 at 09:03 ]
当然,如果这些都不大好使或者太麻烦的话,我推荐你用XMD。XMD里专门有一个命令叫Fix,确保这些原子的位置不被更新,但它们与其它原子的相互作用是存在的。
我没有研究过分子系统,只研究熔盐一类的离子体系和金属一类的原子系统,呵呵。现在我看你的问题是两个: A,所有的分子都是rigid body。我其实不大明白你为什么要把分子都搞成刚体,其实分子内可以有相互作用的啊。这在Lammps中也可以实现。 B,有一些分子始终不动。 呵呵。这两个结合起来,有一点点麻烦。但在Lammps中应该也可以实现。 1. 用setforce, 一定要把初始速度先搞成零。这个命令我也没有用过,我现在不能确定它是只管当前步,还是管整个Run, 你测试一下看。刚才我又看了一下手册,手册上说这个命令可以用来固定原子。 2, Fix rigid 这个命令隐含了对所涉及的刚体中原子进行运动方程的恒能积分,不能再对它用其它的积分命令了,你仔细看说明书就知道了。这个命令的下面有两个“Important note", 你一读就知道。 3, 你如果所有的原子都是rigid body,如上所说,你设置fix rigid命令的时候已经同时积分了方程,但你又想用Nvt,那么这个时候你就只能舍弃HOOVER热浴,而改用Berendsen方法(加个 fix temp/berendsen命令,这个命令只标定速度,不积分方程),或者加 fix temp/rescale命令。 这两个命令不但可以控温,而且可以像我前面所说的一样,把你不想让它动的那些原子的温度(速度)设成零。 4,题外话: 你要用XMD,也有很多办法,比如你把你的双体势做成EAM势函数表,但只有双体势部分有数值,而把Dens和Embed部分都搞成零不就行了,主要是Embed搞成零。这样做,只是没有用Ewald求和,但你是列表形式,算起来也很快的,而且只要你把表中数据点搞得密一些,计算的精度也可以保证。你可以这样搞一下,作个常规计算,与Lammps比较一下。比如用同样的构型,只计算一步,看看能量和力是否相同(主要是能量要相同,力的计算可能由于MD算法不同而略有不同)。 [ Last edited by 老虎大王 on 2009-12-16 at 13:53 ],
至于DLPOLY,那是无法选定一些原子让它不动。 但是DOPOLY对于分子和Rigid body可以有很好的定义。你用DLPOLY也是不错的选择,至于让一些原子不动,这个很容易通过修改源程序来搞定。DLPOLY是Fortran程序,改动起来也容易。
这个有多种方法可以实现。
首先你把这几个原子放在一个group里面(比如group1),把其它原子放在另外的group(比如group2)里面。然后,你至少可以选择如下几种方法:
1. 运动方程不对这几个原子积分, 只对group2积分(但我不能确定这个时候group1里面的原子对其它原子的力的作用是否还存在(你可以作一个测试,对于一个构型手工计算一下这几个原子旁边的某一原子的势能,和程序输出的该原子的势能比较一下——用computer pe/atom命令)
2. 运动方程对所有原子积分,但是对group1里面的原子,每一步都标定它的速度,让它们的速度(或温度)为零。
3. 运动方程对所有原子积分,令group1里面的原子的初速度为零,然后用 fix setforce命令,把它们的受力搞成零。
[ Last edited by 老虎大王 on 2009-12-15 at 09:03 ]
当然,如果这些都不大好使或者太麻烦的话,我推荐你用XMD。XMD里专门有一个命令叫Fix,确保这些原子的位置不被更新,但它们与其它原子的相互作用是存在的。
非常感谢老虎大王!!!
1. setforce好像不管用。在run之后,原子位置还是随着timestep发生变化。
2. run 100000 every 1 set group s vx 0 vy 0 vz 0管用。 但我还有个问题:
因为我将每个分子都是为一个刚体,但同时又想对系统施加NVT,所以我用了两个fix来实现:
fix 1 all nvt 300.0 300.0 100.0
fix 2 all rigid group 2 mol1 mol2
但是运行后却出现警告:
WARNING: One or more atoms are time integrated more than once
请问这个问题该怎么解决?
但我想用Buckingham + Coulomb势,貌似XMD没有吧?
我没有研究过分子系统,只研究熔盐一类的离子体系和金属一类的原子系统,呵呵。现在我看你的问题是两个:
A,所有的分子都是rigid body。我其实不大明白你为什么要把分子都搞成刚体,其实分子内可以有相互作用的啊。这在Lammps中也可以实现。
B,有一些分子始终不动。
呵呵。这两个结合起来,有一点点麻烦。但在Lammps中应该也可以实现。
1. 用setforce, 一定要把初始速度先搞成零。这个命令我也没有用过,我现在不能确定它是只管当前步,还是管整个Run, 你测试一下看。刚才我又看了一下手册,手册上说这个命令可以用来固定原子。
2, Fix rigid 这个命令隐含了对所涉及的刚体中原子进行运动方程的恒能积分,不能再对它用其它的积分命令了,你仔细看说明书就知道了。这个命令的下面有两个“Important note", 你一读就知道。
3, 你如果所有的原子都是rigid body,如上所说,你设置fix rigid命令的时候已经同时积分了方程,但你又想用Nvt,那么这个时候你就只能舍弃HOOVER热浴,而改用Berendsen方法(加个 fix temp/berendsen命令,这个命令只标定速度,不积分方程),或者加 fix temp/rescale命令。 这两个命令不但可以控温,而且可以像我前面所说的一样,把你不想让它动的那些原子的温度(速度)设成零。
4,题外话: 你要用XMD,也有很多办法,比如你把你的双体势做成EAM势函数表,但只有双体势部分有数值,而把Dens和Embed部分都搞成零不就行了,主要是Embed搞成零。这样做,只是没有用Ewald求和,但你是列表形式,算起来也很快的,而且只要你把表中数据点搞得密一些,计算的精度也可以保证。你可以这样搞一下,作个常规计算,与Lammps比较一下。比如用同样的构型,只计算一步,看看能量和力是否相同(主要是能量要相同,力的计算可能由于MD算法不同而略有不同)。
[ Last edited by 老虎大王 on 2009-12-16 at 13:53 ],
至于DLPOLY,那是无法选定一些原子让它不动。
但是DOPOLY对于分子和Rigid body可以有很好的定义。你用DLPOLY也是不错的选择,至于让一些原子不动,这个很容易通过修改源程序来搞定。DLPOLY是Fortran程序,改动起来也容易。
但我在手册上见到:
DL POLY 3 also allows atoms to be completely immobilized (i.e. “frozen” at a fixed point in the MD cell).
貌似DL_POLY能够选定一些原子让它不动