ATAT 自动增补实操:MAPS 选结构、VASP 计算与能量反馈
用 Cu–Au 小结构实际串起 ready/wait/energy 协议、Slurm GPU 计算、形成能参照与异常数据恢复。
阅读本篇目录
在ATAT 调度与停止恢复中,待算结构由用户预先准备。本篇进一步由原生 MAPS 根据已有信息生成待算结构,再用 VASP 计算并把能量送回 MAPS。
本例实际完成四个 Cu–Au FCC 构型:两个纯端元和两个等组成的不同排布。候选胞限制为最多四个原子,固定常规晶格常数 3.8 Å,只保留一个 pair 簇。这些限制是为了简明展示自动任务衔接;四条能量和粗网格不能建立可靠合金相图,也不能用作已经收敛的簇展开。
1. 解压与运行入口#
下载完整 MAPS–Slurm 操作包,在登录节点运行:
python3 -m zipfile -e atat-MAPS-wave536-ad3556dfd989.zip atat-MAPS
cd atat-MAPS
需要 VASP 使用权限、Cu/Au 的 PBE PAW 赝势和 V100 16G 分区权限。未初始化 ATAT 个人配置时先执行 yskit atat-init,已有配置会保留;请核对其 POTPAWPBE 路径。软件环境为 ATAT 3.52(GCC 13.3)及 VASP 6.5.1 V100 模块,加载 NVHPC 25.3 与 MKL 2023.2。
2. 母晶格怎样描述可替换格点#
cat lat.in
3.8 3.8 3.8 90 90 90
0 .5 .5
.5 0 .5
.5 .5 0
0 0 0 Cu,Au
Cu,Au 表示同一个格点可放 Cu 或 Au。逗号不是把两个原子同时放在该位置。这里每个可替换格点也对应一个原子,因此每格点与每原子能量相同;若有固定子晶格、空位等情况,需要重新核对两种归一化是否一致。
本包运行命令为 maps -d -t=1 -mv=4 -m=2 -sig=9:一秒检查输入变化,枚举胞最多四原子,最高簇阶到 pair。nbclusters.in 的第一行是 1,随后是 0,用于这个极小教学模型的簇数选择。不要把这一组限制直接当成真实合金的推荐拟合参数。
3. VASP 参数与提交脚本#
cat vasp.wrap
[INCAR]
SYSTEM=CuAu MAPS Slurm example
ENCUT=400
PREC=Accurate
EDIFF=1e-6
ISMEAR=1
SIGMA=0.1
NSW=0
IBRION=-1
ALGO=Normal
LREAL=.FALSE.
LWAVE=.FALSE.
LCHARG=.FALSE.
KPPRA=64
KSCHEME=GAMMA
USEPOT=PAWPBE
四个构型保持 ENCUT、展宽、泛函/赝势类别和电子收敛设置一致。KPPRA 生成实际 k 网格,不同胞大小可能得到不同网格;严肃比较形成能前还应做相应的倒空间密度、ENCUT、展宽和结构松弛收敛检查。本例 NSW=0,没有进行结构优化。
cat submit.slurm
该脚本申请一张 V100 16G 和两个 CPU 核。VASP 用一个 MPI 进程和一个线程;MAPS 是单独的轻量进程,轮询、计算及异常恢复演示都在这一份 Slurm 分配内。执行整套实例:
bash run.sh
脚本等待作业结束并画图。新输出在 work/,参考数据在 reference/。整套重新计算请用新解压目录;默认 ATAT 调 CPU VASP 6.4.2 的包装器没有被修改,本例明确使用“runstruct_vasp -nr → GPU VASP → runstruct_vasp -ex”的衔接方式。
4. ready、wait、energy 如何连接起来#
每一轮实际执行下面的顺序:
- 已有 Slurm 资源后,驱动程序创建根目录的
ready。 - MAPS 建立一个新的数字目录,写入
str.out与wait,并删除ready。 - 原生
pollmach -e找到wait,调用本包的one-structure.sh。包装器使用结构锁避免重复执行,生成 VASP 输入并开始计算。 - VASP 正常完成后,
runstruct_vasp -ex写入整个计算晶胞的energy、结构、力和应力。程序检查真实输出后才认为本轮结束。 - MAPS 读取新能量后更新自己的拟合与候选结构信息,再进入下一轮。
本例共请求四轮,每轮只启动一个 VASP。ready 表示可以提供一个计算名额,不表示 DFT 已经完成;wait 表示待算,busy 是本包工作进程的计算中标记。只有进程退出码而没有有效能量、结构及 VASP 输出,不应当作成功。

