拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Windows下用WSL2编译VASP 6.5.1:从源码到赝势配置完整指南

Windows下用WSL2编译VASP 6.5.1:从源码到赝势配置完整指南

在Windows上跑VASP 6.5.1,这个词儿一出来就自带争议:VASP官方从来没发布过原生的Windows可执行文件,要说"Windows版vasp-6.5.1",严格讲应该说成"在Windows环境下运行的VASP 6.5.1"。但架不住实验室里确实有大把人只有Windows主机,手头又有VASP 6.5.1的源代码和赝势文件,第一性原理计算的准备工作又绕不开这些。我这次就把Windows下编译VASP 6.5.1、配置赝势文件、跑通结构优化这条路完整走了一遍,整理出一套能直接照着做的方案,同时把源代码和赝势文件这两大核心组件的原理也一并讲透,给刚接触这块的人省点折腾的时间。

1. 项目整体认知:Windows跑VASP到底难在哪

1.1 一个最基本的误区:VASP官方没有Windows原生版

很多刚接触第一性原理计算的用户会习惯性问一句"VASP有没有Windows安装包"。结论很干脆:没有。VASP是Fortran写的、基于MPI并行的高性能计算软件,设计目标就是Linux集群和超级计算机,官方从1.x到6.5.1始终没有提供过原生Windows可执行文件。

原因不复杂。第一,VASP要充分发挥性能,必须依赖MPI并行库以及经过高度优化的BLAS/LAPACK和FFT库,这些东西在Windows生态下虽然也有,但线程调度、内存模型和性能表现都远不如Linux。第二,VASP大量使用Linux内存映射机制和编译器特定扩展,比如Intel Fortran编译器的某些行为、大页面内存管理、POSIX风格的文件锁,这些在Windows上要么没有直接对应物,要么需要很重的兼容层。换句话说,强行做Windows版会得不偿失,官方干脆不做。

所以在Windows上跑VASP 6.5.1,真正要解决的问题不是"安装Windows原生版",而是"在Windows主机上拥有一个能承载Linux二进制程序的运行环境",再把源代码编译产物放进去用。

1.2 三条可行路线,为什么我最终推荐WSL2

要在Windows下用VASP,目前主流有三条路,我挨个说清楚优劣,你就能明白为什么我最后选了WSL2。

路线实现方式性能损耗适合人群主要槽点
Windows原生编译用Intel Fortran或gfortran + MS-MPI在Windows命令行直接编译VASP较低但库依赖麻烦极少数愿意折腾的人官方都不维护,编译错误几乎没法查
虚拟机方案VMware/VirtualBox装完整Linux系统约10%~20%损耗对WSL不熟悉、习惯图形界面的人占用磁盘大,IO慢,共享目录配置麻烦
WSL2(推荐)Windows自带Linux子系统,跑完整Linux内核接近原生(算密集型损耗很小)绝大多数用户跨文件系统IO慢,需要记住相关命令

WSL2在我实测下来比VMware轻太多了。它不是一个模拟器,而是微软在Windows内核之上接了一个真正的Linux内核虚拟机,所以里面跑Ubuntu、装Intel oneAPI、编译VASP、跑MPI,整个链条跟在一台真Linux机器上几乎一样。而且WSL2支持GPU直通,虽然对VASP这种CPU计算软件意义不大,但至少说明底层环境很完整。

顺带提一句:有同行用Docker跑VASP,这在Linux服务器上挺好,但Windows下Docker Desktop本质上还是依赖WSL2,绕了一圈反而多一层配置,新手不建议一开始就上。

2. 三大核心文件:源代码、赝势文件、编译环境

2.1 VASP 6.5.1源代码的构成与正规获取方式

先把最要紧的事情说在前面:VASP是商业授权的学术软件,源代码不公开。能拿到VASP 6.5.1源代码的唯一正规途径,是课题组负责人或单位管理员向VASP官方(维也纳大学)提交许可申请并完成付费,之后官方会开放源码下载入口,并附带使用协议和保密条款。网上所谓的"破解源码""共享源码包",严格讲都是违背软件许可的,既不符合学术规范,也存在法律风险,这条路不要碰。

