量子化学程序OpenMolcas的简易安装

2021-08-10 16:09:48 浏览数 (1)

本公众号之前发过《离线编译OpenMolcas QCMaquis》一文,成功安装后可进行DMRG-NEVPT2和DMRG-PDFT计算。但其中需要编译QCMaquis、 HDF5、GSL和Boost库,过程颇为繁琐。笔者发现有的小伙伴不需要做DMRG计算,只想用OpenMolcas中最核心、最特色的功能——CASSCF、CASPT2、ic-MRCISD和MC-PDFT方法,则安装过程可以大大简化。

本文就介绍一下如何在尽可能少的库依赖下安装OpenMolcas,无需QCMaquis、HDF5、GSL和Boost库,也无需安装OpenMPI和Global Array。安装完后是利用MKL的OpenMP并行版OpenMolcas,适用于节点内并行,很多时候就够用了。有的课题组会花钱去买收费的MOLCAS,由于开源免费的OpenMolcas涵盖了MOLCAS的绝大多数(尤其是特色)功能,现如今完全没有必要浪费个人钱财或经费去买MOLCAS,甚至机器上旧的MOLCAS也没什么用处。

安装前提:我们仍需一些必要的编译器和库:

cmake >= 3.12,Intel编译器(含MKL),python

笔者机子上安装的分别是cmake 3.19、Intel 2019 update5和Anaconda Python3。尽管可以使用GNU编译器替代Intel,但笔者的个人使用经验表明用Intel编译器快不少。若读者未装Intel编译器,可以参看《Linux下安装Intel oneAPI》一文。

1. 下载

