史上最全 CP2K 7.1.0 安装教程

安装环境简介:
CPU:AMD
OS:CentOS 7
MPI:OpenMPI 4.0.4
GCC:10.2.0

真正从零开始安装(新机器,只安装了 OpenMPI 和 Gcc),理论上此方法适用于所有机器。OpenMPI 和 Gcc 这两个的安装并没有什么难度,唯一需要注意的就是在安装 OpenMPI 时需要开启一个选项,用于支持旧版本的语法,否则可能会出现一些语法错误,到时候只能通过修改源代码才能安装成功,非常麻烦。

下载 CP2K 7.1.0 源代码,并查看需要的依赖库

源代码在github 上,这里需要注意的点是你需要用 git 命令下载源代码

	$ git clone --recursive -b support/v7.1 https://github.com/cp2k/cp2k.git cp2k

如果你是在 github 页面右侧的 Releases 里面直接下载 .gz 压缩包,再开始编译的时候会提示你缺少一些文件。而根据提示,你需要使用 git 命令下载,这就导致了如果你原来不是使用 git 命令下载的话,压缩包解压之后的文件夹并不是一个 git 仓库,所以无法下载。

解决办法:从 git 仓库中把 .github 文件夹下下来放在你解压后的文件夹内(没有实验过,理论可行)

然后执行

    $ git submodule update --init --recursive

这样会自动下载子模块

在 cp2k/arch 文件夹中看看有没有你需要的配置文件,例如我需要的配置文件是 Linux-x86-64-gfortran.psmp

打开后可以在最上方看到这次安装所需要的其他包的信息,例如:

  • GFortran 7.4.0
  • MPICH 3.3
  • LAPACK 3.8.0
  • ScaLAPACK 2.0.2、
  • FFTW 3.3
  • Libint 2.6.0
  • Libxc 4.3.4
  • libxsmm 1.14
  • ELPA 2019.05.001
  • PLUMED 2.5.2
  • SPGLIB 1.12.2

接下来我们所需要做的就是把上面的所有包依次下,并安装(超级无敌巨多坑!!!),跟着文章一步一步来,可以避免 99% 的坑。

下面所有的下载和解压过程我都会忽略(特殊情况文中会说明),所有的压缩包解压后我都统一放在同一个目录,安装步骤略多且繁琐,需要一定的耐心和细心。

安装 lapack-3.8.0

	$ cd lapack-3.8.0/
	$ cp make.inc.example make.inc
	$ vim make.inc
	# 修改下面几处
	CC      = mpicc
	CFLAGS = -O3 -fPIC
	FORTRAN = mpifort
	OPTS    = -O2 -frecursive -fallow-argument-mismatch -fPIC
	NOOPT   = -O0 -frecursive -fallow-argument-mismatch -fPIC
	LOADER   = mpifort
	LOADOPTS = -fallow-argument-mismatch -fPIC
	# 最下方还有一处需要更改
	BLASLIB = ../../libblas.a

这里需要注意的是所有编译选项后面需要添加 -fPIC ,否则后面也是会提醒你重新编译,以及最后一处需要修改的地方,这里原来是 librefblas.a。后面其他软件编译需要 lapack库时使用的大多使用的是 -lblas ,不修改就会出现 usr/bin/ld: cannot find -lblas 错误。

	$ make -j 32

编译完成后可以看到 libblas.aliblapack.alibtmglib.a 三个库文件。

安装 scalapack-2.0.2

好像不编译该库也不会导致编译 CP2K 时出现什么错误,不过以防万一还是安装一下。

	$ vim SLmake.inc
	# 修改下面几处
	FC            = mpif90
	CC            = mpicc
	# 最下方还有一处需要更改
	LIBS          = -L../lapack-3.8.0/ $(LAPACKLIB) $(BLASLIB)	

这里最后一处修改就是添加上刚才安装的 lapack-3.8.0 的路径.

	$ make -j 32

编译完成后可以看到 libscalapack.a

安装 fftw-3.3.8

	$ cd fftw-3.3.8
	$ ./configure --prefix=./install --enable-threads --enable-avx512 --enable-avx2 --enable-avx --enable-sse2
	$ make -j 32
	$ make install

这里需要注意的是在 ./configure 时,一定要加上 –enable-threads 选项,否则后续会缺少 libfftw3_threads.la 库。

安装 libxc-4.3.4

这里我提供了一份 shell 脚本,直接执行即可

#!/bin/bash
###############################################################################
# Copyright (c) Intel Corporation - All rights reserved.                      #
# This file is part of the XCONFIGURE project.                                #
#                                                                             #
# For information on the license, see the LICENSE file.                       #
# Further information: https://github.com/hfp/xconfigure/                     #
# SPDX-License-Identifier: BSD-3-Clause                                       #
###############################################################################
# Hans Pabst (Intel Corp.)
###############################################################################

