目录
编译安装VASP
最近要做密度泛函理论(density functional theory)计算,导师让学习一下vasp的使用,于是找了网上的vasp.5.4.4,在超算上自行安装了了一下。稍微记录一下,权当知识拓展。
源码文件
源码文件找的是网上流传版本最为广泛的5.4.4,里面自带了linux下并行编译的makefile,在一般超算上应该都可以直接使用,非常地人性化。
其实伴随着这个源码,已经有前辈给过编译方案,甚至有视频教程。但是鉴于intel直接把Parallel Studio做成oneapi,并且只有买了licsense的才可以下载历史版本(Intel这波做的真的恶心),所以对于编译器的安装部分,还是和前辈所用的略有不同,这里将自己的编译安装过程整理一下,或许也能帮助到后人。
编译器及依赖
VASP是用fortran编写的,所以自然需要fortran编译器。另外在超算上运行并行计算程序还需要相应的mpi(Message Passing Interface),以及Intel的数学库。
- Intel® oneAPI Base Toolkit: 提供Intel MKL
- Intel® oneAPI HPC Toolkit: 提供Intel MPI
- Intel® Fortran Compiler Classic and Intel® Fortran Compiler: 提供Intel fortran编译器ifort
需要注意的是,2023版的oneAPI不支持我们的操作系统,安装的时候会提示:
This machine uses operating system “CentOS version 7”. Compatibility issues may occur.
Installation can continue; however, product functionality may not meet expectations because this product is untested on this operating system. Suggestion: Check the Release Notes for a list of supported operating systems and install this product on a compliant system.
以及,虽然HPC toolkit里面已经内置了fortran编译器,但是实践下来,不独立安装fortran编译器会将不会通过编译。。。
Intel oneapi的安装真的非常容易,只需要照着官网上的流程走。
- 点「下载」跳转到相应的下载界面
- 选择对应的操作系统和安装包类型。我们超算是CentOS version 7就选Linux,因为超算本身可以联网,安装包类型就选在线版。
- 选好之后网页会自动生成一个下载链接,拷贝对应的链接,在超算上运行
wget
命令,后面的链接替换成网页上给的链接,就像这样:wget https://registrationcenter-download.intel.com/akdlm/irc_nas/17977/l_BaseKit_p_2021.3.0.3219_offline.sh
- 这里
*.sh
的文件就可以理解为安装包,三个安装包都下载好之后,拷贝到超算上,运行sh *.sh -a --silent --eula accept
直接安装(超算上没有超级用户权限,直接安装在个人文件夹)。 - 安装完成后用户目录底下会有一个intel的文件夹,我们进入到其中oneapi的文件夹,准备一下modulefiles。
cd ~/intel/oneapi && sh modulefiles-setup.sh
编译VASP
VASP的编译前人已经已经趟过水了,我们直接运行:
. ~/intel/oneapi/setvars.sh #将编译要用的intel的包都加入环境变量
tar -xvf vasp.5.4.4.tar.gz
cd vasp.5.4.4
mv arch/makefile.include.linux_intel makefile.include
然后用用vim
(或者任何一款你熟悉的编辑器)打开这个文件makefile.include
,在20行OFLAG
这里,多加一个参数-xhost
。
改好之后我们就可以直接编译了,直接进行一个make all
,亲测要等待一两个小时,而且使用诸如make -j 16 all
等多线程编译会报错;所以还是建议大家多等等。编译成功的话,在vasp.5.4.4
这个文件夹底下就会生成一个bin
文件夹,我们编译好的可执行文件就在这里了。
最后我们将这个三个可执行文件移动到我们用户可执行文件目录。
mv ~/vasp.5.4.4/bin* ~/.local/bin
另外两个软件
Linux链接器ld
笔者编译的过程中,make all
给报了一个错误:
ld:~/intel/oneapi/compiler/2022.2.1/linux/compiler/lib/intel64_lin/libifcoremt.a(cvtas_a_to_s.o):unrecognized relocation (0x2a) in section 'text'
ld: final link failed: Bad value
据StackOverflow上的大佬指点,是超算上装的ld
的版本太老了的原因。
这个时候需要将超算上的ld
替换成新版本的。
- 首先去GUN官网下载binutils的源码。
- 上传源码到超算上之后,解压、编译、安装。
tar -xvf binutils-2.39.tar.gz
mkdir .binutils #创建安装文件夹
cd binutils-2.39
./configure --prefix=$HOME/.binutils #制定安装目录这里可能需要自己输入一下刚刚创建的文件夹路径
make all-ld
make install-ld
安装完成后,在我们的安装文件夹.binutils
下,就能找到目录bin
,这时候只需要将这个目录加入到环境变量去覆盖掉原来操作系统提供的ld
就行。在~/.bashrc
中加入这行:
export PATH=$HOME/.binutils/bin:$PATH
然后重新进入终端或者执行. ~/.bashrc
。这个时候再重新编译就不会报错了。
Environment Modules
超算上的环境变量一般使用Environment Modules来管理,Intel的库也提供了对应的modulefiles(之前我们已经准备好),搭配使用非常顺滑。
而且不知道是什么原因,在笔者用的超算上运行编译好的的vasp_std的时候,必须要既使用Environment Modules来加载库文件,又要使用之前的. ~/intel/oneapi/setvars.sh
来加载,按理说本来两者只需要一个的。
这个软件的安装方法也和ld
没差多少,我们直接下载他的源码,拷贝到超算上,解压、编译、安装:
tar -xvf modules-5.2.0.tar
mkdir .modules
cd modules-5.2.0
./configure --prefix=$HOME/.modules
make all
make install
提交VASP任务
如前所述,运行VASP,环境变量稍有一点误差就会报错,好在这几天超算比较闲,我就多试了几次,总结出了一个提交脚本:
#!/bin/bash
#SBATCH --job-name=vasp_test
#SBATCH -p cpu
#SBATCH --workdir=YOUR_WORK_DIR_PATH
#SBATCH --output=%j.out
#SBATCH --error=%j.err
#SBATCH --mail-type=ALL
#SBATCH --mail-user=YOUR_EMAIL_ADDR
ulimit -s unlimited
ulimit -l unlimited
#接下来这段因各超算不同而可能需要有所改变,主要是清空超算上原有的配置
export MANPATH=/opt/gridview/clusquota/man
export PATH=/usr/lib64/qt-3.3/bin:$HOME/perl5/bin:/opt/gridview/slurm/bin:/opt/gridview/slurm/sbin:/opt/gridview/munge/bin:/opt/gridview/munge/sbin:/opt/gridview/clusquota//bin:/opt/gridview/clusquota//sbin:/opt/gridview/clusconf/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/ibutils/bin:$HOME/.local/bin
export LD_LIBRARY_PATH=
export MODULEPATH=
#然后重新载入我们的配置
source $HOME/.modules/init/profile.sh
module use $HOME/intel/oneapi/modulefiles
module load compiler
module load tbb
module load mkl
module load mpi
module list
source $HOME/intel/oneapi/setvars.sh --force
mpirun -np 4 vasp_gam
将这段代码保存成文件如my_vasp_job.sh
,然后使用sbatch my_vasp_job.sh
提交任务即可。