1 Lammps输入脚本结构
1.1 初始化命令
设置在创建原子或从文件中读取原子之前需要定义的参数。
相关命令:units, dimension, newton, processors, boundary, atom_style, atom_modify.
如果力场参数出现在将要读取的文件中,则这些命令会告诉LAMMPS使用哪种力场: pair_style,bond_style, angle_style,dihedral_style, improper_style。
1.2 原子定义命令
在LAMMPS中定义原子的方式有3种。通过read_data或 read_restart命令从数据中读取它们或重新启动文件。这些文件可以包含分子拓扑信息。或使用以下命令在没有分子拓扑的晶格上创建原子:lattice, region,create_box, create_atoms。使用replicate命令可以复制整个原子集以进行更大的模拟 。
1.3 设置命令
一旦定义了原子和分子拓扑,就可以指定多种设置:力场系数,模拟参数,输出选项等。
力场系数由这些命令中设置:pair_coeff, bond_coeff,angle_coeff, dihedral_coeff, improper_coeff, kspace_style, special_bonds。
这些命令设置了各种模拟参数: neighbor,neigh_modify, group,timestep, reset_timestep,run_style, min_style,min_modify。
输出选项由thermo,dump和restart命令设置。
1.4 运行命令
使用run 命令运行分子动力学模拟。使用minimize命令执行能量最小化。
2 Lammps基础命令
2.1 echo命令
使用语法
echo none/screen/log/both
使用介绍
该命令决定在LAMMPS读入并处理输入脚本中的命令时,是否将它们输出到屏幕和/或日志文件中。如果你的输入脚本有错误,使用这个命令可以让你看到最后一个被处理的命令是什么。
默认设置
echo log
2.2 units命令
使用语法
units lj/real/metal/si/cgs/electron
使用介绍
该命令用来设置模拟中使用的单位类型。它决定了所有输入脚本、数据文件和所有输出到屏幕、日志文件以及dump文件中物理量的单位。一般来说,该命令用在输入脚本最开始的位置。
默认设置
units lj
2.3 dimension命令
使用语法
dimension 2/3
使用介绍
该命令用来定义模拟的维度。默认情况下,LAMMPS运行三维模拟。
默认设置
dimension 3
2.4 newton命令
使用语法
newton flag/flag1/flag2
- flag:开关对势和键相互作用[on/off]
- flag1:开关对势相互作用[on/off]
- flag2:flag2:开关键相互作用[on/off]
使用介绍
该命令用来开启或关闭对势或键相互作用中的第三运动定律。对于大多数问题而言,将牛顿第三定律设置为开启是一种可以节省2倍及以上计算量的做法。具体到是否会更快,则取决于问题的规模、力截断长度、机器的计算/交换比、以及所使用的处理器数量。
默认设置
newton on
2.5 boundary命令
使用语法
boundary x y z
x,y,z可取p/s/f/m中的一个字母或两个字母的组合。
- p:周期性边界条件periodic
- f:非周期性固定边界条件fixed
- s:非周期性包覆边界条件shrink-wrapped
- m:非周期性包覆最小值边界条件minimum value
使用介绍
设置模拟盒子沿着各个方向的边界条件。单独的一个字母会将模拟盒子沿着某个方向的两个面设置为一样的边界条件。两个字母会将这两个面分别设置为不同的边界条件。
p代表周期性边界条件,就是说原子在跨越模拟盒子的边界时,会从盒子的另外一边再进入盒子里。
默认设置
boundary p p p
2.6 atom_style命令
使用语法
atom_style style args
- style可取:angle/atomic/body/bond/charge/dipole/electron/ellipsoid/full/line/meso/molecular/peri/sphere/tri/hybrid
- args:只有body和hybrid需要设置args
使用介绍
定义模拟过程中原子的类型,它会决定原子包括哪些属性。一定原子的类型被设置了,在模拟过程中就不能在改变了,因此尽量更加通用的类型,以免某些属性没有被包括却被用到了。尽量使用更加通用的类型,虽然这可能会因为某些属性没有用到,同时会稍微降低效率,但总比出错好。
一般来说,模拟时需要单独一种的原子类型。但如果模拟中的有些原子不需要某些性质,但其他的原子需要,那么就要使用包含所有这些性质的类型。比如,如果有些原子需要电荷,而另外一些不需要,要使用类型charge;如果有些原子有键,而另外一些没有,要使用类型bond。
默认设置
atom_style atomic
2.7 pair_style命令
使用语法
pair_style style args
- style可取:none/hybrid/coul/cut...
- args:特点style需要设置args
使用介绍
定义模拟过程中原子间对相互作用的类型。可以通过pair_coeff命令指定相关的系数。
默认设置
pair_style none
2.8 bond_style命令
使用语法
bond_style style args
- style可取:none/hybrid/harmonic/mm3...
- args:特点style需要设置args
使用介绍
定义模拟过程中原子间键相互作用的类型。可以通过bond_coeff命令指定相关的系数。
默认设置
bond_style none
2.9 angle_style命令
使用语法
angle_style style
- style可取:none/hybrid/harmonic/mm3...
使用介绍
定义模拟过程中原子键间角相互作用的类型。可以通过angle_coeff命令指定相关的系数。
默认设置
angle_style none
2.10 pair_coeff命令
使用语法
pair_coeff I J args
- I,J:原子类型
- args:一对或多对原子类型的系数
使用介绍
定义一对或多对原子类型的成对力场系数。
2.11 bond_coeff命令
使用语法
bond_coeff N args
- N:键类型
- args:一种或多种键类型的系数
使用介绍
定义一对或多对原子类型的成对力场系数。
2.12 angle_coeff命令
使用语法
angle_coeff N args
- N:角类型
- args:一种或多种角类型的系数
使用介绍
定义一种或多种角度类型的角度力场系数,取决于角度样式。
2.13 lattice命令
使用语法
lattice style scale keyword values ...
- style可取:none/sc/bcc/fcc/hcp/diamond/sq/sq2/hex/custom
- scale:晶格和模拟盒子的比例因子
- 可以不添加或添加多个keyword/value
- keyword:origin/orient/spacing/a1/a2/a3/basis
使用介绍
该命令用来定义晶格,以便其他命令使用。在LAMMPS中,晶格对应空间中的一些列阵点,这些阵点的位置是由相应原胞中基本原子的位置决定的。这些阵点会在所有的方向上无限的复制。lattice命令的参数可以用来定义很多晶体学晶格。
在LAMMPS,晶格有两种使用方式。第一种,使用命令create_atoms在模拟盒子内的晶格阵点上创建原子。需要注意的是,使用命令create_atoms可以在一个晶格的不同格点上创建不同类型的原子。第二种,晶格沿着x,y,z三个方向的晶格间距可以被其他的命令(比如命令create_box, region, velocity)用作距离单位。
晶格类型必须要与模拟的维度(参考命令dimension)要匹配。类型sc or bcc or fcc or hcp or diamond属于三维问题。类型sq or sq2 or hex属于二维问题。类型custom既可以用于二维,也可以用于三维问题。
对于LAMMPS中一个晶格来说,它是由单胞、一些基本原子和一些在模拟盒子安放单胞的变换参数(比例因子、原点和方位)组成。矢量a1, a2, a3是单胞的边向量。需要注意的是,LAMMPS中使用的单胞是不同于具有最小体积的原胞。
- 类型none并没有定义原胞和相关基组,因此用它定义的晶格不能被命令create_atoms使用。但它定义了由比例参数scale指定的晶格间距。上面已经提到了,晶格间距可以被其他命令用作距离单位。对于类型none来说,不能添加额外的keyword/value。默认定义的是lattice none 1.0,就是说晶格距离与命令units定义的单位长度相等。
- 类型sc, fcc, bcc, diamond是三维晶格。其中sc, fcc, bcc, diamond定义了边长为1.0的立方单胞,其单胞的边矢量为a1 = 1 0 0, a2 = 0 1 0, a3 = 0 0 1。类型hcp的边矢量是a1 = 1 0 0, a2 = 0 sqrt(3) 0, a3 = 0 0 sqrt(8/3)。
- sc晶格有1个基本原子,在立方体左下角后面的位置。
- bcc晶格有2个基本原子,分别在立方体的角上和中心的位置。
- fcc晶格有4个基本原子,有1个在角上,另外3个在面心的位置。
- hcp晶格有4个基本原子,有2个在z=0的平面上,另外2个在z=0.5的平面上。
- diamond晶格有8个基本原子。
-
类型sqandsq2是二维晶格,定义了边长为1.0的正方形单胞,其单胞的边向量是a1 = 1 0 0和a2 = 0 1 0。类型hex定义的也是二维晶格,但单胞是长方形的,其单胞边矢量为a1 = 1 0 0和a2 = 0 sqrt(3) 0。
- sq晶格有1个基本原子,在正方形的左下角的位置。
- sq2晶格有2个基本原子,分别在正方形的角上和中心的位置。
- hex晶格有2个基本原子,分别在长方形的角上和中心的位置。
下面这部分介绍将理想单胞变换为模拟盒子中晶格阵点的相关参数。
参数scale决定在模拟盒子中布置单胞时,它的实际尺寸。也就是说,将该参数作为乘法因子作用在单胞上,从而可以获得所需尺寸的晶格。参数scale的意义依赖于在模拟过程中使用的单位类型(参考命令units)。
对于除了lj之外的所有单位类型,参数scale都是由相应单位类型所定义的长度单位指定。举例来说,对于real或metal的单位类型,如果立方单胞的边长为1.0,指定scale=3.52,那么就会创建一个间距3.52A的立方晶格。对于cgs单位类型而言,间距是3.52cm。
origin选项指定在将单胞布置在模拟盒子中的时候,如何对其进行平移。参数x,y,z是分数值(0.0 <= x,y,z < 1.0),意思是说按着相应方向上的晶格间距的分数倍进行平移。
orient选项指定在将单胞布置在模拟盒子中的时候,如何对其进行旋转。参数dim是模拟盒子3个坐标轴中的一个。另外3个参数定义一个晶体学方向,你的单胞将会沿着那个方向摆放;需要指定为整数,比如orient x 2 1 0的意思就是说模拟盒子的x方向是沿着晶格的[210]方向。你所指定的三个晶格方向必须是相互正交的,并且满足右手定则,即X叉乘Y的方向与Z相同。需要注意的是,这里的介绍只对正交晶格是适用的。如果你要使用custom类型定义非正交的边矢量a1,a2,a3,那么你可以认为orient选项定义了3x3的旋转矩阵,并将其作用于a1,a2,a3对最初的单胞进行旋转,从而得到新的摆向。
使用举例
lattice fcc 3.52
lattice hex 0.85
lattice sq 0.8 origin 0.0 0.5 0.0 orient x 1 1 0 orient y -1 1 0
lattice custom 3.52 a1 1.0 0.0 0.0 a2 0.5 1.0 0.0 a3 0.0 0.0 0.5 basis 0.0 0.0 0.0 basis 0.5 0.5 0.5
默认设置
lattice none 1.0
2.14 region命令
使用语法
region ID style args keyword arg ...
- ID:待定义区域的ID
- style可取:delete / block / cone / cylinder / plane / prism / sphere / union / intersect
使用介绍
该命令用于定义一个空间几何区域。很多其他命令都会使用该命令定义的区域。举例来说,create_atoms可以在定义区域中创建原子,create_box命令可以根据定义区域定义模拟盒子,group命令可以将定义区域中包括的原子定义为一个组,delete_atoms命令可以将定义区域中的原子删掉,fix wall/region可以将定义区域的表面定义为壁面(boundary wall)。
2.15 create_box命令
使用语法
create_box N region-ID keyword value ...
- N: 模拟中使用的原子类型数
- region-ID:用作模拟域的区域ID
- keyword:bond/types or angle/types or dihedral/types or improper/types or extra/bond/per/atom or extra/angle/per/atom or extra/dihedral/per/atom or extra/improper/per/atom
使用介绍
基于指定的区域创建一个模拟框。首先必须使用region命令来定义几何域。
2.16 create_atoms命令
使用语法
create_atoms type style args keyword values ...
- type:要创建的原子类型(用1到N的数字代替)
- style:box / region / single / random
使用介绍
该命令用来在晶格阵点上创建原子,或创建一个单独的原子,或创建一些列随机原子。也可以用命令read_data或read_restart通过直接给出原子坐标的方式创建原子。在使用该命令之前,模拟盒子必须是存在的(使用create_box命令创建),同时晶格也必须已经被定义(使用lattice命令)。但对于创建single类型且以box为单位的原子,或创建random类型的原子时,不需要先定义晶格。
该命令是向已经存在的体系中继续添加原子。换句话说,该命令可以多次使用,从而可以在模拟盒子中创建多组原子。通过交错地使用create_atoms命令和lattice命令(配置为不同晶向orientations),就可以创建晶界;联合使用create_atoms命令和delete_atoms命令,可以创建非常复杂的体系。create_atoms命令也可以在已经读入的体系中继续创建原子。在所有列举的这些情况中,都需要注意不要让新创建的原子与已经存在的原子重叠。可以使用delete_atoms命令来处理重叠原子的问题。
box类型:该命令在整个模拟盒子中所有的晶格阵点上创建原子。如果你的模拟盒子是周期性的,你应该确保其尺寸是晶格距离的整数倍,从而避免在盒子边界处可能存在的原子重叠。如果你的盒子是周期性的,并且在某个方向上盒子的尺寸是晶格距离的整数倍,那么LAMMPS会在边界上只放置一个原子(译注:边界上的原子不会丢失或在两个面同时出现)。
region类型:该命令会在region-ID所指定的区域与模拟盒子相交的公共区域内创建原子。需要注意的是,这里定义的区域可以在模拟盒子内,也可以在模拟盒子外。还需要注意,即便你在这里定义的区域与周期性模拟盒子的尺寸是一样的,LAMMPS所执行的逻辑跟box类型也不一样,就是说并不能像box类型那样确保在边界上只有一个原子。所以如果你希望达成像box类型那样的效果,你最好使用box类型,或者就是非常精确的调整region的尺寸来获得你想要的原子。
single类型:将指定坐标的原子添加到系统中。对于调试或者创建一些列手动添加的原子会比较有用。
random类型:在系统中按着随机坐标产生N各原子,这对于产生无定形系统会比较有用。根据指定的随机种子数seed,程序会依次创建N个随机原子。这N个随机原子的坐标与所使用处理器的个数没有关系。另外,如果region-ID设置为NULL,那么创建的原子会随机填充模拟盒子的任何位置;如果指定了特定的region-ID,那么原子就只会随机填充在模拟盒子与region-ID所共同指定的区域。
注意:使用random类型产生的原子很有可能是相互重叠的,或者是距离较近,不太符合实际物理,从而导致计算出较大的力或能量。因此,在开始进行正常的动力学计算时,最好先使用minimize对体系进行能量最小化,或先使用fix nve/limit进行动力学计算。
2.17 fix命令
使用语法
fix ID group-ID style args
- ID:fix命令的ID
- group-ID:该fix命令所作用的原子组的ID
- style:fix类型名
- args:特定类型fix命令所需要的参数
使用介绍
为一组原子施加fix约束。在LAMMPS中,fix是施加在分子动力学时间步或能量最小化过程中的某种操作。可能是在时间积分的过程中更新原子的位置和速度,或是控制温度,或是给原子施加约束力,或是强制某种边界条件,或计算过程诊断,等等。
fix命令会在时间步中的不同过程中执行相关的操作。如果有2个或多个fix命令作用于时间步中的同一过程,它们会按着在输入脚本中定义的顺序依次被激活。
fix命令的ID只能包含字母、数字和下划线。
fix命令所施加的约束可以被unfix命令删去。
注意:使用unfix命令是唯一用来关闭fix命令所施加的约束的方法。如果只是指定一种新的类似的fix命令并不会关闭之前的fix命令。这对于进行积分的fix命令特别重要。举例来说,如果你先定义了fix nvt命令,然后又定义了fix nve命令,这样做并不会将先定义的NVT时间积分取消掉,而是这两个时间积分同时进行。
fix_modify命令用来重置fix命令定义的某些设置。
使用举例
fix 1 all nve
fix 3 all nvt temp 300.0 300.0 0.01
fix mine top setforce 0.0 NULL 0.0
2.18 dump命令
使用语法
dump ID group-ID style N file args
- ID:dump命令的ID
- group-ID:该dump命令所作用的原子组的ID
- style:dump类型名
- N:隔多少时间步输出一次
- file:输出文件名
- args:特定类型dump命令所需要的参数
Example:Fe的in.file
echo screen #将信息输出到屏幕
units metal #单位metal
boundary p p p #周期性边界条件
atom_style atomic #原子模式
timestep 0.01
lattice bcc 2.86 #铁的晶格类型及晶格常数
region box block 0 4 0 4 0 4 #id为box,style为block,x y z方向上长度
create_box 1 box #只有Fe,为1
create_atoms 1 box
pair_style eam/fs #eam合金相互作用
pair_coeff * * ../potentials/Fe_mm.eam.fs Fe #相互作用势在此文件
neighbor 0.3 bin
neigh_modify every 10 check yes #neighlist更新频率,10步更新一次
variable N equal abs(floor(x[100])) #id为100的原子坐标的绝对值做随机数
velocity all create 100 ${N} dist gaussian #所有原子,对应100K温度下的速度,N随机数,gaussian分布
#跑平衡过程
fix 1 all nve #fix id为1,all所有原子跑nve系综
dump 1 all custom 100 dump_bal.lammpstrj id type x y z
run 10000
undump 1
thermo 100 #100步输出一次热力学信息
dump 1 all custom 100 dump.lammpstrj id type x y z
run 10000