我所在的课题组拿到了正版授权,所以下面讲的都是基于正规源码包的合理操作。

拿到VASP 6.5.1源码包之后,你会看到一个典型的Fortran项目结构。最核心的是src目录,密密麻麻的.f90文件就是全部的源代码,计算的主循环、电荷密度混合、自洽迭代算法、力与应力计算都在这里。build目录里预置了面向不同硬件平台的makefile模板,比如针对Intel编译器的、针对gfortran的、针对Arm平台的。根目录下还有一个关键的makefile.include,这就是整个编译流程真正要用的配置文件,决定编译器、数学库、MPI库的参数和路径。

跟6.4.x版本相比,6.5.1在代码层面有不少调整:一是任务作业管理模块升级,加入了任务自动提交、轮询和失败重启能力,所以跟作业调度相关的配置项多出来了;二是默认算法参数有更新,尤其是对不同体系自洽迭代的收敛行为有所优化;三是修复了一批在特殊对称性体系和+U计算里暴露的老问题。对于日常做结构优化和静态计算的用户,6.5.1体感上最大的变化是稳定性提升,而不是计算速度的飞跃。

2.2 赝势文件(POTCAR)到底是个什么文件

VASP的赝势文件名统一叫POTCAR,这是所有用VASP做DFT计算的人都绕不开的文件。POTCAR本质是一个纯文本文件,按ASCII编码记录了某种元素的PAW赝势数据。PAW全称是投影缀加平面波方法,属于全电子赝势的一种,它通过一套投影算符把一个原子的芯电子和价电子行为打包成数值表格,计算时只需要显式处理价电子,芯区域用赝势代替,既保证精度又大幅降低平面波截断的要求。

POTCAR文件里最核心的信息就几行,但每一行都值得看懂:

  • VRHFIN:这一行简写说明了赝势的元素和类型,比如Fe的PAW PBE势显示为Fe pv,后面的pv表示半芯态的p电子也放进了价电子池。
  • TITEL:赝势全称和版本号,比如PAW_PBE Fe_pv 06Sep2000。你可以在做计算的时候通过这行确认自己用的势版本。
  • ZVAL:价电子数,这个数值直接决定体系的总电子数,任何计算都要靠它。
  • ENMAX和ENMIN:推荐的平面波截断能上限和下限。INCAR里设置ENCUT时可以参考这两个值,取ENMAX的1.3倍左右是高精度计算的常见做法。
  • LEXCH:交换关联泛函数的标识,PBE或者LDA之类。

如果你算的体系是单元素,POTCAR就是这一个元素单独的赝势文件。但绝大多数体系是多种元素,比如Fe2O3、GaAs、钙钛矿氧化物,这时候POTCAR就是多个单元素赝势文件的直接拼接,VASP读取时严格按文件中元素的出现顺序去匹配POSCAR中的原子顺序。也就是说,你必须先把各个元素的POTCAR按POSCAR顺序拼接成一个总文件,顺序错了,算出来的直接是错误体系,而且VASP可能不会报错。

2.3 POTCAR的获取、拼接与校验

获取赝势文件的渠道同样要强调正规性。VASP官网的势库区在授权后可以下载PAW_PBE、PAW_GGA等多个系列的赝势包。下载下来的是按元素分开的压缩包,解压后每个文件夹里都有一个POTCAR文件,通常还会带一个关于赝势版本说明的文件。有了这些单元素POTCAR,拼接工作完全可以自己完成。

假设你的POSCAR里元素顺序是Fe、O,那么在Linux终端下用一行命令就能合并:

cat POTCAR_Fe POTCAR_O > POTCAR

这里POTCAR_Fe和POTCAR_O分别是对应元素的赝势文件。合并完必须立刻校验,别直接开跑。最常用的检查是看TITEL行,确认每个元素是否存在以及顺序是否正确:

grep "TITEL" POTCAR

