LAMMPS 输入文件
LAMMPS 输入文件
in 文件结构:5.3. Input script structure — LAMMPS documentation
- 初始化(Initialization)
- 系统定义(System definition)
- 模拟设置(System definition)
- 运行模拟(Run a simulation)
一般不建议通过 LAMMPS 的内置命令构建初始结构模型(简单的除外)
#
注释;一行过长时,用&
连接下一行LAMMPS in 文件比较好的注释写法
1 | # --------------------- ATOM DEFINITION --------------------- |
1 | # 最小化过程中控制最大移动距离 |
LAMMPS 常用命令
更新 LAMMPS 相关输入参数
- lattice
- create_box
- create_atoms
- atom_style
- units
- compute
- variable(参考孔老师的 MSD 代码)
- jump
- label
Command 类型:5.4. Commands by category — LAMMPS documentation
初始化(Initialization):units、newton
box 设置(Setup simulation box):boundary、change_box、create_box、dimension、lattice、region
原子设置(Setup atoms):atom_style、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 相关命令:
-
$()
的作用和""
很像(允许空格的出现),前者是立即计算转换成数值的(所有出现$
的地方都如此),后者不会立即计算print
命令把变量的值输出时,须用$
而不能用引号。因为引号在print
后面时字符串的作用会被强化,而传递参数的作用会被弱化
1 | if 2>1 then "print yes!" |
1 | # 单循环 |
atom_style
定义模拟过程中原子的类型,决定原子包括哪些属性(原子,键角,二面角、电荷等)
须在建立 simulaiton box(
read_data
或read_restart
或create_box
等命令)前使用不同样式对应的原子属性及适用体系: atom-style-attributes - atom_style command — LAMMPS documentation
默认值:atomic(典型物理体系:金属、固体、atomic liquids)
1 | # 语法 |
boundary
- 用来设置模拟盒子的边界条件
1 | # 语法 |
dimension
定义模拟的维度
默认值:3
1 | # 语法 |
newton
- 用来开启或关闭对势或键相互作用中的第三运动定律
1 | # 语法 |
units
用来定义模拟过程中使用的单位类型(单位制),它决定了所有输入脚本、数据文件和所有输出到屏幕、日志文件以及 dump 文件中物理量的单位;一般来说,该命令用在输入脚本最开始的位置
使用不当,会导致后期数据处理需要进行繁杂的单位换算
eam、tersoff 势函数,使用
units metal
默认值:lj
metal
- 质量:g/mol
- 长度:Å
- 时间:ps
- 能量:eV
- 力:eV/Å
- 应力:bars
- 温度:K
- 速度:Å/ps
real
- 质量:g/mol
- 长度:Å
- 时间:fs
- 能量:kcal/mol
- 力:(kcal/mol)/Å
- 应力:atmospheres
- 速度:Å/fs
1 | # 语法 |
read_data
- 读取 LAMMPS data 构型格式文件(可读取 gzip 格式)
1 | # 语法 |
- LAMMPS data 文件格式:read_data command — LAMMPS documentation
1 | # header |
write_data
写出 LAMMPS data 构型格式文件
使用 LAMMPS 内置命令构建模型后,需设置原子类型对应的相对原子质量(也可势函数),再使用
write_data
,否则会报错
1 | # 语法 |
read_restart
用来读入之前的模拟过程保存下的重启动文件;可以帮助你实现接着之前的模拟过程继续进行
这些重启动文件一般来说是不能拷贝到其他的机器使用的,但你可以使用工具
restart2data
将其转换成文本文件
1 | # 语法 |
read_dump
- (可读取 gzip 格式)
1 |
lattice
定义晶格类型,晶格常数,以及晶向方向
默认值
orient x 1 0 0 orient y 0 1 0 orient z 0 0 1
;改变晶向时,需满足右手定则(不推荐使用 LAMMPS 的内置命令构建特殊晶向的构型,生成的构型不正确)
1 | # 语法 |
region
用来构建拟盒子大小以及划分模拟区域(用于定义一个空间几何区域)
默认值:
units lattice
一般
box
这个单词只用于与盒子相关的地方,只选取部分区域时,不要将其定义为box
1 | # 语法 |
create_box
- 定义模型中有几类原子,几类键等
1 | # 语法 |
creat_atoms
在晶格阵点上创建原子,或创建一个单独的原子,或创建一些列随机原子(往模型中添加原子)
使用该命令之前,模拟盒子必须是存在的(使用
create_box
命令创建),同时晶格也必须已经被定义(使用lattice
命令)
1 | # 语法 |
- box 类型:该命令在整个模拟盒子中所有的晶格阵点上创建原子
pair_style
- 势函数类型
1 | # 语法 |
pair_coeff
- 给出势函数中的参数或者数值列表
1 | # 语法 |
pair_modify
- WIP…
pair_write
将原子对间所定义的势函数,以距离作为自变量,将对应的能量和受力写入到文件中
可用于绘制势函数曲线
1 |
neighbor
此命令设置影响 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 | neighbor skin style |
neigh_modify
设置影响成对近邻列表建立和使用的参数;一次模拟可能需要多个近邻列表
默认值:delay = 0, every = 1, check = yes, once = no, cluster = no, include = all (same as no include option defined), exclude = none, page = 100000, one = 2000, and binsize = 0.0.
此命令设置影响 pairwise neighbor lists 的生成和使用的参数。根据定义的对相互作用和其他命令,模拟可能需要一个或多个邻居列表。
every, delay, check, and once选项影响模拟运行时生成列表的频率。delay设置意味着在上一次构建之后至少 N 个步骤之前从不构建新列表。every设置意味着每 M 步尝试构建列表(after the delay has passed)。如果check设置为 no,则在满足延迟和每个设置的第一步上构建列表。如果check设置为 yes,则every和delay设置将确定何时可能执行构建,但只有在自上次邻居列表构建以来至少有一个原子移动了超过 neighbor skin 距离(在 neighbor 命令中指定)一半的情况下,才会进行实际构建。
如果once设置为 yes,则 neighbor lists 仅在每次运行开始时构建一次,并且从不重新构建,除非在写入重新启动文件时执行步骤,或在修复强制进行重建时执行步骤(例如,创建或删除原子的修复,如 fix deposit or fix evaporate)。只有当您确定原子移动的距离不够远,无法重建 neighbor lists 时,才能进行此设置,例如运行冷晶体模拟。请注意,检查是否应该重建邻居列表并不昂贵。
1 | # 语法 |
group
- 确定一组原子属于一个组;可以在其他命令(如 fix compute dump velocity)使用 group ID,以共同作用于这些原子;若 group ID 已存在,group 命令将指定的原子添加到 group 中
1 | # 语法 |
mass
为原子类型设置相对原子质量
只有在模拟盒子定义后,才能使用该命令
1 | # 语法 |
timestep
- 设置模拟时间步长
1 | # 语法 |
velocity
- 设置或改变原子的速度
1 | # 语法 |
run
- 设置模拟运行步数
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)一致的系统轨迹,前提是存在(完全)周期性边界条件,并且没有系统的其他 “操纵 “(例如,修改力或速度的固定)
1 | fix ID group-ID nve |
fix nvt/npt/nph
- 用 Nose-Hoover 方法对时间积分,生成位置和速度
1 | # 语法 |
- fix nvt,温度不是保持不变,而是会有振荡(波动),振幅与 Tdamp 有关
fix box/relax
1 | fix ID group-ID box/relax keyword value ... |
在能量最小化期间,将外部压力或应力张量应用于模拟盒。这允许盒子的大小和形状在最小化器的迭代过程中变化,从而最终构型将是原子势能的能量最小值,并且系统压力张量将接近指定的外部张量。从概念上讲,指定正压力就像挤压模拟盒;负压通常允许盒子膨胀。
外部压力张量用iso, aniso, tri, x, y, z, xy, xz, yz, and couple关键词。这些关键字使您能够指定外部应力张量的所有 6 个分量,并将这些分量耦合在一起,以便在最小化过程中与它们所表示的尺寸一起变化。
应力张量的 6 个分量中的每一个的目标压力 Ptarget 可以通过 x、y、z、xy、xz、yz 关键字独立指定,这些关键字对应于 6 个模拟盒维度。例如,如果使用 y 关键字,则在最小化期间 y 框长度将发生变化。如果使用 xy 关键字,xy 倾斜因子将更改。如果未指定该组件,长方体尺寸将不会更改。
关键字 iso 表示在计算压力(静水压力)时将所有三个对角分量连接在一起,并将尺寸放大/缩小在一起。value = Ptarget
关键词 aniso 意味着 x、y 和 z 维度是使用应力张量的 Pxx、Pyy 和 Pzz 分量作为驱动力和指定的标量外部压力独立控制的。
vmax 关键字可用于限制在最小化器的一次迭代中可能发生的模拟盒体积的分数变化。如果在最小化期间压力没有稳定下来,这可能是因为体积波动太大。指定的分数必须大于 0.0,且应小于 1.0。值 0.001 表示当指定了 xyz 对时,体积在一次迭代中的变化不能超过 1/10。对于任何其他情况,这意味着模拟框的线性尺寸变化都不能超过 1/10。
默认值:dilate = all, vmax = 0.0001, nreset = 0
fix print
- 每 N 步输出文本内容(用于调试)
1 | # 语法 |
fix_modify
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 | # 语法 |
unfix
- 删除之前使用
fix
命令定义的约束;也会删除使用fix_modify
命令对该约束所进行的修改
1 | # 语法 |
compute
为 group 原子定义一种计算
compute 引用(compute references):
c_ID
计算出的量是瞬时值,也就是说它们只是原子在当前时间步或迭代步的信息。当然,compute 命令也可以在内部保存体系在之前一个状态的某些信息
定义 compute 命令的时候并不会执行计算。真正的计算过程是被其他 LAMMPS 命令激活的,比如某些 fix 命令需要计算温度的时候,或这需要产生热力学信息的时候,或者需要 dump 输出到文件中的时候
1 | # 语法 |
- style 中含有 “atom”,为单原子量;含有 “local”,为局域量;不包含前两者,为全局量
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 ... |
dump
输出原子构型信息
custom style 中的参数:c_ID/c_ID[I] = 允许输出由 compute 计算的每原子向量或数组 (per-atom vectors or arrays),这里 ID 应替换为先前在 in 文件中定义的计算的实际 ID(ID 类似于一种变量)
1 | # 语法 |
dump_modify
1 | # 语法 |
- keyword 为 sort 时:off 表示通常以不确定的顺序(串行或并行)写入;sort 的值为 id 时,表示通过原子 ID 对输出进行排序;N 或−N 表示按每个原子信息的第 N 列中的值按升序或降序对输出进行排序
undump
- 关闭先前定义的 dump,使其不再处于活动状态。这将关闭与 dump 关联的文件。
1 | undump dump-ID |
thermo
- 输出热力学信息(如温度、能量、压强);可以是变量
1 | # 语法 |
thermo_style
- 设置输出的热力学信息内容
1 | # 语法 |
start
write_restart
delete_atoms
- 删除原子
1 | # 语法 |
如果 compress 关键字设置为 yes,那么在原子被删除后,原子 ID 将被重新分配,以便从 1 到系统中的原子数。请注意,对于分子系统(请参见 atom_style 命令),无论压缩设置如何,都不会这样做,因为这会破坏已指定的键连接。但是,reset_atom_ids 命令可以在该命令之后使用,以完成相同的任务。
默认设置是:compress = yes, bond = no, mol = no
displace_atoms
- 移动原子位置
1 | ``` |
min_modify
- 设置所选择的能量最小化算法的参数;不同的设置参数会影响收敛速率和能量最小化过程中需要计算力的次数
1 | # 语法 |
minimize
- 能量最小化
1 | # 语法 |
- 能量最小化结束后,程序会打印一段统计摘要信息,介绍满足了何种收敛判据,以及能量、受力、最终的线性搜索和迭代次数等
1 | Minimization stats: |
neb
temper
set
- 设置原子性质
1 | # 语法 |
variable
variable 引用(variable references):
v_ID
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 | # 语法 |