在 Docker 容器手动编译支持第 4,5 阶泛函导数的 PySCF。
Install PySCF with the forth and the fifth order derivatives of xc (exchange-correlation) functionals using docker containers without network.

Docker 容器准备

关于 Linux 系统下 Docker 的下载和安装,本文不做介绍,仅在下文介绍简单的使用命令,同时介绍 docker 拉取 Ubuntu 22.04 后的基本配置。

Docker 基本使用命令

  1. docker images : 查看当前 user 已经拉取的镜像 (images),如下图
    p1

  2. docker ps -a : 查看当前 user 已经创建的 docker containers,如下图
    p2

  3. docker run -it -d –name {xxx} ubuntu:22.04 /bin/bash : 基于 image ubuntu:22.04 新建名为 “xxx” 的 container,xxx 可以给定,如不设定,则随机生成一个名字,本文档将容器命名为 “pyscf_wdoxc_45”,如下图
    p3

    此时查看已经建立的容器,就可以找到新容器 (pyscf_wdoxc_45),其 ID 号为 79233806c48,之后可以通过容器名称或者此 ID 号来指定容器。

p4

  1. docker attach xxx : 连接并进入容器
    p5

  2. exit : 退出当前容器。
    (*关于 docker 的基本使用命令,还有很多,需要读者自行学习,本文档后续不会涉及)

Ubuntu 基本配置

  1. apt-get update : 更新可用软件包信息
    p6

  2. apt-get install vim : 下载文本编辑器 vim
    p7

  3. cd /etc/apt
    cp sources.list sources.list.bak : 备份源准备换源
    p8

  4. vim sources.list -> 按 “i” 进入 Insert 模式 -> 复制国内源 -> 按 “ESC” 退出编辑模式 -> 按 “shift+;” 并输入 wq 保存源文件
    本文使用的国内源:
    deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
    deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
    deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
    deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
    换源前
    p9
    换源后
    p10

  5. apt-get update : 更新可用软件包信息
    p11

  6. apt-get install : 下载基于 PyPI 平台的软件包下载工具 pip
    p12

编译 PySCF(v2.5.0)

首先看一下 install PySCF 的官方介绍,在此我们主要获取三个信息:
a. install PySCF 需要的第三方 tools
p13
b. 无网络激活 (手动激活) PySCF 需要的 libcint 积分库,libxc 和 xcfun 泛函库下载及编译
p14
c. 无网络激活 (手动激活) PySCF 的下载及编译
p15

install PySCF 需要的第三方 tools

上述 a 中展示了需要的 7 个 tools,可以现在 install,或者在之后 install PySCF 的环节中以及使用 PySCF 的环节中,陆续激活,激活方式可以选择 pip install 或者 apt-get install

笔者先在此激活了 numpy, scipy,同时我们可以定位到这些包的安装位置,后续我们也将在该目录 (文件夹) 下激活 PySCF
p16
p17
后来,在编译过程中笔者陆续激活了 cmake, blas, h5py 软件包,建议读者在此全部激活
pa1
pa2
pa3

libcint 积分库,libxc 和 xcfun 泛函库下载及编译

根据官网提示,明确了需要下载以下三个 packages,分别为 libcint 积分库,libxc 和 xcfun 泛函库。

  1. cd /usr/local/lib/python3.10/dist-packages
    mkdir opt
    cd opt : 建立并切换至编译上述三包的 opt 目录
    p18

  2. apt-get install git
    apt-get install wget : 准备从远程仓库下载 packages 的 git 和 wget 工具
    p19
    p20

  3. 依照官网命令 (install PySCF 的 Installation without network 介绍第 1 代码块部分) 下载包:
    其中对于 libcint 和 libxc 直接按照命令下载即可
    git clone https://github.com/sunqm/libcint.git
    wget https://gitlab.com/libxc/libxc/-/archive/6.0.0/libxc-6.0.0.tar.gz
    !!!格外注意 xcfun 的下载 !!!因为 xcfun 不支持高阶 (>3) 的泛函导数的使用,因此孙启明博士在 github 上 fork 了 xcfun 仓库并建立了新分支 cmake-3.5,于上开发使 xcfun 具备了调用交换关联泛函导数至 5 阶的能力,下载命令为
    git clone -b cmake-3.5 https://github.com/sunqm/xcfun.git
    在 PySCF 2.5.0 版本,已经将 4,5 阶泛函导数推上去了
    git clone https://github.com/libdfts/xcfun.git
    p21

  4. libcint 积分库解压缩及编译 : 按照官网命令(install PySCF 的 Installation without network 介绍第 2 代码块部分)编译,前三条命令直接按顺序执行,第 4 条 cmake 命令需要修改为
    cmake -DWITH_F12=1 -DWITH_RANGE_COULOMB=1 -DWITH_COULOMB_ERF=1
    -DCMAKE_INSTALL_PREFIX:PATH=/usr/local/lib/python3.10/dist-packages/opt -DCMAKE_INSTALL_LIBDIR:PATH=lib ..
    【核心修改点】 : “-DCMAKE_INSTALL_PREFIX:PATH=/opt” 改为 “-DCMAKE_INSTALL_PREFIX:PATH=/usr/local/lib/python3.10/dist-packages/opt”,指定动态链接的编译位置为此小节步骤 1 中建立的 /opt 目录;
    之后执行第 5 条命令即可,对于第 5 条命令,可尝试 “make -j30 && make install”, 通过 -j30 指定多 (30) 核并行编译,即使不使用速度也还行
    p22

  5. libxc 泛函库解压缩及编译 : cmake 命令 (第 4 条命令) 之前相同,第 4 条命令修改为
    cmake -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_SHARED_LIBS=1
    -DENABLE_FORTRAN=0 -DDISABLE_KXC=0 -DDISABLE_LXC=0
    -DCMAKE_INSTALL_PREFIX:PATH=/usr/local/lib/python3.10/dist-packages/opt -DCMAKE_INSTALL_LIBDIR:PATH=lib ..
    【核心修改点-1】 : “-DDISABLE_LXC=1” 改为 “-DDISABLE_LXC=0”,放开 libxc 的第四阶导数 (libxc 最高支持第 4 阶)
    【核心修改点-2】 : “-DCMAKE_INSTALL_PREFIX:PATH=/opt” 改为 “-DCMAKE_INSTALL_PREFIX:PATH=/usr/local/lib/python3.10/dist-packages/opt”,指定动态链接的编译位置为此小节步骤 1 中建立的 /opt 目录;
    之后执行第 5 条命令即可,对于第 5 条命令,可尝试 “make -j30 && make install”, 通过 -j30 指定多 (30) 核并行编译
    p23
    (Note : 可能是由于新增编译第 4 阶导数,编译过程有时会很慢,依照笔者经验,如果不 make -j30, 第 5 条命令执行完成需要 1-5h 均属正常现象;
    即使中断,可重复执行第 5 条命令于中断处继续编译)

  6. xcfun 泛函库解压缩及编译 : cmake 命令 (第 4 条命令)之前相同,第 4 条命令修改为
    cmake -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_SHARED_LIBS=1 -DXCFUN_MAX_ORDER=5 -DXCFUN_ENABLE_TESTS=0
    -DCMAKE_INSTALL_PREFIX:PATH=/usr/local/lib/python3.10/dist-packages/opt -DCMAKE_INSTALL_LIBDIR:PATH=lib ..
    【核心修改点-1】 : “-DXCFUN_MAX_ORDER=3” 改为 “-DXCFUN_MAX_ORDER=5”,放开 xcfun 的导数至第 5 阶 (xcfun 支持任意阶)
    【核心修改点-2】 : “-DCMAKE_INSTALL_PREFIX:PATH=/opt” 改为 “-DCMAKE_INSTALL_PREFIX:PATH=/usr/local/lib/python3.10/dist-packages/opt”,指定动态链接的编译位置为此小节步骤 1 中建立的 /opt 目录;
    之后执行第 5 条命令即可,同样可采用 -j 参数加速编译过程
    p24