如果输出里两行分别显示Fe和O的赝势名称,顺序也对,那基本可以放心用。再顺带看一眼ENMAX,确认你INCAR里的ENCUT没有低于推荐值:

grep "ENMAX" POTCAR

还有一个很容易被忽略的坑:VASP 6.5.1对于某些元素的POTCAR有版本兼容性要求。如果你在官网下载的是旧版本的势库文件,而源码包里自带的势库校验逻辑更新了,运行时会提示赝势与软件版本不兼容。遇到这种情况,最稳妥的做法是去官网重新下载与软件版本配套的最新势库。

3. 实操全流程:从零到VASP 6.5.1跑通一次计算

3.1 用WSL2搭建一个干净的Linux环境

我用的系统是Windows 11,把WSL2环境装好后一切就顺了。装WSL2非常简单,只要在管理员权限的PowerShell窗口执行:

wsl --install -d Ubuntu-22.04

执行完系统会提示重启。重启之后第一次进入Ubuntu会要求设置用户名和密码,这步随意,但密码要记住,后面使用sudo经常要用。装完后我习惯先跑一遍系统更新,把基础软件包补齐:

sudo apt update && sudo apt upgrade -y

然后安装编译基础工具链,包含make、gcc、g++、gfortran和git等,这些是后续编译VASP的基石:

sudo apt install -y build-essential gfortran git make

这里说一个重要的经验:WSL2的Linux文件系统和Windows文件系统是可以互通的,Linux里访问Windows目录通过/mnt/c来操作。但跨文件系统的IO速度慢得惊人,而VASP编译和计算会频繁读写临时文件,所以千万不要把VASP的源码、赝势文件和算例放在/mnt/c下。我一开始图省事,直接在D盘解压源码然后进入/mnt/d去编译,结果make过程慢到让人怀疑人生,而且偶尔还会出现File too large之类的奇怪报错。正确的做法是:把VASP相关所有文件都放到Linux原生文件系统里,比如~/vasp目录,Windows下编辑好的输入文件再通过复制或者共享目录方式同步进去。工作目录放/home下,IO速度跟真实Linux几乎一致。

3.2 选择编译器与数学库:Intel oneAPI还是gfortran

VASP编译最关键的配置是makefile.include,它决定了你用哪套编译器、数学库和MPI库。这里我给出两条路线,效果都验证过。

第一条是官方最推荐的Intel路线,适合绝大多数Intel平台机器。先去Intel官网免费下载并安装oneAPI Base Toolkit和HPC Toolkit,装完后在Ubuntu里激活环境:

source /opt/intel/oneapi/setvars.sh

然后从VASP源码包的build目录里复制一份Intel模板:

cp build/makefile.include.linux_intel ./makefile.include

这个模板针对Intel编译器做了大量优化,MKL数学库自带高精度的BLAS、LAPACK和FFT,MPI直接使用Intel MPI。如果你用的CPU是非Intel平台,比如AMD Ryzen,这套模板也能跑,但MKL在非Intel处理器上会有一定的性能折损,实测大概在5%到10%之间,不算严重。

第二条是gfortran + OpenBLAS路线。如果不想装体积很大的oneAPI,或者机器是老平台兼容性一般,可以走这条:

sudo apt install -y libopenblas-dev libfftw3-dev liblapack-dev openmpi-bin openmpi-common libopenmpi-dev

然后复制gfortran模板,修改库路径:

cp build/makefile.include.linux_gfortran ./makefile.include

这条路线的好处是依赖全部走apt安装,环境干净,出问题容易排查。坏处是OpenBLAS和FFTW在高负载下的性能不如MKL,大体系长时间计算时差距能拉开10%以上。我的建议是:如果机器内存够大、磁盘够快,优先使Intel oneAPI;如果只是想快速跑通流程验证结果,gfortran路线更省事。

3.3 编译配置要点与make std的完整过程

makefile.include里的关键选项,我必须逐项解释清楚,因为这一步是新手梦魇。

文件开头有一堆CPP_OPTIONS,这是VASP预处理器的宏开关,比如:

