前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Block-1.5的编译和安装

Block-1.5的编译和安装

作者头像
用户7592569
发布2023-03-08 19:28:24
3.7K0
发布2023-03-08 19:28:24
举报
文章被收录于专栏:量子化学量子化学

由于CASCI/CASSCF计算量随活性空间呈指数增长,超过(16,16)的计算在高配机器上几乎不可能。近似求解大活性空间的方法通常有DMRG, selected CI等等。Block-1.5是做DMRG计算的经典程序,由Sandeep Sharma和Garnet Chan开发,虽然早在5年前就不更新了,但其计算速度仍高于很多同类程序。Block-1.5一般结合PySCF使用,可以进行DMRG-CASCI,DMRG-CASSCF和DMRG-SC-NEVPT2等计算。笔者之前在公众号上将该程序的安装拆分为几篇短文

Boost.MPI的编译 安装基于openmpi的mpi4py Block-1.5的编译和安装

不便统筹阅读,加上以前的教程有些细微的格式问题,有必要整理和汇总一下安装步骤。

1. 编译boost.MPI

以boost.1.55.0为例,压缩包boost_1_55_0.tar.gz可以在官网

代码语言:javascript
复制
http://www.boost.org/users/history

下载到。注意block-1.5.3对boost版本较为敏感,笔者不推荐使用1.55.0外的版本。有些读者可能会发现自己机器上系统内置了(部分)boost库,但其一般无法用于编译Block。

为了编译出并行版的Boost库,需要事先安装任一种mpi,本文以openmpi-1.10.3为例(假设事先安装好)。假设压缩包放在$HOME/software/目录下,解压,进入目录,运行bootstrap.sh脚本并设置相关参数

代码语言:javascript
复制
tar -zxf boost_1_55_0.tar.gz
cd boost_1_55_0
./bootstrap.sh --prefix=`pwd` --with-libraries=all --with-toolset=intel-linux

这里通过--with-toolset来指定编译器,写intel-linux就是intel编译器,写gcc就是gcc编译器。该选择建议与当初编译openmpi的编译器保持一致pwd指安装在当前文件夹下,也可以更改至其他位置。打开project-config.jam文件,在第一行添加mpicxx的绝对路径

代码语言:javascript
复制
using mpi : /opt/openmpi-1.10.3/bin/mpicxx ;

注意最后有一个分号不能少。这一行内容对空格较敏感,建议读者复制后修改。如果不知道mpicxx路径,可通过命令which mpicxx查询。然后编译

代码语言:javascript
复制
./b2 -j16 --layout=tagged link=static,shared threading=multi install

可以通过加上-j16使用16个核并行编译,大概3分钟即可完成。在lib文件夹下可以看到生成libboost_mpi-mt.so等库文件。mt是multi-thread的意思;linux系统自带的boost库里通常没有这些并行库文件。假设boost放在$HOME/software/目录下,则需添加环境变量

代码语言:javascript
复制
export BOOST_ROOT=$HOME/software/boost_1_55_0
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

第一行的路径视自己的实际情况修改。source ~/.bashrc或退出重登以使环境变量生效。

2. 编译block-1.5.3

原网址

代码语言:javascript
复制
http://www.sunqm.net/pyscf/files/bin/block.spin_adapted-1.5.3.gz

在几年前已失效。现可到下列两个链接下载源码

代码语言:javascript
复制
https://github.com/pyscf/Block
https://github.com/sanshar/Block/files/10379436/block-1.5.3.tar.gz

笔者使用的压缩包为block-1.5.3.tar.gz。

2.1 编译并行版

解压,复制一份代码,这是因为在2.2节中可能还需编译串行版,此处复制一份以区分二者

代码语言:javascript
复制
tar -zxf block-1.5.3.tar.gz
cp -r block-1.5.3 block-1.5.3_mpi
cd block-1.5.3_mpi

打开Makefile文件,找到并修改如下几处

代码语言:javascript
复制
CXX = icpc
MPICXX = mpicxx
BOOSTINCLUDE = $(BOOST_ROOT)/include/
BOOSTLIB = -L$(BOOST_ROOT)/lib -lboost_system-mt -lboost_filesystem-mt -lboost_serialization-mt -lboost_mpi-mt

USE_MPI = yes
USE_MKL = yes
MKLLIB = /opt/intel/compilers_and_libraries/linux/mkl/lib/intel64/``
MKLFLAGS = /opt/intel/compilers_and_libraries/linux/mkl/include``

Makefile中找到如下这一行

代码语言:javascript
复制
LIBS +=  -L$(NEWMATLIB) -lnewmat $(BOOSTLIB) $(LAPACKBLAS) $(MALLOC)

在其末尾添加-lpthread -lrt,也即

代码语言:javascript
复制
LIBS +=  -L$(NEWMATLIB) -lnewmat $(BOOSTLIB) $(LAPACKBLAS) $(MALLOC) -lpthread -lrt

找到这三行内容

代码语言:javascript
复制
ifeq (icpc, $(CXX))
   ifeq ($(OPENMP), yes)
      OPENMP_FLAGS= -openmp

