ATAT 自动计算实操:Slurm、停止恢复与避免重复任务
用三个硅结构串起 pollmach、VASP 输入生成、GPU 计算与结果提取,演示待算标记、停止恢复和重复任务保护。
阅读本篇目录
当 ATAT 给出若干待算结构时,pollmach 可以逐个调用计算命令。本例用三个两原子的硅原胞,实际演示“找到待算结构 → 生成 VASP 输入 → 在 Slurm 中计算 → 写回 ATAT 结果 → 停止和恢复”。
这里的三个结构是预先准备的不同晶格常数,不是新训练的簇展开,也不是 MAPS 自动选点的演示。三个静态能量点用于理解文件和任务流,不能当成已经收敛的状态方程。
1. 准备资料包与环境#
下载完整操作与实算资料包,放到登录节点当前目录:
python3 -m zipfile -e atat-Slurm-wave534-1caa86b10990.zip atat-Slurm
cd atat-Slurm
需有 VASP 使用权限、Si PBE PAW 赝势路径和 V100 16G 分区权限。ATAT 个人配置尚未初始化时,先执行 yskit atat-init;它创建缺失配置并保留已有文件。已有自定义配置时,先确认其中 POTPAWPBE 指向适合本例的 PBE 赝势。
本例采用 ATAT 3.52(GCC 13.3)、vasp/6.5.1-v100 模块;后者加载 NVHPC 25.3 与 MKL 2023.2 环境。默认 ATAT 的 atat-vasp 包装器调用 CPU 版 VASP 6.4.2。本例将原生接口拆为 runstruct_vasp -nr 生成文件、显式 GPU VASP 计算、runstruct_vasp -ex 提取结果,不修改默认包装器和个人配置。
2. 检查计算参数和结构#
cat vasp.wrap
[INCAR]
SYSTEM=Si ATAT Slurm example
ENCUT=400
PREC=Accurate
EDIFF=1e-6
ISMEAR=0
SIGMA=0.05
NSW=0
IBRION=-1
ALGO=Normal
LREAL=.FALSE.
LWAVE=.FALSE.
LCHARG=.FALSE.
KPPRA=64
KSCHEME=GAMMA
USEPOT=PAWPBE
KPPRA=64 是生成网格的目标,最终要检查真实 KPOINTS。本例三个结构实际均为 Gamma 中心 4×4×4 网格;不是“每个方向 64 个点”。EDIFF=1e-6 是电子收敛条件,NSW=0 表示静态计算,没有进行晶胞或原子位置优化。
cat inputs/1/str.out
晶格常数 5.43 Å 的完整 ATAT 结构如下,另两个是 5.40 和 5.46 Å:
1 0 0
0 1 0
0 0 1
0 2.715 2.715
2.715 0 2.715
2.715 2.715 0
0 0 0 Si
1.3575 1.3575 1.3575 Si
前 3 行定义坐标基底,随后 3 行定义晶胞,最后两行是原子位置和元素。转换后的 POSCAR 与 str_relax.out 会采用不同的坐标表示,不应逐行比较文本;应先还原晶胞和笛卡尔位置再比较。

图中画出实际两原子原胞、晶胞边界和一条原子间连线;周期镜像没有全部展开。原图。
3. 提交整套实例#
cat submit.slurm
作业申请 1 张 V100 16G、1 个 CPU 核,实际为 1 个 MPI 进程和 1 个线程。ATAT 轮询和 VASP 都在该 Slurm 分配内运行,不在登录节点执行 DFT。查看脚本后运行:
bash run.sh
脚本等待 Slurm 结束,再自动汇总数据和三张图。reference/ 是随包实际结果,新计算在 work/。整套重跑请使用新解压目录,避免把旧的停止标记或输出带入新任务。
实际流程依次为:
- 在
0和1结构目录创建wait,原生pollmach -e顺序计算它们。 - 给结构
2创建wait,同时创建stoppoll;本轮轮询停止,保留结构2的待算标记。 - 重新启动轮询,只计算结构
2。 - 对三个已有结果的结构重新放置
wait,包装器检查已有energy并跳过,VASP 不重复启动。 - 再尝试已被结构锁占用的目录,包装器明确拒绝第二个执行者。

