Block-1.5的编译和安装
本公众号之前已经发过《离线安装PySCF程序》、《安装基于openmpi的mpi4py》和《Boost.MPI的编译》等文,详情可通过公众号中的“文章分类“查看。结合本文共4篇,即可实现大活性空间DMRG-NEVPT2的计算。简单讲,PySCF的存在使得用户不需要学会Block程序的使用方法及其输入文件写法,即可直接调用Block做DMRG计算,只需要会用PySCF即可(而这相对简单许多)。本文以Block-1.5.3为例介绍Block程序的安装,PySCF 1.4.7,openmpi-1.10.3和boost.1.55.0等软件已事先安装好。
Step1. 下载Block源代码https://github.com/sanshar/Block
解压tar -zxvf block-1.5.3.tar.gz
cp -r block-1.5.3 block-1.5.3_mpi
之所以复制一份,是接下来我们要分别编译一份串行版本和一份mpi并行版本。做计算时两种都常用到。
Step2. 编译串行版
打开Makefile,修改如下几处
CXX = icpc
BOOSTINCLUDE = /opt/boost_1_55_0/include/
BOOSTLIB = -L/opt/boost_1_55_0/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``
(注意上述两行最后是两个单反引号,按键位于键盘Tab键上方,不是引号或双引号)
在LIBS += -L$(NEWMATLIB) -lnewmat $(BOOSTLIB) $(LAPACKBLAS) $(MALLOC)这一行最后加上-lpthread -lrt。
OPENMP_FLAGS= -qopenmp
修改这一处是因为近几年的intel编译器不再支持-openmp这一参数,而是-qopenmp。
然后直接执行make即可。完成后可以运行./block.spin_adapted -v显示版本。实际安装时,各种软件和库的路径需按照自己机器上的具体情况修改。
Step3. 编译并行版
打开Makefile,修改如下几处
CXX = icpc
MPICXX = mpicxx
USE_MPI = yes
boost库和mkl库路径的修改与Step 2中的一致,-lpthread -lrt加的位置也是一样的,这里不再重复。
然后找到下方MPI_LIB = -lboost_mpi一行,将其注释,因为我们在上述boost库路径中写了-lboost_mpi-mt。
完成后同样可以运行./block.spin_adapted -v显示版本。
Step4. 在PySCF程序中写好环境变量
进入pyscf/pyscf/dmrgscf/目录,复制一份配置文件,并重命名
cp settings.py.example settings.py
打开settings.py文件,修改
BLOCKEXE = '/opt/block-1.5.3_mpi/block.spin_adapted'
BLOCKEXE_COMPRESS_NEVPT = '/opt/block-1.5.3/block.spin_adapted'
MPIPREFIX = 'mpirun'
BLOCKVERSION = '1.5.3'
其中BLOCKEXE为并行版Block可执行文件所在处,BLOCKEXE_COMPRESS_NEVPT为串行版可执行文件所在处,二者不能搞错。中间的临时文件路径BLOCKSCRATCHDIR根据自己需要修改。串行版本的Block不代表在计算DMRG-NEVPT2时真的只用单核计算,而是会调用mpi4py模块里的MPI来实现并行。
Step5. 运行简单算例
把下述内容写进一个a.py文件中,
import os
from pyscf import gto, scf, mcscf, dmrgscf, mrpt
dmrgscf.settings.MPIPREFIX = 'mpirun -n 3'
os.system('date')
mol =gto.M(atom='C 0 0 0; C 0 0 1', basis='631g', verbose=5)
mf = scf.RHF(mol).run()
mc = dmrgscf.DMRGSCF(mf, 4, 4)
mc.kernel()
mrpt.NEVPT(mc).compress_approx().kernel()
os.system('date')
然后执行python a.py >& a.out &
需要大约8分钟,最后的DMRGSCF能量为-75.3374493,Nevpt2 Energy为-0.1047427,如果小数点后前5位不一致,很可能是安装有问题。注意,该例子计算量太小,用DMRGSCF(4,4)计算是不如直接用CASSCF(4,4)算快的。当活性空间大很多时DMRG的优势就会体现出来。
更多参考信息:
http://sunqm.github.io/Block/build.html
上述网址还提供预编译的Block程序,如果与自己机子上intel和mpi等软件的条件相符,可直接使用。
https://github.com/sanshar/Block
上述网址中还交待了如何引用Block程序、新版与旧版有何区别等。