CPP_OPTIONS = -DHOST=\"LinuxIFC\" -Dkind8 -DNGZhalf -DCACHE_SIZE=6000 -DPGF90 -Davoidalloc

每个宏都有意义。-Dsingle对应单精度,-Dkind8则启用8字节整数,这个必须开,否则大体系原子数超过整数范围会出严重错误;-DNGZhalf是减少一半倒空间网格内存的优化;-DCACHE_SIZE用来告诉VASP目标平台的缓存大小,影响分块计算策略;-Davoidalloc在部分体系里避免某些大型数组动态分配,能提升稳定性。gfortran模板里还要常见-DMPI之类与并行相关选项。

然后是库路径设置。Intel模板里通常是这样:

MKLROOT = /opt/intel/oneapi/mkl BLAS = -L$(MKLROOT)/lib -lmkl_blas95_lp64 LAPACK = -L$(MKLROOT)/lib -lmkl_lapack95_lp64 FFT = -L$(MKLROOT)/lib -lmkl_intel_lp64 -lmkl_sequential -lmkl_core

如果你装了oneAPI但找不到MKLROOT,大概率是setvars.sh没source,或者安装目录不是/opt/intel/oneapi。用echo $MKLROOT看一下,如果为空就重新source环境。

把makefile.include配置好之后,编译就很简单了。VASP 6.5.1支持三个版本的目标:标准版vasp_std(支持所有功能和泛函,日常主力)、GAMMA版(仅支持Gamma点计算,速度快但限制多)、非共线磁性版vasp_ncl(处理自旋非共线和强自旋轨道耦合体系)。编译方法依次是:

make std make gam make ncl

我只编了vasp_std和vasp_ncl,因为日常结构优化用std,做磁性材料和非共线磁性用ncl。第一次编译耗时较长,Intel oneAPI全量编译大概要吃二十分钟左右,期间CPU会跑满,属于正常现象。编译结束后,产物vasp_std、vasp_ncl和vasp_gam会出现在源码包的根目录。我用ls -lh vasp_std确认文件存在,再跑一下:

./vasp_std --version

能看到版本号输出,说明编译成功。到这一步,Windows下运行VASP 6.5.1的核心问题已经解决。

3.4 验证跑通:Fe2O3结构优化的最小算例

编译好只是开始,真正验证"赝势文件和源代码配置没问题"的方式是跑一个标准算例。我建议用氧化物材料做测试,因为结构明确,收敛行为在常规区间,不会一出错就让人摸不着头脑。

在Linux根目录下建一个工作目录,里面放四个输入文件:POSCAR、INCAR、KPOINTS、POTCAR。我这里用赤铁矿Fe2O3的菱形原胞作为示例,POSCAR大致写成这样(具体晶格常数以官网或论文数据为准):

Fe2O3 1.0 5.035 0.000 2.970 1.678 4.747 2.970 0.000 0.000 4.852 Fe O 2 3 Direct 0.200 0.200 0.200 0.700 0.700 0.700 0.400 0.400 0.400 0.900 0.900 0.900 0.600 0.600 0.600 0.100 0.100 0.100

POSCAR里关键点是元素顺序是Fe、O,所以POTCAR必须由Fe的赝势文件在前、O的赝势文件在后拼接而成。

INCAR是一个结构优化常见的参数配置:

SYSTEM = Fe2O3 optimization ISTART = 0 ICHARG = 2 PREC = Accurate ENCUT = 500 ISMEAR = 0 SIGMA = 0.05 NSW = 60 IBRION = 2 ISIF = 3 EDIFF = 1E-5 EDIFFG = -0.02 LORBIT = 11

这几个参数值得多解释两句。ENCUT取500eV,是因为Fe的PAW-PBE势推荐ENMAX通常在400eV左右,取1.3倍就是520eV,500eV稍微保守但足够说明问题。ISMEAR=0使用高斯展宽,适合氧化物这类绝缘体体系,金属体系要用MP方法设置ISMEAR=1并给合适的SIGMA。IBRION=2用的是共轭梯度法做离子弛豫,ISIF=3表示优化晶胞参数和原子坐标,做体积松弛。EDIFFG取负值表示力的收敛标准,-0.02意味着最大残余力小到0.02eV/埃才停,对大多数材料的结构优化已足够。

