详细内容

LAMMPS讲解16-in文件定义模拟的基本规则

根据前面说的分子动力学原理,那么第一步就是设置粒子的初始位置和速度?等等。在这之前我们还需要做一些前期准备工作。首先是设置单位制,即涉及到的物理量的单位都是什么。为什么要这么做呢?就是为了能够定量描述我们的对象。回想在高中的著名实验——小球平抛。我们怎么描述小球的运动呢?我们会说小球经过多少秒,向前运动了多少米,下落了多少米。这里就采用了国际制单位描述小球的运动。只有先确定了单位制,我们才好定量描述研究对象。不同的研究对象,为了描述方便会采用不同的单位制。比如描述高铁的速度我们会用km/h,而不是m/s。同样,在LAMMPS中面对不同的研究对象,LAMMPS内置了不同的单位制。所以in文件中的

第一条命令要写的就是设置单位制,即写units命令。语法就是、

units <style>  #举例:units real

LAMMPS所有的单位制可在手册中查到。常见的单位系统有,描述分子体系的real,描述金属体系的metal,描述简单液体的lj。

第二条命令是设置边模拟维度,即你模拟的是三维问题还是二维问题。通常我们的模拟都是三维的。语法是

dimension    <N> #举例:dimension    3

第三条命令是设置边界条件,即boundary命令。通常我们希望描述对象的体相性质。但是,看看阿佛加德罗常数的值我们就可以知道实际的对象都会包含超级多的粒子。这么多的粒子的爱计算机无法承受。那怎么办呢?分子动力学中采用了有限代替无限的做法。就是取对象的一部分然后加上周期性边界条件来代替几乎无限大的对象。如图中所示所谓周期性边界条件就是粒子如果从边界穿出去,就会从对面穿回来。这样就实现了以有限的粒子数代替了无限大的对象。由边界所围起来的区域通常称为模拟盒子。模拟盒子的形状最常用的就是长方体。之所以采用长方体是因为编程容易处理。

image.png 

设置边界条件在分子动力学模拟中优先级很高,所以第二条命令要写边界条件,语法是

boundary <x> <y> <z> #举例:boundary p p p

boundary p p p就是指三个方向上都是周期性边界条件。这个设置在LAMMPS中最常用。LAMMPS中还提供了其他类型的边界条件,常用的有固定边界条件(f)和缩放边界条件(s)。当我们需要在某个方向上不想采用周期性时就可用f或s。f作用就是粒子从边界跑出去就回不来了,计算就把它丢掉了。s的作用是边界的位置会随着粒子的位置而缩放,当最靠近边界的粒子往外移动时边界位置也跟着移动,反之亦然。需要指出的是每个方向上都有两个边界,当写一个参数是如p就表示该方向上两个边界都是周期性,f和s也如此。但是,还可以这么写boundary p fs p,这就表示在x和z方向上是周期性边界,在y方向上下面是f,上面是s。因此写该条命令时根据需要进行设置。

第四条命令是设置建立邻居列表的,即neighbor命令。根据分子动力学原理我们需要计算每个原子的受力。而任何一个粒子的受力都来自于其周围粒子给它的合力。但是,我们知道只有距离较近的粒子才会对该粒子产生受力,距离较远的粒子给与的力可以忽略不计。这就是邻居的含义。所以要计算一个粒子所受的合力,首先要找到该粒子周围有哪些邻居,即建立邻居列表。每一个粒子都有自己的邻居列表。neighbor的语法是

neighbor <skin> <style> #举例:neighbor 3 bin

所谓邻居就是距离中心粒子一定范围内的粒子,这个范围称之为作用力的截断半径(r_c)。也就是以中心粒子为球心,r_c为半径内的所有粒子都是邻居。skin是比r_c多出来的一部分,所以建立邻居列表的时候是以r_c+skin为半径进行寻找的。为什么要这么做呢?这是因为建立邻居列表是挺费时间的一件事,那么好不容易建立起来那就尽可能多用几次。而事实上由于分子动力学模拟的时间步长较短,粒子在一个时间步长内走不了多少距离。那么只要邻居列表中的原子移动距离都小于skin,那么这个列表就可以在下一步中继续使用。这就是skin的含义。后面style指的是建立邻居列表的方法,最常用的就是bin方法。这个方法的具体含义可以查看分子动力学教材。入门只需要知道bin在大多数情况下都是最快的,用它就没错了。而r_c在后面的命令中设置。

image.png 

第五条命令是设置邻居列表的更新频率,即neigh_modify命令。LAMMPS提供了很多方式设置邻居列表的更新频率。如果邻居中的粒子已经不在r_c+skin范围内了,那么邻居列表就必须要更新了。当需要更新而未更新时就会出现Dangerous builds。当算完之后LAMMPS输出的Dangerous builds不为零,那么你就要修改neigh_modify命令了,或者加大skin的值。这条命令使用比较复杂,需要根据模拟经验和具体的模拟测试确定最优值。对于新手,可以直接使用以下设置:

neigh_modify every 1 delay 0 check yes

以上都是计算设置,每个模拟这些设置都大同小异。下面开始就是针对模拟对象的设置。


