暂停与重启
# 暂停与重启
通常来讲,我们的计算都要持续几十到几天的时间。在这段时间里,谁都不能保证系统不崩溃/机房不跳闸/保洁员不把插头拔下来给手机充电。或者说,进行到某一步时出现了错误,我们需要知道出错前发生了什么。所以,我们需要一种机制来随时储存进度,可以快速地重新开始。
# binary储存
LAMMPS可以把系统当前状态输出到一个二进制文件中,以供重新开始。二进制储存的好处是,输出快速,能储存部分的系统信息,重启时不需要再次输入。缺点是,二进制文件和系统属性相关,即这个机器上输出的二进制文件不一定可以在别的机器上运行,8核运行的程序再用4核跑不一定正确。
二进制文件中可以储存这些信息:
- Units
- system size/shape/boundary
- newton bond
- force field(atom/pair_style/coeff etc.)
- timestep
- comm style/modify
- group
- topology attributes(bonds angles etc.)
- special_bonds and pair_modify
不能储存这些信息:
- newton pair
- fix
- compute
- variable
- region
- neighbor list and neigh_modify
- kspace
- thermodynamic, dump or restart output
这就意味着,如果需要使用restart重启的话,不需要在input中补写系统信息,只需要把一些修正和计算参数补上就好。机制是这样的,很多fix和compute命令会将当前状态储存在restart中,如果重启时input文件中的fix-id和compute-id和之前一致,那么就是用之前的状态进行fix和compute。如果不一致则抛弃之前的状态重新开始新的。
有一些力场参数也不会被储存的,例如从单独文件中读取的many-body或者tabulated potential,还有pair_hybrid,这些也是需要重新指定。手册相关部分都会明确指出这些能不能储存在restart中,请明确。
尽管restart看似有种种限制,但是一般情况不需要考虑这么多,而这也是标准的储存状态的方式。借用游戏中的说法,每隔一段时间存档或者经过检查点是一个极好的习惯。
与dump类似,该命令的参数file中可以包括两个通配符。如果使用了“*”符号,该符号会被当前时间步的值代替;如果使用了“%”符号,那么每个处理器都会写一个文件,并且%符号会被处理器的ID代替(从0到P-1)。另外,还会有一个文件,文件名是用“base”代替“%”,其中包含了全局的信息。举例来说,如果使用通配符%,那么会写出的文件有restart.base,restart.0,restart.1,……,resta.P-1。使用这种通配符,会创建更小的文件,对于在并行机器中输出和后续的输入都是一种更快的方式。
写出的重启动文件可以使用命令read_restart读入,从而可以从一个特别的状态重新开始一个模拟。因为重启动文件是二进制的,因此在其他的机器上可能就不可读(二进制文件是依赖于机器的)。在这种情况下,可以使用tools目录下提供的restart2data程序将重启动文件转换为文本式的data file格式。命令read_restart和工具restart2data都可以读入由通配符%指定而输出的文件。
再次强调:尽管重启动文件的目的是要从写入重启动文件的位置开始一个模拟,但对一个模拟而言,并不是所有的信息都会存储在重启动文件中。
# restart
restart命令可以周期性地输出二进制储存文件,相当于每个多少步设置一个checkpoint:
restart N file keyword value ...
2
- N 指每隔多少步输出一次
- file 输出文件的文件名
- kw 和 v 可选,请自行查询手册
# write_restart
write_restart 和 restart的唯一区别是,restart是周期性输出,而write_restart只写一次。因此两个命令几乎有着相同的格式。
# data储存
二进制储存其实最大的问题在于它不通用。如果想在别的机器上运行,必须先在本机上先通过命令行参数-restart2data转换成data文件才可以。因此我们可以认为这种储存方式只能短期地知根知底地使用。
但是data文件不一样,它是显式地以文本储存,拿到哪都可以使用。但是它输出会更慢一些,所以没有周期性输出这样的功能。
# write_data
write_data file keyword value ...
当file名中出现"*"通配符时,在输出的时候会被替换成当前的步数,再次重启时如有需要,可以用reset_timestep (opens new window)重新设定。
虽然write_data可以输出一些力场参数,但是强烈建议在keyword 中使用nocoeff 和 nofix取消。原因在于,由于机制限制,很多的力场参数不会被储存,因此每一次仍需要重新设置。所以建议不要输出这些冗杂信息,每次都当作一次新的模拟,清清爽爽地开始。
# 重启
针对这两个命令,没有什么太多变化可言。同样可以参照手册来确定那些不常用的细节和限制。
如果要重启二进制文件,请使用read_restart,如果要重启data文件,请使用read_data.