ATAT 专题

ATAT 自动计算实操:Slurm、停止恢复与避免重复任务

用三个硅结构串起 pollmach、VASP 输入生成、GPU 计算与结果提取,演示待算标记、停止恢复和重复任务保护。

更新于 2026-11-10约 7 分钟阅读按任务与环境选择适用配置
阅读本篇目录

当 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/。整套重跑请使用新解压目录,避免把旧的停止标记或输出带入新任务。

实际流程依次为:

  1. 在 0 和 1 结构目录创建 wait,原生 pollmach -e 顺序计算它们。
  2. 给结构 2 创建 wait,同时创建 stoppoll;本轮轮询停止,保留结构 2 的待算标记。
  3. 重新启动轮询,只计算结构 2。
  4. 对三个已有结果的结构重新放置 wait,包装器检查已有 energy 并跳过,VASP 不重复启动。
  5. 再尝试已被结构锁占用的目录,包装器明确拒绝第二个执行者。

实际轮询与电子迭代结果

本次三个 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 专题。

需要根据你的体系选择资源?联系讨论计算需求。实际可用软件与权限,以当前账户和运行环境为准。

查看配图

放大后可滚动查看细节,按 Esc 关闭。

100%查看原图 ↗