大家都清楚,在用lammps进行模拟计算前,建模这个步骤是必不少的。
总的来讲,我们可以通过两种方法来完成建模操作。一是通过lammps的命令建模;二是通过外部的程序建模,然后用lammps的read_data 命令将模型读入。
lammps命令建模的主要步骤可以描述为:
用units 命令定义单位
lattice 命令定义单胞
region以及create_box命令定义区域和创建盒子
create_atoms 命令创建原子
今天我主要详细讲解lattice命令的语法:
lattice style scale keyword values …
style可以是 none, sc, bcc, fcc, hcp, diamond, sq,sq2, hex 或者 custom
scale是style选项下的参数,比如(当units ≠ lj 时)style填bcc, 那么scale就填体心立方的晶格常数a0的值(当 units 为lj 时,这里的scale就是电子密度值,使用其他units时,scale都是晶格常数)。
需要注意的是,当指定了 lattice的scale之后,位于lammps输入脚本中关于长度的值,其单位就是scale(表示几倍scale长)。
零个或更多个 keyword/value 键值对可以被添加
keyword可指定为 origin, orient, spacing, a1, a2, a3或者 basis
对于所建立的晶胞,我们都可以进行平移origin和旋转orient操作
origin 配对的值是三个数字 (x y z) 意思是对单位晶胞里的所有原子的整体平移量,单位晶胞的楞长默认为1,x,y,z的值为偏移量和棱长的比值(0 <= x,y,z <1),缺省值为(0 0 0)。为了便于后续分析,以及避免建模边界原子重合,我们一般会给一个比较小的偏移量(0.1 0.1 0.1).
orient 作用是旋转晶胞方向。盒子默认方向为(x 0 0 1) (y 0 1 0) (z 0 0 1),可以认为orient命令将晶胞的指定晶向旋转至模拟盒子的三条坐标轴,然后将晶胞在盒子里重新排布。orient配对的值格式为 dim i j k,其中dim的值是字母 ‘x’ , ‘y’ 或者’z’,表示空间的三条轴。i j k 为该轴指向向的晶向,其值为整数,例如“orient x 2 1 0” 意思是旋转过后模拟盒子的x轴将会指向 [210] 晶向。三个方向要求满足正交以及右手定则。做旋转处理时,盒子原本的周期性不能被保证,如果仍然要保持其周期性,则先建模运行,然后看lammps的屏幕输出lattice spacing in x,y,z后的值,记为sx,sy,sz。然后将建立的模型放到ovito中切片观察,计算出xyz各个方向上的最小排布周期长度,记为slx,sly,slz。他们必须满足如下关系:
sxm1=slxn1
sym2=slyn2
szm3=slzn3
其中m1,2,3以及n1,2,3均为整数,于是取盒子大小为(sxm1 sym2 sz*m3)
旋转操作一般被用来建立不同方向的界面。
spacing配对的值是 dx dy dz,为两个单胞之间的间距
如果我们的style取的是custom,那么我们可以通过a1,a2,a3 和 basis 这两个关键词来指定基矢和单胞里的原子在基矢中的定位
a1,a2,a3 各自配对的值为(x y z)意思是a1 a2 a3这三个基矢的值,用来定义单胞的基矢。缺省值对于三维的sc、fcc、bcc和diamond类型的原子,他们的棱长默认为1个单位,默认的基矢为a1 (1 0 0);a2 (0 1 0);a3 (0 0 1)。hpc类型a1 = 1 0 0;a2 =0 sqrt(3) 0;a3 = 0 0 sqrt(8/3)。
basis 配对的值是(x y z),表示在基矢定义的空间的一个位置,如有多个位置,则定义多个basis
对于三维的sc、fcc、bcc和diamond类型的原子,这些已有的类型不需要指定基矢和basis,但是我们可以用custom的style加上基矢和basis的参数来建立同样的模型。bcc, fcc, sc的基矢为a1 = 1 0 0;a2 = 0 1 0;a3 = 0 0 1,bcc默认basis原子(0 0 0)(0.5 0.5 0.5),fcc的basis (0 0 0)(0 0.5 0.5)(0.5 0.5 0)(0.5 0 0.5), sc 的basis(0 0 0)。hpc类型的基矢a1 = 1 0 0;a2= 0 sqrt(3) 0;a3 = 0 0 sqrt(8/3)。