本公众号之前发过《离线编译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的审阅。