LAMMPS / 报错速查

LAMMPS 常见报错与解决:Lost atoms、Out of range、Too many neighbor bins、NaN

本文按“报错原文 → 真实原因 → 先查什么 → 怎么改”整理了 20 余条 LAMMPS 报错,包括运行期的动力学报错、data 文件报错、编译与包缺失、Windows 和 MPI 报错,以及不报错但结果异常的情况。命令和默认值按 LAMMPS 22Jul2025 stable 版核对。

直接答案

LAMMPS 运行中的 Lost atoms、Out of range atoms - cannot compute PPPM、Bond atoms missing、Non-numeric pressure 和 -nan,绝大多数是同一个问题:原子在一步内移动过远,根源通常是初始重叠、时间步过大、单位或力场参数错误。排查顺序是:把 thermo 间隔降到 10 以内找到异常起点,用 minimize 消除近距接触,核对 units 与势函数单位,再调整时间步和邻居列表。Unrecognized pair style 是编译时没装对应的包,用 lmp -h 确认;Windows 上的 job aborted 只是 MPI 汇总信息,真正原因在 LAMMPS 自己的 ERROR 行。

速查

“官方解释”一列是报错末尾 For more information see 之后的地址,可直接打开。本页实测:表中前 18 条都用 conda-forge 的 LAMMPS 22Jul2025 update6(macOS arm64,CPU 版)构造小输入实际触发过,报错原文和 err 编号与表中一致;最后 4 条(MS-MPI、msmpi.dll、make 与 GPU)依赖本机没有的环境,没有复现。