PySCF 下载及编译

  1. cd /usr/local/lib/python3.10/dist-packages : 切换至后续执行命令所在目录 /usr/local/lib/python3.10/dist-packages

  2. 依照官网命令 (install PySCF 的 Build from source 第 1 代码块部分) git clone PySCF
    p25

  3. 依照官网命令 (install PySCF 的 Installation without network 介绍第 3 代码块部分) 编译 PySCF,cmake 命令 (第 3 条命令) 之前相同,在执行 cmake 之前,需要返回上级目录 /usr/local/lib/python3.10/dist-packages/pyscf/pyscf/lib,修改 CMakeLists.txt 文件,
    【核心修改点】 : 添加语句 “set(XCFUN_MAX_ORDER 5)\n if(NOT XCFUN_MAX_ORDER)\n set(XCFUN_MAX_ORDER 3)”,并修改另一处,如下图
    p26
    p30
    之后切换回 /usr/local/lib/python3.10/dist-packages/pyscf/pyscf/lib/build 目录,执行后续也需要修改的 cmake 命令
    cmake -DBUILD_LIBCINT=0 -DBUILD_LIBXC=0 -DBUILD_XCFUN=0 -DCMAKE_INSTALL_PREFIX:PATH=/usr/local/lib/python3.10/dist-packages/opt ..
    【核心修改点】”cmake -DBUILD_LIBCINT=0 -DBUILD_LIBXC=0 -DBUILD_XCFUN=0 -DCMAKE_INSTALL_PREFIX:PATH=/opt ..” 改为 “cmake -DBUILD_LIBCINT=0 -DBUILD_LIBXC=0 -DBUILD_XCFUN=0 -DCMAKE_INSTALL_PREFIX:PATH=/usr/local/lib/python3.10/dist-packages/opt ..”
    以及 make 命令

  4. 最后加入 PySCF 的环境变量,具体执行命令如下
    vim ~/.bashrc 后按 “i” 进入 Insert 模式
    加入环境变量语句:
    export PYTHONPATH=/usr/local/lib/python3.10/dist-packages/pyscf:\$PYTHONPATH
    export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/local/lib/python3.10/dist-packages/opt/lib
    保存并退出 vim : ESC + : + wq
    p27

PySCF 调用 4,5 阶泛函导数测试

由于测试涉及十分专业的知识,测试通过与否暂时由笔者判断

测试1-调用 libxc 的第 4 阶泛函导数

p28

测试2-调用 xcfun 的第 4,5 阶泛函导数

p29

写在最后,编译 PySCF 与是否使用 Docker 容器是解耦合的两件事情,使用 Docker 的原因是

  1. 对于不同版本的软件,可以在各自的环境中开发、测试,互不影响,所以 Docker 是开发、测试友好的
  2. docker 可以制作镜像,方便其他人直接拉取一套你关注软件所在的相同环境,直接使用你的环境或者重复你遇到的问题并尝试解决
  3. 你也可以拉取别人做好的镜像,省去像本文档这样从头配 Ubuntu 所需的时间和步骤

欢迎各位反馈文档中的错误和可改进的地方,以邮件的方式最好。