- lammps中的流程控制:循环与条件判断
- 1. 循环
- 1.1 `label`与`jump`
- 脚本
- 结果
- 1.2 `variable loop` 与 `next`
- 脚本
- 结果
- 2. 条件判断
在lammps中,通过循环与条件判断,我们能够实现更复杂的分子模拟。
1. 循环 1.1 label与jumplabel command — LAMMPS官方文档
label命令表示用指定的id对输入脚本的某一行进行标记
# 语法 label id # 示例1,对该行进行标记,id为loop_start,表示循环的开始 label loop_start
单独的label命令是不起作用的,必须和jump命令联用
jump command — LAMMPS官方文档
jump命令表示关闭当前输入脚本,并且打开指定的输入脚本,跳转到指定的命令行
# 语法 jump file label # 示例1,关闭当前输入脚本,并打开名为file1.in的输入脚本,并且从头开始执行命令 jump file1.in # 示例2,关闭当前输入脚本,并打开名为file1.in的输入脚本,并且从loop_start行开始执行命令 jump file1.in loop_start # 示例3,关闭当前输入脚本,并重新打开当前输入脚本,并且从loop_start行开始执行命令 jump SELF loop_start
label和jump命令组合实现循环
脚本print "循环体前" label loop_start print "循环体" jump SELF loop_start print "循环体外"结果
这个脚本的输出结果就是
循环体前 循环体 循环体 循环体 ......
上述循环是一个死循环,永远不会终止,"循环体外"不会被打印出来,要终止循环还需要使用『循环变量』
1.2 variable loop 与 nextvariable command — LAMMPS官方文档
jump command — LAMMPS官方文档
varilable loop命令是variable的一个子命令,可以用来定义一个循环变量.
next命令与varilable loop命令联用,表示让当前变量取下一个值.
# 示例,定义了一个循环变量a,a的值从1到3变化,并打印
variable a loop 3
print "a = ${a}"
next a
print "a = ${a}"
next a
print "a = ${a}"
结果:
此外,next命令还有个特性,当a取到最后一个值的时候,next会忽略下一个遇到的jump命令,这样就可以起到终止循环的作用。
label、jump、variable loop、next命令组合实现循环
脚本print "循环前"
variable a loop 5
label loop_start
print "循环体"
print "a = ${a}"
next a
jump SELF loop_start
print "循环后"
结果
2. 条件判断
if command — LAMMPS官方文档
条件判断使用if命令,类似于C语言
# 语法
if boolean then t1 t2 ... elif boolean f1 f2 ... elif boolean f1 f2 ... else e1 e2 ...
# 示例1,判断a、b大小
variable a equal 4
variable b equal 3
if "${a} > ${b}" then "print 'a > b'" &
elif "${a} == ${b}" "print 'a = b'" &
else "print 'a < b'"
在使用if命令时要注意
- if命令换行时要使用&行连续符进行连接
- 要执行的命令必须用 " " 包裹,如果命令本身也含有 " ", 则使用单引号进行嵌套,如 "print 'a > b'"
- 只有if后面接命令时需要用then,elif和else不需要
if命令也可以用于跳出循环,下面是官网的示例
variable myTemp equal temp # 定义一个变量,值为系统温度
label loop # 循环入口
variable a loop 1000 # 定义一个循环变量
run 1000 # 执行模拟,一次循环中运算1000个时间步
if "${myTemp} < 300.0" then "jump SELF break" # 当温度达到300K时,跳转到break标签
next a # a自增,当a没有下一个值可取时,忽略下一条jump命令
jump SELF loop # 跳转到循环入口
label break # 循环出口
print "ALL DONE"



