AMD EPYC 7542 上编译 VASP 6.4,最初想要加上 wannier90, vtst, libcx,以及 dftd4,由于 dftd4 不支持 2016 版的 intel 编译器,而机器上只有 2016 和 2021 两个版本,所以只能用 intel 2021 进行编译了。然而最终结果是前三个都装上了而 dftd4 还是没装成功。
一、VASP 基本配置
从 arch 里拷出 makefile.include.intel 文件并重命名为 makefile.include,编译选项通过修改该文件实现。几点关键处如下:
(1)编译选项要加上 -march=core-avx2
(2)fftw 相关设置处加上 intel 的 .a 静态库
OBJECTS = fftmpiw.o fftmpi_map.o fftw3d.o fft3dlib.o \
$(MKLROOT)/interfaces/fftw3xf/libfftw3xf_intel.a
(3)FFLAGS 中的 -xHOST
选项要去掉,否则 AMD CPU 上编译会出错。
(4)FCL += -qmkl=sequential
改为 FCL += -mkl=sequential
否则同样编译会出错,好像是和 scalapack 有关的错误。
二、Wannier90
Wannier90 好说,毕竟以前装过好多次了,先编译出 libwannier.a 库文件,然后在 makefile.include 中稍作修改即可。其实 vasp 6.4.0 的 makefile.include 文件底部已经有相关内容了,改以下两项即可
# For the VASP-2-Wannier90 interface (optional)
CPP_OPTIONS += -DVASP2WANNIER90
#WANNIER90_ROOT ?= /path/to/your/wannier90/installation
#LLIBS += -L$(WANNIER90_ROOT)/lib -lwannier
LLIBS += /my/path/to/libwannier.a
三、 VTST
从官方下载最新的 vtstcode-197.tgz 程序包(注 vtstscripts.tgz 是命令行脚本,编译 vasp 时用不到):
https://theory.cm.utexas.edu/vtsttools/download.html
然后到 vasp 的 src 目录下,备份下 chain.F 和 main.F,然后把 vtstcode 解压后的 vtstcode6.4 目录中的所有文件拷到 src 下。再之后根据官网的说明进行几处修改 http://theory.cm.utexas.edu/vtsttools/installation.htmlmpiifort
(1)修改 main.F 文件
CALL CHAIN_FORCE(T_INFO%NIONS,DYN%POSION,TOTEN,TIFOR, &
LATT_CUR%A,LATT_CUR%B,IO%IU6)
改为
CALL CHAIN_FORCE(T_INFO%NIONS,DYN%POSION,TOTEN,TIFOR, &
TSIF, LATT_CUR%A,LATT_CUR%B,IO%IU6)
然后
IF (LCHAIN) CALL chain_init( T_INFO, IO)
去掉 IF (LCHAIN)
。
(2)修改 src/.objects 文件,在 chain.o
一行之前加入如下部分
bfgs.o dynmat.o instanton.o lbfgs.o sd.o cg.o dimer.o bbm.o \
fire.o lanczos.o neb.o qm.o \
pyamff_fortran/*.o ml_pyamff.o \
opt.o \
(3)修改 src/makefile,相关语句改成如下
LIB= lib parser pyamff_fortran
dependencies: sources libs
四、libxc
从 GitHub 上下载了最新的 6.1.0 版本,解压缩后一开始并没有 configure 文件,需要先运行 autoreconf -i
产生 configure 配置文件,然后进行配置
./configure --prefix=/path/to/install CC=icpc FC=ifort CFLAGS=-march=core-avx2 FCFLAGS=-march=core-avx2
不过有意思的是,最初设的 CC=icc
但是编译出错,其出错的位置为 for(int i=1; i<=n; i++)
这样的语句,变量定义竟然放到 for 里面了,这应该在标准 C 语言中是不允许的,但是 C++ 允许,于是将编译器改成了C++ 编译器 CC=icpc
然后就可以编译了。安装好后设置 vasp 的 makefile.inlcude
# for libxc
CPP_OPTIONS += -DUSELIBXC
LIBXCPATH=/path/to/libxc/installation
INCS += -I$(LIBXCPATH)/include
LLIBS += $(LIBXCPATH)/lib/libxcf03.a $(LIBXCPATH)/lib/libxc.a
其实最初上面的 libxcf03.a
用的是 libxcf90.a
,但是编译完进行链接时说少了一大堆带 f03 的符号,于是将 libxcf90.a
换成 libxcf03.a
后那一大堆错误就没了,但仍有一个符号 libxc_free
未定义。奇怪的是 libxc 的源文件 src/util.c 中有该函数的定义,但是查看 nm -s util.o 时却只有 _Z10libxc_freePv
的定义而没有 libxc_free
的定义,且 libxc.a 中也是同样。不过看到 util.c 中关于 libxc_free
函数的定义很简单,于是干脆直接编一个 myfree.c 文件如下
void libxc_free(void *ptr)
{
free(ptr);
}
然后 icc -c myfree.c 生成 myfree.o,再用 nm -s myfree.o 查看符号则有了 libxc_free
。最后,用命令 ar r libxc.a myfree.o
将该定义加到 libxc.a 库中,这样就有了 libxc_free
的定义了,于是再编译 VASP 就正常了。
五、dftd4
从 GitHub 上下了最新的 3.5.0 版本,yum (系统是 CentOS 7.9)安装了 0.55 版的 meson,同时作为依赖也装了 1.10 版的 ninja-build。编译器和编译选项通过环境变量来设置。
export CC=icc CXX=icpc FC=ifort CFLAGS=-march=core-avx2 FCFLAGS=-march=core-avx2 CXXFLAGS=-march=core-avx2
然后运行 meson setup _build
进行配置,结果在这一步就出现了问题,一堆对输出的最后是如下部分
dftd4 3.5.0
Subprojects
json-fortran-8.2.5: NO must be str, not list
mctc-lib: YES 1 warnings
mstore: YES
multicharge: YES 1 warnings
Found ninja-1.10.2 at /usr/bin/ninja
那个 json-fortran-8.2.5: NO
似乎表明该包有问题,但什么原因不清楚。如果直接执行下一步的命令 meson test -C _build --print-errorlogs
则更是会出一大堆错误,也看不懂。于是尝试使用 GitHub 上给出的已编译好的版本,不过那个应该是 intel 2018 编译器编译出的,设置号路径后修改 vasp 的 makefile.include 如下
CPP_OPTIONS += -DDFTD4
#LLIBS += $(shell pkg-config --libs dftd4)
#INCS += $(shell pkg-config --cflags dftd4)
LLIBS += /path/to/dftd4/lib/libdftd4.a
INCS += -I/path/to/dftd4/include -I/path/to/dftd4/include/dftd4/intel-18.0.2
结果编译时说找不到 .mod 文件,可是路径明明已经设对了,估计是编译版本不同, 2021 版的不认 2018 版编译出的文件吧。没有使用建议的 pkg-config
那两行是因为这里不是自己从源码编译的,得到的路径自然不对,所以自己指定的路径。但最终还是失败的,没有成功安装 dftd4。