目前支持GW方法和Bethe-Salpeter方程求解的软件分为两类,一类是支持此类计算的通用DFT软件包,如VASP、abinit、GPAW、elk、exciting等,另一类是专业的多体微扰软件包,如BerkeleyGW、Yambo、SaX等。专业的程序在所支持的计算类型、后期处理和并行效率等方面相对于通用软件有很大优势。BerkeleyGW和Yambo是两个用户数较多的多体微扰理论软件包,其特点和区别可以参考这个帖子http://muchong.com/t-10638958-1。一言以蔽之,BerkeleyGW非常稳定,文档齐全,程序组织结构非常清晰,但学习成本较高,使用较为繁琐;而Yambo使用方便,并且有很多特色功能,缺点是文档不全,早期版本也不太稳定。至于选择哪个软件,取决于计算资源和是否有人带。如果有人带,或者已经非常熟悉计算流程,推荐BerkeleyGW;从零开始完全自学的话,推荐Yambo。在这篇博文中,重点讲一下如何编译BerkeleyGW。
编译组件
BerkeleyGW有FFTW和HDF5等可选依赖组件。2.0.0以前的版本尚不能使用MKL中的FFT接口,因此FFTW是必需组件。我们先编译FFTW:
export CC=icc export F77=ifort export CFLAGS=-O2 export FFLAGS=-O2 ./configure --prefix=$HOME/soft/fftw-3.3.4 --enable-sse2 --enable-shared
再编译HDF5:
export CC=mpicc export FC=mpif90 export CFLAGS=-O2 export FCFLAGS=-O2 ./configure \ --prefix=$HOME/soft/hdf5-1.8.17 \ --enable-fortran --enable-fortran2003 \ --enable-production --enable-parallel
基于Intel编译器编译BerkeleyGW 1.2.0
BerkeleyGW和VASP编译方式差不多,都是修改一个类似Makefile的文件后再make,没有configure过程。这个文件就是arch.mk,具体说明在源码的config/README里面,config目录下面还有各种范例。在这里给出一个可用的arch.mk(ICC+MKL+FFTW+HDF5+OpenMPI+openmp):
# Precompiler options COMPFLAG = -DINTEL PARAFLAG = -DMPI -DOMP MATHFLAG = -DUSESCALAPACK -DUSEFFTW3 -DHDF5 DEBUGFLAG = C_DEBUGFLAG = # Fortran compiler options FCPP = /usr/bin/cpp -ansi F90free = mpif90 -free -openmp LINK = mpif90 -i-static -openmp FOPTS = -O3 -no-prec-div FNOOPTS = -O2 -no-prec-div MOD_OPT = -module INCFLAG = -I # C/C++ compiler options C_PARAFLAG = -DPARA -DMPICH_IGNORE_CXX_SEEK CC_COMP = mpicxx C_COMP = mpicc C_LINK = mpicxx C_OPTS = -O3 # Command to remove, for make clean REMOVE = /bin/rm -f # FFTW settings FFTWPATH = $(HOME)/soft/fftw-3.3.4 FFTWLIB = -L$(FFTWPATH)/lib -lfftw3 FFTWINCLUDE = $(FFTWPATH)/include # MKL settings MKLPATH = $(HOME)/soft/mkl-13.0.079/lib/intel64 LAPACKLIB = -L$(MKLPATH) -lmkl_intel_lp64 -lmkl_sequential -lmkl_core SCALAPACKLIB = -L$(MKLPATH) -lmkl_scalapack_lp64 -lmkl_blacs_openmpi_lp64 # HDF5 settings HDF5PATH = $(HOME)/soft/hdf5-1.8.17 HDF5LIB = -L$(HDF5PATH)/lib -lhdf5hl_fortran -lhdf5_hl -lhdf5_fortran -lhdf5 -lz HDF5INCLUDE = $(HDF5PATH)/include # Flags for performance profiling PERFORMANCE = # Test suite TESTSCRIPT = make check-parallel
我们逐行看一下这套配置:
-DINTEL告诉预处理器我们所用的编译器为Intel编译器;
-DMPI和-DOMP告诉预处理器启用MPI和OpenMP混合并行,与之对应,后面的编译器参数中必须有-openmp;
-DUSESCALAPACK -DFFTW -DHDF5告诉预处理器启用SCALAPACK、FFTW和HDF5支持;
Fortran和C/C++编译选项基本不用修改;需注意若使用GCC中的预处理器(cpp),且GCC版本大于等于4.8,则FCPP必须设置为FCPP = cpp -C -nostdinc;此外也可直接使用Intel编译器中专用的Fortran预处理器(FCPP = fpp);
在FFTW、MKL和HDF5库设置环节,我们均使用动态链接;注意此处使用的MKL不在标准安装路径下面,需要根据自己服务器的软件配置修改MKLPATH;
修改完arch.mk后,输入make all-flavors即可编译BerkeleyGW。编译完成后,进入testsuite目录,输入make check-parallel即可测试所编译的程序。测试时默认使用4个MPI进程,若需要用更多进程,或者所用MPI为IntelMPI,则需根据该目录下的README文件,修改BGW_TEST_MPI_NPROCS和MPIEXEC环境变量。
测试无误后,输入make install INSTDIR=安装目录,即可将软件安装至指定目录下。
基于GNU编译器编译BerkeleyGW 2.0.0
使用2019版Intel 编译器编译BerkeleyGW 2.0.0,测试时会遇到大量段错误,无论无何调低优化级别都无法消除。解决方案就是安装更低版本的Intel编译器,或者改用GNU编译器。
下面给出用GNU编译器编译BerkeleyGW 2.0.0的arch.mk(GCC+MKL+OpenMPI):
COMPFLAG = -DGNU PARAFLAG = -DMPI MATHFLAG = -DUSESCALAPACK -DUSEFFTW3 DEBUGFLAG = FCPP = cpp -ansi F90free = mpif90 -ffree-form -ffree-line-length-none LINK = mpif90 FOPTS = -O3 -march=native -mtune=native FNOOPTS = -O3 -march=native -mtune=native MOD_OPT = -J INCFLAG = -I C_PARAFLAG = -DPARA CC_COMP = mpicxx C_COMP = mpicc C_LINK = mpicxx C_OPTS = -O3 -march=native -mtune=native C_DEBUGFLAG = REMOVE = /bin/rm -f FFTWLIB = $(MKLROOT)/interfaces/fftw3xf/libfftw3xf_intel.a FFTWINCLUDE = $(MKLROOT)/include/fftw MKLPATH = $(MKLROOT)lib/intel64 LAPACKLIB = -L$(MKLPATH) -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread SCALAPACKLIB = -L$(MKLPATH) -lmkl_scalapack_lp64 -lmkl_blacs_openmpi_lp64
配置文件和上面的差别不大,主要在这几个地方:
-DGNU告诉预处理器所用编译器为GNU编译器;
仅启用MPI并行,所以删掉了-DOMP预处理选项;
没有使用HDF5库,所以删掉了-DUSEHDF5;
编译器选项全部换成了适用于GNU编译器的选项;
直接使用了MKL中的FFTW接口;
MKL安装在了标准位置($MKLROOT);
经测试,在链接到MKL的前提下,GNU编译器和Intel编译器编译出的BerkeleyGW运行效率相差不大。
在准备BerkeleyGW输入文件时,会用到其中的一些小程序。如果在虚拟机中也编译一份BerkeleyGW的话,就会非常方便。下面给出用GNU编译器编译BerkeleyGW 2.0.0的arch.mk(GCC+FFTW+Netlib LAPACK):
# Precompiler options COMPFLAG = -DGNU PARAFLAG = MATHFLAG = -DUSEFFTW3 DEBUGFLAG = C_DEBUGFLAG = # Fortran compiler options FCPP = cpp -C -nostdinc F90free = gfortran -ffree-form -ffree-line-length-none LINK = gfortran FOPTS = -O3 FNOOPTS = -O2 MOD_OPT = -J INCFLAG = -I # C/C++ compiler options C_PARAFLAG = CC_COMP = g++ C_COMP = gcc C_LINK = g++ C_OPTS = -O3 # Command to remove, for make clean REMOVE = /bin/rm -f # FFTW settings FFTWPATH = /usr FFTWLIB = -L$(FFTWPATH)/lib64 -lfftw3 FFTWINCLUDE = $(FFTWPATH)/include # LAPACK settings LAPACKPATH = /usr LAPACKLIB = -L$(LAPACKPATH)/lib64 -llapack -lblas
该配置中使用了从软件源安装的FFTW和LAPACK,所以链接了/usr/lib64下面的库文件。如果使用自己编译的FFTW和LAPACK,则需修改FFTWPATH和LAPACKPATH。
转载本文请联系原作者获取授权,同时请注明本文来自李云海科学网博客。
链接地址:https://wap.sciencenet.cn/blog-2909108-1183487.html?mobile=1
收藏