支持QM/MM-Ewald的Amber24编译

引言

通常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
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions
export PATH=/data/home/xxx/apps/binutils/bin:$PATH
export PATH=/data/home/xxx/softwire/cmake-3.18.2-Linux-x86_64/bin:$PATH
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__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_setup
# <<< conda initialize <<<
export PATH=/data/home/xxx/softwire/orca_6_0_1_linux_x86-64_shared_openmpi416_avx2:$PATH
export LD_LIBRARY_PATH=/data/home/xxx/softwire/orca_6_0_1_linux_x86-64_shared_openmpi416_avx2:$LD_LIBRARY_PATH
export PATH=/data/home/xxx/softwire/openmpi416/bin:$PATH
export 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.git
cd 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_PATH
export MANPATH=/data/home/xxx/softwire/gcc8.3/share/man
export PATH=/data/home/xxx/softwire/gcc8.3/bin:$PATH

export MKLROOT=/data/home/xxx/apps/intel/oneapi/mkl/2024.0
export 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

export XTBHOME=/data/home/xxx/softwire/xtb-main/local2
export 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.o
FAILED: 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 clean
cp /data/home/xxx/softwire/xtb-main/cpx_install/include/cpcmx/GNU-8.3.0/cpx.mod _build/include
cp /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/man
export PATH=/data/home/xxx/softwire/gcc8.3/bin:$PATH

export XTBHOME=/data/home/xxx/softwire/xtb-main/local2
export FC=gfortran CC=gcc

export MKLROOT=/data/home/xxx/apps/intel/oneapi/mkl/2024.0
export 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.bz2
cd 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/include
export BZIP2_LIBRARIES=/data/home/xxx/apps/bzip/lib

export BOOST_ROOT=/data/home/xxx/softwire/boost
export 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.0
export XTBHOME=/export/home/xxx/softwire/xtb-main/local
export 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.gz
cd 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/include
export BZIP2_INCLUDE=/export/home/xxx/apps2/bzip/include
export BZIP2_LIBRARIES=/export/home/xxx/apps2/bzip/lib
export BZIP2_BINARY=/export/home/xxx/apps2/bzip/bin/bz2

wget https://archives.boost.io/release/1.69.0/source/boost_1_69_0.tar.bz2
cd 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.0
export XTBHOME=/export/home/xxx/softwire/xtb-main/local
export FC=gfortran CC=gcc

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


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/include
export BZIP2_INCLUDE=/export/home/xxx/apps2/bzip/include
export BZIP2_LIBRARIES=/export/home/xxx/apps2/bzip/lib
export BZIP2_BINARY=/export/home/xxx/apps2/bzip/bin/bz2


export BOOST_ROOT=/export/home/xxx/softwire/boost
export 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

支持QM/MM-Ewald的Amber24编译
http://example.com/2026/06/22/支持QMMM-Ewald的Amber24编译/
Author
Graminilune
Posted on
June 22, 2026
Licensed under