到OpenMolcas的GitLab主页(https://gitlab.com/Molcas/OpenMolcas)上点击Releases

下载最新稳定版,笔者撰文时是v21.06

笔者下载的是OpenMolcas-v21.06.tar.gz。

2. 编译

在编译前需先在~/.bashrc中写上OpenMolcas环境变量

代码语言:javascript复制
# OpenMolcas
export MOLCAS_WORKDIR=/scratch/$USER/molcas
export MOLCAS_MEM=32Gb
export MOLCAS=/home/$USER/software/OpenMolcas-v21.06
export PATH=$MOLCAS/bin:$PATH
export MOLCAS_PRINT=3
export MOLCAS_NPROCS=1
export OMP_NUM_THREADS=16

完成后记得执行source ~/.bashrc或退出重登。各种路径可以根据读者自己机子的实际情况进行修改。若/scratch/$USER/molcas目录不存在则需手动创建。无论计算任务正常/异常结束,该目录都会有临时文件存在,每隔一段时间应进行清理。若一个任务算完后在相同位置再次提交,OpenMolcas默认去寻找上次的临时文件,好处是可以加速计算,坏处是万一不想要临时文件里的轨道作为初猜,就可能把自己坑了。若想每次计算完自动清空临时文件,可以再加上环境变量

代码语言:javascript复制
export MOLCAS_KEEP_WORKDIR=NO

变量MOLCAS_PRINT=3可以让输出内容更多一些,偶尔有小伙伴向笔者反映他们的输出内容比我少,往往就是这个参数造成的。变量MOLCAS_NPROCS用于MPI并行,但本文编译的是MKL并行版,不支持MPI并行,因此设为1。笔者的节点上有16核,因此OMP并行核数设置为16。这些环境变量仅是笔者的个人推荐,并非适用于任何机器,详细的环境变量说明请阅读OpenMolcas手册

代码语言:javascript复制
https://molcas.gitlab.io/OpenMolcas/Manual.pdf

进入存放压缩包的目录,解压,编译

代码语言:javascript复制
cd /home/$USER/software
tar -zxf OpenMolcas-v21.06.tar.gz
cd OpenMolcas-v21.06
mkdir bin build
cd build
CC=icc CXX=icpc FC=ifort cmake -DLINALG=MKL -DOPENMP=ON 
-DCMAKE_INSTALL_PREFIX=/home/$USER/software/OpenMolcas-v21.06 ../
make -j16
make install

笔者的习惯是将软件放在/home/$USER/software/目录下,读者也可以放到其他目录下。16核编译仅需1-2 min。正常结束后执行

代码语言:javascript复制
cd ..
mv pymolcas bin/

即将主程序pymolcas移入我们新建的bin目录里。

3. 测试

执行

代码语言:javascript复制
pymolcas --version

屏幕应当显示

代码语言:javascript复制
python driver version = py2.18
(after the original perl EMIL interpreter of Valera Veryazov)

接着测试程序自带标准示例。最好切换到其他目录进行测试

代码语言:javascript复制
cd ~/
pymolcas verify standard

这个standard其实对应OpenMolcas-v21.06/test/standard目录,内含100个输入文件,可供自学模仿使用。(注意笔者用的是16核)测试完成大约需要45 min。测试过程中输出内容仅有一行,例如

代码语言:javascript复制
Running test standard: 067... (68%)

在笔者机子上094和099号例子失败,屏幕会提示到哪个目录下检查输出文件,看了一下没什么问题。如果嫌测试时间长,可以自己挑十几个文件测试,例如测试第004,005号文件的命令是

代码语言:javascript复制
pymolcas verify standard:004,005

4. 从Gaussian向OpenMolcas传轨道

作为量化软件,OpenMolcas有自己的SCF功能可以做HF/DFT计算。但SCF收敛性不如高斯(事实上目前几乎不存在SCF比高斯好的量化软件),也不支持检验波函数稳定性。对于一些SCF难收敛、或具有多个SCF解的体系(如多重键断裂、3d或4d过渡金属等),只要求SCF收敛通常是不够的。这种情况下,我们可以先用高斯做HF/DFT计算、检验波函数稳定性、确保波函数稳定后,再将轨道传给OpenMolcas,后者就能极速收敛。例如高锰酸根负离子的UHF计算,我们先给出高斯输入文件

代码语言:javascript复制
%chk=MnO4-.chk
%mem=32GB
%nprocshared=16
#p UHF/aug-cc-pVDZ guess=mix stable=opt nosymm int=nobasistransform

title

-1 1
Mn     0.00000000    0.00000000    0.000
 O     0.00000000    0.00000000    1.602
 O     1.51038009    0.00000000   -0.534
 O    -0.75519005    1.30802752   -0.534
 O    -0.75519005   -1.30802752   -0.534

算完后查看输出文件有两个UHF能量

代码语言:javascript复制
 SCF Done:  E(UHF) =  -1448.97855535     A.U. after   49 cycles
 SCF Done:  E(UHF) =  -1449.02966955     a.u. after   89 cycles

第一个UHF能量对应的波函数是不稳定的,高斯检验发现有internal instability,将其自动优化至稳定的波函数,对应更低的UHF能量。而如果直接用OpenMolcas做计算,类似的输入文件为

代码语言:javascript复制
&GATEWAY
Coord
5
Angstrom
Mn     0.00000000    0.00000000    0.000
 O     0.00000000    0.00000000    1.602
 O     1.51038009    0.00000000   -0.534
 O    -0.75519005    1.30802752   -0.534
 O    -0.75519005   -1.30802752   -0.534
Basis=aug-cc-pVDZ
Group=Nosym

&SEWARD
&SCF
UHF
Charge=-1
Spin=1
Scramble=0.2

注意对自旋极化单重态UHF/UDFT计算,需要破坏初始轨道的对称性,否则会收敛到RHF解上。在高斯中可能大家都熟知应该用guess=mix关键词,而在OpenMolcas中对应使用Scramble关键词进行扰动,扰动幅度可以自己设,此处我们用手册中推荐的0.2。这个例子用OpenMolcas算出来结果是-1448.83565609 a.u.,连高斯的不稳定波函数都不如。SCF用了145圈,正常结束且末尾输出Happy landing,然而仔细检查会发现第145圈之后显示No convergence, optimization aborted。

笔者还尝试过扰动值换成0.3就收敛不了了。熟练使用MOLCAS的人当然可以看手册加关键词进行各种尝试,但此处我们可以在高斯算完后,直接执行

代码语言:javascript复制
formchk MnO4-.chk MnO4-.fch
fch2inporb MnO4-.fch

就可生成.input, .INPORB两个文件,内含坐标、基组、分子轨道及适当关键词。formchk是高斯自带的小程序,而fch2inporb是笔者开源的程序包MOKIT中的一个小程序,可以到https://gitlab.com/jxzou/mokit下载,推荐下载源代码到Linux下自行编译(Windows预编译版本落后许久)。前述高斯输入文件中的关键词nosymm int=nobasistransform就是为了此刻传轨道保证正确性所需。

fch2inporb能自动识别fch文件中是RHF/ROHF/UHF哪种类型的计算并在.input文件中写入合适的关键词,不需要自己写input文件。如果有特殊计算需求(例如使用泛函,指定积分格点等等),可以打开输入文件自行增删关键词。此处我们做的是UHF计算,直接提交即可

代码语言:javascript复制
pymolcas MnO4-.input >& MnO4-.out &
(注意若是Ubuntu系统,默认是dash而非bash,此时应运行pymolcas MnO4-.input >MnO4-.out 2>&1 &)

可以在输出文件中看到2圈即收敛,能量与高斯一样

顺带一提,OpenMolcas做完UHF计算会自动将UNO轨道保存在.UnaOrb文件中。当然了,也可以利用这种传轨道的功能,事先在高斯中算好各种局域轨道,NBO轨道,UNO轨道等等,再传入OpenMolcas做后续计算,一些例子见《CASSCF初始轨道高效构建(一):局域轨道》。

致谢

感谢wsr和zhigang的审阅。

0 人点赞