![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SZ2UDNlZDM0kDM1UTNwcjZjZGMmZ2Y5ITYmRWN5YWY48CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
声明:学习中整理的笔记,不做任何商业用途。
VASP这款第一性原理计算软件,很多人都在使用,今天要做的笔记是VASP软件的编译,早期我是通过计算化学公社的一个帖子学习的,那个前辈写的很详细,链接如下:
教你从头编译vasp-5.4.1 - 第一性原理 - 计算化学公社bbs.keinsci.com
编译5.4.1,主要分四步:1. intel编译器和mkl安装;2. openmpi安装;3. fftw-3.3.4的安装。要注意环境变量,详见附录A、B、C。4. 修改vasp的makefile.include文件,然后make all。
很早之前,我都不知道intel编译器在哪里搞到,其实到官网注册,然后下载学生版轻松解决,会给你激活序列号,你也可以下载激活的license.lic文件。
parallel-studio-xesoftware.intel.com
我发现如果没有使用intel编译器里的fftw库,仅仅使用fftw-3.3.4 or它之前版本,如没有编译一些特定的动态or静态库,在运行vasp带有自旋的计算(ISPIN=2)会出现问题。
具体可以看到编译vasp用到的makefile.include文件
要注意MKLROOT,OBJECTS,INCS。如果使用的是自己fftw,就要这么写;还有你编译fftw的时候把libfftw3_mpi.a库文件编译出来了。
MKLROOT =/export/home/cluser1/intel/mkl
OBJECTS = fftmpiw.o fftmpi_map.o fftw3d.o fft3dlib.o /export/home/cluser1/fftw/lib/libfftw3_mpi.a
INCS =-I/export/home/cluser1/fftw/include
>>>kk
# Precompiler options
#CPP_OPTIONS= -DMPI -DHOST="IFC91_ompi" -DIFC
-DCACHE_SIZE=4000 -DPGF90 -Davoidalloc
-DMPI_BLOCK=8000 -DscaLAPACK -Duse_collective
-DnoAugXCmeta -Duse_bse_te
-Duse_shmem -Dtbdyn
CPP_OPTIONS= -DMPI -DHOST="LinuxIFC" -DIFC
-DCACHE_SIZE=8000 -DPGF90 -Davoidalloc
-DMPI_BLOCK=8000 -DscaLAPACK -Duse_collective
-DnoAugXCmeta -Duse_bse_te
-Duse_shmem -Dtbdyn -DRPROMU_DGEMV -DRACCMU_DGEMV
CPP = fpp -f_com=no -free -w0 $*$(FUFFIX) $*$(SUFFIX) $(CPP_OPTIONS)
FC = mpif90
FCL = mpif90 -mkl
FREE = -free -names lowercase
#FFLAGS = -assume byterecl
FFLAGS = -assume byterecl -FR -heap-arrays
#OFLAG = -O2
OFLAG = -O1 -ip
OFLAG_IN = $(OFLAG)
#DEBUG = -O0
DEBUG = -O0 -FR
MKLROOT =/export/home/cluser1/intel/mkl
MKL_PATH = $(MKLROOT)/lib/intel64
BLAS =-L$(MKL_PATH) -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread
LAPACK =-L$(MKL_PATH) -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread
#BLACS = -lmkl_blacs_openmpi_lp64
BLACS =-L$(MKL_PATH) -lmkl_blacs_openmpi_lp64
SCALAPACK = $(MKL_PATH)/libmkl_scalapack_lp64.a $(MKL_PATH)/libmkl_scalapack_ilp64.a $(BLACS)
#OBJECTS = fftmpiw.o fftmpi_map.o fftw3d.o fft3dlib.o
$(MKLROOT)/interfaces/fftw3xf/libfftw3xf_intel.a
OBJECTS = fftmpiw.o fftmpi_map.o fftw3d.o fft3dlib.o /export/home/cluser1/fftw/lib/libfftw3_mpi.a
INCS =-I/export/home/cluser1/fftw/include
LLIBS = $(SCALAPACK) $(LAPACK) $(BLAS)
OBJECTS_O1 += fft3dfurth.o fftw3d.o fftmpi.o fftmpiw.o
OBJECTS_O2 += fft3dlib.o
# For what used to be vasp.5.lib
CPP_LIB = $(CPP)
FC_LIB = $(FC)
CC_LIB = icc
CFLAGS_LIB = -O
FFLAGS_LIB = -O1
FREE_LIB = $(FREE)
OBJECTS_LIB= linpack_double.o getshmem.o
# Normally no need to change this
SRCDIR = ../../src
BINDIR = ../../bin
<<<kk
计算化学公社的那个帖子还有一段原话我觉得也比较有用
另外,上述文件是参考其他帖子进行修改得到的,最大的修改部分就是
BLACS =-L$(MKL_PATH) -lmkl_blacs_openmpi_lp64
的原始设置是
BLACS =-L$(MKL_PATH) -lmkl_blacs_intel_lp64-lmkl_blacs_openmpi_lp64
以原始设置虽然也能够编译出vasp,但是编译后没有办法正常运行的。
发现编译vasp的时候用到openmpi是将makefile.include文件里的:
FC = mpiifort
FCL = mpiifort -mkl
修改为:
FC = mpif90
FCL = mpif90 -mkl,在运行并行vasp的时候也用到了,可以看看下面运行vasp的pbs文件实例
#!/bin/bash
#PBS -q batch
#PBS -N vasp
#PBS -l nodes=1:ppn=4
#PBS -j oe
#PBS -V
#PBS -l walltime=1500:00:00
export
LD_LIBRARY_PATH=/export/home/cluser1/intel/composerxe/mkl/lib/intel64:$LD_LIB
RARY_PATH
source /export/home/cluser1/intel/composerxe/bin/compilervars.sh intel64
export PATH=/export/home/cluser1/intel/composerxe/bin:$PATH
export
LD_LIBRARY_PATH=/export/home/cluser1/intel/composerxe/mkl/lib/intel64:$LD_LIB
RARY_PATH
export
LD_LIBRARY_PATH=/export/home/cluser1/intel/lib/intel64:$LD_LIBRARY_PATH
export PATH=/export/home/cluser1/openmpi-1.6.5-intel-v12.1.5/bin:$PATH
export
LD_LIBRARY_PATH=/export/home/cluser1/openmpi-1.6.5-intel-v12.1.5/lib:$LD_LIBR
ARY_PATH
export
MANPATH=/export/home/cluser1/openmpi-1.6.5-intel-v12.1.5/share/man:$MANPAT
H
cd $PBS_O_WORKDIR
EXEC=/export/home/cluser1/VASP/vasp.5.4.1/bin/vasp_gam
LOG_FILE=vasptest.log
NP=`cat $PBS_NODEFILE | wc -l`
NN=`cat $PBS_NODEFILE | sort | uniq | tee /tmp/nodes.$$ | wc -l`
cat $PBS_NODEFILE > /tmp/nodefile.$$
mpirun -n $NP $EXEC
rm -f /tmp/nodefile.$$
后来我编译vasp5.4.4的时候就没有这么复杂了。
a.编译parallel_studio_xe
b.编译vasp。
我没有用fftw3.3.4。直接使用的intel编译器的/intel/compilers_and_libraries_2018.0.128/linux/mkl/interfaces/fftw3xf。编译 libfftw3xf_intel.a文件
make libintel64 compiler=intel
所以有了它就不需要fftw了。
附录A
intel编译器和MKL的安装
将l_fcompxe_2011.6.233.tgz和l_ccompxe_2011.6.233.tgz分别解压,分别进入文件夹执行./install.sh (如果使用parallel_studio_xe 就只需要执行一次./install.sh)。选择以当前用户安装,其他的选项为默认,在选择license时,以license文件进行验证,在需要输入路径的地方,输入zwt.lic文件的路径,将两个包都安装成功之后,在~./bashrc文件中加入如下环境变量后执行source ~/.bashrc使之生效
source /export/home/cluser1/intel/composerxe/bin/compilervars.sh intel64
export PATH=/export/home/cluser1/intel/composerxe/bin:$PATH
export LD_LIBRARY_PATH=/export/home/cluser1/intel/composerxe/mkl/lib/intel64:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/export/home/cluser1/intel/lib/intel64:$LD_LIBRARY_PATH
注意,/export/home/cluser1是当前用户的根目录,大家根据自己的实际情况修改,下同。执行命令which ifort看是否打印出安装路径用以判断安装或环境变量设置成功与否。
附录B
openmpi-1.6.5的安装。解压在文件夹内的openmpi压缩包,进入文件夹执行如下命令配置makefile
./configure --prefix=安装目录 CC=icc CXX=icpc F77=ifort FC=ifort
执行命令make -j8调用八核进行编译用以加快编译速度,直接用make单核编译可能超过1小时。执行命令make install完成安装 ,在~./bashrc文件中加入如下环境变量后执行source ~/.bashrc使之生效:
export PATH=/export/home/cluser1/openmpi-1.6.5-intel-v12.1.5/bin:$PATH
export LD_LIBRARY_PATH=/export/home/cluser1/openmpi-1.6.5-intel-v12.1.5/lib:$LD_LIBRARY_PATH
export MANPATH=/export/home/cluser1/openmpi-1.6.5-intel-v12.1.5/share/man:$MANPATH
执行命令which mpif90看是否打印出安装路径用以判断安装或环境变量设置成功与否。
附录C
fftw-3.3.4的安装。解压文件夹中的fftw-3.3.4压缩包,进入文件夹执行如下命令配置makefile
./configure --prefix=安装目录 --enable-mpi
注意,一定要加--enable-mpi否则在安装好的lib文件夹内无法生成此次编译VASP所必须的libfftw3_mpi.a文件。执行命令make,随后make install安装完成。在~./bashrc文件中加入如下环境变量后执行source ~/.bashrc使之生效:
export PATH=/export/home/cluser1/fftw/bin:$PATH
export LD_LIBRARY_PATH=/export/home/cluser1/fftw/lib:$LD_LIBRARY_PATH