VTST 优化器选择与收敛
用同一个两原子Si结构,准备完整输入、选择IOPT并提交计算,比较真实DFT力调用与最终收敛结果。
阅读本篇目录
这篇用一个很小的Si模型说明:怎样选择VTST优化器,怎样提交和查看结构优化,以及怎样判断它是否真的移动了原子、达到了力收敛要求。
下载完整输入、实际收敛数据与绘图程序。常用优化器使用现有 VASP 6.6.1 VTST GPU构建,P100/V100对应模块由NVHPC 25.3编译。ML路线使用单独的CPU修订构建,见ML优化器实操。
1 本例优化什么#
模型是晶格常数5.43 Å的Si金刚石原胞,共两个原子。第1个Si固定,第2个Si从理想晶位移动 (+0.12, -0.08, +0.06) Å 后开始优化。
这里做原子位置优化:晶胞固定,只有第2个Si的三个坐标可变。 ISIF=2 配合POSCAR中的选择性约束;本例不比较晶胞优化。
![]()
完整POSCAR:
Si
1.0000000000000000
0.0000000000000000 2.7149999999999999 2.7149999999999999
2.7149999999999999 0.0000000000000000 2.7149999999999999
2.7149999999999999 2.7149999999999999 0.0000000000000000
Si
2
Selective dynamics
Direct
0.0000000000000000 0.0000000000000000 -0.0000000000000000 F F F
0.2242173112338858 0.2978821362799264 0.2463167587476980 T T T
F F F 固定第1个原子,T T T 允许第2个原子移动。图中的绿色点是理想晶位,黄色点是实际初始位移后的原子。
2 先看参考图,再准备新任务#
python3 -m zipfile -e vtst-optimizers.zip .
cd vtst-optimizers-wave279
bash run.sh
head analysis/summary.csv
ls analysis/figures
这一步读取附件实际数据并生成三张图,不启动新的DFT。接着准备自己的计算:
bash prepare.sh
按提示输入IOPT编号,直接回车默认 2;再选择P100或V100 16G,默认P100。程序打印下一步,例如:
cd work/iopt-2
sbatch run.sh
squeue -u "$USER"
同名工作目录已经存在时,程序会停止,保留已有结果。套餐用户按自己的分区权限调整提交脚本中的分区,保留对应的模块、单GPU和单MPI设置。
3 IOPT怎么选#
| IOPT | 方法 | 本例中的使用方式 |
|---|---|---|
| 0 | VASP内置优化器 | 本例配 IBRION=2 作为普通结构优化的CG对照 |
| 1 | VTST LBFGS | 利用有限历史信息构造逆曲率近似 |
| 2 | VTST力驱动CG | 根据力与曲率方向推进,适用于VTST投影力路线 |
| 3 | Quick-Min | 用带阻尼的动力学式更新进行优化 |
| 4 | 最速下降SD | 根据力乘步长系数更新,便于理解和对照 |
| 7 | FIRE | 按力与速度方向自适应调整优化推进 |
| 8 | ML/PyAMFF | 在线训练局部替代势后结合DFT检查,使用专门的ML修订模块 |
IOPT=2 和 IBRION=2 不是同一个优化器。普通结构优化可用VASP内置CG;NEB、dimer等修改了优化力的路线,应按对应VTST方法选择力驱动优化器,不能直接把这个普通优化对照搬过去。
本版本的 IOPT=5 没有完整实现,IOPT=6 不作为有效的力驱动优化选项。日常先从 1、2、3、4、7 选择,ML路线单独准备。
4 完整INCAR与KPOINTS#
IOPT=2 的完整INCAR:
SYSTEM=Si2-VTST-IOPT2
ENCUT=450
PREC=Accurate
EDIFF=1E-6
EDIFFG=-0.02
ISPIN=1
ISMEAR=0
SIGMA=0.05
NBANDS=16
LREAL=.FALSE.
LASPH=.TRUE.
ISYM=0
ISIF=2
IBRION=3
POTIM=0
IOPT=2
NSW=160
NELM=150
ALGO=Normal
MAXMOVE=0.10
TIMESTEP=0.20
SDALPHA=0.10
FDSTEP=0.005
LWAVE=.FALSE.
LCHARG=.FALSE.
VTST优化器使用 IBRION=3、POTIM=0,由VTST负责更新位置。POTIM=0 不表示原子不动;应查看实际坐标、力和优化器输出。
EDIFF=1E-6 控制电子收敛,EDIFFG=-0.02 表示按力收敛。MAXMOVE=0.10 限制一次更新幅度;SDALPHA=0.10 只用于SD,TIMESTEP=0.20 用于相应的动力学式优化器。它们是这个小位移模型的示例设置,换体系后要结合初始力和收敛行为调整。
KPOINTS:
SmallSi optimizer comparison
0
Gamma
3 3 3
0 0 0
附件每个IOPT目录都保存了完整输入。只有 IOPT=0 对照改用 IBRION=2、POTIM=0.5;其余常用路线保持VTST推进设置。各任务使用同一份初始结构、PAW-PBE Si、450 eV截断与3×3×3网格。
POTCAR由准备程序从集群已有Si库复制到工作目录,不包含在网站下载包中。
5 实际运行命令#
P100提交脚本加载:
module load vasp/6.6.1-p100-vtst
mpirun --bind-to none -np 1 vasp_std > vasp.log 2>&1
V100 16G使用对应 vasp/6.6.1-v100-vtst 模块。命令放在申请了对应GPU的Slurm脚本内,提交步骤见第2节。
查看结果:
tail OSZICAR
grep 'reached required accuracy' OUTCAR
grep 'OPT:' OUTCAR | tail
cat CONTCAR
不仅看程序是否退出,还要看最后的力和实际结构。第1个原子固定时,收敛判断针对允许移动的原子;不能把固定原子上保留的物理受力当成自由原子没有收敛。
6 真实结果如何比较#