if [ "" = "$1" ]; then PRFX=gnu-; else PRFX=$1-; shift; fi
HERE=$(cd $(dirname $0); pwd -P)
DEST=${HERE}/../libxc/${PRFX}skx

if [ ! -e ${HERE}/configure.ac ] || [ "${HERE}" != "$(pwd -P)" ]; then
  echo "Error: XCONFIGURE scripts must be located and executed in the application folder!"
  exit 1
fi

if [ "${HERE}" = "${DEST}" ]; then
  echo "Warning: LIBXC source directory equals installation folder!"
  read -p "Are you sure? Y/N" -n 1 -r
  if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    exit 1
  fi
fi

CONFOPTS=""
TARGET="-mavx512f -mavx512cd -mavx512dq -mavx512bw -mavx512vl -mfma -L../lapack-3.8.0 -L../scalapack-2.0.2"

export FLAGS="-O3 ${TARGET}"
export LDFLAGS="-llapack -blas"
export CFLAGS="${FLAGS}"
export CXXFLAGS="${FLAGS}"
export FCFLAGS="${FLAGS}"
export LIBS=""

export AR="gcc-ar"
export FC="mpifort"
export CC="mpicc"
export CXX="mpicxx"

libtoolize
aclocal
autoheader
automake -a
autoconf

./configure \
  --prefix=./install \
  CC=mpicc CXX=mpicxx FC=mpifort \
  $*

这里需要注意的地方1. 修改编译器为 mpi 编译器,2. 需要加上之前安装的 lapack 和 scalapack。
这份脚本的源代码是在 https://github.com/hfp/xconfigure/raw/master/config 上,但是原脚本在编译 4.3.4 版本时会报错。

复制到 libxc-4.3.4 文件夹中并保存为 make.sh

	$ chmod +x make.sh
	$ ./make.sh
	$ make -j 32
	$ make install

安装 spglib-1.12.2

这里没有什么需要注意的。

	$ cd spglib-1.12.2
	$ mkdir _build
	$ cd _build
	$ cmake -DCMAKE_INSTALL_PREFIX="../install" ..
	$ make -j 32
	$ make install

安装 elpa-2019.05.001

这里也提供一份可以使用的脚本,用法参考 安装 libxc-4.3.4


export LDFLAGS="-fPIC -L../lapack-3.8.0 -L../scalapack-2.0.2"
export CFLAGS="-march=knl -fPIC -L../lapack-3.8.0 -L../scalapack-2.0.2"
export CXXFLAGS="-march=knl -fPIC -L../lapack-3.8.0 -L../scalapack-2.0.2"
export FCFLAGS="-march=knl -fPIC -fallow-argument-mismatch -L../lapack-3.8.0 -L../scalapack-2.0.2 -L/path/to/zlib/lib"
export LIBS="-llapack -lblas"

export AR="gcc-ar"
export FC="mpifort"
export CC="mpicc"
export CXX="mpicxx"

./configure 
	--enable-openmp \
	--enable-shared=no \
	--disable-sse --disable-sse-assembly \
	--disable-avx --disable-avx2 \
	--prefix=./install 

这里需要修改的有 编译器,安装路径,以及 LDFLAGS等编译选项,其中要注意的是由于这次安装的机器是 AMD 的 cpu ,需要 -march=knl 选项,否则会报错 : avx512 。。。。(具体错误不记得了)。

执行完该脚本后执行 make -j 32make install 即可

安装 gsl-2.6

这里没有什么需要注意的。

	$ cd spglib-1.12.2
	$ ./configure --prefix=./install CC=mpicc CXX=mpicxx FC=mpifort 
	$ make -j 32
	$ make install

安装 plumed2-2.5.5

这里只需要注意加上 lapack 、fftw 和 gsl 的路径即可。

	$ cd spglib-1.12.2
	$ ./configure --prefix=./install CXX=mpicxx CC=mpicc LDFLAGS="-L../lapack-3.8.0 -L../fftw-3.3.8/install/lib -L../gsl-2.6/install/lib" LIBS="-llapack -lblas -lfftw3" --enable-gsl
	$ make -j 32
	$ make install

安装 libxsmm-1.16

$ cd libxsmm-1.16
$ make INTRINSICS=1  SSE=2 AVX=2 ROW_MAJOR=0 INDICES_M="$(echo $(seq 1 24))" INDICES_N="$(echo $(seq 1 24))" INDICES_K="$(echo $(seq 1 24))"

这里特别需要注意的是INTRINSICS=1这个选项,因为这里使用的是高版本的 gcc ,具体说明在 libxsmm 官网上有说明。