蓝色为 Cu,金色为 Au;图中是实际计算胞,周期镜像没有全部展开。两个 Au 比例都是 0.5 的构型具有不同的排布。原图。
str.out 中有些坐标可以位于晶胞之外。VASP 的 CONTCAR 可能把它们折回晶胞;比较输入和提取结构时,应按完整周期晶胞判断位置是否等价,不能只比较两个坐标数字是否相同。
5. 读出形成能,而不是混用晶胞总能#
head -n 5 maps-energies.csv
本次实际结果为:
| 目录 | 原子数 | Au 比例 | 晶胞 F / eV | 形成能 / eV·格点⁻¹ |
|---|---|---|---|---|
| 0 | 1 | 0 | −3.4951374 | 0 |
| 1 | 1 | 1 | −2.1325518 | 0 |
| 2 | 2 | 0.5 | −6.3905064 | −0.3814086 |
| 3 | 2 | 0.5 | −6.7034610 | −0.5378859 |
energy 是 OSZICAR 最后一步的 F 值,按整个计算晶胞计。MAPS 在这个全占据模型中按格点归一化,并扣除端元参照。Au 比例为 x、原子数为 N 时,本例独立计算:
形成能 = F_cell/N − (1−x) F_Cu/atom − x F_Au/atom。
例如目录 2 先将 −6.3905064 eV 除以 2,再扣除两种端元的平均值,得到 −0.3814086 eV/格点。不要先把 energy 文件除以原子数,再交给默认 MAPS,否则会重复归一化。
6. fit.out 每列是什么意思#
本次原生输出是:
0.000000000 0.000000000 0.001725947 -0.001725947 1.000000000 0
1.000000000 0.000000000 0.001725947 -0.001725947 1.000000000 1
0.500000000 -0.381408600 -0.395216176 0.013807576 1.000000000 2
0.500000000 -0.537885900 -0.527530218 -0.010355682 1.000000000 3
六列依次为组成、已算形成能、拟合值、已算减拟合的残差、权重、结构目录编号。两个端元的“已算形成能”为零,拟合值仍可有微小残差;不要为了让图看起来规整而把它们手动改成零。

右图显示训练集残差;原生交叉验证分数为 0.125827 eV/格点。样本只有四条,这个数值和有限候选胞中的基态提示都不能证明模型有可靠的预测能力。原图。真实建模需增加结构种类和能量数据,并检查独立预测、物理收敛和基态一致性。
7. 异常数据恢复:不要把旧 fit.out 当成新拟合#
本包还会在完成四条能量后,演示一次不重跑 DFT 的数据恢复:
- 确认本包自己的 MAPS 子进程已正常退出。
- 把目录 3 的
energy原样移动为energy.preserved,创建error,重新启动本包的 MAPS。 - 此时只剩三条可读能量,当前模型提示
Not enough known energies to fit CE。旧fit.out仍有四行,但内容和更新时间都没有变化,不是本轮新生成的拟合。 - 停止这一轮 MAPS,将原文件移回
energy并移除error,再次读取四条能量。程序生成新的四行拟合,原结构和能量字节保持不变。

图中斜线柱表示磁盘上残留的旧四行文件,不代表当前三条输入拟合成功。原图。
这也说明,处理自己的异常数据时,应同时查看当前 maps.log、实际输入集合以及 fit.out 的更新时间。不要只凭“文件存在”就继续相图或蒙特卡洛分析。仅放置一个 error、保留原能量和旧进程,也不应未经核对就认定旧数据已从当前拟合中剔除。
本例的恢复脚本只操作自己的四个算例目录,并保留原能量文件;不是让用户随意删除正在运行任务的文件。大型 MAPS 项目恢复前要确认旧 MAPS、轮询器与 Slurm 作业状态,避免两个主控同时写同一个目录。停止方式和重复执行保护见前篇教程。
8. 单独分析已有结果#
只处理资料包参考结果,不提交作业:
bash analyze.sh
处理刚完成的新计算:
bash analyze.sh work
分析程序从原子组成和端元能量独立重算形成能,并核对实际 VASP 与 ATAT 的结构、力、应力和能量传递。公开包提供必要科学输出片段、输入与原生拟合文件,不包含赝势、软件二进制、完整 OUTCAR 或个人配置。
原生协议、输入及输出格式见 MAPS 官方说明;队列衔接背景见 ATAT 队列系统说明。