LIGGGHTS tips

本篇介绍几个 LIGGGHTS 技巧,read_data,freeze,move,modify_timing,neigh_modify。

LIGGGHTS 中可以用 STL 格式的几何面来模拟复杂边界的问题。如果想用冻结粒子当作壁面,可以采用如下方法。

1
2
3
4
read_data test.dat

group Par_wall id <> 1 1000
fix fr Par_wall freeze

上述代码中,第一行是从外部文件中读取颗粒的信息;第二行是将ID在 1 到 1000 的粒子放到一个 group 里;第三行是将 Par_wall 这个 group 里的粒子冻结起来,具体的操作其实是将这些粒子的力归零,这样粒子将保持最初始的速度。如果将壁面粒子预先生成好,并将其初始速度设置为 0,便可以实现冻结粒子壁面了。

test.data 文件的数据格式如下,每一列数据的含义见注释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
LAMMPS data file via write_data, version Version LIGGGHTS-PUBLIC 3.2.0, git commit 6de550fbf3b8451f51246aa3c76374012e935340 based on LAMMPS 23 Nov 2013, timestep = 0  ## 第一行随便是什么

5 atoms ## 颗粒数
1 atom types ## 颗粒的 type 数

## 模拟区域的大小
-5.0009999999999999e-01 5.0009999999999999e-01 xlo xhi
-2.0004000000000002e-01 2.0004000000000002e-01 ylo yhi
-2.0005500000000001e-01 3.4999999999999998e-01 zlo zhi

Atoms
#id type diameter density x y z i j k
1 1 2.9999999999999999e-02 2.5000000000000005e+03 -2.9626205235821884e-01 -1.7191257603378007e-01 -5.2585560979625336e-02 0 0 0
2 1 2.9999999999999999e-02 2.5000000000000005e+03 -3.1357080694177836e-01 -8.1292507237863978e-02 -3.0941241635135643e-02 0 0 0
3 1 2.9999999999999999e-02 2.5000000000000005e+03 -3.4986005571676082e-01 -4.6564797686740017e-02 -5.0161637377833301e-02 0 0 0
4 1 2.9999999999999999e-02 2.5000000000000005e+03 -3.2901105748658366e-01 1.1629149478965480e-01 -2.8537062345934828e-02 0 0 0
5 1 5.0000000000000003e-02 2.5000000000000000e+03 -3.9692279707164302e-01 1.5000972515153915e-01 -3.5647118241865984e-02 0 0 0


Velocities ## 如果粒子的初始速度为零,这一段可以删去。
#id vx vy vz omegax omegay omegaz
1 -1.5290519507823870e+00 1.0245516532619933e-01 -1.1594445288149451e+00 6.3791250045904881e+00 2.0674456758001139e+02 1.0276923966595568e+02
2 -2.1385398568904033e+00 -1.8858415304542153e-01 -9.4897293591801291e-01 1.2732686070189061e+01 1.9114652955524940e+02 -4.8862922016708987e+00
3 -2.1931823490540205e+00 1.2314081721772643e-01 -1.1305039942880526e+00 -7.7211996358126047e+00 1.8655504536271400e+02 -3.5674698533544941e+01
4 -2.3661710510727509e+00 6.5301832663338024e-03 -9.2367025774174294e-01 -5.7926985652143115e-01 1.7594397127744105e+02 6.1151183183219171e+00
5 -2.6032940321288258e+00 1.7791968545582579e-01 -1.0893683893889663e+00 -1.6450273309025711e+01 6.8599979334439681e+01 3.4617478295022179e+00

上述能实现静止的壁面,如果希望用粒子来实现运动壁面(比如旋转),则可以用 move 命令:

1
2
group rotateWall id <> 1001 2000 # 将 1001 <= id <= 2000 的粒子放到 group rotateWall 里
fix mov rotateWall move rotate -19.8 0 0 1 0 0 8

move 命令有不同的模式,这里用的是 rotate,用这个命令以后,rotateWall 这个 group 里的粒子,将按照指定的参数来进行旋转运动,而不再是根据其受力来更新速度和位置。参数的含义分别为:起始点坐标(x,y,z);旋转轴的指向(x,y,z);周期(转一圈的时间)。

最后再介绍几个小 tips:

  1. 有时候想知道程序中哪一部分耗时最多,并据此来优化程序,这时可以在输入脚本的最开头,添加一句 modify_timing on ,之后在程序运行结束后会统计出每一条 fix 命令的耗时信息。
  2. 上述提到的冻结粒子壁面,在使用中会有一个问题:壁面粒子之间的距离通常是很小的,在建立粒子碰撞对的时候,壁面粒子之间通常会形成碰撞对,但壁面粒子之间没必要建立碰撞对,如果壁面粒子很多,这个建立过程是很耗时的。这种情况下,可以通过修改 neigh_modify 命令的参数来防止壁面粒子之间建立碰撞对:
    1
    neigh_modify delay 0 exclude group  Par_wall Par_wall

这条命令将防止在 Par_wall 这个 group 里的粒子彼此之间建立碰撞对。