将其中-openmp改成-qopenmp,因为近几年Intel编译器不再支持-openmp,而是-qopenmp

找到这一行内容

代码语言:javascript
复制
     MPI_LIB = -lboost_mpi

将其注释,也即

代码语言:javascript
复制
#     MPI_LIB = -lboost_mpi

鉴于修改处较多,笔者建议读者在其他机器上安装时复制此修改好的Makefile,以免出错。终于可以开始编译,笔者使用了4核并行编译

代码语言:javascript
复制
make -j4

无需make install步骤。完成后可以运行

代码语言:javascript
复制
./block.spin_adapted -v

显示版本。笔者机子上显示的是

代码语言:javascript
复制
Runing with 1 processors
Block 1.5
Copyright (C) 2012  Garnet K.-L. Chan
This program comes with ABSOLUTELY NO WARRANTY; for details see license file.
This is free software, and you are welcome to redistribute it
under certain conditions; see license file for details.

2.2 编译串行版(可选)

若读者只想要DMRG-CASCI和DMRG-CASSCF计算、而不需要DMRG-NEVPT2计算,则用不到此串行版,可跳过此段落。进入block-1.5.3目录,打开Makefile文件,找到并修改如下几处

代码语言:javascript
复制
CXX = icpc
BOOSTINCLUDE = $(BOOST_ROOT)/include/
BOOSTLIB = -L$(BOOST_ROOT)/lib -lboost_system-mt -lboost_filesystem-mt -lboost_serialization-mt -lboost_mpi-mt

USE_MKL = yes
MKLLIB = /opt/intel/compilers_and_libraries/linux/mkl/lib/intel64/``
MKLFLAGS = /opt/intel/compilers_and_libraries/linux/mkl/include``

还有-lpthread -lrt-qopenmp两处修改,在2.1中已提到。同样执行make -j4编译。

3. 编译mpi4py(可选)

若读者只想要DMRG-CASCI和DMRG-CASSCF计算、而不需要DMRG-NEVPT2计算,则用不到mpi4py,可跳过此段落。到GitHub下载压缩包

代码语言:javascript
复制
https://github.com/mpi4py/mpi4py/releases

笔者下载的是mpi4py-3.0.0.tar.gz,解压,进入目录

代码语言:javascript
复制
tar -zxf mpi4py-3.0.0.tar.gz
cd mpi4py-3.0.0

打开配置文件mpi.cfg,修改其中的[openmpi]处信息为

代码语言:javascript
复制
[openmpi]
mpi_dir              = /opt/openmpi-1.10.3
mpicc                = %(mpi_dir)s/bin/mpicc
mpicxx               = %(mpi_dir)s/bin/mpicxx
#include_dirs         = %(mpi_dir)s/include
#libraries            = mpi
library_dirs         = /opt/intel/compilers_and_libraries/linux/lib/intel64
runtime_library_dirs = %(library_dirs)s

注意mpi4py依赖于openmpi,上文介绍过笔者电脑上装的openmpi位于/opt/openmpi-1.10.3,读者请按照自己机器实际情况修改路径。若openmpi是使用Intel OneAPI编译的,则应修改为

代码语言:javascript
复制
library_dirs         = /opt/intel/oneapi/compiler/latest/linux/compiler/lib/intel64

保存修改,执行

代码语言:javascript
复制
python setup.py build --mpi=openmpi

完成编译。接着选择安装位置,有3种选择:

(1)安装在自己的目录下

代码语言:javascript
复制
python setup.py install --user

这样会安装到~/.local/文件夹下,由于其位置特殊,不需要在~/.bashrc里增添mpi4py的环境变量,因为~/.local/下的文件会自动被识别。

(2)安装至其他指定路径 例如

代码语言:javascript
复制
python setup.py install --prefix=$HOME/software/mpi4py-3.0.0

此时需要自己在~/.bashrc文件里添加其环境变量

代码语言:javascript
复制
export PYTHONPATH=$HOME/software/mpi4py-3.0.0/lib/python3.7/site-packages:$PYTHONPATH

(3)安装在系统的anaconda文件夹里(如/opt/anaconda3,需要root权限)

代码语言:javascript
复制
python setup.py install --prefix=/opt/anaconda3

它其实是自动安装进/opt/anaconda3/lib/python3.7/site-packages/里去,与numpy和scipy同级的目录下。mpi4py在其目录下可以被自动识别,不需要再添加环境变量。测试是 否安装成功,启动python

代码语言:javascript
复制
from mpi4py import MPI

若无报错则安装成功。压缩包mpi4py-3.0.0.tar.gz和解压得到的文件夹mpi4py-3.0.0无用,均可删除。

4. 在PySCF中设定Block-1.5路径

若读者尚未安装PySCF,请见文末相关链接,自行安装。若读者安装的是PySCF-1.7.6,那就进入pyscf/pyscf/dmrgscf/目录;若安装的是PySCF-2.x和dmrgscf插件,那就进入dmrgscf/pyscf/dmrgscf/目录。注意目标目录可能随下载包来源的不同而不同,例如也有可能叫dmrgscf-master/pyscf/dmrgscf/。到目录中找到settings.py.example文件,复制一份

