系统输出
# 系统输出
当LAMMPS读取完input文件之后,将会把重要信息输出到命令行和log文件中,然后开始初始化。初始化结束后,会将系统信息,包括系统版本,占用内存和初始的热力学状态输出出来。在计算过程中,会周期地输出当前的热力学信息。每一次运算阶段结束后,将会输出最终的热力学信息和系统统计。
# 热力学信息
thermo N
N #每N步输出一次热力学状态
thermo_style style args
style = one or multi or custom
args = #one 和 multi 没有参数可选
custom args =
step #输出当前总步数
elapsed #输出本次run到现在的步数
dt #间隔时间
time #模拟时长
temp #体系温度
press #体系压力
pe #势能
ke #动能
etotal #总能量(pe+ke)
enthalpy #焓 (etotal + press×vol)
evdwl #范德华力的能量
ecoul #库仑力的能量
epair #分子对间的能量(evdwl + ecoul)
###e开头的都是能量就是了###
vol #体积
density #密度
lx,ly,lz #盒子的长宽高
xlo,xhi,ylo,yhi,zlo,zhi#盒子边界的位置
fmax#受到的最大的力
ndanger#危险原子列表的数量
c_ID[]#输出compute的数据
thermo_modify keyword value...
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
27
28
29
30
热力学数据输出的频率和格式主要由thermo、thermo_style和thermo_modify命令来设置。
其中thermo_style命令用于具体指定所需要输出的参量。如LAMMPS预定义的一些关键字(如press、etotal等)所代表的参量,以及另外由compute、fix或variable三个命令所得到的参量值,具体可通过c_ID、f_ID或v_name关键字引用。在这三种情况下,compute、fix或variable三个命令得到的量作为thermo_style custom命令的传入值时必须是一个全局量global,如体系中某一区域(group)的势能、温度等。如果给thermo_style custom命令传入的是非全局量值,则会报错,如:
compute 1 all pe/atom
thermo_style custom step temp pe etotal c_1
2
值得注意的是,热力学输出量既可以是“广度量”也可以是“强度量”。前者与系统中的原子数成比例,如体系总能,而后者则与系统中的原子数无关,如体系温。thermo_modify命令的norm参数用以决定是否对广度量进行归一化操作。compute和fix命令既可以产生广度量也可以产生强度量。具体可参见相关的说明文档。variable命令的类型为equal时仅能产生强度量值,若需要将此时的强度量值转变为广度量值,可通过在公式中除原子数(natoms)的方式得到。
thermo设定了输出的间隔。
thermo_style指明了输出的格式。
当style = custom时,就可以自己手动指定需要输出什么了。
还一种情况,如果通过fix ave/time来做时间平均的话,可以用f_ID来输出相应的平均数据。
# 系统统计
Loop time of 2.81192 on 4 procs for 300 steps with 2004 atoms
Performance: 18.436 ns/day 1.302 hours/ns 106.689 timesteps/s
97.0% CPU use with 4 MPI tasks x no OpenMP threads
2
3
4
5
以上的信息都是不言自明的。Loop部分指出了运行的实际时间;Performence基于当前的运算速度给出了平均时长预测;CPU占比给出了MPI的CPU占用,通常来说越接近100%效率越高,如果相差太多,大概率是卡在I/O上。
值得注意的是下方的时间表格:
MPI task timings breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 1.9808 | 2.0134 | 2.0318 | 1.4 | 71.60
Bond | 0.0021894 | 0.0060319 | 0.010058 | 4.7 | 0.21
Kspace | 0.3207 | 0.3366 | 0.36616 | 3.1 | 11.97
Neigh | 0.28411 | 0.28464 | 0.28516 | 0.1 | 10.12
Comm | 0.075732 | 0.077018 | 0.07883 | 0.4 | 2.74
Output | 0.00030518 | 0.00042665 | 0.00078821 | 1.0 | 0.02
Modify | 0.086606 | 0.086631 | 0.086668 | 0.0 | 3.08
Other | | 0.007178 | | | 0.26
2
3
4
5
6
7
8
9
10
11
纵轴:
- Pair = 非键部分消耗的时间
- Bond = 键接部分消耗的时间
- Kspace = 长程作用力消耗的时间
- Neigh = 构建临近表需要的时间
- Comm = 核内通信消耗的时间
- Output = 输出信息需要的时间
- Modify = 相关内置计算命令需要的时间
- Other = 其他
横轴中的"%varavg"代表波动的程度,越接近0代表负载越均衡。
Nlocal: 501 ave 508 max 490 min
Histogram: 1 0 0 0 0 0 1 1 0 1
Nghost: 6586.25 ave 6628 max 6548 min
Histogram: 1 0 1 0 0 0 1 0 0 1
Neighs: 177007 ave 180562 max 170212 min
Histogram: 1 0 0 0 0 0 0 1 1 1
2
3
4
5
6
7
第三部分列出了每个核心分配到的本地原子数(local atom,Nlocal),幽灵原子数(ghost atom,Nghost)和临近表数(neighbor,Neights)。最大值和最小值给出了这些值在处理器之间的分布,10位直方图显示了分布。直方图计数的总数等于处理器的数目。
Total # of neighbors = 708028
Ave neighs/atom = 353.307
Ave special neighs/atom = 2.34032
Neighbor list builds = 26
Dangerous builds = 0
2
3
4
5
最后一部分给出了整个计算中,临近表的统计信息。当各位了解临近表的原理后,根据这里的数据能判断出临近表的设定,进一步地提高计算的精度和速度。