如果你使用的是低版本的 gcc ,添加该选项可能会报错,删除该选项即可。

安装 boost-1_74_0

如果你的系统中有 boost ,且版本 >= 1.30 则不需要安装 boost。
boost 的安装过程与其他软件不太一样,但是没有什么特别需要注意的地方。

	$ cd boost_1_74_0/
	$ ./bootstrap.sh --with-libraries=all --with-toolset=gcc
	# 这时候会出现一个新的文件 b2
	$ ./b2 install --prefix=./install

安装 gmp-6.2.0

这里可能会有同学有疑问:为什么要安装 gmp ?我们在安装 gcc 时不是已经安装过了吗?

原因:系统中 gcc 是管理员编译好的,gmp 也已经安装好,但是在安装过程中并不支持 c++ 语法,导致我们在使用 mpicxx 编译程序时会报错。如果你的系统中 gmp/lib 中已经包含了 libgmpxx.so ,那么在这里就不需要再重新安装 gmp。

安装 gmp 的过程并不复杂。

	$ cd gmp-6.2.0
	$ ./configure --prefix=./install  --enable-cxx
	$ make -j 32
	$ make install

一定一定要加上 –enable-cxx 选项否则还是会出现上述的错误。

安装 libint-v2.6.0

这里是我踩坑最多的地方,请务必按照下面的步骤安装。

  1. 下载
    没想到在下载就开始翻车了,libint 在 github 上的官方版本并不适用于 cp2k-7.1.0 的安装,我们必须使用 cp2k 提供的特定的安装包来编译 https://github.com/cp2k/libint-cp2k/releases/tag/v2.6.0 。

    而据网友描述,官方提供的版本也会出现编译失败的情况,可能是我运气好,一次就编译通过了。

    我下载的版本是 libint-v2.6.0-cp2k-lmax-6.tgz ,官方提供的一共有四个版本,我随便选了一个就成功了,太感动了。

    在这里也不要下错成最下面的 Source Code,那里面只是 3 个无关的文件(我已经不想吐槽了)

  2. 编译
    走到这里就可以恭喜你了,后面基本上没有什么其他的问题,让我们继续吧!

	$ cd libint-v2.6.0-cp2k-lmax-6
	$ ./configure --prefix=./install  --enable-fortran CC=mpicc CXX=mpicxx CXXFLAGS="-O3 -I../gmp-6.2.0/install/include -L../gmp-6.2.0/install/lib -L/apps/software/zlib/1.2.11/gcc/10.2.0/lib" CFLAGS="-O3 -I../gmp-6.2.0/install/include -L../gmp-6.2.0/install/lib -L/apps/software/zlib/1.2.11/gcc/10.2.0/lib" --with-boost=../boost_1_74_0/install FC=mpifort FCFLAGS="-O3 -I../gmp-6.2.0/install/include -L../gmp-6.2.0/install/lib -L/apps/software/zlib/1.2.11/gcc/10.2.0/lib"
	$ make -j 32
	$ make install

这里使用的 zlib 是系统里自带的,如果你的系统中没有 zlib ,自行安装一个即可,十分简单。

安装 CP2K

终于终于,我们的主角登场了,安装过程其实很快也很简单,只是这里繁琐的步骤实在是让人望而却步。

首先我们修改所需要的配置文件 ,我这里使用的是 arch/Linux-x86-64-gfortran.psmp

CC          = mpicc
FC          = mpif90
LD          = mpif90
AR          = ar -r

include     /path/to/plumed2-2.5.5/install/lib/plumed/src/lib/Plumed.inc.static

ELPA_VER    = 2019.05.001
ELPA_INC    =  /path/to/elpa-2019.05.001/install/include/elpa_openmp-$(ELPA_VER)
ELPA_LIB    =  /path/to/elpa-2019.05.001/install/lib

FFTW_INC    =  /path/to/fftw-3.3.8/install/include
FFTW_LIB    =  /path/to/fftw-3.3.8/install/lib

LIBINT_INC  =  /path/to/libint-v2.6.0-cp2k-lmax-6/install/include
LIBINT_LIB  =  /path/to/libint-v2.6.0-cp2k-lmax-6/install/lib

LIBXC_INC   =  /path/to/libxc-4.3.4/install/include
LIBXC_LIB   =  /path/to/libxc-4.3.4/install/lib

LIBXSMM_INC =  /path/to/libxsmm-1.16/include
LIBXSMM_LIB =  /path/to/libxsmm-1.16/lib

SPGLIB_INC  =  /path/to/spglib-1.12.2/install/include
SPGLIB_LIB  =  /path/to/spglib-1.12.2/install/lib

# 下面这些是原来没有的,请自行添加