KPOINTS用自动网格:

Automatic mesh 0 Gamma 4 4 4 0 0 0

准备好后,在目录里依次执行:

cat POTCAR_Fe POTCAR_O > POTCAR grep "TITEL" POTCAR mpirun -np 4 ~/vasp/vasp_std

跑起来之后,用ls -l观察进度,最后检查OUTCAR里是否出现"General timing and accounting informations"和"reached required accuracy"字样。如果INCAR里设置了NSW=60,结构优化过程中离子步会逐步收敛,最理想的状态是在六十步内完成,输出里能看到受力越来越小。

对于Fe2O3,因为体系带磁性和比较强的电子关联,如果严格用纯PBE,可能要加+U或者设置初始磁矩才能快速收敛。当作最简单的验证算例时,可以先把磁性关掉或者初始磁矩给零,计算结果不会特别准,但足以验证VASP本体是否正常工作。

4. 常见问题与排查技巧实录

踩过的坑按出现频率,我列成了下面几张速查表,每个问题后面附上我的排查思路。

4.1 WSL2环境典型问题

问题现象原因解决办法
编译时长时间卡死在某个文件源码放在/mnt/c下,跨文件系统IO太慢把源码和算例移到Linux原生目录
输入文件从Windows记事本编辑后报诡异错误Windows换行符\r\n混入用dos2unix POSCAR等命令转换文件
WSL2内ping不通外网代理设置或者DNS配置检查/etc/resolv.conf和Windows防火墙,必要时重置WSL
内存看起来不够WSL2默认内存限制太紧在用户目录下添加.wslconfig文件,设置memory=16GB等参数

关于换行符问题,我特意说细一点。很多同行喜欢在Windows下用记事本或VS Code编辑INCAR和POSCAR,然后直接复制到WSL2里面。Windows文本编辑器默认使用CRLF换行,即\r\n,而Linux下大多数程序只认LF换行。VASP虽然对换行符有一定容忍度,但在INCAR某些参数行或者POSCAR坐标里一旦混入\r,轻则报错,重则解析出完全错误的信息。我习惯的做法是编辑完统一执行:

sed -i 's/\r$//' POSCAR INCAR KPOINTS

或者安装dos2unix工具一键处理。记住,所有文本输入文件都要过一道换行符处理,这是Windows下用VASP最容易被忽视的细节。

WSL2内存限制也值得重视。VASP的大体系计算,内存占用轻松上10GB,而WSL2默认最多只吃到物理内存的50%。如果你的内存有32GB,实际WSL里可能只有16GB可用,算大体系就会杀进程。我在C盘用户目录下新建一个名为.wslconfig的文件,内容如下:

[wsl2] memory=24GB processors=8 swap=8GB

保存后重启WSL,内存限制就提高了。这个文件只有Windows侧可用,配置方法网上到处都是,属于微软官方支持的做法。

4.2 编译与MPI相关的问题

编译阶段报错最多的是找不到库文件。我遇到的有这几种:

第一,mpif90: command not found,说明MPI环境没激活。Intel路线下需要先source /opt/intel/oneapi/setvars.sh,gfortran路线下确认mpirun --version能跑通。第二,MKL not found之类的报错,通常是MKLROOT路径没配对,可以直接在makefile.include里改成绝对路径。第三,Error: Type mismatch in argument这类Fortran编译报错,多数发生在老编译器配新源码的时候,比如Ubuntu自带的gfortran版本过旧。解决办法是升级到gfortran 10以上版本,或者干脆统一用Intel编译器,后者对VASP源码的兼容性好得多。

还有一种低频但迷惑的问题:编译vasp_std时明明成功了,运行时却提示libmpi.so.12: no version information available。这是MPI库版本更新后遗留的ABI兼容问题。解决办法是在编译前先把系统中的OpenMPI彻底清理,重新安装固定版本,比如openmpi-bin 4.1.x,再重新编译VASP。整个过程比较耗时,但能换来一个干净的运行环境。