报错原文最常见的真实原因最先检查什么官方解释
ERROR: Lost atoms: original N current M原子单步位移过大:初始重叠、时间步过大、单位或参数错误、边界设置把 thermo 降到 10,看报错前 PotEng、Press、Temp 从哪一步开始异常docs.lammps.org/err0008
Out of range atoms - cannot compute PPPM带电原子单步移出所在进程的子区域与 skin 范围log 末尾 Dangerous builds 是否非零;第 0 步就报则查重叠docs.lammps.org/err0004
Bond atoms X Y missing on proc P at step S成键原子间距超过通信截断,多数情况是体系已经炸开报错前的温度和压力;pair 截断是否很短(例如纯排斥 LJ)docs.lammps.org/err0005
Non-numeric pressure - simulation unstable(及 atom coords / box dimensions 变体)力溢出为 NaN 或 InfNaN 是否在第 0 步就出现;delete_atoms overlap 删掉了几个原子docs.lammps.org/err0006
thermo 输出中 Temp、Press 为 nan 或 -nan,但程序没停与上一行相同,LAMMPS 并不总是立即终止同上;改用双精度 GPU 设置复跑Errors_details 中 Pressure, forces, positions becoming NaN or Inf 一节
Too many neighbor bins盒子膨胀过大,或最大截断过小thermo 中加入 lx ly lz,看盒子尺寸是否在快速增长docs.lammps.org/err0009
Domain too large for neighbor bins个别原子被甩出很远(s 边界),或 fix deform、控压把盒子撑得过大边界是否为 s;fix deform 的速率与单位docs.lammps.org/err0017
Cannot use neighbor bins - box size << cutoff某一维盒长远小于截断,常见于薄层体系最薄方向的盒长与 pair 截断docs.lammps.org/err0015
Neighbor list overflow, boost neigh_modify one单原子邻居数超过 one(默认 2000);也可能是盒子写错导致密度虚高盒子尺寸是否正确;data 文件是否误用分数坐标docs.lammps.org/err0036
Did not assign all atoms correctly非周期边界下 data 文件中有原子落在盒子外xlo xhi / ylo yhi / zlo zhi 是否包住全部坐标docs.lammps.org/err0016
Invalid atom ID in Bonds section of data fileBonds 引用的原子 ID ≤ 0、大于最大 ID,或两端是同一原子头部 atoms 数与 Atoms 段行数;转换工具输出的 ID 是否从 1 开始Errors_messages
Incorrect format in Atoms section of data fileatom_style 与 data 文件列数不一致,或头部计数大于实际行数atom_style 与 Atoms 段标题注释(如 # full)是否一致docs.lammps.org/err0002
Unknown identifier in data file头部关键字或段名拼错;或第一行写了头部关键字(第一行固定被当作注释跳过)data 文件第一行;段名大小写docs.lammps.org/err0001
Unrecognized pair style 'xxx' is part of the YYY package which is not enabled in this LAMMPS binary可执行文件编译时没装 YYY 包lmp -h 中的 Installed packagesdocs.lammps.org/err0010
Incorrect args for pair coefficientspair_coeff 格式与 pair_style 不符,例如 eam 与 eam/alloy 混用、hybrid 缺子样式名对照该 pair_style 文档的 pair_coeff 示例docs.lammps.org/err0021
Numeric index X is out of boundspair_coeff、bond_coeff 中的类型号超出 data 文件声明的类型数data 文件头部 atom types、bond typesdocs.lammps.org/err0019
XXX command before / after simulation box is defined命令顺序错误:units、atom_style 必须在 read_data 之前,pair_coeff 必须在之后命令相对 read_data / create_box 的位置docs.lammps.org/err0033、err0034
Substitution for illegal variable多字母变量没写花括号,$cutoff 被解析为 $c改成 ${cutoff}docs.lammps.org/err0013
job aborted: [ranks] message ... abort code 1(MS-MPI)MPI 层的汇总信息,LAMMPS 已因输入错误退出去掉 -screen none,查看 log.lammps 最后一条 ERRORMatSci 论坛帖(见参考资料)
系统提示找不到 msmpi.dll运行的是 MSMPI 版 LAMMPS,但没有安装 MS-MPI 运行时或安装后未重启是否安装 msmpisetup.exe 并重启docs.lammps.org/Run_windows.html
make mpi 时 mpicxx: command not found 或 mpi.h: No such file or directory系统没有 MPI 编译器包装器或开发头文件which mpicxx;没有 MPI 时改用 make serialdocs.lammps.org/Build_basics.html
GPU library not compiled for this acceleratorGPU 库编译的架构或 CUDA 版本与当前显卡、驱动不匹配GPU_ARCH 设置与 nvidia-smi 显示的显卡和驱动版本docs.lammps.org/Build_extras.html
Errors_details 页面里的小节编号(如 5.2.9)与 err 编号(err0008)不一致,以报错中打印的 err 编号为准。

读报错

源码位置:ERROR 行末尾的括号是源文件和行号,例如 (src/thermo.cpp:526)。行号随版本变化,对照源码时必须用同一版本。

ERROR 与 ERROR on proc N:前者是所有进程一致检测到的错误,后者是由单个进程检测并终止的错误,单核运行时也会显示为 ERROR on proc 0(本页实测:Substitution for illegal variable、Neighbor list overflow、Too many neighbor bins 在单核下都是这种格式)。Lost atoms、Out of range、Bond atoms missing 都与区域分解有关,换进程数后报错可能出现或消失。这种情况说明输入本身不稳定,不能当作“换核数就解决了”。

Last input line:多数输入语法错误会打印正在执行的命令。运行期报错(例如 Lost atoms)设置了 NOLASTLINE,不会打印这一行,需要看报错前的 thermo 输出。

并行运行时如果没有任何报错就退出,报错可能还停留在输出缓冲区(4096 或 8192 字节)。加命令行参数 -nb 关闭缓冲后复跑;这个参数会明显拖慢速度,只在排错时使用。

Lost atoms

LAMMPS 默认只在写 thermo 输出的那一步检查原子总数。thermo 设为 1000 时,报出的步数最多比原子真正丢失的时刻晚 999 步,所以第一步是缩小 thermo 间隔。

本页实测(LAMMPS 22Jul2025 update6,CPU 单核):在 864 个原子的 LJ 液体中,距离某个原子约 0.15σ 处再放一个原子,第 0 步势能为 5.2×10⁷,NVE 运行到第一个 thermo 步即报 Lost atoms: original 865 current 863。同一结构先套用上面的 in.debug,最小化后 nve/limit 运行 5000 步、NVE 运行 2000 步都没有报错,Dangerous builds 为 0。把两个原子放在完全相同的位置时,第 0 步的势能为 inf、压力为 nan,fix nve 不会停止运行,温度此后一直是 nan。

thermo_modify lost 有 error(默认)、warn、ignore 三个值。官方文档说明 ignore 只适用于原子本应离开体系的模拟。改成 ignore 后原子数会变化,dcd 等要求原子数恒定的输出格式会报错,统计量也会偏。

同一输入换 LAMMPS 版本后开始 Lost atoms,开发者的解释是原输入本来就处于边缘稳定状态,旧版本恰好没有触发,需要按新问题排查。

in.debug:定位 Lost atoms 的诊断设置lammps
# 诊断用设置:放在 read_data / create_atoms 和力场定义之后、run 之前
thermo          10                      # Lost atoms 只在 thermo 步检查,先缩小间隔
thermo_style    custom step temp pe ke etotal press vol lx ly lz
thermo_modify   lost error norm no      # 保持默认 error,不要改成 ignore
neigh_modify    delay 0 every 1 check yes

# 1) 先最小化,消除近距接触
min_style       cg
minimize        1.0e-4 1.0e-6 1000 10000
reset_timestep  0                       # 必须在定义 dump 之前执行,否则报 Cannot reset timestep with active dump

# 2) 每 10 步记录坐标、速度和力
dump            d1 all custom 10 dump.debug id type x y z vx vy vz fx fy fz
dump_modify     d1 delay 0              # 已知在第 N 步附近出错时,把 0 改成 N-200

# 3) 初始阶段限制单步位移(距离单位;不能与 fix shake 同时使用)
fix             f_lim all nve/limit 0.1
run             5000
unfix           f_lim
检查重叠原子lammps
# 检查是否有重叠原子:在 pair_style / pair_coeff 定义之后执行
# 要求:pair 截断 + neighbor skin >= 0.5(此处距离单位),否则报 Delete_atoms cutoff > max neighbor cutoff
# special_bonds 设为 0 的成键原子对不在邻居列表里,不会被检查
# 只在诊断副本里用,它会真的删掉原子
delete_atoms    overlap 0.5 all all
# 日志中出现 "Deleted N atoms, new total = ...",N > 0 说明结构里有重叠
原因典型信号诊断方法修改方法
初始重叠或近距接触第 0 步势能和压力已经异常大,前几步温度急升delete_atoms overlap 0.5 all all 看删掉几个原子;在 OVITO 中按距离查找近邻先 minimize;或用 fix nve/limit 0.1 跑几千步,再换回 fix nve/nvt
时间步过大温度在前几百步持续上升;NVE 下总能量单向漂移步长减半复跑,报错推迟或消失即可确认按体系取步长:柔性水 0.25 fs,SHAKE 约束含 H 键 1 fs,含 C/O/N 的有机体系约 1 fs
units 写错或参数单位不符能跑几步,但温度、压力数值离谱;日志中有 Changing timestep 警告核对 units 与势函数文件、文献参数所用单位见下文“单位混用”一节
pair_coeff 元素映射错误某两类原子间距异常缩短或互相穿透核对 pair_coeff * * 文件名 之后的元素顺序是否与 data 中类型 1、2…… 对应按类型编号顺序写元素名,不用的类型写 NULL(hybrid 时)
边界条件f 边界下原子从表面飞出;大盒子配 s 边界时第一步盒子塌缩确认丢失的原子是否本该离开体系溅射、蒸发类模拟改用 thermo_modify lost warn;s 改为 m 边界
壁势太靠近盒子边缘靠近 fix wall 的原子速度异常dump 中查看丢失原子所在位置论坛案例中改用 fix wall/reflect 后解决
fix deform 速率过大或单位换算错误thermo 中 lx 每步变化很大,伴随温度上升把 erate 换算成 1/s 核对:metal 下 erate 0.001 即 1e9 s⁻¹降低应变率;确认 units box 或 lattice
控温控压阻尼过小温度或体积大幅振荡Tdamp、Pdamp 换算成步数Tdamp 约 100 步、Pdamp 约 1000 步,可写成 $(100.0*dt)、$(1000.0*dt)

PPPM 与成键

PPPM 把每个电荷分摊到周围若干网格点上。并行时每个进程只持有自己子区域加 skin 范围内的网格。原子在一次邻居列表重建之前移出这个范围,就会报 Out of range atoms - cannot compute PPPM。这里的“范围”是子区域,单核运行时才等于整个盒子,所以加大盒子不能解决这个报错。

中文社区流传较广的经验做法(CSDN、知乎同一作者的 PPPM 排错文章)分两种情况:原子速度不高时,用 neigh_modify delay 0 every 1 check yes 提高重建频率即可;原子受力很大、速度很高时,要同时减小时间步(文中用到 0.1 fs)并回头检查建模和力场参数;建模优化初期可以先不用 PPPM。这套做法与官方解释一致,前提是先确认没有重叠原子,否则减小步长只会推迟报错。

本页实测(同一版本,4 个 MPI 进程):在 30 Å 立方盒子中随机放 800 个 ±1 电荷原子(存在严重重叠),pair_style lj/cut/coul/long 10.0 加 pppm 1.0e-4。设 neigh_modify delay 10 every 10 check no 时报 Out of range atoms - cannot compute PPPM;用默认重建设置时同一结构改报 Lost atoms;换成下面的保守设置(skin 3.0 Å、0.5 fs)仍然报 Lost atoms;先 minimize 再运行则正常。这说明保守设置只解决重建过晚的问题,结构里有重叠时必须先最小化。

同一输入在 Windows 能跑、在 Linux 报错,通常是 FFT 网格或区域分解不同,原因仍是体系中存在高能构型。

Bond atoms missing 表示成键的另一个原子不在通信截断范围内。默认通信截断等于 pair 截断加 skin。纯排斥 LJ 等截断很短的力场,或 pair_style none,需要用 comm_modify cutoff 加大通信截断;体系已经炸开时加大截断无效。

本页实测:成键两原子相距 10 Å、pair 截断 2.0 Å、skin 0.5 Å、2 个进程时,在运行开始前就报 Bond atom missing in image check(err0014);加 comm_modify cutoff 12.0 后正常运行。两个成键原子在运行中被拉开时,报的是 Bond atoms 1 2 missing on proc 0 at step 4(err0005)。

log.lammps 末尾:判断邻居列表是否重建过晚text
# 每次 run 结束时 log.lammps 末尾的邻居列表统计
Neighbor list builds = 1229
Dangerous builds = 0        # 非零:原子在重建前已移动超过半个 skin,提高重建频率或加大 skin
保守设置lammps
# Out of range atoms / Bond atoms missing 的保守设置(real 或 metal 单位)
neighbor        3.0 bin                 # skin 从默认 2.0 Å 加到 3.0 Å
neigh_modify    delay 0 every 1 check yes
timestep        0.5                     # real 单位 0.5 fs;SHAKE 约束含 H 键后再回到 1-2 fs

# 平衡初期先用截断库仑,体系稳定后再切回 long + pppm
# pair_style    lj/cut/coul/cut 10.0
# (不写 kspace_style)
设置(real 单位,1 fs 基准)Neighbor list buildsDangerous builds相对耗时
delay 10,skin 2.0 Å,1.0 fs100010001.00×
delay 0,skin 2.0 Å,1.0 fs122901.04×
delay 10,skin 3.0 Å,1.0 fs61701.00×
delay 10,skin 2.0 Å,0.5 fs125201.84×
MatSci 论坛用户对一个 OpenFF 体系做的 10 ps 测试(帖子 45169)。加大 skin 几乎不增加耗时,减半时间步耗时接近翻倍。

邻居列表

Too many neighbor bins

bin 边长默认是最大 pair 截断的一半。盒子膨胀到 bin 数超出整型上限时报错。最常见的是体系炸开后盒子随之变大,先在 thermo 中输出 lx ly lz 确认。截断确实很小时,可用 neigh_modify binsize 加大 bin。当前开发版文档中的 neigh_modify bin/hash 在 22Jul2025 stable 中不存在,本页实测会报 Unknown neigh_modify keyword: bin/hash。

Domain too large for neighbor bins

个别原子被甩出很远,s 边界会把盒子跟着撑大;fix deform 或控压也可能把盒子拉得过大。先查报错前的原子速度和盒子尺寸,再查 fix deform 的速率。

Cannot use neighbor bins - box size << cutoff

某一维盒长远小于截断,常见于单层或薄膜体系。加大该方向盒长(真空层),或改用 neighbor 2.0 nsq;nsq 更慢。

Neighbor list overflow, boost neigh_modify one

默认 one 为 2000、page 为 100000,page 至少是 one 的 10 倍,推荐 50 到 100 倍。加大之前先确认密度合理:盒子尺寸写错或 data 文件误用分数坐标都会让密度虚高。

NaN

  1. 01

    确认 NaN 第一次出现的步数

    thermo 设为 1 复跑。第 0 步就是 NaN,最常见原因是原子重叠:重叠原子在可视化中看起来就是一个原子。周期边界下,盒子按原子坐标极值设定、没有留空隙时,两侧原子会通过周期边界重叠。本页实测:两个原子坐标完全相同时,只用 fix nve 不报错、thermo 一直输出 nan;改用 fix npt 时第 0 步报 Non-numeric pressure - simulation unstable;4 个进程的 fix nve 运行报 Non-numeric atom coords - simulation unstable。

  2. 02

    检查重叠并先最小化

    用 delete_atoms overlap 在诊断副本中检查。删除数大于 0 就回到建模步骤留出间距,或先 minimize。

  3. 03

    先恒温再控压

    官方文档指出 NaN 更容易在直接使用 Nose-Hoover 控压时出现。先只控温跑到势能稳定,再加 fix npt;也可以在平衡了一段 MD 后再做一次最小化。

  4. 04

    GPU 运行先用双精度

    GPU 包默认按 mixed 精度编译(GPU_PREC=mixed),单精度和混合精度更容易溢出。初期弛豫用双精度或 CPU 跑完,再切回混合精度做生产运行。

  5. 05

    改用软势起步

    pair_style soft 或 soft-core 势对近距接触不敏感,可用于把严重重叠的初始结构推开,然后再换回正式力场。

编译与包

Unknown pair style 是 2019 年以前版本的报错原文。2020 年起改为 Unrecognized pair style 'xxx' is part of the YYY package which is not enabled in this LAMMPS binary,直接给出缺少的包名。若提示包已安装但样式仍缺失,说明它依赖的另一个包没有装,需要看该样式文档的 Restrictions 一节。

装包之后必须重新编译。传统 make 不能在同一条命令里装包并编译,make yes-colloid mpi 不会生效,要分成两条。只改了包却没有重新编译或没有替换旧的可执行文件,是官方文档点名的常见疏漏。

22Jul2025 版用 CMake 构建要求 CMake 3.16 以上,编译器至少支持 C++11,支持 C++17 时自动使用 C++17;启用 KOKKOS 时必须 C++17。make mpi 默认调用 mpicxx,系统没有 MPI 时改用 make serial,或先安装 OpenMPI、MPICH 的开发包。

确认包并重新编译bash
# 查看当前可执行文件包含哪些包、样式,以及是否带 MPI
lmp -h | less          # 搜索 "Installed packages" 与 "pair styles"

# CMake 构建:缺哪个包就加对应的 -D PKG_xxx=on,然后必须重新编译
cmake -S cmake -B build -D PKG_MANYBODY=on -D PKG_KSPACE=on -D PKG_MOLECULE=on -D BUILD_MPI=on
cmake --build build -j 8

# 传统 make:装包和编译必须分两条命令
cd src
make yes-manybody yes-kspace
make mpi -j 8          # 生成 lmp_mpi;写成 "make yes-manybody mpi" 不会生效

并行与 Windows

Windows 并行运行bat
REM Windows 下 MSMPI 版 LAMMPS 的并行运行方式
REM 先用 dir 确认输入文件的完整文件名(资源管理器默认隐藏扩展名)
dir
mpiexec -localonly 4 lmp -in in.CHO.lmp
REM 不加 -screen none,否则真正的 ERROR 行不会显示在终端

job aborted: [ranks] message ... abort code 1

这是 MS-MPI 的汇总信息,说明 LAMMPS 自己报错退出了。真正原因在终端或 log.lammps 中的 ERROR 行。用了 -screen none 时终端不会显示 ERROR。论坛中有用户为此排查 MS-MPI 四天,实际原因是输入文件叫 in.CHO.lmp,命令里写成了 -in in.CHO。

找不到 msmpi.dll

官方 Windows 安装包中只有 LAMMPS-MSMPI 版本支持 MPI 并行,它需要另外安装微软的 msmpisetup.exe 并重启。msmpisdk.msi 只在用 Visual Studio 从源码编译时需要。只想多线程加速时,用非 MSMPI 版加 -pk omp 4 -sf omp 即可。

MSMPI 版输出迟迟不出现

MPI 并行模式下屏幕输出是块缓冲的,攒够一定字节才显示,这是官方说明的已知行为,不代表卡死。

Linux 上单核正常、多核报错

单核时没有区域分解,所有原子都能访问,问题被掩盖。多核报 Lost atoms 或 Out of range 说明动力学本身有问题。两种分解得到的能量相差很大时,两个结果都不可信。

MPI_ABORT 出现在 OpenMPI 层

lmp -h 会显示可执行文件链接的 MPI 版本。确认是 MPI 库本身的问题、而本机只需串行时,可用 -D BUILD_MPI=off 重新配置。

不报错

单位默认值:units real 时 timestep 默认 1.0 fs、skin 2.0 Å;units metal 时 timestep 默认 0.001 ps、skin 2.0 Å。把 real 输入改成 metal 而保留 timestep 1.0,时间步会变成 1 ps,放大 1000 倍。ReaxFF 势使用 real,多数 EAM 与 Tersoff 势文件使用 metal。

现象常见原因检查与修改
进程占满 CPU,但长时间没有新输出thermo 未设置(只在首末步输出);MPI 下输出被缓冲;体系大且用了 pppm、ewald 这类不随原子数线性扩展的方法设置 thermo 100;用 -nb 复跑;先用小体系测出每步耗时再外推
确实停在某一步不动某个值变成 NaN 后循环无法退出,或程序缺陷用 gdb -p 进程号 附加到进程,输入 where 获取调用栈,附在求助帖中
NVE 下总能量单向漂移时间步过大,或邻居列表重建过晚步长减半对比漂移量;查看 Dangerous builds
温度越跑越高Tdamp 过小或单位换算错;控温组与积分组不一致;同一原子被两个积分 fix 重复积分检查 One or more atoms are time integrated more than once 警告;Tdamp 取约 100 步
能量、压力数值大几个数量级units metal 与 real 混用:eV 与 kcal/mol 相差约 23 倍,bar 与 atm 也不同核对 pair_coeff 参数来源的单位;势文件带 UNITS: 标签时单位不符会直接报错,没有标签的不会
时间步被悄悄改掉timestep 写在 units 之前,units 会把它重置为默认值搜索日志中的 WARNING: Changing timestep from 2 to 1 due to changing units to real 一类警告(本页实测原文);把 timestep 放在 units 之后
相同输入、不同核数结果不同数值舍入导致轨迹在几百到几千步后分叉;用 create_atoms 建模时原子编号随核数变化,velocity 给同一原子分配的速度也随之不同比较统计平均值,不逐步比较数值;需要初始速度与核数无关时,velocity 命令加 loop geom

流程

in.minimal:最小复现模板lammps
# 最小复现:从出错的 restart 或 data 开始,只保留触发报错必需的命令
units           real
atom_style      full
read_data       small.data              # 用 replicate 前的最小单胞或删掉大部分溶剂

pair_style      lj/cut/coul/long 10.0
kspace_style    pppm 1.0e-4
include         ff.params               # 力场参数单独放一个文件,方便对照

thermo          1
thermo_style    custom step temp pe press vol
dump            d1 all custom 1 dump.min id type x y z fx fy fz
fix             f1 all nve
run             200                     # 能在几百步内复现即可
  1. 01

    读完整条报错

    记下报错原文、ERROR 还是 ERROR on proc N、源码位置和 err 编号,打开对应官方解释。往前看所有 WARNING,运行中途的 WARNING 只打印到屏幕,不进 log 文件。

  2. 02

    确认是输入阶段还是运行阶段

    box 定义前后、run 之前出错,多为语法、命令顺序或 data 文件问题。run 中途出错,多为动力学问题。

  3. 03

    缩小间隔,找异常起点

    thermo 设为 1 到 10,输出 pe、press、temp、lx。dump 每 1 到 10 步写一次,用 dump_modify delay 只记录出错前的一段。

  4. 04

    做最小复现

    用小体系、单核、最少的命令复现同一报错。小体系几百步内出错,修改一次只需几分钟。

  5. 05

    单变量修改

    每次只改一处:先 minimize,再查单位和参数,再改时间步,最后才调邻居列表。同时改多处会让你不知道真正的原因。

  6. 06

    确认修好

    报错消失不等于结果可信。至少跑一段 NVE 看能量是否守恒,并检查 Dangerous builds 为 0。

中文社区高频

这一节的条目来自知乎和计算化学公社上流传较广的 LAMMPS 报错汇总帖与求助帖,已用 LAMMPS 22Jul2025 update6(conda-forge CPU 版)实测,或按当前源码和文档核对。

ReaxFF 内存与混合势设置lammps
# ReaxFF 稀疏体系或多核运行时报 hbondchk failed / bondchk failed 的三种处理
# 1) 加大预分配(默认 safezone 1.2、mincap 50、minhbonds 25),内存占用随之增加
pair_style      reaxff NULL safezone 1.6 mincap 100 minhbonds 50
pair_coeff      * * ffield.reax C H O N

# 2) 改用 KOKKOS 版 ReaxFF(纯 CPU 编译的 KOKKOS 也可以),不用 safezone 等关键字
#    mpirun -np 4 lmp -k on -sf kk -in in.reaxff

# 3) 与非 ReaxFF 势混用时,只对 ReaxFF 原子做电荷平衡
# pair_style    hybrid reaxff NULL lj/cut 10.0
# pair_coeff    * * reaxff ffield.reax C H O NULL
# group         reax type 1 2 3
# fix           qeq reax qeq/reaxff 1 0.0 10.0 1.0e-6 reaxff maxiter 500

step N: hbondchk failed 或 bondchk failed(err0018)

ReaxFF 按当前体系加一个安全系数预分配键和氢键列表。反应剧烈、体系稀疏或每个进程分到的原子很少时,列表会溢出。本页实测:8 个 RDX 分子(168 个原子)放进边长 120 Å 的周期盒子,3000 K NVT、步长 0.25 fs,默认设置下 1 个进程在第 13617 步、2 个进程在第 13014 步、8 个进程在第 5219 步报 hbondchk failed。改成 safezone 1.6 mincap 100 minhbonds 50 后,1 个和 8 个进程都跑完 2 万步。官方给出的另外两种办法是把长 run 拆成多段,或改用 KOKKOS 版 ReaxFF。本页把同一体系拆成 20 段、每段 1000 步,用 8 个进程运行,仍在第 3000 到 4000 步之间出现段错误,所以拆段不一定够用。

ReaxFF 每个进程分到的原子太少

知乎上的 LAMMPS 报错汇总帖给出的经验值是 ReaxFF 每个核至少 100 个原子,300 到 500 个更合适;计算化学公社的一个热解求助帖中,反复出现的 lost atoms 在作者换了核数后消失。核数多不一定更快:上面的 168 原子稀疏体系加大 safezone 后,在同一台机器上 1 个进程跑 2 万步用 8.0 s,8 个进程用 111.5 s。小体系先用 1 到 2 个进程测出每步耗时,再决定是否加核。

Fix qeq/reaxff CG convergence failed after N iterations

这是警告,表示电荷平衡在 maxiter 次迭代内没有收敛,默认 maxiter 为 200,可在 fix 末尾写 maxiter 500 加大。中文汇总帖建议写 warn no 关闭警告,这个写法在当前版本直接报 ERROR: Illegal fix qeq/reaxff command(本页实测);关闭警告的关键字是 nowarn。官方文档说明 nowarn 用于需要固定迭代次数的串并行对比;警告在运行中持续出现时,先按前文排查体系是否已经不稳定。

ReaxFF 与其他势混用(pair_style hybrid)

pair_coeff 中不用 ReaxFF 的类型写 NULL 占位。fix qeq/reaxff 只作用于 ReaxFF 原子组成的 group:对 all 做电荷平衡时,没有 QEq 参数的类型会触发 No QEq parameters for atom type N provided by pair reaxff,组内总电荷不为零时给出 Fix qeq/reaxff group is not charge neutral 警告。不需要电荷平衡时,用 pair_style reaxff NULL checkqeq no 关闭检查,此时使用 data 文件中的静态电荷。

Triclinic box skew is too large 与 box tilt large

中文汇总帖对这条报错的处理方法是在脚本中加 box tilt large。22Dec2022 版起 box 命令已移除,倾斜量超过盒长一半时只给出 WARNING: Triclinic box skew is large. LAMMPS will run inefficiently.,计算照常进行。本页实测 22Jul2025:xy 倾斜为盒长的 2.5 倍时同样只有这条警告;脚本里保留 box tilt large 只会打印 The 'box' command has been removed and will be ignored。仍然报 skew too large 的,用的是 2022 年以前的版本。

交给 Agent

指令示例:“这是我的 in.npt、system.data 和报错日志,运行到第 3200 步报 Out of range atoms - cannot compute PPPM。请复现报错,按最小化、单位和参数、时间步、邻居列表的顺序逐项排查,每次只改一处,找到原因后给出修改后的输入文件和一段 NVE 能量守恒检查。”

智能体会执行的步骤:在预装 LAMMPS 2025.07.22 GPU 版的环境中复现报错;缩小 thermo 和 dump 间隔定位异常起点;做最小复现;逐项修改并重跑;对修改后的输入跑能量守恒检查,并对结果做对抗审阅。

产出文件:修改后的 in 文件、每轮排查的 log 与 dump、Dangerous builds 统计和能量漂移数据,以及一份说明原因与修改依据的记录。

你仍需自己核对:力场和势函数是否适用于你的体系,单位与参数来源是否一致,以及修改后的时间步、控温控压参数是否满足论文中要分析的物理量。

求助

LAMMPS 官方求助渠道是 MatSci 社区论坛的 LAMMPS 分区。开发者对缺信息的帖子通常只会回复“请附上完整输入”。

  • LAMMPS 版本(log 第一行,例如 LAMMPS (22 Jul 2025))和平台,以及 lmp -h 中的已安装包与 MPI 信息
  • 完整报错原文,包括源码位置和 err 编号,不要截图
  • 能直接运行的完整输入:in 文件、data 文件、势函数文件,打包成 zip;尽量不用二进制 restart 文件
  • 尽量小的复现体系:最少原子数、最少进程数、最短运行步数
  • 运行命令(mpirun -np 4 lmp -in ...、是否用了 -sf gpu 或 -k on)
  • 报错前若干步的 thermo 输出
  • 已经试过的修改和各自结果,例如“时间步从 1 fs 降到 0.5 fs 后报错从第 3200 步推迟到第 9000 步”
  • 单核与多核运行结果是否一致
  • 先搜索论坛历史帖:Out of range atoms 是论坛中被问得最多的问题之一

参考资料

常见问题

thermo_modify lost ignore 能解决 Lost atoms 吗?

它只是关闭检查。官方文档说明 ignore 只应用于原子本应离开体系的模拟,例如溅射、表面蒸发。其他情况下丢失原子说明动力学已经出错,忽略后得到的结果不可信。

为什么单核能跑,多核就报 Lost atoms 或 Out of range?

单核时没有区域分解,原子跑多远都能被找到,问题被掩盖。子区域越小,报错越早出现。根源仍是原子单步位移过大,应按 Lost atoms 一节排查。

LAMMPS 报 Unknown pair style 怎么办?

这是 2019 年以前版本的报错原文,说明可执行文件没有编译对应的包。新版本会直接写出包名。用 lmp -h 确认已装的包,用 -D PKG_xxx=on 或 make yes-xxx 加入后重新编译。

LAMMPS 计算过程中不报错但卡住了怎么办?

先确认 thermo 已设置、并行时用 -nb 关闭输出缓冲,排除“有进度但看不到”。确实停在某一步时,用 gdb -p 进程号 附加进程,输入 where 查看卡在哪个函数。

Out of range atoms 一定要换掉 PPPM 吗?

不需要。它说明原子移动过快,PPPM 只是第一个检测到问题的模块。平衡初期可以临时改用截断库仑、不设 kspace_style,体系稳定后再切回 PPPM。

Windows 上 mpiexec 运行报 job aborted 是 MS-MPI 没装好吗?

多数情况下 MS-MPI 安装正常。job aborted 只说明 LAMMPS 已经报错退出,原因在 LAMMPS 的 ERROR 行。先去掉 -screen none 查看输出,并确认输入文件名包含完整扩展名。

把 LAMMPS 报错排查交给 Scientify

上传输入文件和报错日志,智能体在预装 LAMMPS 2025.07.22 GPU 版的云端环境中复现报错、逐项修改并保留每一轮的日志。关掉电脑后任务继续运行。新注册用户免费获得 5 美元等值额度。