LAPACK_LIB  =  /path/to/lapack-3.8.0
SCALA_LIB   =  /path/to/scalapack-2.0.2
GSLBLAS_LIB =  /path/to/gsl-2.6/install/lib
GSLBLAS_INC =  /path/to/gsl-2.6/install/include
ZLIB_LIB    =  /path/to/zlib-1.2.11/lib
PLUMED_LIB  =  /path/to/plumed2-2.5.5/install/lib
PLUMED_INC  =  /path/to/plumed2-2.5.5/install/include


CFLAGS      = -O2 -g -mtune=native

DFLAGS      = -D__ELPA -D__FFTW3 -D__LIBINT -D__LIBXC -D__LIBXSMM
DFLAGS     += -D__MPI_VERSION=3 -D__PLUMED2 -D__SPGLIB
DFLAGS     += -D__parallel -D__SCALAPACK

FCFLAGS     = $(CFLAGS) $(DFLAGS)
FCFLAGS    += -ffree-form -ffree-line-length-none
FCFLAGS    += -fopenmp -fallow-argument-mismatch
FCFLAGS    += -ftree-vectorize -funroll-loops -std=f2008
FCFLAGS    += -I$(ELPA_INC)/elpa -I$(ELPA_INC)/modules
FCFLAGS    += -I$(FFTW_INC) -I$(LIBINT_INC) -I$(LIBXC_INC) -I$(LIBXSMM_INC) -I$(GSLBLAS_INC) -I$(PLUMED_INC) -I$(SPGLIB_INC)

LDFLAGS     = $(FCFLAGS) -static-libgfortran

LIBS        = -L$(PLUMED_LIB) -L$(GSLBLAS_LIB) -L$(ZLIB_LIB) -lgsl -lgslcblas -lz -L$(LIBXSMM_LIB) -L$(FFTW_LIB)
LIBS       += $(ELPA_LIB)/libelpa_openmp.a
LIBS       += $(LIBXC_LIB)/libxcf03.a
LIBS       += $(LIBXC_LIB)/libxc.a
LIBS       += $(LIBINT_LIB)/libint2.a
LIBS       += $(SPGLIB_LIB)/libsymspg.a
LIBS       += $(LIBXSMM_LIB)/libxsmmf.a
LIBS       += $(LIBXSMM_LIB)/libxsmm.a
LIBS       += $(FFTW_LIB)/libfftw3.a
LIBS       += $(FFTW_LIB)/libfftw3_threads.a
LIBS       += $(SCALA_LIB)/libscalapack.a
LIBS       += $(LAPACK_LIB)/liblapack.a
LIBS       += $(LAPACK_LIB)/libblas.a
LIBS       += -ldl -lpthread -lstdc++

上面的配置文件只需要把 /path/to 改为你自己的地址即可

 	$ make ARCH=Linux-x86-64-gfortran VERSION=psmp -j 32

可能会提示你执行一条 git 命令,直接执行下载即可。如果机器不能联网,在有网的环境中执行完成后重新上传即可。

接下来你只需要静静地等待安装完成即可。

安装完成后,在 exe/Linux-x86-64-gfortran 文件夹下可以看到可执行文件 cp2k.psmp

至此,安装全部结束

使用

上述所有安装的 依赖库/lib 文件夹需要添加到 LD_LIBRARY_PATH,依赖库/bin 添加到 PATH

泪目,撒花 QAQ

下面是技术总结

以下错误出现的位置我现在记不清楚,不过解决办法依然可以使用。

  1. missing ‘(’ before “__has_include” operand
    找到出现该错误的文件,调整其中的 if 语句,主要是把其中含有 __has_include 的语句注释,但是还需要保持判断结果准确。

  2. can not find libint_f.mod
    这个错误的原因就是你使用的是官方提供的 libint ,解决办法是参考文章中 安装 libint 一节重新安装。

  3. 对 ‘dfftw_plan_with_nthreads_’ 未定义的引用
    该错误的原因是在安装 fftw 时没有添加 –enable-threads ,解决办法是重新安装 fftw

  4. 编译完成后运行时出错:Error in `cp2k-7.1/exe/Linux-x86-64-gfortran/cp2k.psmp’: munmap_chunk(): invalid pointer: 0x000000000e9d1800
    这个错误是在编译 elpa 库是没有添加 –enable-openmp 选项,前几天(2020.09.27)我被这个错误搞得晕头转向,不知道是哪里的原因。我在编译 elpa 库时没有添加该选项,然后又将 arch/Linux-x86-64-gfortran.psmp 配置文件中的 libelpa_openmp.a 修改为 libelpa.a ,编译倒是通过了,就是运行不起来。查找了两天才找到这个错误原因,太蛋疼了

转载请注明出处,谢谢。

猜你喜欢

转载自blog.csdn.net/qq_32115939/article/details/108751525
今日推荐