ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

零基础VASP结构优化:从Linux命令到四大输入文件与收敛排查

零基础VASP结构优化:从Linux命令到四大输入文件与收敛排查 第一次拿到 VASP 的计算目录绝大多数人的反应是一样的里面只有 INCAR、POSCAR、KPOINTS、POTCAR 四个纯文本文件没有任何图形界面也没有一个写着开始计算的按钮。你要跑结构优化就得在 Linux 系统里敲命令、拼文件、提交任务、再盯着一堆日志判断到底收没收敛。这篇内容写给两类人一类是完全没接触过第一性原理计算、想从零跑通 VASP 结构优化的新手另一类是会用一点电脑但没正经用过 Linux 命令行、被 ssh 和 vim 卡住的同学。我会把 VASP 的四份输入文件逐个拆开讲清楚职责再带着你跑一遍完整的结构优化流程最后把最容易踩的坑按排查链路列出来。整套流程下来你可能只需要一台能 ssh 的机器和一个合法授权的 VASP 环境剩下的都是可以练出来的手艺。1. 新手真正卡住的地方往往不在密度泛函理论1.1 VASP 能算什么以及它算不了什么VASP 是一套基于平面波基组和赝势方法的密度泛函理论计算程序它处理的是周期性体系。落到具体任务上新手最常接触的是这几件事给定一个晶体结构算出它的总能量让程序自己调整原子位置甚至晶胞形状找到能量更低的构型这就是结构优化在优化好的结构上做自洽计算得到态密度、能带、电荷密度含过渡金属的体系还可以算磁矩和自旋构型再往后还有表面吸附能、过渡态搜索、分子动力学。这些任务的输入都是同一套文件区别只在参数怎么设。但有几件事必须先说清楚否则容易走弯路。第一DFT 是有系统误差的交换关联泛函的选择直接决定结果PBE 算出来的晶格常数普遍比实验值偏大一丢丢大概百分之一量级这是正常现象不是你算错了。第二VASP 不是万能的强关联体系比如一些过渡金属氧化物、稀土化合物用普通泛函往往不准需要加 Hubbard U 或者用杂化泛函而这两个都会让计算量明显上升。第三软件的合法授权要解决个人随便找个包来用的做法既不专业也不安全正规途径是课题组或单位购买授权、或者使用有授权的计算平台。新手还有一个常见误解以为 VASP 像办公软件一样点一下就出结果。实际上它的运行方式是读文件、算、写文件整个过程没有任何交互你必须学会从文本输出里判断它算得对不对、算完没有。这就是为什么 Linux 基础绕不开。1.2 Linux 不是附加题而是主考科目很多人会问我学的是材料、化学、物理为什么非要学 Linux答案很直接因为 VASP 就是跑在 Linux 上的命令行程序它的启动方式就是在终端里敲一行mpirun -np 32 vasp_std它的所有输入都靠文件放在当前目录下它的所有输出也都写成文件。你不掌握 Linux连把任务跑起来这一步都做不到。不过要澄清一个误区VASP 需要的 Linux 技能树其实非常窄。你不需要会写脚本语言不需要懂内核也不需要记住几百条命令。真正用得上的无非是这几类在目录之间跳转、复制移动删除文件、看和改文本文件、把任务挂到后台防止断线中断、看机器还有多少内存和磁盘、把文件传进传出。这五六件事练熟日常工作就够用了。我在带新人的时候通常只让他们背十条命令和十个 vim 操作剩下的用到再查。1.3 一条给零基础的三周上手路线如果让我给完全零基础的人排一个节奏大概是这样的。第一周解决环境和跑通问题拿到能登录的机器学会 ssh 登录学会用ls、cd、cat看目录看文件然后找一个最简单的体系比如硅或者氯化钠把 VASP 跑起来哪怕只是做一次不做任何离子移动的单点能计算只要看到 OUTCAR 正常结束第一步就算过了。这一步的目的不是算对是打通链路。第二周逐个吃透四个输入文件把 POSCAR 的坐标格式搞明白、把 KPOINTS 的密度和机时的关系搞清楚、把 POTCAR 的拼接顺序记住、把 INCAR 里十来个核心参数的含义弄懂然后完整跑一次结构优化能读懂收敛判据。第三周专门练排查故意把 POSCAR 的元素顺序改错、故意把 KPOINTS 设成奇数导致对称性下降、故意把 POTIM 设得很大造成振荡看看报错长什么样这样以后遇到真问题就不会慌。这条路线走下来大概两三周就能独立完成一些常规的计算任务。比先把量子力学教材啃完再动手高效得多因为很多概念是在动手过程中才真正理解的。2. 在哪儿跑虚拟机、课题组服务器、计算平台的三条路2.1 三种运行环境的真实代价新手最先遇到的现实问题是我的电脑能跑 VASP 吗这里把三种常见方案摆在一起对比你自己判断。方案上手成本可用算力适合人群主要麻烦本地虚拟机装 Linux中需要装系统和编译环境一般只有几个到十几个核想练 Linux 和熟悉流程编译依赖多、内存小、算大体系基本没戏课题组服务器或工作站低通常已有编译好的程序几十到几百核绝大多数研究生需要排队、有磁盘配额、环境变量容易搞乱单位或商业计算平台低提交作业即可弹性可上千核需要短时间出结果有费用、需要写作业脚本、数据传输要规范我个人的建议是不要在本地虚拟机上死磕大体系。虚拟机最适合做的事是练命令、练文件编辑、跑一个十几个原子的体系看看流程。真正要出数据还是得在正经的计算环境里跑因为平面波方法的计算量随体系大小增长很快十几个原子和几十个原子完全是两个量级的事情。虚拟机的选择上服务器常用的发行版多半是 CentOS 系或 Ubuntu 系你在本地装哪个都行反正练的是命令不是界面。装完之后第一件事是把 ssh 服务打开第二件事是学会用终端剩下的慢慢来。2.2 别急着自己编译 VASP新手有一个特别容易掉进去的坑觉得要从源码编译一遍才算真的学会。我的看法是恰恰相反编译只在两种情况下值得做一是有明确需求要改源码二是环境里确实没有现成的可执行文件。除此之外优先用现成的。在正式计算环境里通常用环境模块来管理软件module avail | grep -i vasp module load vasp/5.4.4 which vasp_std看到vasp_std标准版、vasp_gam只算 Gamma 点、vasp_ncl非共线磁性这几个可执行文件说明环境已经就绪。然后简单验证一下能不能跑mpirun -np 4 vasp_std如果在没有输入文件的目录里执行程序会报找不到 POSCAR 之类的错误然后退出这反而是好事说明程序本身能被调用起来。真要自己编译坑点集中在三个方面编译器与数学库的匹配Intel 编译器配 MKL 是最省事的组合gfortran 配 OpenBLAS 也能用但要调参数、MPI 库的选择与运行方式的对应用 OpenMPI 编译就用 mpirun用 Intel MPI 就用 mpiexec混用会出奇怪的问题、以及链接库的路径。这几件事一旦出问题报错信息通常很抽象所以在没有十足把握之前找现成的二进制文件是性价比最高的选择。2.3 目录规划与磁盘配额一个特别不显眼的坑这是我见过新手翻车最多、也最容易被忽视的地方。VASP 的输出文件非常大WAVECAR 和 CHGCAR 动辄几个 GB一个几十原子的体系做几十个离子步中间产物加起来能吃掉几十 GB。而几乎所有的计算环境都对每个人有磁盘配额限制一旦写满程序会莫名其妙地中断报错还可能指向别的地方让你查半天。所以从第一天就要养成习惯每个计算任务单独建一个目录命名带上体系和用途比如MgO_bulk_opt_v1、MgO_bulk_dos。不要在同一个目录里反复覆盖文件也不要图省事把所有任务堆在一个大目录里。更重要的是把不必要的大文件关掉。结构优化阶段波函数和电荷密度其实都不需要保存除非你要续算或者做后续的非自洽计算直接在 INCAR 里写上LWAVE .FALSE. LCHARG .FALSE.这两个开关能省下的空间非常可观。另外养成随手查看空间的习惯df -h . du -sh * du -sh ./* | sort -h | tail第一条看当前分区的剩余空间第二条看当前目录下各文件大小第三条能快速找出是谁把空间吃掉了。如果确实需要保留 WAVECAR 用于续算也要定期清理旧任务的产物别等着系统管理员来提醒你。还有一个小技巧赝势文件POTCAR不需要每个任务目录单独存一份完整副本但要注意 VASP 只认一个叫 POTCAR 的文件所以不能用软链接分别指向多个元素必须把它们按顺序拼成一个文件。常见的做法是把赝势库放在家目录的一个固定位置每次用cat拼接下一节会具体讲。3. 只针对 VASP 场景要练熟的 Linux 操作3.1 目录与文件操作够用就行这一组命令是每天都会敲的建议练到不用思考pwd # 我现在在哪个目录 ls -lh # 看文件带大小和人类可读单位 ls -ltr # 按修改时间排序最新在最后 cd ../.. # 往上退两级 mkdir -p TiO2/opt # 一次建多级目录 cp -r old new # 递归复制整个目录 mv a b # 改名或移动 rm file # 删文件 rm -rf dir # 删目录极其危险关于rm -rf我只说一条经验在按下回车之前把pwd和ls再看一遍确认自己在正确的目录里。我见过不止一次有人想删当前目录下的临时文件结果路径写成了自己整个项目根目录一秒钟的功夫几周的工作就没了。如果条件允许把重要数据往另一个位置备份一份或者熟悉一下alias rmrm -i这种带确认的别名。压缩包的处理也很常用比如从别处下载的赝势库或者结构文件包tar -zxvf potpaw.tar.gz # 解压 tar.gz tar -cjf backup.tar.bz2 dir # 打包压缩 unzip structures.zip # 解压 zip unzip -O gbk structures.zip # 中文文件名乱码时指定编码最后这条在处理中文命名的压缩包时特别有用从 Windows 传过来的 zip 经常因为编码问题在 Linux 里显示成一堆乱码字符加个编码参数就正常了。另外文件权限这件事迟早会遇到尤其是当你需要把脚本变成可执行文件时chmod x run.sh chmod 755 run.sh前者给文件加上可执行权限后者是更明确的权限写法。至于新建用户、用户组、目录归属这些在服务器的多人环境里有管理员管你只需要知道ls -l输出里那一串rwx的前三位是属主权限、中间三位是同组用户、后三位是其他人遇到权限不够的报错先看这一串就够了。3.2 看文件VASP 的输出管理全靠这几个命令VASP 的输出文件动辄几千上万行用普通编辑器打开会卡必须靠命令行工具筛。下面这几个组合是我用得最多的tail -f vasp.log # 实时滚动看日志 tail -n 50 OUTCAR # 看最后 50 行 head -n 20 OSZICAR # 看开头 20 行 grep free energy TOTEN OUTCAR # 找总能量那一行 grep reached required accuracy OUTCAR # 判断是否收敛 grep -n TOTAL-FORCE OUTCAR # 带行号显示匹配位置 grep -A 30 TOTAL-FORCE OUTCAR | tail -20 # 看最后一次的受力表 wc -l OUTCAR # 数行数粗略判断算了多久tail -f是盯任务的必备技能程序每写一行日志它就跟着滚动断线重连后重新执行一遍就行。grep配合管道用是最有效的因为 VASP 的 OUTCAR 里关键信息都藏在几千行中间靠眼睛翻是自虐。还有一个需要专门提一下的工具是less它是看大文件的最佳选择less OUTCAR进入之后按/输入关键词回车搜索按n跳到下一个匹配按G跳到文件末尾按g回到开头按q退出。这套操作看几百 MB 的 OUTCAR 完全不卡。3.3 vim 的十个救命操作够你改 INCAR 一辈子很多人第一次打开 vim 就再也不想碰它因为不知道怎么退出。这里把最常用的操作列全其实只要十个i进入插入模式可以打字Esc回到普通模式:wq保存并退出:q!不保存强制退出dd删除当前行yy复制当前行p粘贴到下一行/关键词搜索n下一个:%s/旧/新/g全文替换u撤销gg跳到文件头G跳到文件尾其中全文替换在改参数时特别省事。比如你刚跑完一轮优化想把 INCAR 里的离子步上限改成零做一次快速验证只需要:%s/NSW 100/NSW 0/比一行行找快得多。如果你实在受不了 vim用nano也是个选择它底部会直接列出快捷键提示学起来没那么陡。还有一种更省心的方式是本地改好文件再上传但那要多一步传输改小文件时反而麻烦所以我还是建议把 vim 的基础操作练出来。3.4 断线不能掉任务nohup 与 screen新手最惨的经历之一好不容易配好文件在终端里敲了mpirun -np 32 vasp_std看着屏幕滚得挺欢然后合上笔记本或者网络一抖任务就没了几个小时的机时白费。解决办法有两个层次。最简的是用 nohup 把任务挂到后台nohup mpirun -np 32 vasp_std vasp.log 21 末尾的让它进后台nohup让它忽略挂断信号 vasp.log 21把标准输出和错误输出都写进文件这样断线之后任务还在跑回来看vasp.log和 OUTCAR 就行。查后台任务用jobs -l或者ps -u 你的用户名。更稳妥的是用 screen 或者 tmux 这类会话工具它们把终端会话本身持久化screen -S vasp # 新建一个叫 vasp 的会话 # 在里面正常敲命令 # 按 CtrlA 然后按 D脱离会话 screen -ls # 列出所有会话 screen -r vasp # 重新接回去这样即使本地断网、笔记本休眠会话里的程序照样跑重新登录后screen -r就回到原来的画面。tmux 用法类似看个人习惯。我的建议是短时间跑的测试用 nohup长时间的正式计算一律用 screen 或 tmux出问题的时候好处理。正式计算环境通常还有作业调度系统SLURM 或者 PBS那种情况下任务交给调度器管理反而不需要你自己挂后台。3.5 传文件与看机器状态文件传输在 Linux 里最常用的是 scp 和 rsyncscp POSCAR userhost:/home/user/project/ # 上传单个文件 scp -r results userhost:/home/user/ # 上传整个目录 scp userhost:/home/user/project/OUTCAR . # 下载文件到当前目录 rsync -av --progress ./ userhost:/home/user/project/ # 同步带进度如果觉得命令行传文件麻烦Windows 下用带图形界面的 SSH 客户端很多都内置文件管理面板拖拖拽拽也能完成尤其是传几百 MB 的 OUTCAR 或者结构文件的时候更方便。看机器状态这几个命令要会top # 实时看 CPU 和内存占用 free -h # 看内存总量和剩余 df -h # 看各分区剩余空间 ps -u $USER # 看自己跑着哪些进程 kill 12345 # 按进程号结束某个进程 kill -9 12345 # 强制结束慎用有作业调度系统的环境还要会查队列squeue -u $USER # SLURM 查自己的任务 sinfo # 看各分区状态 scancel 12345 # 取消任务这一组命令的目的很简单知道你的任务是在排队、在跑、还是已经死了知道机器是被你占满了还是闲着。4. 四个输入文件其实是四份互相咬合的合同4.1 POSCAR晶格与坐标的唯一真相POSCAR 描述体系长什么样它的格式是固定行数的每一行都有明确含义MgO bulk 1.0 4.25 0.00 0.00 0.00 4.25 0.00 0.00 0.00 4.25 Mg O 2 2 Direct 0.000000 0.000000 0.000000 0.500000 0.500000 0.000000 0.500000 0.500000 0.500000 0.000000 0.000000 0.500000第一行是注释随便写但建议写上体系名和版本方便日后回看。第二行是缩放系数通常是 1.0如果写负数VASP 会把它当作目标体积来处理这个用法在按体积扫描时有用。第三到第五行是三条晶格矢量。第六行是元素符号第七行是对应的原子个数这两行必须严格对应。第八行决定后面坐标是按分数坐标Direct还是笛卡尔坐标Cartesian来读。这里有一个非常容易踩的坑如果第八行你没写 Direct 或 CartesianVASP 会默认按 Direct 处理。很多从 VESTA 导出的 POSCAR 是会带关键字的但如果你自己手写或者用脚本生成忘记这一行就可能把笛卡尔坐标当成分数坐标读进去结果原子位置全乱晶格能算得离谱你还找不到原因。所以每次拿到一个新 POSCAR第一件事就是确认这一行的关键字并且扫一眼坐标值是不是都在 0 到 1 之间——如果有大于 1 的数那多半是笛卡尔坐标得检查关键字有没有对上。如果要固定某些原子只优化剩下的需要在第八行之后插入一行Selective dynamics然后每个坐标后面加三个 T 或 FT 表示可动F 表示固定Selective dynamics Direct 0.000000 0.000000 0.000000 F F F 0.500000 0.500000 0.000000 T T T做表面吸附的时候这个功能非常常用把底下几层原子固定住模拟体相只放开表层和吸附物。另外两个高频问题值得一提。第一个是从建模软件导出结构时的对称性问题。如果你在建模界面里做的是掺杂或者原子替换原始晶体的空间群对称性就不再成立了导出前必须把对称性降到最低也就是常说的 P1否则软件会自作主张地认为某些原子是等价的导出的坐标会出现莫名其妙的位置偏移或者原子数对不上。这个操作在建模软件里通常是一个按钮的事但不做就会让你后面所有计算都建立在一个错误的结构上。第二个是晶格参数和真空层。三维体相材料没什么好说的但如果你算的是二维材料或者分子就必须在垂直方向留足够的真空层经验值是不小于 15 埃否则周期镜像之间的相互作用会让能量明显偏低。这时候 POSCAR 的晶格矢量在垂直方向要设成材料厚度加上真空层厚度而不是材料的实际厚度。4.2 KPOINTS你机时预算的总开关KPOINTS 决定布里渊区怎么采样直接决定计算量和精度。最简单的写法是自动网格Automatic mesh 0 Gamma 9 9 9 0 0 0第一行注释第二行的 0 表示自动生成第三行是网格类型Gamma 表示 Gamma 中心也可以写 M 表示 Monkhorst-Pack 网格第四行是三个方向的划分数第五行是偏移量一般保持 0 0 0。网格密度怎么定最实用的判断方式是看晶格长度晶格越长的方向倒数空间越短需要的划分越少。所以对于层状或者链状材料长轴方向的划分应该是 1。比如算一个 c 方向有 20 埃真空层的二维材料KPOINTS 大概写成12 12 1。同样地如果算的是孤立分子或者团簇为了避免周期性相互作用通常直接只用一个 Gamma 点。密度取多少合适有一个经验区间金属体系因为费米面穿过能带需要比较密的网格半导体和绝缘体可以稀一些做结构优化时用中等密度让总能量收敛到毫电子伏量级就够做态密度和能带这类对精度敏感的任务时再加密。一个粗略的检验方法是做 K 点收敛测试把网格从 6 6 6 加到 8 8 8、10 10 10看总能量变化当相邻两档的能量差小于 1 毫电子伏每原子的时候就算收敛了。这个测试每个新体系做一次就行不必每个任务都做。新版本的 VASP 还支持在 INCAR 里直接写KSPACING 0.03来让程序自动根据晶格长度决定网格配合KGAMMA .TRUE.使用。这对方便是方便但要注意它和目录里已有的 KPOINTS 文件的优先级关系两种方式同时存在时容易搞混建议一个项目里只用一种方式别混着来。4.3 POTCAR拼接顺序错了直接报错POTCAR 是赝势文件每个元素一份需要按 POSCAR 里元素的顺序拼接成一个文件。顺序这件事是硬性的POSCAR 写的是Mg O那 POTCAR 就必须先 Mg 后 O反了会直接报错退出或者在极端情况下算出一个完全错误的结果。cat ~/pot/potpaw_PBE/Mg_pv/POTCAR ~/pot/potpaw_PBE/O/POTCAR POTCAR grep TITEL POTCAR # 检查拼接之后的元素和顺序 grep ENMAX POTCAR # 看每个元素的推荐截断能grep TITEL输出的顺序就是 POTCAR 里的元素顺序拿它和 POSCAR 第六行对比一致就对了。这是一个十秒钟就能做完的检查强烈建议每次拼完都做一遍。赝势的选择上有几个原则。第一整个计算必须用同一套泛函的赝势不能一部分元素用 PBE 的、另一部分用 LDA 的混用会导致结果没有意义。第二同一个体系的所有计算优化、静态、态密度都要用同一套赝势否则能量没法互相比较。第三含 d 电子的过渡金属和主族重元素通常要选带_pv或_sv后缀的版本因为把次外层电子当成价电子处理能明显提高精度代价是计算量增加。第四针对不同体系有时会有专门的推荐版本比如氧化物体系里氧的赝势这个要看你所在环境提供的赝势库文档。grep ENMAX的输出还有另一个用途它决定了 INCAR 里 ENCUT 应该设多少。通行做法是取所有元素中最高的 ENMAX乘以 1.3 到 1.5再向上取整到 50 的倍数。比如氧的 ENMAX 是 400 电子伏特左右镁更低那么取 400 乘 1.3 得到 520向上取整就是 550。实际工作中对于氧化物体系500 到 550 是常见区间。4.4 INCAR把计算意图翻译成参数如果说前三个文件是算什么INCAR 就是怎么算。下面这张表是我认为新手必须理解的核心参数剩下的用到再查文档。参数作用结构优化常见取值ENCUT平面波截断能由 POTCAR 的 ENMAX 决定通常 400 到 550PREC精度等级AccurateEDIFF电子步能量收敛判据1E-5 到 1E-6EDIFFG离子步收敛判据-0.01 到 -0.02负值表示按力判据单位电子伏特每埃ISMEAR展宽方式绝缘体 0金属 1 或 2SIGMA展宽宽度0.05配合 ISMEAR00.1 到 0.2配合 ISMEAR1IBRION离子步算法2共轭梯度最常用ISIF是否优化晶胞2 只动原子3 同时动晶胞NSW最大离子步数100 到 200POTIM离子步长0.3 到 0.5振荡时降到 0.1NELM最大电子步数60 到 100LREAL实空间投影AutoISPIN是否自旋极化含磁性元素时设为 2LWAVE/LCHARG是否保存波函数和电荷密度优化阶段设为 .FALSE.NCORE / KPAR并行方式按核数和 K 点数调整EDIFFG 这个参数有一个容易记反的地方写正值表示用能量差作判据写负值表示用受力作判据。结构优化一般用力的判据因为原子的最终位置取决于受力是否归零能量差有时候会提前看起来收敛了但原子还没到位。所以写EDIFFG -0.01表示要求每个原子受到的最大力小于 0.01 电子伏特每埃这是比较严格的设置如果只是先看看大概用 -0.05 也行。ISIF 的选择体现了策略ISIF2 保持晶胞形状和体积不变只让原子找位置ISIF3 连晶胞一起优化能得到平衡晶格常数。听起来 3 更省事但实际上直接上 3 容易出问题因为初始结构如果不合理晶胞可能被拉到一个奇怪的状态甚至出现振荡。稳妥的做法是先跑 ISIF2 把原子位置理顺再用 ISIF3 放开晶胞。这就是所谓的两段式优化多花一次计算的机时换来的是更高的成功率和更好的可解释性。含磁性元素的体系还要注意 ISPIN 和 MAGMOM。ISPIN2 打开自旋极化MAGMOM 给出每个原子的初始磁矩。这里的经验是初始磁矩不要给得太离谱也不要全给 0否则程序可能收敛到一个非磁性的解。对于铁的氧化物这类体系给过渡金属原子一个 4 到 5 的初始磁矩、给氧一个很小的值是比较常见的做法。初始磁矩的设置本身会影响收敛到哪个磁态所以如果你算出来的磁矩和文献差很多第一件事就是检查初始值给得对不对。5. 手把手跑一次结构优化以氧化镁体相为例5.1 从晶体结构到 POSCAR我们拿氯化钠型结构的氧化镁体相做例子它只有两个元素、结构简单、实验数据齐全特别适合新手验证流程。氧化镁的实验晶格常数大约是 4.21 埃用常规的立方晶胞每个晶胞 8 个原子来算。如果你从结构数据库导出的结构是标准的立方晶胞POSCAR 的晶格矢量就是三个互相垂直的方向长度都填 4.2 左右的初值。这里不需要特别精细因为结构优化本身会把晶格调整到平衡值。但如果你是从建模软件里导出要注意前面提到的两个坑一是导出时确认坐标关键字是 Direct 还是 Cartesian二是如果做过原子替换或者掺杂务必先把对称性降到 P1 再导出。这两个坑我都亲眼见过有人卡了整整一周。拿到 POSCAR 之后按顺序做三件事head -n 10 POSCAR # 检查格式 grep TITEL POTCAR # 检查赝势顺序 cat INCAR KPOINTS # 检查参数设置第一件事确认晶格矢量、元素符号、原子数、坐标关键字都正常第二件事确认 POTCAR 的元素和顺序与 POSCAR 第六行一致第三件事确认 INCAR 里的参数没有语法错误比如把ENCUT 500写成了ENCUT 500VASP 会报错或者用默认值两种情况都很烦。5.2 先做一次十分钟体检跑这是我最想推荐给新手的一个习惯。正式提交长任务之前先用极低的参数跑一次看看输入文件有没有硬伤SYSTEM MgO quick check ENCUT 300 PREC Normal EDIFF 1E-4 NSW 0 IBRION -1 ISMEAR 0 SIGMA 0.05 LWAVE .FALSE. LCHARG .FALSE. NELM 30配合一个最粗糙的 KPOINTSAutomatic mesh 0 Gamma 1 1 1 0 0 0NSW0 加上 IBRION-1 表示只算一次单点能不移动任何原子。整套设置两三分钟就能跑完如果能在 OUTCAR 里看到正常结束说明文件格式、路径、权限、并行环境全部没问题。如果这里就出错了那报错也一定比正式任务里的报错好排查得多因为变量少。我见过太多人一上来就用满参数提交一个 24 小时的任务第二天发现是 POSCAR 多了一行空行白白浪费一整天。5.3 正式优化的参数配置体检跑通过之后把 INCAR 换成正式的SYSTEM MgO bulk relaxation ENCUT 500 PREC Accurate EDIFF 1E-5 EDIFFG -0.01 IBRION 2 ISIF 2 NSW 100 POTIM 0.4 ISMEAR 0 SIGMA 0.05 LREAL Auto ALGO Normal NELM 100 LWAVE .FALSE. LCHARG .FALSE. NCORE 4KPOINTS 用中等密度对立方晶胞取8 8 8或者9 9 9都可以Gamma 中心即可Automatic mesh 0 Gamma 9 9 9 0 0 0这里每个参数都有理由。ENCUT 取 500 是因为氧的推荐截断能在 400 附近乘 1.3 后取整。EDIFF 取 1E-5 是结构优化的常规值做能量差比较的时候可以收紧到 1E-6。ISMEAR0 配 SIGMA0.05 适合绝缘体因为氧化镁是宽禁带材料如果用金属的展宽方式反而会引入误差。LREALAuto 让程序自动决定实空间投影策略对这类中等规模体系比较友好。NCORE4 是并行参数它表示每个轨道分组用 4 个核在核数较多时能改善并行效率具体取值第四节说过要根据核数调整。跑完第一段 ISIF2 之后用生成的 CONTCAR 覆盖 POSCAR把 INCAR 里的 ISIF 改成 3再跑一轮放开晶胞cp CONTCAR POSCAR这个操作是标准流程。CONTCAR 的格式和 POSCAR 完全一样可以直接接续使用它记录的是最后一轮离子步的构型。如果你想省事也可以一开始就用 ISIF3但对新手我不建议。两段式的好处是如果第二段出了问题你至少有一个已经优化好原子位置的中间结果还能单独分析是晶胞优化的哪一步出了毛病。5.4 提交任务与盯任务在有作业调度系统的环境里写一个提交脚本是最规范的做法#!/bin/bash #SBATCH -J MgO_opt #SBATCH -p normal #SBATCH -N 1 #SBATCH -n 32 #SBATCH -o vasp.log #SBATCH -e vasp.err #SBATCH -t 24:00:00 module purge module load vasp/5.4.4 mpirun -np 32 vasp_std保存为sub.sh然后chmod x sub.sh sbatch sub.sh squeue -u $USER tail -f vasp.logsbatch提交之后squeue看任务状态PD 是排队R 是运行tail -f vasp.log实时看输出。如果环境用的是 PBS 类调度器命令行换成qsub、qstat、qdel脚本头部的指令也要相应换成#PBS逻辑是一样的。如果环境没有调度系统就在 screen 会话里用 mpirun 直接跑screen -S MgO mpirun -np 32 vasp_std vasp.log 21 # CtrlA 然后 D 脱离跑起来之后最关心的两件事是它在动吗和它收敛了吗。tail -f vasp.log能看实时输出OSZICAR 则记录了每个离子步的能量N E dE d eps ncg rms rms(c) DAV: 1 -0.271234567890E02 ... ... 1 F -.27123456E02 E0 -.27123456E02 d E 0.000000E00 2 F -.27135678E02 E0 -.27135678E02 d E -0.122220E-01F后面的数字是当前构型的自由能E0是外推得到的总能量最后那个d E是相邻离子步之间的能量变化。结构优化的过程就是看着这些数字一步步往下走越走越小最后稳定。如果连续几步能量在同一个值附近来回抖或者能量往上走那就该去第六节看排查思路了。判断是否正常结束看 OUTCAR 里有没有这一行grep reached required accuracy OUTCAR有这一行说明离子步在力的判据下收敛了。如果没看到这一行但 OSZICAR 里的离子步数达到了 NSW 的上限那就是没收敛就停了需要分析原因、增加步数或者调整参数。6. 收敛不了怎么办按排查链路一步步缩小范围6.1 程序直接崩掉先看报错关键词程序挂掉的时候报错信息通常出现在标准输出文件或者 OUTCAR 的末尾先从那几行开始看。下面这张表是我整理的高频错误对照遇到问题可以先对号。现象或报错常见原因处理方向提示读取 POSCAR 失败或原子数与元素数不符文件行数不对、多了空行、元素符号行与数目行不匹配用 head 逐行核对重新从建模软件导出提示找不到 POTCAR 或元素不匹配拼接顺序与 POSCAR 不一致、路径写错用 grep TITEL 比对顺序重新 cat电子步迭代出现 LAPACK 相关失败初始结构有原子重合或晶格病态检查 POSCAR 里是否有两个原子坐标相同或过近离子步出现 bracketing 类致命错误离子步大步长导致能量面搜索失败把 POTIM 降到 0.1 到 0.2或改 IBRION1出现子空间矩阵非厄米的提示数值问题通常与大步长或初始态差有关换 ALGONormal 或 All减小 POTIM提示 DENTET 相关警告展宽方式或温度设置与体系不匹配绝缘体用 ISMEAR0金属改用 ISMEAR1 或 2任务在运行中突然消失磁盘写满、内存超限、被调度系统杀掉用 df -h 看空间看 vasp.err 里的记录计算耗时远远超出预期K 点过密、核数过多导致并行效率下降先做收敛测试检查核数与 K 点、NCORE 的搭配排查的思路是先看报错再想原因最后改一个变量。最忌讳的是同时改三四个参数然后重新提交就算跑通了也不知道是哪个改动起了作用下次遇到同样的问题还是不会。6.2 不收敛但没崩能量震荡与离子步走不完这种情况比直接崩掉更常见。典型表现是 OSZICAR 里能量来回跳或者离子步走到 NSW 上限还没收敛。处理顺序我一般是这样第一步把 POTIM 降下来。默认值对某些体系来说太大尤其是初始结构离平衡位置比较远的时候大步长会让原子在能量面上跳过头导致震荡。从 0.5 降到 0.2甚至 0.1多数情况下能明显改善。这个改动的代价是可能需要更多离子步但总比不收敛强。第二步换离子步算法。IBRION2 是共梯度最常用但如果体系比较软比如层状材料、分子晶体换成 IBRION1准牛顿法往往更稳。反过来如果体系原子数很多准牛顿法的内存开销会上去这时候又该回到共轭梯度。第三步检查初始结构本身。如果初始结构里有两个原子距离近得不合理或者晶格参数和实际差得太远那么再怎么调参数也很难收敛。这种情况的解决办法是先用手动方式或者更粗糙的方法做一次预优化把结构拉到合理区间再交给 VASP。第四步看电子步的收敛情况。如果每次自洽都要跑满 NELM 才停说明电子步本身就没收敛好那么离子步的受力也是不准确的自然收敛不了。这时候要检查 ENCUT 是否够、K 点是否过稀、展宽设置是否合适。有一个常见的错误是把 SIGMA 设得极小比如 0.01又用 ISMEAR1这样占据数会剧烈变化反而更难收敛。第五步考虑体系本身的性质。含过渡金属的强关联体系、有近简并态的体系、金属性很强的体系都可能需要特殊处理比如加 U、调整展宽、或者先用更粗糙的参数找到一个合理构型再加密。这类问题已经超出新手范围但知道有些体系就是难收敛这件事本身能让你不至于怀疑自己的操作。6.3 核数不是越多越好并行效率的坑这也是一个反直觉的点。很多新手觉得服务器有 64 核那就申请 64 核越快越好。实际情况是如果你的 K 点只有 Gamma 一个或者 K 点数量很少那么增加核数并不会线性加速反而可能因为通信开销让总时间变长。原因在于 VASP 的并行方式有几个层次K 点并行、轨道并行、以及 NCORE 控制的组内并行。当 K 点数量小于并行组数时多余的核只能分到同一个 K 点上做轨道并行效率提升有限甚至下降。实用的取值原则是让 KPARK 点分组数乘以 K 点数再配合 NCORE尽量不浪费核。比如 KPOINTS 是9 9 9、对称约化后有十几个不可约 K 点用 32 核可以设 KPAR4、NCORE8让 K 点分组和组内并行都吃满。如果只有 Gamma 点那么用 8 到 16 核可能比 32 核更快这种情况直接申请少一点的核数更划算也不占别人的资源。判断并行效率的方法很简单记录单步计算耗时改一次核数再跑一次同样的任务比较耗时。如果核数翻倍而耗时只降了 20%说明效率已经很低了。这个测试花不了多少时间但对长期使用很有价值因为它能帮你省下大量的机时。7. 结构优化之后这条路还能往哪儿走7.1 优化只是起点后面通常还有三步把结构优化跑通之后你会发现后面的很多东西都是在这套框架上做加法。最常见的下一步是静态自洽计算用优化好的 CONTCAR 作为 POSCAR把 ISIF 设为 2 或者直接 NSW0把 EDIFF 收紧到 1E-6把 K 点加密算一次高精度的总能量。这个能量可以拿来算形成能、结合能是很多分析的基准。再往后是态密度和能带。态密度用较密的 K 点配合展宽方法能带则需要沿高对称路径取点通常要先用工具生成路径再做非自洽计算。这两件事对 K 点的设置要求完全不同所以目录最好分开建别在同一个目录里改来改去。还有一类是表面和界面。做法是在体相优化好的结构上切面加真空层固定底层原子放开表层然后放吸附物做优化。前面讲 POSCAR 时提到的 Selective dynamics 在这里就派上用场了。计算量会比体相大不少所以参数的选择要更谨慎一些。7.2 让重复劳动自动化当你算到第三个、第五个体系的时候一定会开始想自动化。最省事的做法是写一个简单的 shell 脚本把已经验证过的 INCAR 和 KPOINTS 模板复制到新目录改一下并生成 POSCAR然后提交。更进一步可以用 vaspkit 这类工具辅助生成 KPOINTS 和 POTCAR或者用 ASE、pymatgen 这类库在脚本里直接构造结构、批量生成输入。关键是顺序先把一个体系完整跑通、把参数验证好再谈自动化。上来就写脚本批量提交几十个任务结果模板里的 POSCAR 格式是错的那就是几十份错误的机时。我自己的经验是任何自动化流程在上线前都要先手动跑通一个小样本确认输出正确再批量执行。7.3 一些长期有效的习惯最后分享几个我用了很多年、觉得最值得保持的习惯。第一每个任务目录里放一个README或者note.txt写清楚这个任务是哪个体系的第几轮、参数改了什么、目的是什么。三个月后回来看你会感谢当时的自己。第二参数不要随手改。把验证过的 INCAR 存成模板每次从模板复制只在明确知道为什么的时候改。这样出问题时你能快速对比出是哪次改动引入的。第三所有原始输出定期备份至少保留 OUTCAR、OSZICAR、CONTCAR 和 INCAR 这四样它们足够还原一次计算的绝大部分信息。WAVECAR 这种大文件除非要续算否则该删就删。第四养成看一眼 WARNING 的习惯。VASP 的警告不一定会让计算失败但往往是某些参数设置不合理的信号。新手经常忽略警告一路跑到最后结果发现能量趋势不对回头查才发现第一条警告就说明了问题。我自己刚开始学的时候最耗时间的不是理解参数含义而是不知道去哪里找信息、不知道一个报错到底严重不严重。如果你现在正处在这个阶段最有效的方式其实是找一个小体系把上面这套流程完整走一遍遇到一个报错就解决一个三五次之后你对这套工具的掌控感会完全不一样。
返回列表