本次三个 SCF 均为 11 次 DAV 迭代;四个轮询阶段的 VASP 调用数分别为 2、0、1、0。原图。
pollmach -e -m NO_MACHINE_FILE ... 在本例采用顺序本机模式;这里“本机”是已经分配到的计算主机。特意指定一个不存在的机器配置文件,避免读取个人旧 ~/.machines.rc 后按旧方式远程派发。本例通过 Slurm 分配资源,不使用直接 SSH 到计算节点的调度方式。
4. 包装器具体做了什么#
资料包 one-structure.sh 的完整内容为:
#!/bin/bash
set -euo pipefail
: "${SLURM_JOB_ID:?Submit the containing workflow through Slurm}"
if ! mkdir .dispatch-lock 2>/dev/null; then echo 'A worker already owns this structure';exit 3;fi
trap 'rmdir .dispatch-lock' EXIT
if test -s energy; then echo 'Existing completed energy retained; no new VASP';exit 0;fi
touch busy
if ! test -s INCAR; then runstruct_vasp -nr > prepare.log 2>&1; fi
printf '%s\n' "$SLURM_JOB_ID $PWD $(id -u)" >> ../VASP-CALLS.txt
mpirun -np 1 --bind-to none "$VASP_BIN" > native.log 2>&1
runstruct_vasp -ex > extract.log 2>&1
test -s energy
rm busy
原子地创建 .dispatch-lock 可避免两个工作进程同时处理一个结构;退出时释放自己的锁。busy 标记计算过程,失败时保留它帮助定位未完成结构。runstruct_vasp -nr 只生成输入,随后由当前 GPU 模块提供的 VASP_BIN 执行,最后 -ex 提取结果。
注意,有 energy 就跳过是这份小型包装器的规则,不等于任意旧结果都完整有效。恢复自己的任务前,应同时核对 OUTCAR 的电子收敛与正常结束、energy、str_relax.out、force.out、stress.out。不完整的结果应先保留再处理,不能直接用一个空标记冒充已完成。
pollmach 的退出码也不能替代这些检查:它可能在子命令失败后继续轮询。遇到 busy 长期保留、缺少 energy 等情况,先查看该结构目录的 prepare.log、native.log、extract.log 及 Slurm 状态。
mpirun --bind-to none 在本例配合 Slurm 的单核分配和 OMP_NUM_THREADS=1 使用,避免该 MPI 版本在单核 cpuset 上再次绑定出错;不改变作业申请的 CPU 数。
5. 怎样停止和恢复自己的轮询#
本例程序已实际执行停止、恢复与重复等待标记流程。日常使用时,touch work/stoppoll 是通知这一套轮询停止的方式:通常等当前子计算返回后才会检查到它,不是立即取消正在运行的 VASP。
如果必须立即取消计算,用 squeue -u "$USER" 找到对应作业,再对确认的作业号执行 scancel。恢复前先确认原作业和旧轮询进程已经结束;不要只看目录里有没有锁就直接删除锁、再启动一个主控。
本包的 workflow.py 是一次性的完整演示脚本。它故意包含停止和恢复阶段,不能作为任意大型 MAPS 项目的通用“再次运行”按钮。为自己的结构库接入时,可复用 pollmach 与 one-structure.sh 的衔接方式,并依据真实待算目录建立 wait;MAPS 的结构选择和簇展开拟合详见ATAT 簇展开教程。
6. 读取能量、力和应力#
head -n 4 si-energy-stress.csv
| 常规晶格常数 | 原胞体积 | ATAT energy / 原胞 |
|---|---|---|
| 5.40 Å | 39.366000 ų | −10.642059 eV |
| 5.43 Å | 40.025752 ų | −10.656382 eV |
| 5.46 Å | 40.692834 ų | −10.663991 eV |
energy 是最后一步 OSZICAR 的 F 值,单位 eV,针对整个晶胞。extract_vasp 不自动改取 E0,也不自动除以原子数;本例每原子能量才是该数值除以 2。不同材料、展宽与能量定义不能随意混合交给拟合程序。
force.out 是按实际原子顺序排列的 eV/Å;stress.out 是从 VASP in kB 行组装的对称 3×3 应力张量,单位 kbar,1 kbar = 0.1 GPa。str_relax.out 需要连同自身坐标基底读取。

图中只连出三个已算点,没有用它们拟合状态方程或推断平衡晶格常数。原图。本例分析程序逐项对照 OSZICAR、真实 VASP 力/应力与 ATAT 提取文件,并检查原子数、位置、晶胞、实际 k 网格和重复调用数量。
7. 只看已有数据或重新画图#
bash analyze.sh
该命令读取随包参考数据,不提交作业、不重新运行 VASP。公开包提供原始 OSZICAR、结构、ATAT 结果和必要科学输出片段,不包含 POTCAR、WAVECAR、完整 OUTCAR 或软件二进制。
处理自己刚计算的结果:
bash analyze.sh work
官方接口与调度背景见 ATAT 的 VASP 接口 和队列系统使用方式。本篇提供适合这套集群环境的具体衔接脚本;更多命令入口仍在 ATAT 专题。