
一 基础信息
1 软件简介
VASP(Vienna Ab-initio Simulation Package)是一个用于从第一性原理进行材料模拟的计算物理软件。它是基于量子力学的密度泛函理论(Density Functional Theory, DFT)和赝势平面波(pseudopotential plane-wave)方法开发的。广泛应用于固体物理、凝聚态物理、材料科学和表面科学领域,用于模拟和预测材料的电子结构、物理性质和化学反应。作为一款高级计算材料科学软件,VASP使用赝势方法来处理电子间的相互作用,减少了计算中自由电子的数量,提高了计算效率。VASP优化了并行计算,可以有效利用现代超级计算机的计算资源,适合进行大规模的计算任务。这意味着在处理大型体系或需要高计算精度的情况下,VASP能够提供快速而有效的计算。
2 版本简介
目前集群中编译安装的是VASP6.3.2版本,支持VASP Transition State Tools,OpenMPI和MPI并行计算。计算时可根据需求选择不同的编译配置,具体有vasp_std、vasp_gam和vasp_ncl。
- vasp_std:标准版本(Standard),适用于大多数类型的计算。它支持最全面的功能,包括自旋极化、自旋轨道耦合在内的功能。
- vasp_gam: Gamma点优化版本,计算速度比vasp_std快8倍。适用于大型超胞计算或者当计算仅需在Gamma点进行时,如某些类型的金属和分子系统。
- vasp_ncl:非共线(non-collinear)版本,计算速度比vasp_std慢8倍,主要用于处理涉及自旋轨道耦合、自旋波或其他复杂磁性相互作用的计算。
3 输入文件
通过VASP软件提交计算任务时,我们需要准备四个输入文件,即INCAR,KPOINTS,POSCAR,POTCAR。
- INCAR文件是用来设置计算参数的文件。包含了影响计算类型、精度、电子结构、优化步骤等方面的参数。
- KPOINTS是布里渊区网格(K点)定义文件,记录了倒空间的取样的方法,关系到计算的精度和成本。
- POSCAR是构型描述文件,主要包括平移矢量、原子类型和数目、以及原子坐标。
- POTCAR是各原子的赝势定义文件,记录了所需要的赝势。当体系含有多个元素时,需使用cat命令将不同元素的赝势文件结合成新的赝势文件,且结合时赝势的种类和顺序都必须和POSCAR中原子种类和顺序一致。
4 输出文件
在VASP计算中,生成了多种输出文件,每个文件都有其特定的作用和用途。可根据需求输出相应的文件。
- CHG: 该文件包含电荷密度分布信息,通常用于计算材料的电子结构和电荷分布。
- CHGCAR: 与CHG文件相似,但使用VASP特定的格式,通常用于可视化电荷密度。
- CONTCAR: 该文件包含最后一个步骤的原子坐标,通常用于后续的结构优化或分析。
- DOSCAR: 包含态密度(Density of States, DOS)信息,用于分析材料的电子态结构。
- EIGENVAL: 包含能量和带结构信息,通常用于分析材料的能带结构。
- IBZKPT: 描述第一布里渊区(First Brillouin Zone, IBZ)的K点信息。
- OSZICAR: 提供了计算过程中每个步骤的能量和其他物理量,通常用于监视计算进度。
- OUTCAR: 包含详细的计算输出信息,如能量、力、应力等。
- PCDAT: 包含用于量子化学计算的附加数据。
- WAVECAR:包含平面波展开的波函数信息。
- XDATCAR:包含时间演化或MD(分子动力学)计算中的原子轨迹。
- vaspout.h5:包含额外输出信息的HDF5格式文件。
- vasprun.xml: 包含VASP计算的总结和元数据。
5 提交任务脚本
5.1 单任务提交
#!/bin/bash #这是脚本的解释器指令,表示该脚本将使用Bash shell来运行
#SBATCH --job-name=vasp_openmpi_job #指定了作业的名称
#SBATCH --partition=Nebula_Elites #指定了作业在的Elites分区进行计算
#SBATCH --nodelist=node1 #指定了作业运行在的1号节点
#SBATCH -N 1 #指定了需要1个计算节点
#SBATCH --ntasks-per-node=16 #指定每个节点上运行的任务数为16个
#SBATCH --cpus-per-task=1 #目前集群已关闭超线程,cpus-per-task=1!!!!
#SBATCH --time=9999:00:00 #指定了作业的最大运行时间为9999小时
#SBATCH --output=%j.log #指定了标准输出文件的名称,"%j" 会被替换为作业 ID
#SBATCH --error=%j.err #指定了标准错误文件的名称,"%j" 会被替换为作业 ID
# 加载到计算任务所在文件夹,此命令针对直接修改脚本提交计算任务。
cd /home/lmm/vaspadenergy/OCO/
#加载 OpenMPI
. /mnt/softs/spack/share/spack/setup-env.sh && \
spack load openmpi@4.1.4%gcc@9.4.0 arch=linux-ubuntu20.04-zen2
# 使用 mpirun提交计算任务
mpirun -n 16 -map-by node -bind-to core \
-x OMP_PROC_BIND=True -x OMP_PLACES=cores -x OMP_NUM_THREADS=1 -x OMP_STACKSIZE=512m \
singularity exec /mnt/softs/singularity_sifs/vasp6.3.2_omp_mpi_openmpi412.sif \
vasp_std
#也可使用srun命令提交计算任务
srun -np 16 singularity exec /mnt/softs/singularity_sifs/vasp6.3.2_omp_mpi_openmpi412.sif vasp_std
其中-n 16,-np 16是指定使用16个进程,对应之前SBATCH脚本中的每个节点上的任务数。
5.2 多任务提交
#!/bin/bash
#SBATCH --job-name=vasp-batch
#SBATCH --partition=Nebula_Elites
#SBATCH --nodelist=node1
#SBATCH -N 1
#SBATCH --ntasks-per-node=16
#SBATCH --cpus-per-task=1
#SBATCH --time=9999:00:00
#SBATCH --output=%j.log
#SBATCH --error=%j.err
# 将16个核心平均分配给两个任务,不重复使用相同核心工作,以提高计算效率
cpu_sets=("0-7" "8-16" )
# 指明两个任务所在目录
directories=(
"/home/lmm/H-Zn"
"/home/lmm/H-Ga"
)
#加载 OpenMPI
. /mnt/softs/spack/share/spack/setup-env.sh
spack load gcc@12.1.0%gcc@9.4.0 arch=linux-ubuntu20.04-zen2 openmpi@4.1.4%gcc@9.4.0 arch=linux-ubuntu20.04-zen2
#切换到指定目录,并使用mpirun命令并行运行VASP
for i in {0..1}; do
cd ${directories[$i]} &&\
mpirun -n 8 \
--cpu-set ${cpu_sets[$i]} \
-x OMP_PROC_BIND=True \
-x OMP_PLACES=cores \
-x OMP_NUM_THREADS=1 \
-x OMP_STACKSIZE=512m \
singularity exec /mnt/softs/singularity_sifs/vasp6.3.2_vtst_omp_mpi_openmpi412.sif \
vasp_std > log.log &
done
其中–cpu-set ${cpu_sets[$i]}等同于map-by-core bind-to-core
5.3 将计算任务复制到/tmp目录进行计算,并定期将计算结果复制回个人目录
#!/bin/bash
#SBATCH --job-name=CO2+Ovac2-CI-NEB
#SBATCH --partition=Nebula_Galaxy
#SBATCH -N 1
#SBATCH --ntasks-per-node=96
#SBATCH --time=9999:00:00
#SBATCH --output=%j.out
#SBATCH --error=%j.err
export PMIX_MCA_gds=hash
# 动态构造临时工作目录
tmpdir=/tmp/$USER@$SLURM_JOB_ID
# 创建临时工作目录
mkdir -p $tmpdir
# 将SLURM提交目录的内容复制到临时目录
cp -r $SLURM_SUBMIT_DIR/* $tmpdir
# 转移到临时工作目录
cd $tmpdir
# 初始化或更新计数器文件
if [ ! -f count.txt ]; then
echo 0 > count.txt
fi
# 检查OUTCAR文件是否存在
if [ -f OUTCAR ]; then
# 检查OUTCAR文件中是否存在特定字符串
if grep -q "reached required accuracy - stopping structural energy minimisation" OUTCAR; then
echo "计算已经完成,不需要重新计算。"
# 计算完成后,复制输出文件回SLURM作业提交时所在的目录
cp -r $tmpdir/* $SLURM_SUBMIT_DIR
echo "VASP calculation process completed. Results are saved to $SLURM_SUBMIT_DIR"
# 清理临时工作目录
rm -rf $tmpdir
exit 0
fi
fi
# 若未达到所需精度或OUTCAR文件不存在,则继续进行计算
count=$(cat count.txt)
if [ "$count" -lt 3 ]; then
echo "准备开始或重新计算。当前计算次数: $(($count + 1))"
echo $(($count + 1)) > count.txt
else
echo "计算次数已超过三次,自动终止任务。"
# 清理临时工作目录
rm -rf $tmpdir
exit 0
fi
# 启动计算前,后台运行一个循环,每1小时备份一次数据
(
while true; do
cp -r $tmpdir/* $SLURM_SUBMIT_DIR
echo "Backup completed at $(date)"
sleep 3600 # 等待1小时
done
) &
# 在这里执行您的计算逻辑
rm -rf vaspout.h5
srun --mpi=pmix -n 96 --cpu-bind cores singularity exec /mnt/softs/singularity_sifs/vasp6.3.2_vtst_omp_mpi_openmpi412.sif vasp_gam
# 无论计算是否成功,均将结果复制回SLURM作业提交时所在的目录
cp -r $tmpdir/* $SLURM_SUBMIT_DIR
echo "VASP calculation process completed. Results are saved to $SLURM_SUBMIT_DIR"
# 清理临时工作目录
rm -rf $tmpdir
# 结束后台备份进程
kill %1
6 提交任务流程
- 准备好所有输入文件(INCAR、POTCAR、POSCAR、KPOINTS)后放入一个文件夹中。
- 在脚本中指定输入文件所在位置,脚本命名为“slurm.sh”,并将其放在个人目录下。
- 直接在个人目录下利用“sbatch slurm.sh”命令提交计算任务即可。
- 只需更改脚本中输入文件的位置,Slurm作业调度系统将会根据脚本中的指令自动切换到正确的目录,并在那里启动VASP计算。
二 经验分享
1 合理参数设置
为避免计算资源浪费,请谨慎设置INCAR文件中各参数和KPOINTS。本集群计算资源有限,在不知道各参数与集群适配度和参数实际作用的情况下,切勿一味追求高精度而造成不必要的计算资源浪费。故在此申明,请熟读VASP官网的使用手册,并尽可能了解自己的研究体系后再进行任务计算。以下对影响计算速度的几个重要参数作出注解:
- ENCUT:平面波基组中使用的最大动能截断,决定了平面波基组的大小。ENCUT的默认值为POTCAR 文件中最大ENMAX值,但推荐手动设置ENCUT值,一般来说ENCUT值越高,计算精度和成本也越高。
- PREC:控制计算的精度,包括基组的质量和迭代过程中的一些细节。
- EDIFF:自洽场(SCF)计算的能量收敛标准,用于确定电子步骤何时收敛。较小的值会提高精度但可能导致更多的SCF迭代。默认值为EDIFF=10−4 eV,官方推荐使用EDIFF=10−6eV,但请依据实际任务类型和体系情况设定。
- EDIFFG:离子步骤和结构弛豫收敛的能量或力的标准,决定了结构优化何时停止。当EDIFFG为负值时,表示使用力作为收敛标准;当EDIFFG为正值时,表示使用能量作为收敛标准。使用能量作为收敛标准,收敛速度较快。故当初始结构较为糟糕难收敛时,推荐先使用能量作为标准进行计算,再使用力作为标准进行续算直至达到精度要求。
- ALGO:用于指定电子自洽迭代的算法。不同的ALGO设置影响计算的速度、稳定性和准确性。常用的ALGO设置ALGO=Conjugate、 ALGO=Normal、ALGO=VeryFast其中ALGO=Normal为默认算法, 采用Davidson迭代方案,提供了良好的速度和稳定性平衡。适用于大多数标准计算。在不需要特别考虑计算速度或稳定性的一般情况下,这是一个可靠的选择。ALGO=Conjugate是基于共轭梯度方法的优化算法,它通常用于精确地找到势能表面上的最小值点。适用于难以收敛的系统或需要非常精确能量最小化的情况。ALGO=VeryFast采用了RMM-DIIS算法,计算速度快于DAV算法,适用于大体系或需要快速获取结果的情况。
- IBRION:控制离子弛豫和分子动力学的算法,主要目的是控制结构优化的过程,但间接影响计算速度。IBRION=1表明基于泰勒展开的准牛顿方法,IBRION = 2表明采用共轭梯度法。
- NCORE:核心并行,指每个并行计算节点上用于波函数处理的核心数,NCORE=cores/node
- NPAR:节点并行,控制波函数和电荷密度的并行计算,NPAR=compute nodes
- KPAR:K点并行,控制K点的并行处理,KPAR的设置应该能够均匀地分配整个K点网格。
- KPOINTS文件:用于指定布里渊区中用于积分和采样的K点网格。具体包括K点的取样方式和倒空间xyz方向上的K点密度。K点密度越大,精算精度越高,但在xyz方向的K点密度应与晶格常数(abc)成一定比例。
2 并行计算参数调试思路
2.1 确定NBAND
NBANDS是指计算过程中KS or QP轨道的总数量,如何确定NBANDS的数量取决于计算任务和体系。不同体系的NBANDS不同,可以先简单测试系统的NBANDS数目,依据NBANDS合理设置NCORE、KPAR、KPAR。VASP中最小的NBANDS值要求为所有占据态+1个空带。 推荐使用VASP中的NBANDS默认设置值,即NBANDS=电子数/2+离子数/2。RMM-DIIS算法比DAV算法对bands数量更敏感,需要更多bands。
不同计算任务中,NBANDS的区别:
在电子最小化计算中,空态对能量并不影响,但需要空态才能更好收敛。在多体微扰理论计算中(GW,RPA, and BSE)需要大量的空轨道,空轨道数量大于占据态,这也将导致收敛速度减慢,故此时使用ALGO=Exact 以帮助收敛。
当进行并行计算时,NBANDS自动增加,NCORE>1、KPAR>1时NBANDS自动增加以使能够被核心数整除。
当进行自旋极化计算时,NBANDS的默认值会增加以考虑初始极化。
当进行非共线计算时, NBANDS的默认值会增加以考虑旋量分量。
2.2 并行计算参数了解
- KPAR指代有多少KPOINT被并行的处理。
- NCORE指代一个BAND在多少CPU 核中进行计算。
- NPAR指代总计有多少个BAND并行处理。
- NCORE与NPAR只能指定一个有效。KPOINT并行属于外层的并行,BAND并行属于较内层的并行。
- 推荐设置NCORE=2,最高为每个节点的核心数。对于100左右的原子,NCORE=4是不错的选择,如果体系原子数过多,NCORE可增大。但实际情况可根据测试结果分析。
- K点并行虽有效但对存储要求高,若内存空间不够时需谨慎设置。根据个人经验,若KPOINTS个数不多时,KPAR=2设置已足够,调整NCORE参数,计算速率比KPAR=4,KPAR=8的明显提高。一味的将KPAR增大对计算效率提升不大,但对内存要求过大,该方法并不是一个明智选择。
2.3 小型测试
- 对于小型体系,可在登陆节点直接进行测试,利用time命令记录当迭代一定步数时所需时间,比较不同NCORE、KPAR参数对计算时间的影响,进而确定最佳并行参数设置。
- 对于大体系,在登陆节点的方式并不可取,因为迭代较慢。可以通过脚本提交任务,在脚本中设置当迭代到某步,如“10F”时自动终止任务,并记录任务时间以便后期进行比较。
3 常查看计算结果
当提交任务后,记得时常查看已更新的计算结果,依据现有结果分析任务的原子运动轨迹是否正确,结构是否合理。若发现趋势、结构不合理的情况,应停止计算,重新调整后再提交计算。请勿提交任务后就任其计算,以免造成不必要的资源浪费和较低的工作效率。
4 常见报错及解决
4.1 结构不合理

出现以上情况主要是由于原子间距离太近或是POSCAR中晶格占位有问题导致难收敛。解决方法有将ALGO参数调整为ALGO=VERY_FASE,使用RMM方法收敛;也可调整结构重新计算。
4.2 HDF5与集群架构不兼容

出现以上报错是HDF5文件与INCAR文件结合出现错误。计算任务的非正常终止,重新计算时已有的输出结果和INCAR文件不兼容。建议在slurm.sh脚本中强制清除HDF5文件(rm -rf vaspout.h5)。
4.3 频率计算时

出现以上错误,请检查是否有以下设置:
①使用了NCORE/NPAR;若有,取消NCORE/NPAR参数设置,频率计算时不能设置这些并行计算。
②使用 IBRION=5破坏了结构的对称性;若有,尝试使用ISYM=0解决该问题。
③设置了LORBIT=11参数;若有,取消该参数设置。
4.4 "ZBRENT: fatal error in bracketing"

出现该错误是因为能量振荡,无法找到下一个稳定能量。尝试使用以下方法解决:
①更改IBRION=1,较为推荐,能够有效解决该报错。
②增加PTIOM=0.1。
③增加ENCUT。
对于同一研究体系,计算参数要保持一致,若是计算过程中为解决报错问题而进行了参数调整以帮助收敛,最后要在已收敛基础上设置为原参数重新计算,以保证数据的有效性和准确性。
4.5 DFT+U计算时的参数设置


出现以上错误,请仔细检查POSCAR/POTCAR中元素以及你想要进行U校正的顺序是否一一对应。如下图所示
DFT+U Calculation
LDAU = .TRUE. (Activate DFT+U)
LDAUTYPE= 2 (Dudarev, only U-J matters)
LDAUL = 2 2 -1 -1 (Orbitals for each species 2 means d group metals -1 means no U )
LDAUU = 5 2.5 0 0 0 (U for each species)
LDAUJ = 0 0 0 0 0 (J for each species)
LMAXMIX = 4 (Mixing cut-off, 4-d, 6-f)
4.6 跨节点计算时可能出现的错误

当进行跨节点计算时(4-7号节点),可能会出现以上错误,尽量使用5-7号节点进行计算。
三 过渡态计算
3.1 计算方法
CI-NEB:
CI-NEB 方法是一种用来寻找反应途径上最小能量路径(MEP)的技术。它通过创建一系列彼此通过“弹性带”连接的图像(即能量表面上的点)来实现,这些图像代表了从反应物到产物的可能路径。通过迭代优化过程,这些图像沿着能量最低的路径移动,直至找到过渡态。在Climbing Image的变体中,路径上最接近鞍点的图像被特别优化,以确保它准确地爬升至鞍点顶部。
优点:
直观地提供了从反应物到产物的完整反应路径。
适用于复杂系统的反应途径和过渡态的精确定位。
局限性:
计算成本较高,特别是对于包含大量原子的系统。
初始路径的选择可能影响到最终找到的过渡态和路径的准确性。
Dimer:
Dimer 方法通过使用一对相距很近的点(即“二聚体”)来搜索势能面的鞍点。该方法的核心在于旋转这对点,以逼近最小曲率模式,进而定位鞍点。Dimer 方法主要用于鞍点的定位,而不是提供完整的反应路径。
优点:
不需要计算Hessian矩阵,从而减少了计算需求。
可以高效地定位到复杂系统的鞍点。
局限性:
不直接提供从反应物到产物的连续路径。
对初始猜测的依赖可能导致在寻找过渡态时遇到困难。
综上,CI-NEB 更适合那些需要明确了解从反应物到产物整个路径的研究,而 Dimer 方法则在寻找单个鞍点时更为高效。选择哪种方法取决于具体的研究需求、系统的复杂性以及计算资源的可用性。
四 附录
1 官网
VASP的官方网址为https://www.vasp.at/ 在该网页上学习资源丰富,既有关于输入文件的参数设置和说明,还有一些计算案例,请务必利用好该学习资源。
2 VASPKIT
VASPKIT是一个用于处理和分析VASP数据的工具,能够简化VASP用户的工作流程,尤其是在输入和输出文件的处理方面。VASPKIT对刚学习VASP的新手较为友好,操作简单易上手,能借助其生成VASP计算所需的输入文件,也可利用其分析和处理VASP各种输出文件,提取有用信息。可根据自己的需求从https://vaspkit.com/ 下载和学习。
3 可视化软件(VESTA、Materials Studio、VMD、P4VASP)
VASP是一个没有界面的计算软件,建模、可视化、数据分析都需要依赖第三方软件,可利用可视化软件VESTA、Material studio、VMD、P4VASP来建模、查看结构和分析数据。
4 Jupyter
Jupyter是一个开源的交互式计算环境,它允许用户在一个文档中结合代码执行、富文本、数学公式、图形和多媒体资源。该工具主要用于数据科学、科学计算、统计建模、机器学习等领域。前文中提到的实时查看输出结果及后续的计算结果分析均可通过Jupyter实现。
5 理论书籍
Density Functional Theory.
Theoretical Surface Science A Microscopic Perspective.
Concepts of Modern Catalysis and Kinetics.