Gromacs 和 CP2K 相结合进行 QM/MM 模拟,是我比较喜欢的 Toolchain。所以这里我们选择这两个软件进行 QM/MM 计算。本文介绍我的环境编译过程。原文首发于 https://zhuanlan.zhihu.com/p/700073814
本文在Gromacs与cp2k联动使用plumed做QM/MM增强采样等帖子的指导下完成。
前置知识
C++项目目录结构
以 OpenMPI 为例,项目一般采用如下目录结构:
openmpi411/
├── bin
├── etc
├── include
├── lib
└── share
其中 bin 为可执行文件目录,一般需要添加到 PATH 环境变量;lib 为库目录,可添加到 LD_LIBRARY_PATH 环境变量;include 为头文件目录。
LDFLAGS,CFLAGS 和 LIBS
LDFLAGS 是用于在编译时指定库文件位置的参数。
LDFLAGS="-L'/path/to/your/lib'"
CFLAGS 是用于在编译时指定头文件位置的参数。
CFLAGS="-I'/path/to/your/include'"
LIBS 用于指定连接器要连接的库文件。下文中,如果 make 进度走到了 100%,但是连接出了问题,则说明 LIBS 给得不对。
LIBS="-lstdc++ -lopenblas"
安装过程
安装 fftw
考虑到我的 CPU 支持 avx2,这里选择自行编译 fftw 库并加上 --enable-avx2 选项,以加快模拟时的运行速度。
编译过程:
wget http://www.fftw.org/fftw-3.3.10.tar.gz
tar zxvf fftw-3.3.10.tar.gz
cd fftw-3.3.10
./configure --prefix=/opt/fftw3310 --enable-sse2 --enable-avx --enable-float --enable-shared --enable-avx2
sudo make -j 32 install
编辑 ~/.bashrc 文件,在最后加入:
export PATH=/opt/fftw3310/bin:$PATH
export LD_LIBRARY_PATH=/opt/fftw3310/lib:$LD_LIBRARY_PATH
安装 OpenMPI
OpenMPI 可选用 CP2K 默认构建的,也可自行编译。我这里考虑到其他软件(ORCA)对 OpenMPI 4.1.1 版本有明确需求,故采用自行编译的 OpenMPI。
sudo dnf install gcc gcc-gfortran
wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.1.tar.bz2
tar -xf openmpi-4.1.1.tar.bz2
./configure --prefix=/opt/openmpi411 --disable-builtin-atomics
sudo make all -j 32 install
编辑 ~/.bashrc 文件,在最后加入:
export PATH=/opt/openmpi411/bin:$PATH
export LD_LIBRARY_PATH=/opt/openmpi411/lib:$LD_LIBRARY_PATH
安装 CP2K
CP2K 所选择安装的组件与下文编译 Gromacs 时给定的额外参数应当严格对应。
选择使用 toolchain 安装。
./install_cp2k_toolchain.sh \
--with-libxsmm=install \
--with-elpa=install \
--with-libxc=install \
--with-libint=install \
--with-gsl=no \
--with-libvdwxc=no \
--with-spglib=no \
--with-hdf5=no \
--with-spfft=no \
--with-cosma=no \
--with-libvori=no \
--with-sirius=no \
--with-scalapack=install \
--with-openblas=install \
--with-fftw=/opt/fftw3310 \
--with-openmpi=system \
--with-plumed=install
其中对于 cosma 组件,我后来虽然找到了它的库文件和 LIBS 参数,但是联合编译的时候 CP2K 会出错,没有排查出原因,所以这里索性选择略过不安装。其他组件可自行选择是否安装,对应的 LIBS 参数见下文。
注意 fftw 的路径我写了明确的路径,实测如果只是写 system 的话,后面 make 的时候会出现无法 include 的问题。
使用 toolchain 默认安装的组件位于 /path/to/cp2k/tools/toolchain/install/ 路径,可在此寻找组件的库文件。
然后按照常规流程编译 CP2K,具体可见 sob 老师的教程CP2K第一性原理程序在CentOS中的简易安装方法。
cd /path/to/cp2k
cp tools/toolchain/install/arch/* arch/
source tools/toolchain/install/setup
然后编译 CP2K 和静态库。
make -j 32 ARCH=local VERSION="ssmp psmp"
make -j 32 ARCH=local VERSION="ssmp psmp" libcp2k
这里也有人说直接执行第二行就可以,但我实测无法正常生成 cp2k.ssmp 和 cp2k.psmp,还得是按原始方法先编译一次,再生成库文件。
安装 Gromacs
下载 >= 2022 的 Gromacs 版本。
采用常规安装方法,但需要更改 cmake 步骤。
tar zxvf gromacs-2024.2.tar.gz
cd gromacs-2024.2
mkdir build
cd build
cmake .. \
-DCMAKE_PREFIX_PATH=/opt/fftw3310 \
-DCMAKE_INSTALL_PREFIX=/opt/gromacs/ \
-DBUILD_SHARED_LIBS=OFF \
-DGMXAPI=OFF \
-DGMX_INSTALL_NBLIB_API=OFF \
-DGMX_GPU=CUDA \
-DGMX_USE_COLVARS=internal \
-DGMX_MPI=ON \
-DGMX_FFT_LIBRARY=fftw3 \
-DGMX_BLAS_USER=/opt/cp2k-2024.1/tools/toolchain/install/openblas-0.3.25/lib/libopenblas.so \
-DGMX_LAPACK_USER=/opt/cp2k-2024.1/tools/toolchain/install/openblas-0.3.25/lib/libopenblas.so \
-DGMX_CP2K=ON \
-DCP2K_DIR=/opt/cp2k-2024.1/lib/local/psmp \
-DGMX_DEFAULT_SUFFIX=OFF \
-DCP2K_LINKER_FLAGS="-L'/opt/cp2k-2024.1/tools/toolchain/install/elpa-2023.05.001/cpu/lib' -L'/opt/cp2k-2024.1/tools/toolchain/install/libxsmm-1.17/lib' -lstdc++ -lplumed -ldl -lz -lelpa_openmp -lscalapack -lxsmmf -lxsmm -lpthread -lxcf03 -lxc -lint2 -lfftw3_mpi -lfftw3 -lfftw3_omp -lopenblas -llibgrpp -Wl,--enable-new-dtags"
make -j 32
sudo make -j 32 install
source /opt/gromacs/bin/GMXRC
对 cmake 参数所做的修改可参见官方文档Installation guide - GROMACS 2024.2 documentation。-DGMX_BLAS_USER 和 -DGMX_LAPACK_USER 指向提供了 BLAS 和 LAPACK 的库,libopenblas 提供了这两者。
这里从我自己的需求出发,除 cp2k 外还带了如下特性:GPU加速(CUDA),MPI,单精度,colvars。不需要这些特性、需要双精度的话可以自行增减选项。
注意这里修改了-DCP2K_LINKER_FLAGS ,该参数对 CP2K-9.1 后的版本是可选的。我看到有部分教程提到可以将该参数忽略来避免后面 make 命令报错,但我实测这一方法并不能解决问题。根据测试,该参数的设定方法如下:
通过 LDFLAGS 参数指定所用的其他库,取决于你的 CP2K 安装了哪些组件,例如我安装了 elpa,libxsmm,这里就需要写明它们的 lib 路径;
通过 LIBS 参数指定 CP2K 的依赖组件的编译选项,例如我安装了 elpa,scalapack 等,就加上对应的选项“-lelpa_openmp -lscalapack”等。
LIBS 参数的具体名字可以在 arch 目录中,对应你的架构的 psmp 文件中查找(我的是 /opt/cp2k-2024.1/arch/Linux-gnu-x86_64.psmp)。
例如 elpa 对应的段落如下:
ifneq ($(USE_ELPA),)
USE_ELPA := $(strip $(USE_ELPA))
ELPA_INC := $(INSTALL_PATH)/elpa-$(USE_ELPA)/cpu/include/elpa_openmp-$(USE_ELPA)
ELPA_LIB := $(INSTALL_PATH)/elpa-$(USE_ELPA)/cpu/lib
CFLAGS += -I$(ELPA_INC)/elpa -I$(ELPA_INC)/modules
DFLAGS += -D__ELPA
ifeq ($(SHARED), yes)
LIBS += -Wl,-rpath=$(ELPA_LIB) -L$(ELPA_LIB) -lelpa_openmp
else
LIBS += $(ELPA_LIB)/libelpa_openmp.a
endif
endif
可见其参数是“-lelpa_openmp”。
而 scalapack 对应的是:
ifneq ($(USE_SCALAPACK),)
SCALAPACK_LIB := $(INSTALL_PATH)/scalapack-$(USE_SCALAPACK)/lib
ifeq ($(SHARED), yes)
LIBS += -Wl,-rpath=$(SCALAPACK_LIB) -L$(SCALAPACK_LIB) -lscalapack
else
LIBS += $(SCALAPACK_LIB)/libscalapack.a
endif
endif
则参数为“-lscalapack”。
测试
运行并测试是否正常编译。
> gmx
:-) GROMACS - gmx, 2024.2 (-:
Executable: /opt/gromacs/bin/gmx
Data prefix: /opt/gromacs
Working dir: /run/media/Programs/source
Command line:
gmx
...
其他
如果安装失败,不要气馁,增减 cmake 参数、修改交叉编译选项(-DCP2K_LINKER_FLAGS)并不断重复 cmake 和 make 行,多尝试几次。如果需要减少 CP2K 的某些依赖,注意保证 CP2K 的目录结构不要被破坏。
[关于 Gromacs 与 CP2K 联用的教程在这里]](https://docs.bioexcel.eu/2021-04-22-qmmm-gromacs-cp2k/)。不过这个比较老了,需要根据现行版本来修改对应命令和参数。