引言
通常QM/MM
MD都是用截断方案处理QM区域与MM环境间的静电相互作用,忽略掉长程部分对模拟结果(尤其是自由能)会有什么影响,相关工作还较少。一般来说,涉及显著电荷分布重排的反应,忽略长程QM-MM静电作用确实会引入一些误差。
较新的Amber24支持在xTB级别下进行考虑长程静电的QM/MM
MD模拟,但需要将xTB程序编译为动态库。正好我想测试QM/MM
PME对于自由能曲线的影响,且当时集群上并没有Amber24,遂努力编译。虽最后并没有正式在研究中采用xTB/MM-Ewald(也许xTB级别太次,或者QM/MM-Ewald尚未成为主流——当然cp2K是有的),这也算难得的经历,此文为编译过程的回顾整理。
编译成功的前提是一个干净的环境,需要把你的~/.bashrc清理的足够干净
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 if [ -f /etc/bashrc ]; then . /etc/bashrc fiexport PATH =/data/home/xxx/apps/binutils/bin:$PATHexport PATH =/data/home/xxx/softwire/cmake-3.18.2-Linux-x86_64/bin:$PATH__conda_setup ="$('/data/home/xxx/apps/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null) " if [ $? -eq 0 ]; then eval "$__conda_setup " else if [ -f "/data/home/xxx/apps/anaconda3/etc/profile.d/conda.sh" ]; then . "/data/home/xxx/apps/anaconda3/etc/profile.d/conda.sh" else export PATH ="/data/home/xxx/apps/anaconda3/bin:$PATH " fi fi unset __conda_setupexport PATH =/data/home/xxx/softwire/orca_6_0_1_linux_x86-64_shared_openmpi416_avx2:$PATHexport LD_LIBRARY_PATH =/data/home/xxx/softwire/orca_6_0_1_linux_x86-64_shared_openmpi416_avx2:$LD_LIBRARY_PATHexport PATH =/data/home/xxx/softwire/openmpi416/bin:$PATHexport LD_LIBRARY_PATH =/data/home/xxx/softwire/openmpi416/lib:$LD_LIBRARY_PATH
我最初是在一个环境相对干净的cpu集群上完成编译,后续在环境更复杂的集群上也成功
xtb库的编译与下载
xtb下载
1 2 git clone https://github.com/grimme-lab/xtb.gitcd xtb-main
准备
我新建了一个conda环境xtb_env,以便防止包冲突。加载环境:conda
activate xtb_env
加载编译器等
1 2 3 4 5 6 7 8 9 10 11 12 export LD_LIBRARY_PATH =/data/home/xxx/softwire/gcc8.3/lib64:/data/home/xxx/softwire/gmp/lib:/data/home/xxx/softwire/mpfr/lib:/data/home/xxx/softwire/mpc/lib:$LD_LIBRARY_PATHexport MANPATH =/data/home/xxx/softwire/gcc8.3/share/manexport PATH =/data/home/xxx/softwire/gcc8.3/bin:$PATHexport MKLROOT =/data/home/xxx/apps/intel/oneapi/mkl/2024.0export LD_LIBRARY_PATH =${MKLROOT} /lib/intel64:$LD_LIBRARY_PATHexport LIBRARY_PATH =${MKLROOT} /lib/intel64:$LIBRARY_PATHexport CPATH =${MKLROOT} /include:$CPATHexport PKG_CONFIG_PATH =${MKLROOT} /lib/pkgconfig:$PKG_CONFIG_PATHexport XTBHOME =/data/home/xxx/softwire/xtb-main/local2export FC =gfortran CC =gcc
### 构建
这部分花了很长时间,首先是xtb编译过程需要下载许多依赖的包,但集群网络不好.
解决方式是,在本地build一次,让subprojects下载对应的git仓库,然后scp传输
子项目会下载一些重复的包,导致冲突
1 cmake -B_build -S. -GNinja -DCMAKE_BUILD_TYPE =RelWithDebInfo -DBUILD_SHARED_LIBS =TRUE -DINSTALL_MODULES =TRUE -DCMAKE_EXE_LINKER_FLAGS ="-lm" -DCMAKE_INSTALL_PREFIX =${XTBHOME} -DWITH_TBLITE =OFF -DFETCHCONTENT_FULLY_DISCONNECTED =ON -DCMAKE_EXE_LINKER_FLAGS ="-L/data/home/xxx/softwire/xtb-main/subprojects/cpx/_build"
###########################################################
提示缺乏cpx.mod,要单独编译cpx模块:
1 2 3 4 5 6 7 8 9 10 11 12 13 ninja: Entering directory `_build' [773 /908] Building Fortran object CMakeFiles/ xtb- object.dir/src/ solv/ cpx.F90 .oFAILED : CMakeFiles /xtb-object.dir/ src/solv/ cpx.F90 .o include/ xtb_solv_cpx.mod /data/ home/xxx/ softwire/gcc8.3/ bin/gfortran -I../ src/solv -I. -I../ include - Iinclude - I ../ subprojects/mctc-lib/ include - Isubprojects /mctc-lib/ include - fdefault- real- 8 - fdefault- double- 8 - ffree- line- length- none - fbacktrace - O2 - g - DNDEBUG - Jinclude - fPIC - fopenmp - fpreprocessed - c CMakeFiles /xtb-object.dir/ src/solv/ cpx.F90 - pp.f90 - o CMakeFiles /xtb-object.dir/ src/solv/ cpx.F90 .o../ src/solv/ cpx.F90 :25 :8 : use cpx, only: calculation_type, parameter_type, atomicmass, density,& 1 Fatal Error : Can 't open module file ‘cpx.mod’ for reading at (1 ): No such file or directory compilation terminated. [784 /908] Building Fortran object CMakeFiles/ xtb- object.dir/src/ disp/ dftd4.F90 .o ninja: build stopped: subcommand failed.
构建问题的解决
1 2 3 4 5 cd subprojects/cpx cmake -B_build -DBUILD_SHARED_LIBS=TRUE -DINSTALL_MODULES=TRUE -DCMAKE_INSTALL_PREFIX=/data/home/xxx/softwire/xtb-main/cpx_install -DFETCHCONTENT_FULLY_DISCONNECTED=ON make -C_build make -C_build install
可能遇到一个版本检查问题
回到主目录
1 2 3 ninja -C _build cleancp /data/home/xxx/softwire/xtb-main/cpx_install/include/cpcmx/GNU-8.3.0/cpx.mod _build/includecp /data/home/xxx/softwire/xtb-main/subprojects/cpx/_build/libcpcmx.so* _build/
然后再运行一次xtb的 cmake
1 2 ninja -C _build ninja -C _build install
编译Amber24
新建一个conda环境conda activate amber_env
1 2 3 4 5 6 7 8 9 10 11 12 13 export LD_LIBRARY_PATH=/data/home/xxx/softwire/gcc8.3/lib64:/data/home/xxx/softwire/gmp/lib:/data/home/xxx/softwire/mpfr/lib:/data/home/xxx/softwire/mpc/lib:$LD_LIBRARY_PATH export MANPATH=/data/home/xxx/softwire/gcc8.3/share/manexport PATH=/data/home/xxx/softwire/gcc8.3/bin:$PATH export XTBHOME=/data/home/xxx/softwire/xtb-main/local2export FC=gfortran CC=gccexport MKLROOT=/data/home/xxx/apps/intel/oneapi/mkl/2024.0export LD_LIBRARY_PATH=${MKLROOT} /lib/intel64:$LD_LIBRARY_PATH export LIBRARY_PATH=${MKLROOT} /lib/intel64:$LIBRARY_PATH export CPATH=${MKLROOT} /include:$CPATH export PKG_CONFIG_PATH=${MKLROOT} /lib/pkgconfig:$PKG_CONFIG_PATH
直接用这样的环境,容易遇到Amber编译的常见问题:找不到Boost。编译Boost:
1 2 3 4 5 6 7 8 9 10 wget https://archives.boost.io/release/1.88.0/source/boost_1_88_0.tar.bz2cd boost ./bootstrap.sh --prefix=/data/home/xxx/softwire/boost --with-libraries=all --with-toolset=gcc 然后在project-config.jam添加一行 using mpi : /share/apps/openmpi/4.1.6/bin/mpicxx ; ./b2 -j8 --layout=tagged link =static,shared threading=multi install --with-program_options cxxflags="-std=c++11" --with-iostreams \ -sBZIP2_SOURCE=/data/home/xxx/apps/bzip \ -sBZIP2_BINARY=/data/home/xxx/apps/bzip/lib/libbz2.so
更新环境(bzip是以前装的)
1 2 3 4 5 6 7 8 9 export PATH=/data/home/xxx/apps/bzip/bin:$PATH export LD_LIBRARY_PATH=/data/home/xxx/apps/bzip/lib:$LD_LIBARAY_PATH export BZIP2_INCLUDE_DIR=/data/home/xxx/apps/bzip/includeexport BZIP2_LIBRARIES=/data/home/xxx/apps/bzip/libexport BOOST_ROOT=/data/home/xxx/softwire/boostexport BOOST_INCLUDE=$BOOST_ROOT /include:$BOOST_INCLUDE export BOOST_LIB=$BOOST_ROOT /lib:$BOOST_LIB export LD_LIBRARY_PATH=$BOOST_ROOT /lib:$LD_LIBRARY_PATH
进入amber的build目录 修改run_cmake
$AMBER_PREFIX/amber24_src \ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 cmake $AMBER_PREFIX/amber24_src \ -DCMAKE_INSTALL_PREFIX=$AMBER_PREFIX/amber24_install2 \ -DCOMPILER=GNU \ -DMPI=FALSE -DCUDA=FALSE -DINSTALL_TESTS=TRUE \ -DDOWNLOAD_MINICONDA=FALSE \ -DUSE_XTB=ON \ -DXTB_LIBRARY="${XTBHOME}/lib64/libxtb.so" \ -DXTB_INCLUDE_DIR="${XTBHOME}/include" \ -DBoost_NO_SYSTEM_PATHS=OFF \ -DBoost_USE_STATIC_LIBS=OFF \ -DBoost_DEBUG=ON \ -DBOOST_ROOT="/data/home/xxx/softwire/boost_1_69_0" \ -DFORCE_EXTERNAL_LIBS=boost \ -DCMAKE_EXE_LINKER_FLAGS="-lpthread" \ -DCMAKE_C_FLAGS="-pthread" \ -DCMAKE_CXX_FLAGS="-pthread" \ -DDISABLE_TOOLS="moft" \ -DBOOST_SUPPORTS_COMPRESSION=ON 2 >&1 | tee cmake.log
然后bash ./run_cmake && make install
make过程中可能报错
1 /data/home/xxx/apps/binutils/bin/ld: warning: libcpcmx.so.1, needed by /data/home/xxx/softwire/xtb-main/local2/lib64/libxtb.so, not found (try using -rpath or -rpath-link)
需手动复制库 cp /data/home/xxx/softwire/xtb-main/_build/libcpcmx.so*
/data/home/xxx/softwire/xtb-main/local2/lib64
另一个集群的编译过程
xtb编译
我直接在base环境安装
1 2 3 4 module load mkl/latest module load gcc/11.5.0export XTBHOME=/export/home/xxx/softwire/xtb-main/localexport FC=gfortran CC=gcc
同样有找不到cpx模块文件的问题
首先编译好cpx模块,然后将相应库/模块文件复制到到编译器能找到的地方
1 2 3 4 5 cp /export/home/xxx/softwire/xtb-main/subprojects/cpx/_build/libcpcmx.so* _build/cp /export/home/xxx/softwire/xtb-main/cpx_install/include/cpcmx/GNU-11.5.0/cpx.mod _build/include/export LIBRARY_PATH=/export/home/xxx/softwire/xtb-main/subprojects/cpx/_build:$LIBRARY_PATH export LD_LIBRARY_PATH=/export/home/xxx/softwire/xtb-main/subprojects/cpx/_build:$LD_LIBRARY_PATH
之后编译xtb
1 2 3 4 cmake -B_build -S. -GNinja -DCMAKE_BUILD_TYPE =RelWithDebInfo -DBUILD_SHARED_LIBS =TRUE -DINSTALL_MODULES =TRUE -DCMAKE_EXE_LINKER_FLAGS ="-lm" -DCMAKE_INSTALL_PREFIX =${XTBHOME} -DWITH_TBLITE =OFF -DFETCHCONTENT_FULLY_DISCONNECTED =ON -DCMAKE_EXE_LINKER_FLAGS ="-L/export/home/xxx/softwire/xtb-main/subprojects/cpx/_build -lm" ninja -C_build ninja install -C_build
Bzip安装
1 2 3 4 wget https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gzcd bzip2-1.0.8 make -f Makefile-libbz2_so make && make install PREFIX=/export/home/xxx/apps2/bzip
然而编译完之后,需要手动复制动态库到目标文件,并 ln -sf
libbz2.so.1.0.8 libbz2.so
Boost 1.69安装
1 2 3 4 5 6 7 8 9 10 11 12 export PATH=/export/home/xxx/apps2/bzip/bin:$PATH export LD_LIBRARY_PATH=/export/home/xxx/apps2/bzip/lib:$LD_LIBARAY_PATH export BZIP2_INCLUDE_DIR=/export/home/xxx/apps2/bzip/includeexport BZIP2_INCLUDE=/export/home/xxx/apps2/bzip/includeexport BZIP2_LIBRARIES=/export/home/xxx/apps2/bzip/libexport BZIP2_BINARY=/export/home/xxx/apps2/bzip/bin/bz2 wget https://archives.boost.io/release/1.69.0/source/boost_1_69_0.tar.bz2cd boost module load mpi/openmpi/4.1.6 ./bootstrap.sh --prefix=/export/home/xxx/softwire/boost --with-libraries=all --with-toolset=gcc
然后在project-config.jam添加一行 using mpi :
/export/home/xxx/apps3/openmpi416/bin/mpicxx ;
1 2 3 4 5 ./b2 install -j8 --layout=tagged link =static,shared threading=multi cxxflags="-std=c++11" \ -sBZIP2_INCLUDE=/export/home/xxx/apps2/bzip/include \ -sBZIP2_LIBPATH=/export/home/xxx/apps2/bzip/lib \ -sBZIP2_BINARY=bz2 \ --reconfigure
编译Amber24 with xtb
新建一个conda环境以免用里面的boost:conda create --name amber_env
python==3.12
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 module load mkl/latest module load gcc/11.5.0export XTBHOME=/export/home/xxx/softwire/xtb-main/localexport FC=gfortran CC=gccexport LIBRARY_PATH=/export/home/xxx/softwire/xtb-main/subprojects/cpx/_build:$LIBRARY_PATH export LD_LIBRARY_PATH=/export/home/xxx/softwire/xtb-main/subprojects/cpx/_build:$LD_LIBRARY_PATH export PATH=/export/home/xxx/apps2/bzip/bin:$PATH export LD_LIBRARY_PATH=/export/home/xxx/apps2/bzip/lib:$LD_LIBARAY_PATH export BZIP2_INCLUDE_DIR=/export/home/xxx/apps2/bzip/includeexport BZIP2_INCLUDE=/export/home/xxx/apps2/bzip/includeexport BZIP2_LIBRARIES=/export/home/xxx/apps2/bzip/libexport BZIP2_BINARY=/export/home/xxx/apps2/bzip/bin/bz2export BOOST_ROOT=/export/home/xxx/softwire/boostexport BOOST_INCLUDE=$BOOST_ROOT /include:$BOOST_INCLUDE export BOOST_LIB=$BOOST_ROOT /lib:$BOOST_LIB export CPLUS_INCLUDE_PATH=$BOOST_ROOT /include:$CPLUS_INCLUDE_PATH export LIBRARY_PATH=$BOOST_ROOT /lib:$LIBRARY_PATH export LD_LIBRARY_PATH=$BOOST_ROOT /lib:$LD_LIBRARY_PATH
为了防止潜在找不到库的问题,/export/home/xxx/softwire/xtb-main/subprojects/cpx/_build的libcpcmx.so.1复制到amber的lib中。
1 bash ./run_cmake && make install