计算化学公社

 找回密码 Forget password
 注册 Register
Views: 1597|回复 Reply: 9

[其它量化程序] 一步一步撸ParaGauss

[复制链接 Copy URL]

597

帖子

20

威望

4151

eV
积分
5148

Level 6 (一方通行)

发表于 Post on 2022-8-12 19:10:32 | 显示全部楼层 Show all |阅读模式 Reading model
本帖最后由 beefly 于 2022-8-28 15:34 编辑

ParaGauss是LCAO-GTO DFT计算程序,几乎是和ADF同时开发,不过ParaGauss没有发展起来,特别是十年前推出4.0版以后,后续的开发已经几乎停滞。2014年,经过一些删减的ParaGauss 3.2.1版被提交到Github上,实现了开源,但是没有讲如何编译,运行脚本似乎也已经过时,而且发布者已经离开了学术领域,不提供任何支持。今天花了一天时间,初步摸索出编译和运行方法。

  • 编译ParaGauss

  • 可选)装GNU guile库( https://www.gnu.org/software/guile/ )。因为担心2014年的ParaGauss和现在的guile不兼容,故用了比较老的guile 2.2版。从源代码编译guile的方法见自带的README文件,要预装很多库。因为用Ubuntu系统,可以一键安装:
    sudo apt-get install guile-2.2-dev
    然后把头文件libguile.h的地址加入环境变量:
    export C_INCLUDE_PATH=/usr/include/guile/2.2:$C_INCLUDE_PATH
    目前没感觉出guile包装后的优越性,因此这一步可以跳过。
  • 编译和安装OpenMPI。既可以用intel编译器,也可以用gnu编译器,网上有很多介绍。需要注意的是,运行configure的时候要加上参数 --enable-mpi-fortran 和 --enable-static 。安装后设置环境变量:
    export PATH=$openmpi_install_dir/bin:$PATH
    export LIBRARY_PATH=$openmpi_install_dir/lib:$LIBRARY_PATH
    export LD_LIBRARY_PATH=$openmpi_install_dir/lib:$LD_LIBRARY_PATH
    export CPATH=$openmpi_install_dir/include:$CPATH          (由于有Fortran代码调用头文件,必须设置CPATH)
  • 如果用gnu编译器,需要自行安装blas+lapack库。Ubuntu可以用命令:
    1. sudo apt-get install libblas-dev liblapack-dev
    复制代码
    然后写入环境变量:
    1. export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/blas:/usr/lib/x86_64-linux-gnu/lapack:$LIBRARY_PATH
    2. export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/blas:/usr/lib/x86_64-linux-gnu/lapack:$LD_LIBRARY_PATH
    复制代码

  • 到Github下载ParaGauss源代码( https://github.com/alexei-matveev/paragauss-gpl ),位于Code -- Download ZIP 。解压缩,cd进入主目录paragauss-gpl-master。现在需要针对编译环境写一个machine.mk文件。根据上面第2步所用的编译器:
    a) 如果用的是Intel编译器(2020版),从paragauss-gpl-master/make里复制最接近的ifc13local.mk,放到主目录下:
    cp make/ifc13local.mk ./machine.mk
    然后编辑machine.mk中的两行:
    MPIINCLUDE =        -I$openmpi_install_dir/include
    MPILIBS = -lmpi_usempif08 -lmpi -lmpi_mpifh
    b) 如果用gnu编译器,则复制paragauss-gpl-master/make/krsk-gfortran-openmpi.mk:
    cp make/krsk-gfortran-openmpi.mk ./machine.mk
    然后编辑machine.mk:
    删除这两行的“-x f95”
    1. F90BASEFLAGS = -x f95 -Wall #-fbounds-check #-pedantic-errors -Werror
    2. FBASEFLAGS   = -x f95 -Wall #-fbounds-check #-pedantic-errors -Werror
    复制代码
    删除这一行的-lf77blas和-latlas(根据blas和lapack库文件的实际名称,必要的话可以修改LAPACKLIBS和BLASLIBS两个环境变量):
    1. BLASLIBS =        -lf77blas -lblas -latlas
    复制代码
    在环境变量COMMINCLUDE之前定义MPIINCLUDE。例如:
    1. MPIINCLUDE =        -I/$openmpi_path_dir/include
    2. COMMINCLUDE =   $(MPIINCLUDE)
    复制代码
    如果用guile(见第1步),则把文件结尾的以下几行
    1. ifeq ($(WITH_GUILE),1)
    2.     INCLUDE += -I$(BASEDIR)/guile
    3.     LIBS += -lguile
    4. endif
    复制代码
    改为
    1. ifeq ($(WITH_GUILE),1)
    2.     LIBS += $(shell guile-config link)
    3.     CINCLUDE += $(shell guile-config compile)
    4.     LINKFLAGS += -Wno-main
    5. endif
    复制代码
    c) machine.mk中其他的路径可酌情修改,但是似乎用不到。
  • 如果不用guile(见第1步),修改Makefile,把其中的“WITH_GUILE = 1”改为“WITH_GUILE = 0”。
  • 修改molmech/hess_and_opt_module.f90,1087-1089行有语法错误:
    1.                   str=rstep(nvar+1:nvar+3)
    2.                   call use_vect_s()
    3.                   call renew_slab(str)
    复制代码
    改为
    1.                   str_s=rstep(nvar+1:nvar+3)
    2.                   call use_vect_s()
    3.                   call renew_slab(str_s)
    复制代码

  • 如果用ifort编译器,修改文件modules/xc_func.f90,1388行会导致ifort编译器出现内部错误:
    1.     f = scm_list (f, f1, f2)
    复制代码
    改为:
    1.     type(scm_t) :: f1, f2, f0

    2. (略)

    3.     f0 = f
    4.     f = scm_list (f0, f1, f2)
    复制代码

  • 用 make 编译。编译成功后,

    a) 若使用guile,会出现可执行程序 guile-qm 以及运行脚本 runqm

    b) 若不使用guile,会出现可执行程序 mainscf_V3.2.1-yyyyymmdd(后缀中的yyyy、mm、dd分别是编译那天的年月日)



  • 运行ParaGauss