代码语言:javascript
复制
cp settings.py.example settings.py

打开settings.py文件,修改如下几处

代码语言:javascript
复制
BLOCKEXE = '/opt/block-1.5.3_mpi/block.spin_adapted'
BLOCKEXE_COMPRESS_NEVPT = '/opt/block-1.5.3/block.spin_adapted'
BLOCKSCRATCHDIR = os.path.join('/scratch/jxzou/pyscf', str(os.getpid()))

第一行需填写MPI版Block路径,第二行需填写串行版Block路径,第三行是临时文件路径,这些路径请读者根据本地情况修改。前已提过,若无需DMRG-NEVPT2计算,则无需编译串行版Block,自然也不用管BLOCKEXE_COMPRESS_NEVPT。为使程序读写临时文件更快,应写为大容量分区的目录或固态硬盘。

5. 测试

PySCF与Block-1.5联用的输入文件示例见dmrgscf/examples/目录。此处笔者展示一个MOKIT调用PySCF和Block-1.5自动做多参考态计算的例子,分子为

几何结构先用CAM-B3LYP/6-31G(d,p)级别优化一下。对于这种共轭分子,多组态/多参考态计算最常用的活性空间大小为全部

\pi

轨道,此处即(16,16),包含8个C-C

\pi

成键轨道和8个C-C

\pi

*反键轨道。使用MOKIT自动做计算的话,我们就不用自己去挑选轨道了,输入文件如下

代码语言:javascript
复制
%mem=160GB
%nprocshared=24
#p NEVPT2/cc-pVDZ

mokit{npair=8}

0 1
C        -4.24566100     0.70775600     0.00000200
C        -4.24566100    -0.70775600     0.00000100
C        -3.06469600    -1.39740500     0.00000000
C        -1.82221000    -0.71140300     0.00000000
C        -1.82221000     0.71140300     0.00000000
C        -3.06469600     1.39740500     0.00000100
C        -0.58525800    -1.39038300    -0.00000100
C         0.61987500    -0.72352400    -0.00000100
C         0.61987500     0.72352400    -0.00000100
C        -0.58525800     1.39038300    -0.00000100
C         1.88409800    -1.45948300     0.00000200
C         3.00192300    -0.72943000    -0.00000600
C         3.00192300     0.72943000    -0.00000900
C         1.88409800     1.45948300    -0.00000100
C         4.49498500    -0.67672300     0.00000200
C         4.49498500     0.67672300     0.00000700
H        -5.18939000     1.24342300     0.00000300
H        -5.18939000    -1.24342300     0.00000200
H        -3.06023600    -2.48359300     0.00000000
H        -3.06023600     2.48359300     0.00000000
H        -0.58866800    -2.47748700    -0.00000100
H        -0.58866800     2.47748700     0.00000000
H         1.86281500    -2.54477900     0.00000800
H         1.86281500     2.54477900     0.00000400
H         5.27714000    -1.42481000     0.00000600
H         5.27713900     1.42481000     0.00001600

这个任务在高配置节点上强行使用CASSCF(16,16)硬算亦可,但此处我们希望算NEVPT2,基于传统CASSCF无望,因此先将参考态改用DMRG-CASSCF(16,16),并基于此参考态进行DMRG-SC-NEVPT2计算,最大保留态maxM=1000(这些MOKIT都会自动处理)。提交任务

代码语言:javascript
复制
automr cyclobuta_b_anthracene.gjf >cyclobuta_b_anthracene.out 2>&1 &

使用24核计算耗时约3.5 h。可分别打开*_s.fch*_CASSCF_NO.fch文件检查GVB自然轨道或CASSCF自然轨道,均为

\pi

轨道(节约篇幅,此处未展示)。打开输出文件看能量结果为

代码语言:javascript
复制
E(CASSCF) =      -611.89824962 a.u.
Nevpt2 Energy = -1.891190771954538 a.u.

另一方面,我们可以使用Block2程序进行同样的计算,对比结果

代码语言:javascript
复制
E(CASSCF) =      -611.89824962 a.u.
Nevpt2 Energy = -1.891189523923513

DMRG-CASSCF能量高度一致,NEVPT2相关能相差1e-6 a.u.级别,可以接受,说明程序安装没问题。 离线安装PySCF-2.x-extensions

代码语言:javascript
复制
https://gitlab.com/jxzou/qcinstall/-/blob/main/%E7%A6%BB%E7%BA%BF%E5%AE%89%E8%A3%85PySCF-2.x-extensions.md

block2的编译和安装

代码语言:javascript
复制
https://gitlab.com/jxzou/qcinstall/-/blob/main/block2%E7%9A%84%E7%BC%96%E8%AF%91%E5%92%8C%E5%AE%89%E8%A3%85.md
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 量子化学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 编译boost.MPI
  • 2. 编译block-1.5.3
    • 2.1 编译并行版
      • 2.2 编译串行版(可选)
      • 3. 编译mpi4py(可选)
      • 4. 在PySCF中设定Block-1.5路径
      • 5. 测试
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档