第六条命令设置原子类型,即atom_style命令。我们模拟的基本构成是原子。不同的对象粒子所具有的属性是不同的。对于某个对象,粒子不需要的属性就不需要设置,以节省内存加速计算。比如研究对象是分子(如水分子),那么构成分子的粒子(style为full)就需要具有以下属性:粒子编号,粒子所属分子的编号,粒子类别(atom type),带电量,x坐标,y坐标,z坐标。如果研究对象是惰性气体(如氩)或金属单质(如铁),那么粒子(style为atomic)的属性就是:粒子编号,粒子类别,x坐标,y坐标,z坐标。LAMMPS中内置了相当多的原子类型可以查看手册寻找自己需要的类型。这里要说的是atom style和atom type中文翻译都一样,具体是啥意思。简单来说atom style定义了大类,atom type定义了大类中的小类。比如一个水分子中,所有粒子的atom_style都是full,但是在这个style下,又区分为氧原子type和氢原子type。一个模拟中可以由多个type,但是只能有一个style。atom_style定义好后就约束了data文件中具体内容。atom_style的语法是

atom_style <style> #举例:atom_style full

粒子属性定义完后,就可以定义粒子之间相互作用的方式了。所谓相互作用其实就是粒子之间作用力的计算公式。计算公式是通过势能来表述的。因为势能在空间上的梯度就是力,即F=-divU。比如重力势能对高度求导就是重力。为什么要用势能表述呢?因为势能是标量而力是矢量,因此使用标量在构建或者拟合相互作用表达式时就容易的多。而在实际计算中只需要对势能进行求导就能获得受力。任何对象的组成粒子之间相互作用都分为非键结和键结。非键结就是不同通过化学键的相互作用,键结就是通过化学键的相互作用。有些对象只有非键结相互作用,如液态氩或单质铁。有些对象两种都有,比如水或蛋白质。非键结相互作用包括范德华和静电。在LAMMPS非键结相互作用即范德华和静电通过pair_style和pair_coeff命令设置。pair_style和pair_coeff定义了短程相互作用,即相互作用具有截断半径。范德华仅有短程相互作用,而静电是既有短程又有长程作用,如果体系中有静电作用,那么定义完pair_style和pair_coeff,还要定义长程静电求解类型kspace_style。用在分子体系的键结相互作用分为键(bond),键角(angle),二面角(dihedral),离平面(improper)。不同的对象会包含不同的键结作用,比如水分子就只包括键和键角,而分子量稍大的分子会需要全部的键结相互作用来描述。这些相互作用构成描述体系的力场。这些力场是从量子力学出发而得到的经典近似。以下为定义相互作用的命令:

第七条命令设置pair_style。首先定义非键结相互作用。不同的力场有不同的pair_style,模拟中要根据对象选择合适的pair_style。LAMMPS集成了目前几乎所有的pair_style。模拟时只需要根据对象进行选择即可。pair_style对于绝大多数模拟都需要定义。不同的pair_style具有不同的语法,具体可查阅手册。pair_style中一般会定义截断半径的大小。以最简单的包含范德华的pair_style为例,其语法是

pair_style lj/cut <cutoff> #举例:pair_style lj/cut 9.0

第八条命令设置bond_style。这条命令是可选的,根据不同的对象可定。其设置简单,没啥好说的,就是计算两个粒子通过化学键的相互作用,其语法为

bond_style <style> #举例:bond_style harmonic

第九条命令设置angle_style。这条命令是可选的,根据不同的对象可定。其设置简单,没啥好说的,就是计算相邻三个粒子的相互作用,其语法为

angle_style <style> #举例:angle_style harmonic

第十条命令设置dihedral_style。这条命令是可选的,根据不同的对象可定。其设置简单,没啥好说的,就是计算四个相邻粒子之间的相互作用,其语法为

dihedral_style <style> #举例:dihedral_style opls

第十一条命令设置improper_style。这条命令是可选的,根据不同的对象可定。其设置简单,没啥好说的,就是计算四个相邻粒子之间的相互作用,其语法为

improper_style <style> #举例:improper_style opls

第十二条命令设置special_bonds。这条命令是可选的,当有键结作用出现时,设定有键结相互作用的粒子之间是否还具有pair相互作用。一般来说,是没有的,所以这条命令一般写作:

special_bonds lj/coul 0.0 0.0 0.5

第十三条命令设置kspace_style。这条命令是可选的,当有静电作用出现时,需要加上。不同的pair_style对应不同的kspace_style,其语法:

kspace_style <style> <value> #举例:kspace_style pppm 0.0001

以上就是第一部分的内容。对于不同的研究对象力场设置部分会有所不同。如简单液体只需要pair_style就行了,分子物质一般都会设置,晶体也一般只需要pair_style。如果你的对象有多种物质还可以使用hybrid类的力场命令进行组合设置。

 

 

感谢鲍路瑶老师的分享,内容来自于鲍老师分享出来的资料

如有需要添加微信:lmp_zhushou  进入微信群,帮助他人,共建社区

获取完整版lammps讲义可以加微信lmp_zhushou或加入QQ994359511


最新评论
请先登录才能进行回复登录
技术支持: CLOUD | 管理登录
seo seo