lammps中的流程控制:循环与条件判断
在lammps中,通过循环与条件判断,我们能够实现更复杂的分子模拟。
1. 循环
1.1 label
与jump
label 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
与 next
variable 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"