并行运行时,如果mpirun -np 4跑起来后每个核都在忙,但输出文件一动不动,很可能是MPI库与系统网络接口不兼容。WSL2里典型的解决方法是设置:

export OMPI_MCA_btl_vader_single_copy_mechanism=none

这个环境变量专门解决OpenMPI在容器和虚拟机环境下的通信兼容问题,实测有效。

4.3 赝势文件与计算参数问题

再说几个赝势相关的坑。

“POTCAR中找不到某个元素”是最常见的。比如你POSCAR里写了Fe O,但POTCAR只拼接了Fe,VASP会直接报错。排查方式很简单,grep TITEL就能看出来。还有一种隐蔽得多:POSCAR元素顺序和POTCAR顺序不一致,Fe2O3写成Fe在第二行,POTCAR却是O在前Fe在后,VASP不会明显报错,但算出来能量和受力全部错乱。我踩过一次这个坑,整个弛豫过程看起来很合理,结果晶格参数越算越离谱,最后检查POTCAR才发现顺序反了。所以每次拼完POTCAR,一定要grep校验。

还有一类是INCAR里ENCUT低于POTCAR的ENMAX。VASP会给出警告,但并不强制提高,如果体系压力很大或者原子运动幅度大,低截断会导致能量震荡甚至不收敛。稳妥的做法是确保ENCUT至少等于ENMAX,我习惯取1.3倍。也可以通过OUTCAR里的maximum number of plane-waves来观察,如果平面波数量异常少,多半是截断能开太低了。

最后提一下赝势版本混用的问题。有些同行喜欢混合不同系列的赝势,比如一个元素用PAW_PBE,另一个用PAW_PW91。虽然偶尔也能跑,但这属于物理上不严谨的做法,不同赝势的构造方法、芯半径、交换关联不一致,混用会让相对能量失去意义。在同一套计算里,所有元素要尽量用同一系列、同一版本的赝势文件,这是最省心的做法。

还有一个小技巧:做含有过渡金属的体系时,Fe、Ni、Mn等元素如果只把3d和4s电子放进价电子池,常常会出现截断能要求特别高的问题。官网通常同时提供不带半芯态的版本如Fe、和带半芯态的版本如Fe_pv。对大多数需要准确描述磁性和晶格的计算,用Fe_pv这类带半芯态的版本更稳妥,虽然计算成本略高,但收敛性和精度都要好很多。选择哪一种,在POTCAR的TITEL行里就能看出来。

5. 最后分享一点我的实际使用体会

整个流程跑通后,我最大的一个感受是:Windows下用VASP,与其到处找现成的二进制包和别人整理好的赝势集合,不如自己踏踏实实把源码编译一遍、把赝势文件手动拼接一遍。前者表面上省了时间,实际上一旦版本对不上、库不兼容、赝势顺序出错,排查起来反而更耗时。而当你亲手完成makefile.include配置、编译出vasp_std的那十分钟,你对整个VASP工具链的理解会有一个质的提升,以后再换服务器、换集群、换个软件版本,基本都能举一反三。

另外一个体会是别迷信网上流传的"某大牛编译好的Windows版VASP"。这类东西一方面来源不明、安全性没保障,另一方面多半是旧版本或者修改过行为的编译产物,算出来的结果是否可靠没人能保证。你手上有正版授权的源码,跟着官方文档和社区经验配置好环境,才是既安稳又踏实的路子。

日常使用时,我还会定期检查VASP官网有没有发布补丁或者新的赝势库更新。VASP 6.5.1之后虽然还没看到重大功能版本,但官方偶尔会更新势库推荐版本。做第一性原理计算,稳定性和可复现性永远是第一位的,投入一些时间把基础环境打牢,后面工作起来会顺畅得多。希望这篇基于Windows环境跑VASP 6.5.1和配置赝势文件的经历,能帮你在同样的路上少踩几个坑。

返回列表