第 1 步
先按“要不要 MPI 并行”“要不要 CUDA”“有没有 root”三个条件选路线。选错的典型后果是装完才发现不能并行,或者 GPU 根本没用上。
| 路线 | 适用条件 | MPI | GPU | 注意 |
|---|---|---|---|---|
| Windows LAMMPS-GUI 安装包(GitHub release,LAMMPS-Win10-x64-GUI-30Sep2026.exe) | 学习、调试 in 文件,小体系 | 不支持 | GPU 包,OpenCL 混合精度 | 含命令行 lmp;不含 KIM 等包;安装时 SmartScreen 会弹出提示 |
| Windows MS-MPI 安装包(rpm.lammps.org/windows,LAMMPS-64bit-30Sep2026-MSMPI.exe) | Windows 上要多进程并行 | 只支持 MS-MPI,需另装 msmpisetup.exe | GPU 包,OpenCL | 用 mpiexec -n 4 lmp -in ...;安装程序自动设置 PATH 和 LAMMPS_POTENTIALS;2Aug2023 起只用 MS-MPI |
| WSL2 + 源码 CMake | Windows 电脑,要 CUDA 或 MPI | OpenMPI | GPU 包或 KOKKOS(CUDA) | WSL 内不能装 Linux 显卡驱动;文件放 Linux 文件系统 |
| conda-forge(conda install lammps) | Linux/macOS,不想编译 | 有 openmpi/mpich/nompi 变体 | CUDA 变体用 KOKKOS,不含 GPU 包 | 版本停在 2025.07.22;没有 Windows 版;含 KIM;不带 potentials/ 目录,也不设置 LAMMPS_POTENTIALS(本页实测 osx-arm64 包) |
| Linux 静态二进制(download.lammps.org/static) | 集群登录节点、无 root、只要能跑 | 不支持 | 无 | 不依赖系统库;不含 Python 模块 |
| apt / dnf 发行版包 | 快速试用 | 有 | 无 | Ubuntu 24.04 的 apt 版本是 20240207,22.04 是 20220106 |
| 源码 CMake(Linux、集群) | 正式计算、要定制包或 GPU | 有 | GPU 包或 KOKKOS | 本页主线;可装到 $HOME,不需要 root |
| Docker/Apptainer(NVIDIA NGC nvcr.io/hpc/lammps) | 有 NVIDIA Container Toolkit 的 GPU 机器 | 镜像内置 | 有,CUDA | 先在容器里运行 lmp -h,确认加速包是 GPU 还是 KOKKOS |
版本
2026 年 9 月 30 日发布的新稳定版提高了编译工具链门槛。集群上的 GCC 或 CMake 偏旧时,直接编新版会在 configure 阶段失败。
判断方法:先运行 gcc --version 和 cmake --version。GCC 低于 10.4 又要用 KOKKOS,就选 stable_22Jul2025_update6,或者先装新编译器。CMake 版本不够时,可以用 python3 -m pip install --user cmake 装一个新版,不需要 root。
如果 in 文件要和导师或已发表工作的结果对比,记录 lmp -h 输出的完整版本号。30Sep2026 修正了 ARM64 和开启 FMA 的平台上与平台相关的结果差异,两个版本的数值可能有末位差别。
| 项目 | stable_22Jul2025_update6 | stable_30Sep2026 |
|---|---|---|
| CMake 最低版本 | 3.16 | 3.20 |
| C++ 标准 | 默认 C++11;KOKKOS 需要 C++17 | C++17;KOKKOS 需要 C++20 |
| 内置 Kokkos | 4.6.2(GCC ≥ 8.2,CUDA ≥ 11.0) | 5.2(GCC ≥ 10.4,NVCC ≥ 12.2) |
| GPU 包默认 GPU_ARCH | sm_50 | sm_75 |
| 传统 make 构建 | 可用于 KOKKOS | KOKKOS 自 11Feb2026 起只能用 CMake;make 只能编不需要 lib/ 额外步骤的包 |
| dump image / dump movie | 核心功能 | 移入新的 GRAPHICS 包,basic.cmake 预设已包含 |
| 已移除的包 | — | ATC、AWPMD、POEMS、ML-RANN、VTK;pair agni(dump vtk 移入 EXTRA-DUMP) |
Windows
LAMMPS-GUI 安装包适合学习:编辑器能直接运行当前 in 文件并显示 thermo 曲线和快照。它的局限有三条:不能 MPI 并行;GPU 只有 OpenCL 版 GPU 包,需要显卡驱动带 OpenCL 运行时;KOKKOS 只能用串行或 OpenMP。安装包是自签名的,浏览器和 SmartScreen 会提示风险,在提示中选择“仍要运行”即可。
Windows 下多核运行有两种写法。用 GUI 安装包时用 OpenMP:lmp -sf omp -pk omp 8 -in in.file。用 MSMPI 安装包时用 MPI:mpiexec -n 8 lmp -in in.file。官方说明两者叠加通常更慢,二选一即可。
要 CUDA、要编自己的包、或者要和集群保持同一套脚本,就换 WSL2。CUDA on WSL 只在 Windows 端装 NVIDIA 驱动(R495 及以后),WSL 内只装 cuda-toolkit-12-x 元包。不要装 cuda、cuda-12-x 或 cuda-drivers 元包,它们会覆盖 WSL 映射进来的驱动。WSL2 的 GPU 支持要求 Pascal 及以后的显卡。
# Windows PowerShell(管理员)
wsl --install -d Ubuntu-24.04
wsl --set-default-version 2
# 进入 Ubuntu 后:只装 CUDA Toolkit,不装 Linux 显卡驱动
# 按 NVIDIA 下载页选择 Linux > x86_64 > WSL-Ubuntu,安装 cuda-toolkit-12-x 元包
nvidia-smi # 若找不到:/usr/lib/wsl/lib/nvidia-smi
# 工作目录放在 Linux 文件系统里,不要放 /mnt/c
mkdir -p ~/md && cd ~/md第 2 步
basic.cmake 预设打开 KSPACE、MANYBODY、MOLECULE、RIGID 四个包,30Sep2026 还会打开 GRAPHICS。EAM 在 MANYBODY 里,本页的拉伸算例只需要这个包。
# 依赖(Ubuntu 22.04/24.04 或 WSL2 Ubuntu)
sudo apt update
sudo apt install -y build-essential cmake git libopenmpi-dev openmpi-bin python3-pip
cmake --version # 30Sep2026 要求 >= 3.20;不够就:python3 -m pip install --user cmake
# 获取源码:stable 分支 = 最新稳定版(2026-10 时为 30Sep2026)
git clone -b stable --depth 1 https://github.com/lammps/lammps.git lammps
# 需要与 2025.07.22 一致时改用:git clone -b stable_22Jul2025_update6 --depth 1 ...
cd lammps && mkdir build && cd build
cmake -C ../cmake/presets/basic.cmake \
-D BUILD_MPI=yes -D BUILD_OMP=yes -D PKG_OPENMP=yes \
-D CMAKE_INSTALL_PREFIX=$HOME/.local \
../cmake
cmake --build . -j 8
cmake --install . # 装到 ~/.local,不需要 root
# 写进 ~/.bashrc
export PATH=$HOME/.local/bin:$PATH
export LAMMPS_POTENTIALS=$HOME/.local/share/lammps/potentials
# 验证:必须看到 MPI 库名、MANYBODY 等包
lmp -h | sed -n '/MPI v/p;/Installed packages/,/List of individual/p'- lmp -h 的输出里要有 MPI 库名。CMake 找不到 MPI 开发包(libopenmpi-dev)时会静默编出串行版。这时 mpirun -np 4 实际跑 4 个互不相干的串行副本:日志显示 1 by 1 by 1 MPI processor grid,每行输出重复 4 次。
- mpirun 必须来自编译时用的那套 MPI。集群上 module load 的 MPI 和编译时的不一致时,同样会出现上面的 N 个副本现象。
- 额外的包用 -D PKG_<NAME>=yes 打开,例如 -D PKG_REAXFF=yes、-D PKG_MEAM=yes、-D PKG_EXTRA-COMPUTE=yes。需要大部分常用包时用 -C ../cmake/presets/most.cmake。
- 改了包的组合后,在同一个 build 目录重新执行 cmake 再编译即可,已有设置会保存在 CMakeCache.txt 里。
第 3 步
两者都能在 NVIDIA 卡上跑 EAM,但分工方式不同:GPU 包把 pair 计算放到 GPU,其余步骤留在 CPU;KOKKOS 尽量让整个时间步留在 GPU 上。
GPU_API 的默认值是 opencl。只写 -D PKG_GPU=on 会编出 OpenCL 版,在 NVIDIA 卡上也能跑,但不是 CUDA 后端。这一项是网上教程最常漏写的。
GPU_ARCH 和 Kokkos_ARCH 按显卡计算能力填写:V100 是 sm_70 / VOLTA70;T4 和 RTX 20 系列是 sm_75 / TURING75;A100 是 sm_80 / AMPERE80;RTX 30 系列和 A40 是 sm_86 / AMPERE86;RTX 40 系列和 L40S 是 sm_89 / ADA89(不是 sm_90);H100 是 sm_90 / HOPPER90;RTX 50 系列是 sm_120 / BLACKWELL120。CUDA 13 已不能为 Maxwell、Pascal、Volta 离线编译。22Jul2025 的默认值是 sm_50,配 CUDA 13 时必须显式指定 GPU_ARCH。
KOKKOS 编出的程序换到主版本号不同的 GPU 架构上(例如 7.x 换到 8.x)会直接报错退出,同主版本只会在启动时多一次 JIT 编译。为多种卡准备程序时,按最旧的那张卡编译,或者为每种卡各编一个。
# 先查显卡计算能力:8.6 -> sm_86,8.9 -> sm_89
nvidia-smi --query-gpu=name,compute_cap --format=csv
# 方案 A:GPU 包(CUDA 后端)
mkdir build-gpu && cd build-gpu
cmake -C ../cmake/presets/basic.cmake \
-D PKG_GPU=on -D GPU_API=cuda -D GPU_ARCH=sm_86 -D GPU_PREC=mixed \
-D BUILD_MPI=yes -D BUILD_OMP=yes -D PKG_OPENMP=yes \
-D CMAKE_INSTALL_PREFIX=$HOME/.local \
../cmake
cmake --build . -j 16
# 方案 B:KOKKOS(CUDA 后端);两个 -C 预设可以叠加
mkdir build-kokkos && cd build-kokkos
cmake -C ../cmake/presets/basic.cmake \
-C ../cmake/presets/kokkos-cuda.cmake \
-D Kokkos_ARCH_AMPERE86=yes \
-D BUILD_MPI=yes \
../cmake
cmake --build . -j 16| 对比项 | GPU 包 | KOKKOS |
|---|---|---|
| 加速范围 | pair、部分 PPPM;积分和多数 fix 在 CPU | pair、fix、compute 中有 /kk 版本的都在 GPU;遇到没有 /kk 版本的命令会在 CPU 和 GPU 之间来回拷数据 |
| 每张卡的 MPI 进程数 | 多进程共用一张卡通常更快,官方建议 2–10 个 | 默认 1 个;多进程共卡必须开 CUDA MPS |
| 精度 | single / mixed(默认)/ double | 默认 double;30Sep2026 起也支持 single、mixed |
| 适合 | CPU 核多、GPU 少;Windows 的 OpenCL 版 | 单卡大体系;双精度下原子数多时官方说明 KOKKOS 通常更快 |
| 运行参数 | -sf gpu -pk gpu N | -k on g N -sf kk |
| 关键编译参数 | -D PKG_GPU=on -D GPU_API=cuda -D GPU_ARCH=sm_XX | -C kokkos-cuda.cmake -D Kokkos_ARCH_<GPU>=yes |
- 经验做法(MatSci 论坛多帖):用 CMake 时不要再在 src 目录执行 make yes-gpu 或单独编译 lib/gpu。两种构建方式混用时 CMake 会报错,处理办法是在 src 目录执行 make no-all purge 或重新解压源码,只用 -D PKG_GPU=on。
- 经验做法:运行时报 CUDA driver version is insufficient 一类错误,多数是 CUDA Toolkit 比驱动新。nvidia-smi 右上角显示的是驱动支持的最高 CUDA 版本,nvcc --version 显示的是编译用的 Toolkit 版本,前者应不低于后者。
- 编译时找不到 nvcc,把 CUDA 的 bin 目录加入 PATH(例如 export PATH=/usr/local/cuda/bin:$PATH)后,删掉 build 目录重新 cmake。
第 4 步
# 纯 CPU,8 个 MPI 进程
mpirun -np 8 lmp -in in.cu_tensile
# 纯 CPU,OPENMP 包,1 个进程 8 线程(Windows GUI 安装包也可用)
lmp -sf omp -pk omp 8 -in in.cu_tensile
# GPU 包:4 个 MPI 进程共用 1 张卡
mpirun -np 4 lmp -sf gpu -pk gpu 1 -in in.cu_tensile
# KOKKOS:1 张卡配 1 个 MPI 进程
lmp -k on g 1 -sf kk -in in.cu_tensile
# Pascal 及以后的卡可以试半邻居表,常更快
lmp -k on g 1 -sf kk -pk kokkos newton on neigh half -in in.cu_tensile
# 多卡且 MPI 不支持 GPU-aware 时(发行版自带 OpenMPI 常见)
mpirun -np 2 lmp -k on g 2 -sf kk -pk kokkos gpu/aware off -in in.cu_tensile- 用 -in 文件名,不用 < 重定向。部分 MPI 实现下 < 在并行时读不到输入。
- conda 的 mpich 变体在环境的 bin 目录里自带 mpirun(MPICH Hydra),激活环境后直接用 mpirun -np 8 lmp -in in.cu_tensile,不要混用系统里的 OpenMPI。lmp -h 的 MPI 一行会显示 MPICH Version。本页在 macOS 上实测:开着 VPN 时 MPICH 会选中 utun 虚拟网卡,报 OFI poll failed (default nic=utun...),先 export FI_PROVIDER=tcp 即可正常运行。
- conda 的 CPU 包不含 GPU 和 KOKKOS 包。本页实测:加 -k on 报 Cannot use -kokkos on without KOKKOS installed,加 -sf gpu -pk gpu 1 报 Package gpu command without GPU package installed;-sf omp -pk omp N 可以使用。
- -sf gpu 会给所有有 /gpu 版本的命令加后缀,eam/alloy 会变成 eam/alloy/gpu;-sf kk 同理。不想改 in 文件时,用命令行开关即可切换 CPU 与 GPU。
- KOKKOS 默认假设 MPI 支持 GPU-aware。单卡单进程不受影响。多进程出现段错误,或提示 Turning off GPU-aware MPI since it is not detected 时,加 -pk kokkos gpu/aware off。
- GPU 包的混合精度(mixed)是默认值。发表前用 double 精度编译或 CPU 版跑一段同样的模拟,对比能量和应力。
- 估算耗时:先把 run 改成 2000 步,看日志末尾 Performance 一行给出的 timesteps/s,再按总步数外推。
第 5 步
体系是 32000 个原子的周期性块体铜,用 Mishin 2001 EAM 势。流程是:能量最小化 → 300 K 零压平衡 20 ps → x 方向以 1×10⁹ s⁻¹ 拉伸 300 ps,同时 y、z 方向保持零压。
本页实测(LAMMPS 22Jul2025 update6,conda-forge CPU 版,macOS arm64):把 region 改成 0 10 0 10 0 10(4000 个原子),其余参数不变,完整跑完 20 ps 平衡和 300 ps 拉伸。300 K 平衡后 lx 为 36.31 Å,对应晶格常数 3.631 Å。plot_ss.py 给出 0–1% 应变的模量 67.3 GPa,与 [100] 杨氏模量的理论值一致:用同一势在 0 K、0.1% 应变下算得 C11 = 169.7 GPa、C12 = 122.3 GPa(Mishin 2001 论文给出 169.9 和 122.6 GPa),由 E = (C11−C12)(C11+2C12)/(C11+C12) 得 67.2 GPa。第一次屈服应力 8.80 GPa,对应应变 0.113,随后应力突降到约 4.3 GPa;σyy、σzz 始终在 ±0.3 GPa 内,说明 y、z 方向的零压控制有效。864 个原子(6×6×6 晶胞)得到 68.6 GPa 和 8.85 GPa(应变 0.115)。这个屈服应力是无缺陷周期性晶体的均匀形核应力,比宏观实验值高约两个数量级,属于理想晶体模型的正常结果。
单核耗时(同一版本与机器,4000 个原子,各跑 1000 步,CPU 占用 99.9%):NPT 平衡段 204 步/秒(0.82 M atom-step/s),拉伸段带 fix deform、fix print 和 dump,为 156 步/秒,即每步 6.4 ms(0.62 M atom-step/s)。按此外推,32000 个原子单核每步约 51 ms,平衡加拉伸共 32 万步约 4.5 小时。验证期间本机同时运行其他任务,多进程并行的加速比受干扰,本页不给出。
# in.cu_tensile —— 单晶铜 [100] 单轴拉伸
# 适用:LAMMPS 22Jul2025 与 30Sep2026;需要 MANYBODY 包
# ---------- 1. 初始化 ----------
units metal # 长度 Å,时间 ps,能量 eV,压力 bar
dimension 3
boundary p p p
atom_style atomic
variable T equal 300.0 # 温度 K
variable erate equal 1.0e9*1.0e-12 # 1e9 s^-1 换算成 1/ps
# ---------- 2. 建模 ----------
lattice fcc 3.615 # 与势文件给出的 Cu 晶格常数一致
region box block 0 20 0 20 0 20 # 20x20x20 个晶胞,32000 个原子
create_box 1 box
create_atoms 1 box
# ---------- 3. 势函数 ----------
pair_style eam/alloy
pair_coeff * * Cu_mishin1.eam.alloy Cu # 文件在 LAMMPS 的 potentials/ 目录
neighbor 2.0 bin
neigh_modify delay 0 every 1 check yes
# ---------- 4. 能量最小化,同时把盒子压力弛豫到 0 ----------
thermo 100
thermo_style custom step pe press lx ly lz
fix relax all box/relax iso 0.0 vmax 0.001
min_style cg
minimize 1.0e-12 1.0e-12 10000 100000
unfix relax
# ---------- 5. 300 K、0 bar 平衡 20 ps ----------
reset_timestep 0
timestep 0.001 # 1 fs
velocity all create ${T} 4928459 mom yes rot yes dist gaussian
fix eq all npt temp ${T} ${T} 0.1 iso 0.0 0.0 1.0
thermo 1000
thermo_style custom step temp pe press lx ly lz
run 20000
unfix eq
# ---------- 6. x 方向恒应变速率拉伸,y、z 方向保持 0 bar ----------
variable tmp equal lx
variable L0 equal ${tmp} # 立即求值,记下拉伸前的长度
reset_timestep 0
fix nptyz all npt temp ${T} ${T} 0.1 y 0.0 0.0 1.0 z 0.0 0.0 1.0 drag 1.0
fix pull all deform 1 x erate ${erate} units box remap x
variable strain equal (lx-v_L0)/v_L0
variable sxx equal -pxx/10000 # bar 转 GPa;取负号使拉应力为正
variable syy equal -pyy/10000
variable szz equal -pzz/10000
fix out all print 100 "${strain} ${sxx} ${syy} ${szz}" file stress_strain.txt screen no title "# strain sxx_GPa syy_GPa szz_GPa"
compute peatom all pe/atom
dump traj all custom 2000 tensile.lammpstrj id type x y z c_peatom
thermo_style custom step v_strain temp v_sxx v_syy v_szz pe press
restart 50000 tensile.*.restart
run 300000 # 300 ps,工程应变达到 0.30
write_data final.data
- 01
units metal
决定后面所有数字的单位:距离 Å,时间 ps,能量 eV,压力 bar。EAM、Tersoff、SW 等势文件大多按 metal 单位给出。
- 02
lattice fcc 3.615 与 region/create_box/create_atoms
lattice 同时设定晶格和长度单位,region 里的 0 20 指 20 个晶胞,约 72 Å。晶格常数用势函数的平衡值,否则一开始就有残余应力。Cu_mishin1.eam.alloy 文件头写的是 3.615 Å。
- 03
pair_style eam/alloy 与 pair_coeff * * 文件 Cu
eam/alloy 读 setfl 格式(.eam.alloy),只能写一条 pair_coeff * *,后面按原子类型顺序写元素名,元素名的个数等于原子类型数。setfl 文件含质量,所以不需要 mass 命令。.eam 文件(funcfl 格式)要配 pair_style eam。两者混用会读错文件。
- 04
neighbor 与 neigh_modify
metal 单位默认 skin 为 2.0 Å。自 2Aug2023 起 neigh_modify 默认 delay 0 every 1 check yes。旧教程里的 delay 10 可能产生 Dangerous builds 警告,建议删掉。
- 05
fix box/relax + minimize
最小化时同时调整盒子尺寸,使 0 K 压力为 0。vmax 0.001 限制每步体积变化,防止最小化发散。
- 06
velocity + fix npt iso
在 300 K、0 bar 下平衡 20 ps,让晶格热膨胀到位。跳过这一步直接拉伸,曲线起点会带热应力。阻尼参数 0.1 ps(Tdamp)和 1.0 ps(Pdamp)分别是 100 步和 1000 步,符合手册建议的量级。
- 07
variable L0 equal ${tmp}
${} 会在读到这一行时立即求值,所以 L0 固定为拉伸前的长度。直接写 variable L0 equal lx 的话,L0 会随盒子一起变,应变恒为 0。
- 08
fix npt y/z + fix deform x erate
deform 以恒定工程应变速率拉长 x 方向。erate 的单位是 1/时间单位,metal 下是 1/ps,所以 1×10⁹ s⁻¹ 要写 0.001。y、z 用 npt 控制为 0 bar,允许泊松收缩,得到的是单轴应力状态。只写 deform 而 y、z 固定,得到的是单轴应变,应力偏高。拉伸方向 x 不要同时用 npt 控压,否则控压会抵消拉伸;这是 MatSci 论坛上拉伸曲线异常最常见的原因之一。
- 09
variable sxx equal -pxx/10000
pxx 是压力张量分量,单位为 bar,拉伸时为负。取负号使拉应力为正,除以 10000 换成 GPa。变量里用到 pxx、pyy、pzz 时,thermo_style 里必须有 press 一类的压力关键字,LAMMPS 才会计算压力张量。本页实测:去掉 thermo_style 末尾的 press,拉伸段的 run 一开始就报 ERROR: Thermo keyword pxx in variable requires thermo to use/init press。
- 10
fix print、dump、restart
fix print 的字符串用双引号包住,里面的 ${strain} 会在每次输出时求值。dump 输出到 .lammpstrj,OVITO 和 VMD 都能直接打开。restart 每 50000 步写一次续跑文件。
变体
纳米线拉伸是块体脚本最常见的改法。需要改三处:建模、控压方向,以及应力归一化体积。
y、z 方向保留周期边界,但留出远大于截断半径(Mishin 势为 5.5 Å)的真空层,纳米线就不会和自己的周期镜像相互作用。上例盒宽约 72 Å,线径约 40 Å,真空约 32 Å。
pxx 是全盒子的维里应力除以盒子体积。盒子体积包含真空,直接用 -pxx/10000 会明显低估纳米线的应力。上面的换算假设截面在拉伸中不变。也可以对 compute stress/atom 求和,再除以原子数乘以单原子体积。无论用哪种,都要在论文中写明归一化体积的定义。
本页实测(同一版本;为缩短时间把长度改为 20 个晶胞,共 7540 个原子;300 K 平衡 4 ps 后以 1×10⁹ s⁻¹ 拉伸到应变 0.03):平衡后 lx 为 71.52 Å,比建模长度 72.30 Å 短 1.1%,这是表面应力使纳米线轴向收缩的结果,所以 L0 要在平衡之后取。0–1% 应变拟合的模量,用上面的体积换算为 55.8 GPa,直接用 -pxx/10000 只有 13.2 GPa,两者之比约 4.2,等于盒子截面积与纳米线截面积之比。对 compute stress/atom 求和,除以原子数乘单原子体积 a³/4(并按轴向伸长修正),得到的应力与上面的换算相差小于 0.5%。stress/atom 的符号与压力相反,求和后不要再取负号。
# 把第 2 步建模替换为下面几行:[100] 铜纳米线,直径约 4 nm,长约 20 nm
lattice fcc 3.615
region box block 0 55 -10 10 -10 10 # 晶格单位;x 取整数个晶胞
create_box 1 box
region wire cylinder x 0 0 5.5 INF INF # 半径 5.5 个晶格常数,约 19.9 Å
create_atoms 1 region wire
# 第 4 步改为只在 x 方向弛豫盒子
fix relax all box/relax x 0.0 vmax 0.001
# 第 5 步改为只在 x 方向控压
fix eq all npt temp ${T} ${T} 0.1 x 0.0 0.0 1.0
# 第 6 步:y、z 是真空,不能再控压,改用 NVT
fix nvt1 all nvt temp ${T} ${T} 0.1
fix pull all deform 1 x erate ${erate} units box remap x
# pxx 按整个盒子体积(含真空)归一,要换算到纳米线自身体积
variable R equal 5.5*3.615
variable sxx equal -pxx*vol/(PI*v_R^2*lx)/10000 # GPa,忽略泊松收缩势函数
Cu 的 EAM 势不需要另外下载:Cu_mishin1.eam.alloy(Mishin 等,PRB 63, 224106, 2001)、Cu_u3.eam(Foiles 1986)和 Cu_zhou.eam.alloy 都在 LAMMPS 的 potentials/ 目录里。NIST 原子间势库(ctcms.nist.gov/potentials/system/Cu)上,同一个 Mishin 势的文件名是 Cu01.eam.alloy。NIST 对 Mendelev 2013 的 Cu2 势注明了改进堆垛层错能,对 Zhou 2004 的 ipr2 版本注明了修正表格函数的伪振荡。研究位错和孪晶时,按这些说明选择势函数,并在方法部分写明来源。
用 conda 安装时没有这个目录,从 GitHub 上与版本对应的 tag 下载即可:curl -LO https://raw.githubusercontent.com/lammps/lammps/stable_22Jul2025_update6/potentials/Cu_mishin1.eam.alloy,放到 in 文件所在目录,或放到一个固定目录后把 LAMMPS_POTENTIALS 指向它。
OpenKIM 的势不用下载文件,在 in 文件里直接引用模型 ID:kim init EAM_Dynamo_MishinMehlPapaconstantopoulos_2001_Cu__MO_346334655118_006 metal,接着在建模之后写 kim interactions Cu。前提是编译了 KIM 包。conda 版和 apt 版自带 KIM,Windows 预编译包不带。
新版会读取势文件第一行的 UNITS 标签。in 文件的 units 与之不符时,报错 Potential file ... requires metal units but real units are in use。处理方法是修改 units,或换用对应单位的势文件。
| 体系 | 常用势函数(pair_style) | 所需包 | 单位 | 来源 |
|---|---|---|---|---|
| 金属、合金 | eam、eam/alloy、eam/fs、meam | MANYBODY、MEAM | metal | NIST IPR、OpenKIM、LAMMPS potentials/ 目录 |
| 共价晶体(Si、Ge、SiC) | sw、tersoff | MANYBODY | metal | potentials/ 目录、NIST IPR、OpenKIM |
| 碳材料(石墨烯、CNT、烃) | airebo、tersoff | MANYBODY | metal | potentials/CH.airebo |
| 聚合物、有机分子(固定拓扑) | lj/cut/coul/long + 键角二面角(OPLS-AA、GAFF);lj/class2(PCFF、COMPASS) | MOLECULE、KSPACE、CLASS2 | real | moltemplate、LigParGen、msi2lmp 生成 data 文件 |
| 反应体系(燃烧、氧化、断键成键) | reaxff + fix qeq/reaxff;或 fix bond/react | REAXFF;REACTION | real | potentials/ 目录中的 ReaxFF 参数和文献附带参数 |
| 需要接近 DFT 精度 | snap、pace、mliap | ML-SNAP、ML-PACE、ML-IAP | metal | 文献附带文件、OpenKIM |
单位
| 物理量 | metal | real |
|---|---|---|
| 距离 | Å | Å |
| 时间 | ps(默认 timestep 0.001 = 1 fs) | fs(默认 timestep 1.0 = 1 fs) |
| 能量 | eV | kcal/mol |
| 压力 | bar(1 GPa = 10000 bar) | atm(1 GPa = 9869.2 atm) |
| fix deform erate | 1/ps | 1/fs |
| 默认 neighbor skin | 2.0 Å | 2.0 Å |
- 从 metal 换到 real 时,erate 数值要再乘 10⁻³:1×10⁹ s⁻¹ 在 real 下是 1.0e-6(1/fs)。
- compute stress/atom 的单位是 压力×体积(bar·Å³),并且符号与压力相反。它不是单原子应力,除以单原子体积后才能当应力看。
- thermo 中的 press 是 (pxx+pyy+pzz)/3,单轴拉伸时它约为 -σxx/3。不能用 press 代替 σxx。
- MD 拉伸常用的应变速率在 10⁷–10¹⁰ s⁻¹ 之间,比实验高出很多个数量级,屈服应力会偏高。经验做法:正式计算前在 10⁹ 和 10⁸ s⁻¹ 各跑一次,看屈服应力差多少,再决定是否值得用更低的速率。比较不同尺寸或温度时,保持应变速率一致,并在文中说明。
第 6 步
log.lammps 中每个 run 的 thermo 段以 Step 开头的表头行开始,以 Loop time of 一行结束。表头列名就是 thermo_style 里的关键字,变量会显示为 v_strain、v_sxx。Loop time 之后有时间分解表(Pair、Neigh、Comm、Output 等的占比):Pair 占比低而 Comm 或 Output 占比高时,说明进程数过多或输出过于频繁。
OVITO 能直接打开 tensile.lammpstrj(也能读 .gz)。在 Pipeline 中添加 Common neighbor analysis 修改器,能按 FCC、HCP、Other 给原子着色。在 FCC 铜中,单层 HCP 原子对应孪晶界,两层相邻的 HCP 原子对应本征堆垛层错。VMD 用 vmd -lammpstrj tensile.lammpstrj 打开,它读不了压缩文件。
本页实测:用上面的 4000 原子算例运行 plot_ss.py,输出 E(0-1%) = 67.3 GPa 和 first yield = 8.80 GPa at strain 0.113。小晶胞在第一次屈服后会重新加载,864 原子算例在应变 0.23 处出现 9.9 GPa 的更高峰,所以脚本找的是第一次明显回落之前的最大值,不能直接取全局最大值。lammps.formats.LogFile 读出的 runs 依次对应最小化、平衡和拉伸三段,runs[-1] 的键为 Step、v_strain、Temp、v_sxx、v_syy、v_szz、PotEng、Press。
位错密度随应变的曲线是中文社区常见的后处理需求,CSDN 上有多篇文章演示,脚本多在 QQ 群里分发。下面的 dxa_density.py 只用 OVITO Python 模块(pip install ovito)的公开接口:DislocationAnalysisModifier 输出位错线总长 DislocationAnalysis.total_line_length(Å)和盒子体积 DislocationAnalysis.cell_volume(ų),两者相除再乘 10²⁰ 得到 m⁻²;DislocationAnalysis.length.1/6<112> 是 Shockley 不全位错的长度。
本页实测(OVITO 3.16.1,上面 4000 原子算例的 151 帧拉伸轨迹,用时约 11 s):应变 0.116 之前 DXA 没有找到位错,FCC 原子比例在应变 0.100 时为 0.936,0.116 时降到 0.625;应变 0.118 时第一次检出位错,密度 4.1×10¹⁷ m⁻²,HCP 原子比例升到 0.149;此后密度在 0 到 1.4×10¹⁸ m⁻² 之间跳动,应变 0.300 时为 9.6×10¹⁷ m⁻²,HCP 比例稳定在 0.15 到 0.33。跳动来自盒子太小:边长约 36 Å 时,一条贯穿盒子的位错线对应约 8×10¹⁶ m⁻²,位错在周期边界间形核和湮灭会让单帧数值成倍变化。要在论文中比较位错密度,需要更大的盒子,或对一段应变区间取平均。
# plot_ss.py:读取 fix print 输出,画应力-应变曲线,拟合初始模量并找第一次屈服
import numpy as np
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
d = np.loadtxt("stress_strain.txt", comments="#")
strain, sxx = d[:, 0], d[:, 1]
# 20 个点滑动平均,压掉热噪声(每点间隔 100 步);valid 模式避免两端补零造成的假下降
w = 20
sxx_s = np.convolve(sxx, np.ones(w) / w, mode="valid")
strain_s = strain[w // 2 : w // 2 + len(sxx_s)]
lin = strain <= 0.01 # 只用 0–1% 应变拟合
E = np.polyfit(strain[lin], sxx[lin], 1)[0]
# 第一次屈服:应力超过 1 GPa 后第一次从历史最大值回落 20% 之前的最大值
# 小体系卸载后会再次加载,全局最大值可能出现在后面,不能直接用 argmax
run_max = np.maximum.accumulate(sxx_s)
drop = np.nonzero((run_max > 1.0) & (run_max - sxx_s > 0.2 * run_max))[0]
j = drop[0] if drop.size else len(sxx_s)
i = np.argmax(sxx_s[:j])
print(f"E(0-1%) = {E:.1f} GPa")
print(f"first yield = {sxx_s[i]:.2f} GPa at strain {strain_s[i]:.3f}")
plt.plot(strain, sxx, lw=0.5, alpha=0.4, label="raw")
plt.plot(strain_s, sxx_s, lw=1.5, label=f"moving avg ({w})")
plt.xlabel("Engineering strain")
plt.ylabel("Stress σxx (GPa)")
plt.legend()
plt.tight_layout()
plt.savefig("stress_strain.png", dpi=200)
# 也可以直接解析 log.lammps(需要安装 LAMMPS Python 模块,conda 版自带)
# from lammps.formats import LogFile
# run = LogFile("log.lammps").runs[-1] # 键名就是 thermo 列名,如 "v_strain"、"v_sxx"
# dxa_density.py:逐帧做 CNA 与 DXA,输出位错密度和 FCC/HCP 原子比例
import sys
from ovito.io import import_file
from ovito.modifiers import DislocationAnalysisModifier
pipeline = import_file(sys.argv[1] if len(sys.argv) > 1 else "tensile.lammpstrj")
dxa = DislocationAnalysisModifier(input_crystal_structure=DislocationAnalysisModifier.Lattice.FCC)
pipeline.modifiers.append(dxa)
print("# step rho_total(1/m^2) rho_shockley(1/m^2) FCC_frac HCP_frac")
for frame in range(pipeline.source.num_frames):
data = pipeline.compute(frame)
a = data.attributes
vol = a["DislocationAnalysis.cell_volume"] # Å^3
rho = a["DislocationAnalysis.total_line_length"] / vol * 1e20 # Å/Å^3 -> m^-2
rho_s = a.get("DislocationAnalysis.length.1/6<112>", 0.0) / vol * 1e20
n = data.particles.count
fcc = a["DislocationAnalysis.counts.FCC"] / n
hcp = a["DislocationAnalysis.counts.HCP"] / n
print(f"{a['Timestep']:8d} {rho:.3e} {rho_s:.3e} {fcc:.3f} {hcp:.3f}")
续跑
restart 文件保存原子、盒子、units、atom_style 等。不保存的内容必须在续跑脚本里重写:所有 fix 和 compute,以及从文件读取参数的多体势(EAM、Tersoff 等)的 pair_coeff。
fix deform 使用和原脚本相同的 fix-ID(这里是 pull)时,会从 restart 文件恢复拉伸开始时的盒子,但只有 run 命令带 start 和 stop 时才使用它。start 填原始拉伸段开始时的步数(reset_timestep 0 之后是 0),stop 填总步数。只写 run 300000 upto 时,deform 以续跑时的盒长为基准重新计算伸长量。本页实测(864 原子、1×10¹⁰ s⁻¹ 的缩短算例,从应变 0.10 续跑到原定终点步):只写 upto 时终点应变是 0.32;加 start 0 stop 后终点应变是 0.30,终点应力 6.80 GPa,与不中断运行的 6.78 GPa 一致。用本节脚本(只改 L0)从“第一个 in 文件”一节中 4000 原子算例的第 150000 步续跑 1000 步,输出的应变与原运行相同,应力前 7 位有效数字一致。按页面参数从第 150000 步续跑而不加 start/stop,终点应变会是 0.3225。L0 必须填原始拉伸前的长度,不能用续跑时的 lx,否则应变从 0 重新算起。run N upto 让总步数停在 N,中断几次都能对齐到同一终点。
# in.cu_tensile.continue —— 从第 150000 步的 restart 继续拉伸
read_restart tensile.150000.restart
pair_style eam/alloy # 多体势不存进 restart,必须重写
pair_coeff * * Cu_mishin1.eam.alloy Cu
neighbor 2.0 bin
variable T equal 300.0
variable erate equal 1.0e9*1.0e-12
variable L0 equal 72.5 # 改成原始日志里 variable L0 equal 后面的数值
timestep 0.001
fix nptyz all npt temp ${T} ${T} 0.1 y 0.0 0.0 1.0 z 0.0 0.0 1.0 drag 1.0
fix pull all deform 1 x erate ${erate} units box remap x # fix-ID 与原脚本一致
variable strain equal (lx-v_L0)/v_L0
variable sxx equal -pxx/10000
fix out all print 100 "${strain} ${sxx}" append stress_strain.txt screen no
thermo_style custom step v_strain temp v_sxx pe press
thermo 1000
restart 50000 tensile.*.restart
run 300000 upto start 0 stop 300000 # 跑到总步数 300000;start/stop 让 deform 沿用原始盒长报错
Out of range atoms、Too many neighbor bins、NaN 等更多报错的原因和处理见《LAMMPS 常见报错与解决》(/learn/lammps-errors)。
| 报错原文(节选) | 原因 | 处理 |
|---|---|---|
| Unrecognized pair style 'eam/alloy' is part of the MANYBODY package which is not enabled in this LAMMPS binary | 编译时没有打开 MANYBODY 包 | 重新 cmake 加 -D PKG_MANYBODY=yes,或使用 basic.cmake 预设 |
| cannot open eam/alloy potential file Cu_mishin1.eam.alloy: No such file or directory | 势文件既不在当前目录,也不在 LAMMPS_POTENTIALS 指向的目录 | 把文件复制到 in 文件所在目录,或 export LAMMPS_POTENTIALS=<安装前缀>/share/lammps/potentials;conda 版没有该目录,需先从 GitHub 下载势文件(见“势函数”一节) |
| Potential file Cu_mishin1.eam.alloy requires metal units but real units are in use | units 与势文件单位不一致 | 改为 units metal,并按 metal 单位重写 timestep 和 erate |
| ERROR: Lost atoms: original 32000 current 31998 | 时间步过大、初始结构有重叠原子,或势函数和单位用错 | 先检查 lattice 常数和 timestep;完整排查步骤见 LAMMPS 报错页 |
国内环境
这一节整理计算化学公社、CSDN、知乎和高校超算文档中反复出现的做法,已按 LAMMPS 与相关工具的当前文档或源码核对;标注“本页实测”的数字来自 2026-10-10 的实际查询或运行。
# ~/.condarc:conda-forge 走清华 TUNA 镜像(TUNA 帮助页中只用社区源的写法)
channels:
- conda-forge
- nodefaults
show_channel_urls: true
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
conda clean -i
# 构建字符串 = 加速方式 + MPI:cpu、cuda129、cuda130、cuda134 与 nompi、mpich、openmpi 组合
conda create -n lammps -y "lammps=2025.07.22=cpu*openmpi*" # 新环境总下载约 410 MB
conda create -n lammps-gpu -y "lammps=2025.07.22=cuda129*openmpi*" # 新环境总下载约 1 GB
conda activate lammps && lmp -h | head -20
# 1) 在能联网的机器上下载第三方源码包(地址与 cmake/Modules/Packages/VORONOI.cmake 中一致)
curl -LO https://download.lammps.org/thirdparty/voro++-0.4.6.tar.gz
# 2) 传到集群后,配置时用 <前缀>_URL 指向本地文件;SHA256 仍按默认值校验,版本必须一致
cd lammps/build
cmake ../cmake -C ../cmake/presets/basic.cmake -D PKG_VORONOI=yes -D DOWNLOAD_VORO=yes \
-D VORO_URL=file://$HOME/src/voro++-0.4.6.tar.gz
cmake --build . -j 8
# 需要下载的包很多时:联网机器上运行 tools/offline/init_caches.sh 建缓存(默认 ~/.cache/lammps),
# 把缓存目录拷到集群同一路径,再 source tools/offline/use_caches.sh,按它打印的 -D LAMMPS_DOWNLOADS_URL=... 加到 cmake 命令
# VMD Tk Console:Packmol 输出的 pdb 转 LAMMPS data(TopoTools)
package require topotools
mol new system.pdb
# pdb 中 VMD 的 type 取自原子名,C1、C2、H1 会各成一个类型;先按元素合并
[atomselect top {name "C.*"}] set type C
[atomselect top {name "H.*"}] set type H
pbc set {40.0 40.0 40.0} ;# 没有盒子时 writelammpsdata 拒绝写文件
topo writelammpsdata system.data full
# 类型号按类型名字母序分配:C=1、H=2;Masses 段每行末尾的注释就是类型名
conda 走清华镜像,并用构建字符串选变体
conda-forge 在国内下载慢时,按清华 TUNA 镜像帮助页在 ~/.condarc 中把 conda-forge 指向 mirrors.tuna.tsinghua.edu.cn/anaconda/cloud。本页实测(2026-10-10 用 micromamba 查询该镜像):linux-64 上有 lammps 2025.07.22 的 cpu、cuda129、cuda130、cuda134 四类构建,每类再分 nompi、mpich、openmpi。只写 conda install lammps 时,求解器自己决定用哪种 MPI 和是否带 CUDA;用 "lammps=2025.07.22=cpu*openmpi*" 这样的构建字符串可以固定变体。新建环境的总下载量:cpu+openmpi 约 410 MB,cuda129+openmpi 约 1 GB。
学校超算先查 module,再决定是否自己编译
高校超算一般已部署 LAMMPS,可执行文件名随 module 不同。华南理工平台提供源码编译的 lammps/2Aug2023(可执行文件 lmp_intel_cpu_intelmpi)和 conda 环境 lammps20230802-cpu(可执行文件 lmp);上海交大思源一号提供 lammps/20230328-intel-2021.4.0-omp 等 CPU module 和 lammps/20230802-intel-2021.4.0-gpu,示例运行命令是 mpirun lmp -pk intel 0 omp 2 -sf intel -i in.lj,力场不在 INTEL 包支持范围内时去掉 -pk intel 和 -sf intel。先 module avail lammps,加载后用 lmp -h 查已装的包。这些 module 多为 2023 年的版本,照 30Sep2026 文档写的新关键字可能不被识别,出错时对照该版本的文档。交大文档要求编译在计算节点上进行,登录节点禁止并行编译。
编译时第三方库下载失败
CMake 打开 VORONOI、PLUMED、ML-PACE、KIM 等包时,会从 GitHub、download.lammps.org 或 OpenKIM 下载源码包。校园网不稳定或集群没有外网时,CMake 报 Each download failed!(CSDN 一篇无外网集群编译记录中的原文)。该作者的做法是手动放入压缩包并伪造 CMake 的步骤标记文件。更直接的办法是用缓存变量 <前缀>_URL 指向本地文件,例如 VORO_URL、PLUMED_URL、PACELIB_URL、KIM_URL,前缀和默认地址写在 cmake/Modules/Packages/<包名>.cmake 的 SetDownloadSettings 一行。GPU 包和 KOKKOS 的库随 LAMMPS 源码分发(DOWNLOAD_KOKKOS 默认关闭),编译 GPU 版不需要联网下载这两部分。
Packmol、VMD TopoTools、Materials Studio 转 data 文件的坑
Packmol 只保证盒子内部的原子间距不小于 tolerance,不考虑周期镜像。Sobereva 在计算化学公社的 Packmol 教程中用 add_box_sides 1.2 给盒子每个方向多留 1.2 Å;Packmol 20.15.0 起可用 pbc 关键字直接按周期盒子堆积。VMD TopoTools 的 topo writelammpsdata 在没有盒子尺寸时报 need to have non-zero box sizes,需要先 pbc set;它按 VMD 中类型名的字母序分配类型号,而读 pdb 时类型名取自原子名。Materials Studio 建模后经 OVITO 转出的 data 文件,类型顺序也常与力场文件不同,计算化学公社有帖子用 Word 和 Excel 手工轮换类型号。对 eam/alloy、tersoff、reaxff 这类 pair_coeff * * 文件 元素… 写法的势,不必改 data 文件,按 data 中类型 1、2、3… 的顺序写元素名即可:LAMMPS 手册的例子是 ffield 中元素顺序为 C H O N、类型 1 到 4 依次为 C、C、N、H 时,写 pair_coeff * * ffield.reax C C N H。
交给 Agent
一句话指令示例:“用 LAMMPS 模拟直径约 4 nm、长约 20 nm 的 [100] 单晶铜纳米线在 300 K、1×10⁹ s⁻¹ 下的单轴拉伸,用 Mishin EAM 势和 GPU 加速,输出应力-应变曲线、杨氏模量、屈服强度和共近邻分析快照,再与直径约 2 nm 的纳米线对比尺寸效应。”
智能体会执行这些步骤:租用 GPU 并运行环境自检;编写建模、弛豫和拉伸的 in 文件;先跑短程测试,估算耗时后再提交正式计算;用 Python 提取应力-应变数据并拟合模量;用共近邻分析标记位错和孪晶;对结果做对抗审阅,确认任务真正完成。交付内容包括 in 文件、后处理脚本、日志、曲线图、结构快照、环境记录和报告。计算结束后释放算力。
以下内容仍需你自己核对:势函数是否适合要研究的变形机制;应力归一化体积的定义;应变速率和尺寸对屈服强度的影响是否已在结论中说明;是否需要用不同随机种子重复计算,以估计统计误差。
参考资料
- LAMMPS stable_30Sep2026 发布说明(GitHub) — C++17、CMake 3.20、KOKKOS C++20、GRAPHICS 包与移除包的版本差异
- LAMMPS 手册:Build with CMake — CMake 最低版本与预设文件
- LAMMPS 手册:Packages with extra build options(GPU、KOKKOS) — GPU_API、GPU_ARCH 默认值与 Kokkos 架构 ID
- LAMMPS 手册:GPU package — -sf gpu -pk gpu 用法与每卡 MPI 进程数建议
- LAMMPS 手册:KOKKOS package — -k on g 用法、GPU-aware MPI、C++20 与 CUDA 12.2 要求
- LAMMPS-GUI 安装文档 — 预编译包含 OpenCL GPU 包、不支持 MPI、Windows 签名提示
- LAMMPS Windows 安装包说明 — MS-MPI 版本、OpenMP 用法
- conda-forge lammps-feedstock — conda 版的包列表,以及 CUDA 版使用 KOKKOS
- NVIDIA CUDA on WSL User Guide — WSL 内不能装 Linux 驱动,只装 cuda-toolkit 元包
- LAMMPS 手册:pair_style eam — funcfl 与 setfl 格式、pair_coeff 写法、势函数来源网站
- LAMMPS 手册:fix deform — erate 单位、拉伸时其余两个方向用 npt 控压的建议、restart 行为
- LAMMPS 手册:compute stress/atom — 单位为压力×体积,符号与压力相反
- NIST Interatomic Potentials Repository:Cu — Cu 势函数清单与 OpenKIM ID
- Mishin et al., Phys. Rev. B 63, 224106 (2001) — Cu_mishin1.eam.alloy 原始论文
- MatSci 论坛:mpirun launches multiple runs — 未链接 MPI 时出现 N 个串行副本的诊断
- MatSci 论坛:fix npt + fix deform — 经验帖:拉伸时控压方向的选择,以及 MD 应变速率量级的讨论
- MatSci 论坛:Regarding uniaxial tensile test — 经验帖:拉伸方向不要再用 npt 控压
- MatSci 论坛:GPU package compilation — 经验帖:CMake 与 make yes-gpu 混用报错,GPU_API 默认 OpenCL
- MatSci 论坛:There is an error with the GPU implemented — 经验帖:CUDA Toolkit 比驱动新导致 GPU 运行失败
- Gravelle et al., A Set of Tutorials for the LAMMPS Simulation Package, LiveCoMS 6, 3037 (2025) — 官方开发者参与的 LAMMPS-GUI 入门教程集
- 清华大学 TUNA 镜像:Anaconda 镜像使用帮助 — conda-forge 的 custom_channels 写法与 conda clean -i
- 华南理工大学科学计算平台:LAMMPS — 超算 module 与 conda 环境两种部署方式、可执行文件名和 Slurm 脚本
- 上海交通大学超算文档:LAMMPS — 各集群 module 版本、-pk intel -sf intel 运行方式、在计算节点编译
- CSDN:无 root 权限在不联网的集群上安装带 quip 包的 lammps — 经验帖:无外网集群上 CMake 报 Each download failed! 与手动放置压缩包
- LAMMPS 源码:tools/offline — init_caches.sh 与 use_caches.sh 离线编译缓存
- Sobereva:分子动力学初始结构构建程序 Packmol 的使用(计算化学公社) — 经验帖:tolerance 2.0 与 add_box_sides 1.2 避免周期边界处的不合理接触
- Packmol User's Guide — 20.15.0 起支持 pbc 关键字
- TopoTools 源码 topolammps.tcl — writelammpsdata 要求非零盒子、类型号按类型名字母序分配
- 计算化学公社:Lammps 模拟中一种改变 data 文件中元素顺序的方法 — 经验帖:Materials Studio 经 OVITO 转出的 data 类型顺序与力场不一致
- LAMMPS 手册:pair_style reaxff — pair_coeff 按类型顺序映射元素的例子(C C N H)
- OVITO Python 参考:DislocationAnalysisModifier — total_line_length、cell_volume、length.1/n<ijk> 等全局属性
- CSDN:Python ovito 计算输出位错线长度 — 经验帖:用 OVITO Python 按帧统计位错线长度
- CSDN:ovito+python 相分数、位错密度统计 — 经验帖:OVITO 中逐帧输出位错密度的操作流程