LAMMPS 输入文件
LAMMPS 输入文件
介绍
in 文件结构:5.3. Input script structure — LAMMPS documentation
- 初始化(Initialization)
- 系统定义(System definition)
- 模拟设置(System definition)
- 运行模拟(Run a simulation)
一般不建议通过 LAMMPS 的内置命令构建初始结构模型(简单的除外)
#
注释;一行过长时,用&
连接下一行LAMMPS in 文件比较好的注释写法
1 | # --------------------- ATOM DEFINITION --------------------- |
LAMMPS 常用命令
更新 LAMMPS 相关输入参数
- compute
- variable(参考孔老师的 MSD 代码)
- jump
- label
命令类型:5.4. Commands by category — LAMMPS documentation
初始化(Initialization):units、newton
模拟盒子设置(Setup simulation box):boundary、change_box、create_box、dimension、lattice、region
原子设置(Setup atoms):atom_style、create_atoms、delete_atoms、displace_atoms、group、mass、read_data、read_dump、read_restart、replicate、set、velocity
势函数(力场 Force fields):pair_style、pair_coeff、pair_modify、pair_write
Settings:timestep、reset_timestep、neighbor、neigh_modify、min_style、min_modify
fix 和 compute:fix、fix_modify、unfix、compute、compute_modify、uncompute
Actions:minimize、neb
输出(Output):
- 热力学数据输出的频率和格式:thermo、thermo_style、tehrmo_modify、
- 构型/轨迹读取、输出:read_data、write_data、dump、dump_modify
输入脚本控制(Input script control):variable、clear、shell、if、jump、label、next、print
再细化分类
- 蒙特卡洛 MC 相关命令:
fix gcmc
、fix atom/swap
、fix sgcmc
- 蒙特卡洛 MC 相关命令:
5.2. Parsing rules for input scripts — LAMMPS documentation
$()
的作用和""
很像(允许空格的出现),前者是立即计算转换成数值的(所有出现$
的地方都如此),后者不会立即计算print
命令把变量的值输出时,须用$
而不能用引号。因为引号在print
后面时字符串的作用会被强化,而传递参数的作用会被弱化
1 | if 2>1 then "print yes!" |
1 | # 单循环 |
atom_style
定义模拟过程中原子的类型,决定原子包括哪些属性(原子,键角,二面角、电荷等)
必须在建立模拟盒子(
read_data
或read_restart
或create_box
等命令)前使用不同样式对应的原子属性及适用体系: atom-style-attributes - atom_style command — LAMMPS documentation
1 | # 语法 |
boundary
设置模拟盒子的边界条件
f
非周期性边界条件,且是开放性的边界条件(即采用这种边界条件,当有原子运动到盒子以外的区域,该原子便会被系统删除,即丢失原子,但一般情况下 LAMMPS 在运行过程中是不允许丢失原子的,则若想采用该边界条件,需在thermo
命令下添加thermo_modify lost ignore
允许系统丢失原子)
1 | # 语法 |
dimension
- 定义模拟的维度
1 | # 语法 |
newton
- 用来开启或关闭对势或键相互作用中的牛顿第三运动定律
1 | # 语法 |
units
定义模拟过程中使用的物理量的单位制(一般该命令写在输入脚本最开始的位置);使用不当,会导致后期数据处理需要进行繁杂的单位换算
metal
- 质量:g/mol
- 长度:Å
- 时间:ps
- 能量:eV
- 力:eV/Å
- 压强:bars=0.1 MPa
- 温度:K
- 速度:Å/ps
real
- 质量:g/mol
- 长度:Å
- 时间:fs
- 能量:kcal/mol
- 力:(kcal/mol)/Å
- 压强:atmospheres
- 速度:Å/fs
1 | # 语法 |
read_dump
- (可读取 gzip 格式)
1 |
lattice
定义点阵
改变晶向时,需满足右手定则(不推荐使用 LAMMPS 的内置命令构建特殊晶向的构型,生成的构型不正确)
1 | # 语法 |
region
构建模拟盒子大小、划分模拟区域
默认值:
units lattice
一般
box
这个单词只用于与盒子相关的地方,只选取部分区域时,不要将其定义为box
1 | # 语法 |
create_box
- 定义模型中有几类原子,几类键等
1 | # 语法 |
create_atoms
生成/填充原子
使用该命令之前,模拟盒子必须是存在的(使用
create_box
命令创建),同时晶格也必须已经被定义(使用lattice
命令)
1 | # 语法 |
pair_style
- 势函数类型
1 | # 语法 |
pair_coeff
- 给出势函数中的参数或者数值列表
1 | # 语法 |
pair_modify
- WIP…
pair_write
将原子对间所定义的势函数,以距离作为自变量,将对应的能量和受力写入到文件中
可用于绘制势函数曲线
1 |
neighbor
- 定义近邻列表;只计算与在该原子截断距离内的原子的相互作用;近邻列表就是为了更新每个原子截断距离内的原子位置而设定的
1 | max neighbors/atom: 2000, page size: 100000 |
一个原子能够拥有的最多的近邻原子数量是 2000(默认值)
构建的近邻列表的半径 = 势函数的截断半径 + skin 值
atomonly:表明当前模型中参与计算受力的只有原子, 无键, 角, 二面角
page size 则是表明 LAMMPS 里面存储了多少个近邻对;默认值 100000;page_size 至少大于一个原子的最大的近邻原子数量的 10 倍
需要在内存中记录下每个近邻对中的中心原子和近邻原子的 ID,以便于后续在模拟中使用这些 ID 进行数组索引. 而 page_size 就是 LAMMPS 为存储这些近邻对的原子 ID 而申请的内存空间.
Dangerous builds, 该数值表示的是存在潜在漏算风险的近邻列表的重构次数。在 LAMMPS 中, 若不使用 neighbor_modify 命令进行调整, 近邻列表的构建默认是每运行一步都检查一次近邻列表是否存在需要重构的风险, 若发现存在需要重构的近邻列表, 会延迟运行 10 步之后(非立即重构), 再进行重构近邻列表
LAMMPS 采用的判定是否需要重构是非常保守的策略。自从上一次重构近邻列表之后, 一旦有某个原子的位移超过 skin 值的一半, LAMMPS 就判定需要进行邻居列表重构
Dangerous builds 的数量不为 0, 并不意味着模拟中就一定出现了漏算或者错算。但对于一个正确的模拟来说, 无论跑多少步, Dangerous builds 都应该保持为 0。也可使用 neigh_modify every 1 delay 0 check yes
命令, 以稍微增加一些计算量的代价, 确保每次需要更新近邻列表的时候都立即更新, 而不会有任何的延迟
并不是所有的势函数都支持使用 openMP 进行并行, 但是所有的势函数都绝对支持基于 MPI 的并行
此命令设置影响 pairwise neighbor lists 构建的参数。所有原子对的 neighbor cutoff 距离等于其力截止加上 skin 距离,都存储在列表中。通常,skin 距离越大,需要构建的 neighbor lists 就越少,但每个时间步都必须检查更多的对以确定可能的力相互作用。skin 的默认值取决于模拟的单位选择;请参见下面的默认值。
style 的值表示选择构建近邻列表的算法。bin style 通过 binning 创建列表,binning 是一种与 N/P(每个处理器的原子数)线性缩放的操作,其中 N=原子总数,P=处理器数 (processors)。它几乎总是比缩放为 (N/P)^2 的 nsq style 快。
默认值:2.0 bin for units = real or metal, skin = 2.0 Angstroms
1 | # 语法 |
neigh_modify
设置近邻列表构建和使用的参数;一次模拟可能需要多个近邻列表
every, delay, check, and once选项影响模拟运行时生成列表的频率。delay设置意味着在上一次构建之后至少 N 个步骤之前从不构建新列表。every设置意味着每 M 步尝试构建列表(after the delay has passed)。如果check设置为 no,则在满足延迟和每个设置的第一步上构建列表。如果check设置为 yes,则every和delay设置将确定何时可能执行构建,但只有在自上次邻居列表构建以来至少有一个原子移动了超过 neighbor skin 距离(在 neighbor 命令中指定)一半的情况下,才会进行实际构建
once
只在开始运行时构建一次近邻列表,并且从不重新构建,除非在写入 restart 文件时,或使用 fix 相关命令(如 fix deposit、fix evaporate)。检查是否应该重构近邻列表耗时很少默认值:delay=0, every=1, check=yes, once=no, page=100000, one=2000, binsize=0.0
1 | # 语法 |
group
对原子进行分组;group-ID 可被用于 velocity、fix、compute、dump 等命令中(最多支持 32 个 group)
即使不对原子进行分组,LAMMPS 也会设置一个默认的
all
group-ID,即将所有的原子全部划分到 all 组内
1 | # 语法 |
mass
- 设置原子类型的相对原子质量;只有在模拟盒子定义后,才能使用该命令
1 | mass 1 26.982 # Al |
timestep
设置模拟时间步长
默认值:1 fs (real)、0.001 ps (metal;即 1 fs)
1 | timestep 0.001 |
velocity
- 设置或改变原子的速度
1 | # 语法 |
run
- 设置模拟运行步数
1 | run 0 # 只计算系统的热力学量并输出 |
thermo
- 输出热力学信息频率
1 | thermo 0 # 默认值 |
thermo_style
设置输出的热力学数据参量(格式):
- LAMMPS 预定义的一些关键字(如 press、etotal 等)所代表的参量
- 由 compute、fix 或 variable 三个命令所得到的参量值,具体可通过
c_ID
、f_ID
或v_name
关键字引用(必须是全局量)
热力学输出量既可以是“广度量”也可以是“强度量”。前者与系统中的原子数成比例,如体系总能,而后者则与系统中的原子数无关,如体系温度。thermo_modify 命令的
norm
参数用以决定是否对广度量进行归一化操作。compute 和 fix 命令既可以产生广度量也可以产生强度量。variable 命令的类型为equal
时仅能产生强度量值,若需要将此时的强度量值转变为广度量值,可通过在公式中除原子数(natoms)的方式得到若通过 fix ave/time 做时间平均,可用
f_ID
来输出相应的平均数据
1 | # 语法 |
thermo_modify
1 | thermo_style custom step vol temp etotal pe press |
min_style
- 能量最小化算法
1 | # 语法 |
min_modify
- 设置能量最小化算法的参数;不同的设置参数会影响收敛速率和能量最小化过程中需要计算力的次数
1 | # 语法 |
minimize
- 能量最小化
1 | # 语法 |
- 能量最小化结束后,程序会打印一段统计摘要信息,介绍满足了何种收敛判据,以及能量、受力、最终的线性搜索和迭代次数等
1 | Minimization stats: |
set
- 设置原子类型
1 | # 语法 |
variable
variable 引用(variable references):
v_ID
1 | # 语法 |
dump
设置输出原子构型信息
- LAMMPS 预定义的一些关键字(如 id、x、fx 等)所代表的参量
- 由 compute、fix 或 variable 三个命令所得到的参量值,具体可通过
c_ID
、f_ID
或v_name
关键字引用(必须是 per-atom 量,与 thermo_style 命令相反)
1 | # 语法 |
dump_modify
修改 dump 命令的预定义参数
dump 通常输出的结果是无序的,可通过
dump_modify sort
修正由于是并行计算,系统中的粒子被分配给各个核心,因此取回时会发现有些原子略微超出了盒子边界。这通常来说不要紧,如果非常在意,可通过
dump_modify strict
修正由于是每多少步进行一次,默认第一步是不进行输出的,只会输出 minimize 的最后一步和后面的周期。可通过
dump_modify first
修正
1 | # 语法 |
undump
- 关闭先前定义的 dump,使其不再处于活动状态。这将关闭与 dump 关联的文件。
1 | undump 1 |
fix
给原子施加约束;
fix
是在时间步进或最小化期间应用于系统的任何操作;可能是在时间积分的过程中更新原子的位置和速度,或是控制温度,或是给原子施加约束力,或是强制某种边界条件,或计算过程诊断,等等fix 的 style 有很多,且大多是单独的命令
fix 引用(compute references):
f_ID
1 | # 语法 |
fix setforce
1 | fix ID group-ID setforce fx fy fz keyword value ... |
fix nve
执行普通 (plain) 时间积分,以在每个时间步更新组中原子的位置和速度。这创建了与微正则系综(NVE)一致的系统轨迹,前提是存在(完全)周期性边界条件,并且没有系统的其他 “操纵”(例如,修改力或速度的固定)
时间积分采用 Verlet 算法
1 | fix ID group-ID nve |
fix nvt/npt/nph
LAMMPS中的系综(NPT/NVT)命令(只是对官网的翻译)
这些命令用来对 Nose-Hoover 型的 non-Hamiltonian 运动方程进行时间积分。该运动方程用以从正则系综(NVT)、等温等压系综(NPT)、等焓系综(NPH)采样生成原子的位置和速度,从而对所定义的 group 内的原子在每一个时间步进行位置和速度的更新
Nose-Hoover 控温 Tdamp(温度阻尼系数) 建议值 100*dt、控压 Pdamp(压强阻尼系数) 建议值 1000*dt(metal 单位制下,timestep 取 0.001,即 1 fs 时,对应的 Tdamp=0.1、Pdamp=1.0)
温度、压强不是保持不变,而是会有振荡,振幅与 Tdamp、Pdamp 有关
使用 npt 时必须保证在至少一个方向上控压,且这个方向的边界条件必须是 p
iso
1 | # 语法 |
fix box/relax
在能量最小化过程中对模拟盒子施加外部压力或应力张量。这样就可以在最小化迭代过程中改变模拟盒子的大小和形状,使最终构型既是原子势能的能量最小值,又使系统压力张量接近指定的外部张量。从概念上讲,指定正压 – 挤压模拟盒子,负压通常允许模拟盒子膨胀
正交盒子有 3 个自由度(x、y、z),三斜/非正交盒子有 6 个自由度(x、y、z、xy、yz、xz)
iso
表示根据静水压(压强张量对角分量的平均值)控制三个盒子矢量的长度,且按同一比例缩放(x、y、z 三个方向同时耦合控压)aniso
表示根据静水压控制三个盒子矢量的长度,但允许独立变化(x、y、z 三个方向各自独立控压,不进行耦合)tri
表示根据静水压控制所有盒子自由度,且允许独立变化vmax
用于限制能量最小化一次迭代中盒子体积的变化分数。若在最小化过程中压力没有稳定下来,可能是因为体积波动太大默认值:vmax=0.0001
1 | # 语法 |
fix deform
1 | # 语法 |
unfix
- 删除之前使用
fix
命令定义的约束;也会删除使用fix_modify
命令对该约束所进行的修改
1 | # 语法 |
delete_atoms
删除原子
删除原子后,原子 ID 不连续,使用
compress yes
可对 ID 序号进行压缩,即重新排序,产生连续的原子 ID。默认设置:compress=yes, bond=no, mol=no
1 | # 语法 |
displace_atoms
- 移动原子位置、旋转
1 | # 语法 |
change_box
- 改变盒子的体积/形状/边界条件
1 | # 语法 |
box
- large 表示允许非正交盒子的倾斜系数可以是任意数(tilt factors),默认值为 small
1 | box tilt large |
replicate
- 扩胞
1 | replicate 1 2 3 |
atom_modify
1 | map |
read_data
- 读取 LAMMPS data 构型格式文件(可读取 gzip 格式)
1 | read_data data.lmp |
- LAMMPS data 文件格式:read_data command — LAMMPS documentation
1 | # header |
write_data
将构型保存成 LAMMPS data 格式文件
使用 LAMMPS 内置命令构建模型后,需设置原子类型对应的相对原子质量(或势函数),再使用
write_data
,否则会报错
1 | write_data data.lmp |
read_restart、restart、write_restart
用于重启计算(二进制文件)
体系大,驰豫时间也对应长,在体系驰豫后保存 restart 文件,可直接读取用于后续的模拟过程,无需再进行驰豫,可提高效率
在能量最小化或驰豫阶段,一般只需在驰豫结束保存一个 restart 文件即可
LAMMPS 源码 tools 目录下的 restart2data 工具,可将二进制 restart 文件转换成 LAMMPS data 构型格式文件,以便
read_data
读入restart 文件存储、不会存储的信息:
1 | read_restart restart.equil |
fix print
每 N 步输出文本内容(用于调试)
默认选项:无文件输出,screen=yes,输出文件中的标题行 title string(# 号是自带的)
# Fix print output for fix-ID
1 | # 语法 |
fix_modify
1 |
fix atom/swap
- 执行 Monte Carlo 原子交换;需安装 MC package
1 | # 语法 |
fix sgcmc
运行 parallel hybrid molecular dynamics/Monte Carlo (MD/MC) 模拟
LAMMPS 示例代码路径
examples/mc/in.sgcmc.eam
1 | # 语法 |
jump
关闭当前输入脚本文件,打开命令中文件名所指定的文件,并从那个文件开始读入 LAMMPS 命令;与命令
include
不同的是,LAMMPS 不会再返回到之前的输入文件了SELF
含义:重新打开当前 in 文件并再次读取
1 | # 语法 |
label
- 设置标签
1 |
clear
用来删除所有的原子、将所有的设置都设为默认值,并释放 LAMMPS 分配的所有内存
该命令可以让你在一个输入脚本中顺序运行多个作业
工作目录(命令
shell
)、日志文件状态(命令log
)、echo 状态(命令echo
)以及输入脚本中的变量(命令variable
)不受clear
影响
1 | (commands for 1st simulation) |
next
- 该命令需要与使用命令
variable
定义的变量同时使用,用来从为该变量定义的一些列值中将下一个值赋给变量。在使用该命令之后,变量就是一个新值
1 | # 语法 |
if
- 在输入文件中提供 if-then-else 功能
1 | # 语法 |
- 打印文本字符串到屏幕和日志文件
1 | # 语法 |
shell
- 执行 Shell 命令
1 | # 语法 |
compute
为 group 原子定义一种计算
style 中含有 “atom”,为单原子量;含有 “local”,为局域量;不包含前两者,为全局量
compute 引用(compute references):
c_ID
计算出的量是瞬时值,也就是说它们只是原子在当前时间步或迭代步的信息。当然,compute 命令也可以在内部保存体系在之前一个状态的某些信息
定义 compute 命令的时候并不会执行计算。真正的计算过程是被其他 LAMMPS 命令激活的,比如某些 fix 命令需要计算温度的时候,或这需要产生热力学信息的时候,或者需要 dump 输出到文件中的时候
1 | # 语法 |
- 一些单独的 compute 命令
1 | compute pressure # 整体压强 |
compute_modify
- 用来修改过之前定义过的
compute
命令的一个或多个参数
1 | # 语法 |
uncompute
- WIP…
compute rdf
1 | compute ID group-ID rdf Nbin itype1 jtype1 itype2 jtype2 ... keyword/value ... |
compute msd
1 | compute ID group-ID msd keyword values ... |
neb
WIP…