在其它位置另建一个目录,准备一个运行脚本run.sh。
a) 如果使用guile,运行脚本run.sh的内容如下:
  1. #!/bin/bash

  2. export PATH=$openmpi_install_dir/bin:$PATH
  3. export LD_LIBRARY_PATH=$openmpi_install_dir/lib:$LD_LIBRARY_PATH

  4. export PATH=$path_of_paragauss-gpl-master:$PATH

  5. # serial calculation:
  6. # runqm  job-1
  7. # parallel calculation
  8. mpirun -np 4 runqm job-1
复制代码

b) 如果不使用guile,运行脚本run.sh的内容如下:
  1. #!/bin/bash

  2. export PATH=$openmpi_install_dir/bin:$PATH
  3. export LD_LIBRARY_PATH=$openmpi_install_dir/lib:$LD_LIBRARY_PATH

  4. export PATH=$path_of_paragauss-gpl-master:$PATH

  5. cp  job-1  input

  6. # serial calculation:
  7. # mainscf_V3.2.1-yyyyymmdd
  8. # parallel calculation
  9. mpirun -np 4 mainscf_V3.2.1-yyyyymmdd

复制代码

yyyyymmdd”要换成实际的后缀。job-1是输入文件名,可以从 paragauss-gpl-master/qa 里面找。复制的时候,要连同基组文件一起复制。
如果用intel编译器+mkl库,还要在run.sh中把相应的环境变量加上。例如:
  1. source $intel_compilers_path/bin/compilervars.sh intel64
  2. source $intel_compilers_path/mkl/bin/mklvars.sh intel64
复制代码




评分 Rate

参与人数
Participants 2
威望 +1 eV +5 收起 理由
Reason
sobereva + 1
plus + 5 精品内容

查看全部评分 View all ratings

597

帖子

20

威望

4151

eV
积分
5148

Level 6 (一方通行)

 楼主 Author| 发表于 Post on 2022-8-12 19:43:47 | 显示全部楼层 Show all
本帖最后由 beefly 于 2022-8-20 19:33 编辑

ParaGauss主要功能如下:

paragauss

paragauss


一点个人看法:
1,输入文件格式复杂,特别是坐标、基组部分,过于繁琐
2,ParaGauss当年最大的卖点之一,是标量相对论DKH2的解析梯度和解析Hessian(不过求导公式用了一些比较粗糙的近似),但不如相对论赝势用得广。如今已被容易求导且精度更高的X2C方法淘汰
3,ParaGauss是把DFT+U方法引入分子计算的少数程序之一(在这个开源版里没有),不过在分子领域,人们更习惯用杂化泛函乃至多组态方法计算强关联体系
4,如果对ParaGauss里的算法感兴趣,可以研究一下;做应用计算则意义不大

