ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

VASP能带计算全流程详解:从结构优化到能带图绘制

VASP能带计算全流程详解:从结构优化到能带图绘制 做DFT计算的人几乎都绕不开能带计算。我用VASP跑能带也算踩了不少坑从最开始对着输入文件发懵到后来能把能带图、态密度、投影能带串起来讲一个完整的故事中间折腾掉的时间属实不少。这篇就一次性把“VASP能带计算全流程”讲透从物理图像、三步走流程、高对称K路径、输入文件怎么写到数据处理和画图最后附上我实际踩过的坑新手可以直接照着抄有一定基础的也能查漏补缺。开始之前先提一个容易混淆的地方。有些人搜“DFT”会搜到芯片测试领域的Design for Testability也就是可测性设计那里也有一堆DFT工具和流程。但本文里的DFT是密度泛函理论Density Functional Theory是计算材料学、计算化学里最常用的电子结构计算方法之一VASP则是目前用得最广的DFT软件包。如果你是冲着芯片测试来的那这篇不是你要找的内容别浪费时间往下读了。1. 动手之前先弄明白能带计算到底在算什么1.1 能带就是电子的E-k色散关系晶体具有周期性结构电子的波函数满足布洛赫定理因此可以用一个波矢k来标记电子态。能带计算的核心就是在倒空间里沿某个方向扫过一系列k点把电子的本征能量E(k)算出来得到一条条“带”。这种E-k关系决定了材料是金属、半导体还是绝缘体。比如在费米能级附近完全没有能带穿过带隙又很大那就是绝缘体带隙较小是半导体费米能级落在某条能带中间电子可以直接被激发就是金属。能带图相当于一张“电子的限速牌和路况图”告诉你电子在哪个动量方向好走、哪个方向走不动这也是后面分析有效质量、载流子输运、光学跃迁的物理基础。很多初学者会问一个问题VASP自洽计算结束后EIGENVAL文件里明明已经有本征值了为什么还要单独再算一次能带这是个好问题。从数据层面讲自洽计算确实输出了本征值但这些本征值对应的k点是按均匀网格分布的比如4×4×4或者6×6×6的Monkhorst-Pack网格。这些网格点零零散散地分布在倒空间里把它们连起来根本看不出连续的色散曲线。能带计算要的是沿高对称线的高密度采样比如从Γ点到X点之间取几十个点把这之间的能量变化平滑地画出来。所以哪怕自洽结果里已经有本征值你也必须专门跑一次沿高对称路径的非自洽计算。这就好比你要测量一座城市沿主干道的温度变化。均匀分布的自动气象站能告诉你城区的整体温度范围但你要画一条“沿人民路从东到西的温度剖面”就必须专门在这条路上每隔一段布一个点。能带计算干的就是这种沿路布点的活。1.2 能带计算和态密度是配合使用的能带图是沿某条高对称路径的一维切片它信息密度很高但也有局限它只显示了布里渊区里很少一部分k点上的能量分布。而态密度DOS是对整个布里渊区所有k点做积分给出“有多少电子态落在某个能量区间”两个图互补。实际工作中能带图用来判断带隙类型、带边位置、色散曲率态密度用来判断哪些原子轨道贡献了这些能带。所以靠谱的做法是能带图和DOS图放在一起画能量横轴严格对齐费米能级这样才能说清楚“这条带是谁贡献的、是成键还是反键”。后面第5节画图部分我会具体演示。2. 能带计算前必须补齐的两个“隐形前提”2.1 结构必须提前优化到位能带计算不是从零开始的它的准确性严重依赖于晶体结构。你拿来算的POSCAR如果是实验测得的结构严格来说还得用你的计算参数重新优化一遍因为DFT理论下的稳定结构与实验值有微小偏差。尤其是力收敛标准我建议把EDIFFG设到-0.01到-0.02 eV/Å之间原子位置才能真正松下去。如果你的初始结构是从实验数据库或者文献里直接拷过来没做结构优化就直接算能带最典型的后果是能带图上出现明显的“锯齿”——因为原子受力没消除体系不在能量极小点上电子波函数对应的势场就有虚假的不对称性。轻则能带看起来别扭重则带隙类型判断都会出问题。结构优化时注意两点。第一要同时释放原子位置和晶胞参数除非你有明确理由只优化原子坐标。第二优化收敛后要检查OUTCAR里的力和应力张量核心判断是forces是否已经低于你设定的EDIFFG以及压强是否接近零。我见过不少人是看“迭代步数跑完了”就以为优化好了其实VASP是因为达到NSW上限停的这时候结构压根没收敛。2.2 标准流程是三步走不是两步很多教程把能带计算简化成“先自洽再能带”这没错但中间漏了关键的一步结构优化。完整的可复现流程是第一步结构优化得到稳定的晶格常数和原子位置。第二步静态自洽计算在优化好的结构上算出一份高质量的CHGCAR电荷密度文件。第三步沿高对称K路径做非自洽能带计算读入第二步的CHGCAR输出能带本征值。为什么静态自洽要单独拿出来而不是直接用结构优化最后一步的电荷密度因为在结构优化过程中每一步离子移动后电子密度都会重新自洽但优化过程为了省时间K点密度和能量收敛标准通常不会拉满。直接拿这时的CHGCAR去做能带精度不够稳定。静态自洽用更密的K点网格、更严的EDIFF得到一份“干净的”电荷密度这才是能带计算正确的基础。2.3 能带计算与自洽计算的关键区别ICHARG11自洽计算与非自洽能带计算在VASP里的核心区别在于是否更新电荷密度。自洽计算里VASP从初始电荷密度出发反复求解Kohn-Sham方程更新电荷密度直到前后两次的电荷密度差小于EDIFF。这个过程要迭代很多次是DFT计算里最耗时的一环。能带计算则聪明得多既然已经有了静态自洽的CHGCAR电荷密度不需要再变了只需要在固定的电荷密度下沿高对称K路径执行“最后那一次对角化”把各个k点上的本征能量直接求出来。VASP里用一行参数控制这个行为ICHARG 11ICHARG11的含义是从CHGCAR文件读取电荷密度并且在整个计算过程中固定它不进行自洽更新。这是能带计算能跑得飞快的关键。很多新人忘了设这一项VASP就会默认从原子叠加密度开始重新自洽K点又少路径又特殊结果白白多跑好几个小时得到的本征值质量还未必更好。配套的参数是LCHARG .FALSE. LWAVE .FALSE.能带计算不需要再输出CHGCAR和WAVECAR省掉这两项能少写几个G的硬盘文件。ISMEAR在能带计算里其实不那么敏感因为不涉及自洽一般取0或者-5都可以但为了跟自洽计算保持一致我习惯沿用自洽时的设置。3. 高对称K路径能带图的一半质量看它3.1 为什么非要沿高对称路径扫布里渊区里有若干高对称点和对称线比如面心立方晶格的Γ、X、W、L、K、U点。电子在这些点上的波函数具有更高的对称性数学上很多能带的极值会出现在这些位置。实验和理论分析都习惯沿高对称点之间的连线来可视化能带结构这样既能捕捉带边位置又能反映色散方向性。有标准参考。Setyawan和Curtarolo在2010年发过一篇非常系统的文章Comput. Mater. Sci. 49, 299把各种布拉菲格子的高对称K路径建议整理成了表格现在VASPKIT、Materials Cloud、pymatgen等工具基本都遵循这套约定。如果你是自己手动选路径务必对照这类的标准约定否则画出来的能带图在行家眼里“一眼假”。3.2 用VASPKIT生成KPOINTS省时省力还少踩坑我不推荐新手手写高对称路径。不是说不能写而是很容易写错点坐标。尤其是不同晶系的高对称点坐标符号完全不同体心四方、六方、菱形晶格的路径约定各有各的坑。用工具自动生成是更稳妥的选择。我平时最常用的做法是用VASPKIT生成。VASPKIT是国产的开源DFT后处理工具功能强大更新也勤快这里推荐它的303号功能打开终端输入vaspkit然后依次选择3) K-Path for Band-Structure 3.0) Generate K-Path程序会让你选择结构的类型VASPKIT会自动读取当前目录下的POSCAR识别晶格和布拉菲格子类型然后询问你要原胞还是惯用胞的路径。生成后它会输出KPOINTS文件以及每个高对称点的标签还会给出建议的能带路径图。需要注意的一点是如果你的体系是超胞、异质结、表面体系那高对称路径的选择逻辑跟普通晶体不太一样。表面体系要看二维布里渊区的投影界面体系要看组成材料各自布里渊区的对应关系。VASPKIT对这些场景也有相关功能但你需要自己判断路径的物理含义工具只负责给几何路径。如果你坚持手写KPOINTS标准的是line-mode格式。以简单立方晶格为例k-points along high symmetry lines 20 line-mode reciprocal 0.000 0.000 0.000 ! Gamma 0.500 0.000 0.000 ! X 0.500 0.000 0.000 ! X 0.500 0.500 0.000 ! M第二行的20表示每条线段之间取20个点。高对称点坐标后面可以用感叹号加标签注释VASP会忽略这些注释。这里要特别提醒line-mode里每两行高对称点组成一条线段线段之间必须用一个空行隔开否则VASP会把它们当作同一个线段处理能带图就会出现奇怪的“折返”和断点。4. VASP能带计算实操全记录4.1 输入文件参数配置细节我以一个半导体体系的能带计算为例把每一步的输入文件完整写出来。假设你已经有了优化好的结构文件架构大概是这样的目录1结构优化目录2静态自洽目录3能带计算静态自洽的INCARSYSTEM static calculation PREC Accurate EDIFF 1E-6 EDIFFG -0.01 ISMEAR -5 LORBIT 11 LCHARG .TRUE. LWAVE .FALSE. NELM 200 NCORE 4这里的ISMEAR-5是四面体方法适用于半导体和绝缘体。如果是金属体系要用ISMEAR1并配合SIGMA比如SIGMA0.05到0.2之间。ISMEAR选错在自洽计算里会出现电子步振荡甚至不收敛在后面能带计算里影响小一些但最好还是从一开始就按体系类型选对。静态自洽的KPOINTSAutomatic mesh 9 gamma-centered 9 9 9 0 0 0K点密度选择有讲究。静态自洽用的K点网格应当比结构优化时更密。具体多密才好最好做一个简单的收敛性测试分别用6×6×6、9×9×9、12×12×12算总能量看能量差在1 meV/atom以内就选密度较低的那组。金属体系还要特别留意K点密度对费米面附近态密度的影响通常需要比半导体更密的网格。**静态自洽的POSCAR和POTCAR**直接复制结构优化目录里的对应文件确保结构完全一致。POTCAR的顺序必须和POSCAR里原子种类顺序一致这个我在后面第6节还会强调。跑完静态自洽确认目录里有CHGCAR文件生成。然后进入能带计算目录。能带计算的INCARSYSTEM band calculation PREC Accurate EDIFF 1E-6 ISMEAR -5 LORBIT 11 ICHARG 11 LCHARG .FALSE. LWAVE .FALSE. NBANDS 96 NCORE 4关键就是ICHARG11。NBANDS这里我建议手动写一个比默认值略大的数。怎么确定这个数先看自洽计算OUTCAR里实际用的NBANDS比如自洽算出来NBANDS80那能带计算可以设到96甚至100。因为能带计算要展示导带高处的色散如果NBANDS太小导带顶端的能带会被截断画出来的能带图在能量高处会有一条奇怪的截止线跟真实物理不符。**能带计算的KPOINTS**这里用VASPKIT生成的line-mode文件。如果手写把第3节的示例按照自己的布里渊区路径修改即可。每条线段之间的取点数一般取15到30个之间我通常取20或25。取点太多会让计算时间线性增长太少则曲线不够平滑。**能带计算的POSCAR和POTCAR**同样从静态自洽目录复制一字不差。这里我特别强调不能自己手动改POSCAR里的晶格常数或者原子坐标哪怕改动极小CHGCAR里的电荷密度就跟当前结构不匹配ICHARG11读进去就是错的数据。4.2 提交计算与过程检查要点目录准备完毕后用你习惯的MPI方式提交。比如mpirun -np 16 vasp_std能带计算因为不做自洽速度通常很快几分钟到半小时内就能跑完。如果你发现它跑了好几个小时还没结束多半是ICHARG11没设对回去检查一下INCAR。计算过程中可以实时监控进度。最直接的方法是不断看OSZICAR文件如果一直在迭代电子步说明它还在自洽正常能带计算几乎不迭代直接进入每个K点的本征值求解。另外用grep看OUTCARgrep NBANDS OUTCAR | head -5 grep E-fermi OUTCAR确保NBANDS和你设定的值一致同时记下费米能级数值。半导体体系的费米能级会在带隙中间金属体系会在某个能量处后处理画图时都要用它做能量零点。4.3 到底要不要上杂化泛函HSE纯PBE泛函算出来的半导体带隙普遍比实验值小这是DFT的已知问题。遇到带隙要求高的体系比如要跟光学实验对比或者要准确判断缺陷能级位置就要考虑用杂化泛函最常用的是HSE06。HSE算能带的流程比PBE多一步。理论上你可以直接用PBE优化好的结构做HSE静态自洽得到HSE级别的CHGCAR然后再在这个基础上做HSE能带计算。也可以跳过HSE静态自洽直接从PBE的CHGCAR出发做HSE能带但精度会打折扣。HSE计算的关键INCAR参数LHFCALC .TRUE. AEXX 0.25 HFSCREEN 0.2 ALGO Damped PRECFOCK Fast NKRED 2AEXX0.25对应HSE06标准参数HFSCREEN0.2表示HSE06的屏蔽参数。这里要提醒一下HSE计算量比PBE高一个量级以上对内存和时间的消耗都很可观。新手第一次玩HSE建议先用较小的K点网格和较少取点数跑通流程确认逻辑正确后再拉到生产级别的精度。HSE的KPOINTS建议用Gamma centered网格不要用Monkhorst-Pack因为HSE计算里快速网格Fock交换部分对K点分布有额外要求Gamma centered更稳。5. 数据处理与画图能带图好看的同时也必须严谨5.1 提取能带数据VASPKIT是效率神器计算结束后能带数据已经躺在EIGENVAL或者vasprun.xml里了。手动解析这些文件太痛苦直接用VASPKIT的505号功能vaspkit选择5) Band-Structure 5.0) Generate Band-Structure Data程序读取vasprun.xml或EIGENVAL输出两个关键文件BAND.dat和KLABELS。BAND.dat第一列是沿路径累计的k点距离第二列开始是各能带的能量值KLABELS里记录了高对称点对应的横坐标位置和标签。这两个文件画图时要配合使用。这里有个容易踩的坑VASPKIT默认输出的能量是绝对的没有减去费米能级。你需要从OUTCAR里找到费米能然后在后处理里把能量平移。VASPKIT在交互过程中也会问你要不要读取费米能并平移我建议选择是这样后面画图省事。5.2 用Python画一张简洁漂亮的能带图我目前最常用的画图工具是Python的matplotlib脚本不算复杂但解决了几个关键问题自动处理高对称点竖线、自动标注点标签、统一设置能量窗口。这里给出一个简化但能直接用的画图脚本框架import numpy as np import matplotlib.pyplot as plt data np.loadtxt(BAND.dat) k_dist data[:, 0] energies data[:, 1:] # 高对称点位置需要从VASPKIT生成的KLABELS读取 ticks_position [0.0, 1.5, 2.7, 4.0] ticks_label [$\\Gamma$, X, M, $\\Gamma$] # 所有能量减去费米能级 e_fermi 5.0 # 改成你体系实际的费米能级 energies_shift energies - e_fermi fig, ax plt.subplots(figsize(6, 8)) for i in range(energies_shift.shape[1]): ax.plot(k_dist, energies_shift[:, i], lw1.2, colorblack) for pos in ticks_position: ax.axvline(pos, colorgray, lw0.8, ls--) ax.set_xticks(ticks_position) ax.set_xticklabels(ticks_label, fontsize14) ax.set_ylim(-5, 5) # 按需调整能量窗口 ax.set_ylabel(Energy (eV), fontsize14) ax.set_xlim(min(ticks_position), max(ticks_position)) plt.tight_layout() plt.savefig(band.png, dpi300)注意几个细节。第一费米能级必须自己确认从OUTCAR里grep出来填进去第二纵坐标范围要合理半导体能带一般看费米能附近±5 eV就够金属可能要看更宽第三高对称点的横坐标位置不能瞎编要以KLABELS文件里的数值为准。如果你想要更专业的效果可以考虑用pyband工具它支持投影能带绘制能按照轨道或原子的贡献给能带着色。另一个选择是用pymatgen的BSPlotter它能自动读取vasprun.xml直接画图也很方便。5.3 读能带图从“能看出带隙”到“能讲清楚物理”能带图画出来之后你要能回答下面几个问题带隙是直接还是间接看价带顶和导带底的横坐标是否一致。不一致就是间接带隙这决定了材料的光学跃迁效率。带隙数值是多少从图上读出价带最大值的能量和导带最小值的能量相减。如果是半导体这个值要跟实验值对比时注意PBE的系统性低估。哪条带是色散剧烈的能带越弯曲电子有效质量越小。有效质量可以从带底或带顶附近的抛物线拟合得到公式是m* ℏ²/(d²E/dk²)。这个参数直接关系到载流子迁移率很多输运性质分析都要用。能带图上还有个小陷阱要注意某些体系存在自旋轨道耦合打开SOC后原本简并的能带会劈裂。如果你算的是含重元素的体系比如铅、铋、碲化物没开SOC得到的能带图可能完全无法解释实验。SOC在VASP里用LSORBIT .TRUE.开启同时需要指定SAXIS方向。这一点在过渡金属化合物和拓扑材料体系里尤其重要。6. 常见问题与排查技巧实录我把自己实际碰到过以及帮别人排查过的高频问题整理成了一个速查表。这些问题单看都不复杂但组合在一起很容易让人心态爆炸。现象常见原因解决思路能带图有明显锯齿曲线不光滑结构未收敛检查力收敛回到优化步骤能带图中途断线或回折K路径线段之间没有空行检查KPOINTS line-mode格式计算跑了很久还在迭代ICHARG设置成非11INCAR改ICHARG11导带高处被截断NBANDS不够加大NBANDS重新计算带隙明显太小甚至为零PBE固有误差/结构错误检查结构尝试HSE06能带能量整体偏高或偏低没减费米能级统一用OUTCAR里的费米能平移含重元素体系能带劈裂不对没开SOC开启LSORBIT并验证SAXIS最让我印象深刻的一个案例是有位同学算的是二维材料MoS2导带底附近老是有一条能量浮动很大的带整个能带图怎么看怎么别扭。我让他检查是不是用的晶胞含有真空层、但POSCAR的晶格矢量顺序跟自洽计算不一致。果然他把静态自洽后的POSCAR做了个旋转换序虽然格子没变但CHGCAR里的电荷密度是相对于原坐标的一旋转就错得离谱。能带计算不是“读个数据算一下”那么简单它要求你保持每一步的“坐标系”完全一致。还有一个隐蔽的问题POTCAR中的赝势顺序必须和POSCAR原子顺序一致。如果你在自洽的时候元素顺序是A B能带计算时不小心换个顺序VASP会直接报错或者给出荒谬的结果。这种低级错误靠看日志很难发现最好用diff命令比较一下自洽目录和能带目录的POSCAR、POTCAR是否一致。另外提醒一下金属体系。金属的能带图经常会被问“为什么费米能级穿过能带而且有些带只画了一半”这不是错误是金属的典型特征。金属能带图里费米能级以下全填满以上全空着能量零点取在费米能上所以你会看到能带被一条水平线截断。这种情况下ISMEAR不要用-5要用ISMEAR1配合合适的SIGMA否则自洽阶段就可能不收敛。7. 一路踩过来的一些经验与能带计算的扩展方向7.1 给新手的几点实在建议能带计算是一项“看起来就一步实际上吃透前三步”的任务。结构优化、静态自洽、能带计算三个环节环环相扣任何一环的隐患都会在最后能带图上暴露出来。我个人的习惯是每算一个体系都会留一个运行日志把结构优化的力收敛值、静态自洽的K点和能量差、能带计算的NBANDS和费米能级都记下来。这个习惯一开始是因为踩坑太多后来发现复查和写文章时特别有用。能带图出问题的时候翻日志比重新跑一遍快得多。另一个建议是把流程脚本化。我最开始算能带也是一步步敲命令后来发现不同体系之间除了KPOINTS和INCAR略有不同其余几乎一样就写了一个简单的批量脚本自动从静态自洽目录复制文件、改INCAR、生成能带K点路径然后提交计算。你不需要一开始就做得很花哨但至少可以写一个一两百行的shell脚本或者Python脚本把复制POSCAR、POTCAR、CHGCAR的动作固定下来减少手动操作带来的低级错误。还有一点是计算资源规划。能带计算的K点取点数量一般在几百个以内单核跑也没问题但要注意NBANDS大时会占不少内存尤其是HSE计算。如果你想用HSE算能带建议先估算一下内存需求别跑到一半节点被OOM杀掉。7.2 能带算完之后还能做什么能带计算只是很多高阶分析的起点。最直接的扩展是投影能带。用VASPKIT的211、212号功能或者pyband可以把能带按照原子轨道s、p、d或者指定原子层的贡献拆开用颜色深浅画出来。这在分析异质结、吸附体系、缺陷体系时非常关键能直接看出某个能带来自界面哪一侧、哪种轨道。再往上走是Wannier函数拟合。把能带数据用Wannier90拟合成紧束缚哈密顿量之后就能算量子输运、贝里曲率、陈数、拓扑不变量等性质。这些在拓扑材料、热电材料研究里是常规操作。VASP加Wannier90是有标准流程的关键在于能带计算时的K路径和Wannier拟合用的k网格要匹配好。带隙精度再往上提就要上GW方法了。GW计算比HSE还贵但带隙精度通常更接近实验。一般不会直接拿GW替代全部流程而是先在PBE或者HSE层面完成结构、能带定性分析需要精确带隙时再做一次单点GW修正。另外有必要说明一个容易搞混的场景如果你做的是三维光子晶体板的能带计算那这里的“能带”是指电磁波在周期性介电结构中的色散关系不是电子能带。它的计算方法和VASP完全是两套路线通常用MPB、COMSOL这类电磁仿真工具。电子能带里要费米能级、要填充数光子晶体能带里没有这些概念只有频率和波矢的关系。搜索时看到“能带计算”要注意区分自己属于哪一类。最后再分享一个小技巧能带计算跑完后先不要急着画整张图。先用脚本把价带顶和导带底附近的几条带单独打出来看看它们的变化趋势是否符合对称性预期。如果连最基本的Γ点能级简并都不对那后面再多漂亮的图也是空中楼阁。这种“多看一眼原始数据”的习惯能帮你省掉一大半返工时间。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进