| 方法 | DFT力调用次数 | 电子迭代总次数 | 最终自由原子力 / eV·Å⁻¹ |
|---|---|---|---|
| VASP内置CG,IOPT=0 | 7 | 39 | 0.009555 |
| LBFGS,IOPT=1 | 6 | 37 | 0.017057 |
| VTST力驱动CG,IOPT=2 | 7 | 41 | 0.005469 |
| Quick-Min,IOPT=3 | 10 | 54 | 0.018541 |
| SD,IOPT=4 | 8 | 46 | 0.012359 |
| FIRE,IOPT=7 | 14 | 60 | 0.008865 |
| ML修订路线,IOPT=8,1MPI | 9 | 51 | 0.000374 |
| ML修订路线,IOPT=8,2MPI | 9 | 51 | 0.000374 |
这些次数对应实际DFT受力计算,包含求曲率或线搜索所需的调用,不应简单等同于相同幅度的结构移动次数。ML的1/2MPI曲线在本例中重合。

所有路线达到0.02 eV/Å的自由原子力目标,最终总能量彼此相差约十几微电子伏。这个两原子、很小初始位移的例子用于学习操作;步长参数、体系和计算后端都会影响次数,不据此给优化器排通用速度名次。
尤其是,本例ML路线并没有比普通CG减少DFT调用。是否值得使用ML,需要在自己的体系上看训练代价、局部替代势质量和实际DFT调用。
7 分析自己的输出#
回到资料包根目录:
module load ase/3.29.0
python analyze.py work analysis-my-run
head analysis-my-run/summary.csv
脚本读取各工作目录中的INCAR、OUTCAR和vasprun.xml,提取真实力调用、能量和第2个原子的力,再画图。它针对本篇两原子约束模型编写;换成其他体系时,要相应修改自由原子选择。
继续看ML优化器实操、NEB与CI-NEB及dimer流程。方法和参数出处见VTST官方优化器说明。