78

帖子

0

威望

2694

eV
积分
2772

Level 5 (御坂)

发表于 Post on 2022-8-14 08:51:31 | 显示全部楼层 Show all
现在我倒是越来越觉得,撸别人的,不然直接搞一个。哎!

268

帖子

3

威望

4331

eV
积分
4659

Level 6 (一方通行)

发表于 Post on 2022-8-14 09:17:34 | 显示全部楼层 Show all
wgbigfatcat 发表于 2022-8-14 08:51
现在我倒是越来越觉得,撸别人的,不然直接搞一个。哎!

自己写重复的功能意义不是很大。

评分 Rate

参与人数
Participants 2
eV +7 收起 理由
Reason
ChrisZheng + 5 233333
zjxitcc + 2 233333大师你已经写过了

查看全部评分 View all ratings

459

帖子

1

威望

4003

eV
积分
4482

Level 6 (一方通行)

发表于 Post on 2022-8-14 09:28:51 | 显示全部楼层 Show all
Warm_Cloud 发表于 2022-8-14 09:17
自己写重复的功能意义不是很大。

大师你不能写完了之后说这种话

268

帖子

3

威望

4331

eV
积分
4659

Level 6 (一方通行)

发表于 Post on 2022-8-14 20:57:56 | 显示全部楼层 Show all
niobium 发表于 2022-8-14 09:28
大师你不能写完了之后说这种话

不写怎么会有这么痛的领悟。。。

459

帖子

1

威望

4003

eV
积分
4482

Level 6 (一方通行)

发表于 Post on 2022-8-14 21:44:45 | 显示全部楼层 Show all
Warm_Cloud 发表于 2022-8-14 20:57
不写怎么会有这么痛的领悟。。。

我觉得要么有自己完整的程序,如ORCA、GAMESS等等;要么就方法足够牛逼到能让高斯之类的程序支持,如Grimme的D3;要么就固定地参与某个程序的开发,如Head-Gordon、Krylov都绑定Q-Chem了,其实也类似第一种情况。如果总是个接口之类的东西,要么自己不会算积分,要么自己不会做HF,要用A,还非要基于B,这程序基本就是自己组里玩玩。

268

帖子

3

威望

4331

eV
积分
4659

Level 6 (一方通行)

发表于 Post on 2022-8-14 22:52:51 | 显示全部楼层 Show all
niobium 发表于 2022-8-14 21:44
我觉得要么有自己完整的程序,如ORCA、GAMESS等等;要么就方法足够牛逼到能让高斯之类的程序支持,如Grim ...

写软件很痛苦,代价比如延期。不过,能够撑过来那确实还可以。。当然了,能有自己的牛逼方法和完整软件这个是最好的情况了。

2608

帖子

1

威望

5812

eV
积分
8440

Level 6 (一方通行)

MOKIT开发者

发表于 Post on 2022-8-15 23:33:12 | 显示全部楼层 Show all
本帖最后由 zjxitcc 于 2022-8-16 00:17 编辑
niobium 发表于 2022-8-14 21:44
我觉得要么有自己完整的程序,如ORCA、GAMESS等等;要么就方法足够牛逼到能让高斯之类的程序支持,如Grim ...

很有道理。不过“完整的程序”这个细究定义的话,就存疑了。。。总是有不少研究问题需要多个量化程序来解决(过去、现在、未来都是这样),从这个角度看的话,就不存在完整的程序了。。。当然,相对的比较还是可以有的,总会有些程序“比较完整”(像Gaussian和ORCA)
自动做多参考态计算的程序MOKIT

459

帖子

1

威望

4003

eV
积分
4482

Level 6 (一方通行)

发表于 Post on 2022-8-16 08:30:56 | 显示全部楼层 Show all
zjxitcc 发表于 2022-8-15 23:33
很有道理。不过“完整的程序”这个细究定义的话,就存疑了。。。总是有不少研究问题需要多个量化程序来解 ...

standalone

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2023-2-5 08:49 , Processed in 0.421611 second(s), 29 queries .

快速回复 返回顶部 返回列表 Return to list