计算化学公社

 找回密码 Forget password
 注册 Register
Views: 12394|回复 Reply: 8

[VASP] 编译带dftd4的vasp.6.2.1

[复制链接 Copy URL]

16

帖子

3

威望

1095

eV
积分
1171

Level 4 (黑子)

发表于 Post on 2021-8-7 12:52:58 | 显示全部楼层 Show all |阅读模式 Reading model
本帖最后由 lqid 于 2021-8-7 22:38 编辑

VASP从6.2.0开始支持DFT-D4 方法(https://www.vasp.at/wiki/index.php/IVDW),但是需要作为外部包在编译的时候额外编译进去(https://www.vasp.at/wiki/index.php/Installing_VASP.6.X.X)。实际操作的时候,笔者发现其实想要用上带DFT-D4的vasp没那么简单,本贴子记录了一下本人在学校的hpc集群上安装Grimme的dftd4程序和编译带dftd4的vasp.6.2.1时的过程,希望对有兴趣和需求的人有启发和帮助。

1. 安装dftd4
在社长的博文(http://sobereva.com/464)中有对DFT-D4方法的介绍,而且提供了2种编译方法——简单粗暴的方法和基于meson+ninja的编译方法。当时的dftd4是ver 2.0,目前最新的dftd4已经到了ver 3.3.0,程序已经被重写了一遍。但是非常蛋疼的是,vasp的代码中用的api是基于2.x版本的,如果编译的dftd4是3.2.0及之前的3.x版本,vasp编译会出错,好在3.3版中重新增加了vasp用的2.x api。(https://github.com/dftd4/dftd4/issues/85, https://zhuanlan.zhihu.com/p/375207527)
编译环境:
GCCcore-10.3.0, CentOS Linux release 8.4.2105, meson-0.58.0, ninja-1.10.2, python-3.9.5 笔者分别在Intel® Parallel Studio XE 2020 Update 1 (19.1.1.217)和Intel® Parallel Studio XE 2019 Update 1 (19.0.1.144)环境下尝试编译dftd4。
根据dftd4的github上的指南(https://github.com/dftd4/dftd4),用以下4条指令编译dftd4
  1. meson setup _build
  2. meson test -C _build --print-errorlogs
  3. meson configure _build --prefix=/path/to/install
  4. meson install -C _build
复制代码
但是笔者发现均无法正常编译,并且没有产生ver 3.3.0新加的给vasp使用的旧api。
首先编译问题可以在第一条命令中,添加通过指定编译器的环境变量解决。如果是Intel® Parallel Studio XE 2020 update 1 (19.1.1.217)环境,则用
  1. FC=ifort CC=icc CXX=icpc meson setup _build
复制代码
如果是Intel® Parallel Studio XE 2019 update 1 (19.0.1.144)环境,则用
  1. FC=ifort meson setup _build
复制代码
(在笔者的测试中,如果反过来均会报错导致编译失败,非常神奇但是不清楚为什么)

然后在第三条指令中,加入-Dapi_v2=True 变成
  1. meson configure _build --prefix=/path/to/install -Dapi_v2=True
复制代码
来生成vasp可用的api。

最后在.bashrc 中加入并且source ~/.bashrc
  1. export LD_LIBRARY_PATH=$HOME/bin/dftd4/lib64:$LD_LIBRARY_PATH
复制代码
(编译dftd4时--prefix=$HOME/bin/dftd4)


2.编译vasp
(关于编译vasp中遇到的问题不在本贴子的讨论范围内)
给出指南是这样的(应该适用于ver 2.x版本的dftd3
  1. CPP_OPTIONS += -DDFTD4
  2. LLIBS       += -Lyour-libdftd4-build -ldftd4
  3. INCS        += -Iyour-libdftd4-build/libdftd4.a.p
复制代码
笔者英语能力有限,实在是没理解your-libdftd4-build到底是指什么目录,并且ver 3.x 的dftd4似乎没有生成libdftd4.a.p 文件。我用以下路径能够得到编译成功并且可以使用dftd4的vasp二进制文件
  1. CPP_OPTIONS += -DDFTD4
  2. LLIBS       += -L$HOME/bin/dftd4/lib64 -ldftd4
  3. INCS        += -I$HOME/bin/dftd4/include/dftd4/intel-xx.x.x.xxx
复制代码
(若编译dftd4时--prefix=$HOME/bin/dftd4)
其中intel-xx.x.x.xxx中的数字为编译时使用的intel编译器版本号


p.s.其实在写本贴的时候dftd4还在3.2版,但是支持vasp的源代码compat.f90已经在github page上了,原本是想介绍一下怎么用compat.f90微微魔改一下dftd4的代码,提前体验这个新功能的,结果计划赶不上变化hhhhhhh


07/08/2021 15:00补充:

3.在vasp.6.2.0前的版本使用dftd4
我发现在vasp.6.1.0中已经有关于dftd4的源代码,主要是vdwforcefield.F和subdftd4.F这两个。简单对比了一下发现和6.2.0的没什么区别,应该是可以直接用。再之前的版本,根据dftd4的GitHub page上的一个subproject https://github.com/dftd4/dftd4_vasp,似乎可以通过修改和增加代码来用上dftd4,这里搬运一下。

首先修改src/vdwforcefield.F文件,在vdw_forces_main subroutine中加入
  1. USE vdwD4
复制代码
然后在
  1. !c D3(BJ-damping) by Jonas Moellman
  2. CASE(12)                                                                                                            
  3.   CALL vdw_forces_D3(IO,LATT_CUR,DYN,T_INFO,TSIF,TIFOR,TOTEN,ELEM,historycounter,4,IVDW)   
复制代码

下方加入
  1. ! D4-ATM(EEQ) implemented by Eike Caldeweyher
  2. CASE(13)
  3.   CALL vdw_forces_D4(IO,LATT_CUR,DYN,T_INFO,TSIF,TIFOR,TOTEN,ELEM,IVDW)
复制代码
然后找到vdw_read subroutine中读取INCAR中IVDW flag的值的这段代码
  1. IF (IVDW==1 .OR. IVDW==2 .OR. IVDW==3 .OR. IVDW==4 .OR. (IVDW>=10 .AND. IVDW<=12) .OR.  &
  2. &   IVDW==101 .OR. (IVDW>=20 .AND. IVDW<=22) .OR. IVDW==26 .OR.  IVDW==202 &
  3. &   .OR. IVDW==212 .OR. IVDW==263 .OR. IVDW==612  ) THEN
  4.   LVDW=.TRUE.
  5. ELSE
  6.   LVDW=.FALSE.
  7.   CALL PROCESS_INCAR(LOPEN, IO%IU0, IO%IU5, 'LVDW', LVDW, IERR, WRITEXMLINCAR)
  8.   IF (LVDW) IVDW=1
  9. ENDIF
复制代码
把(IVDW>=10 .AND. IVDW<=12)改成(IVDW>=10 .AND. IVDW<=13)
然后把subdftd4.F放到src文件夹下。如果是vasp5的话,需要把subdftd4.F中所有关于vtutor的代码注释掉,vtutor module是vasp6新加的。
最后修改/src/.object,找到subdftd3.o\,在它下面一行加上subdftd4.o\。

然后就可以修改makeflie.include进行编译了。不过注意这里CCP_OPTIONS里是-DWITH_DFTD4不是-DDFTD4




评分 Rate

参与人数
Participants 8
威望 +1 eV +35 收起 理由
Reason
obaica + 5 谢谢
ezez + 5 赞!
MisakaFaction + 5 好物!
sobereva + 1
wypkdhd + 5 牛!
卡开发发 + 5 牛!
physics_xw + 5 好物!
fineren + 5 谢谢分享

查看全部评分 View all ratings

272

帖子

0

威望

3937

eV
积分
4209

Level 6 (一方通行)

发表于 Post on 2021-8-7 16:41:19 | 显示全部楼层 Show all
赞,可惜缺 瓦斯普621

评分 Rate

参与人数
Participants 1
eV +4 收起 理由
Reason
喵星大佬 + 4 同缺2333

查看全部评分 View all ratings

16

帖子

3

威望

1095

eV
积分
1171

Level 4 (黑子)

 楼主 Author| 发表于 Post on 2021-8-7 22:24:07 | 显示全部楼层 Show all
chrinide 发表于 2021-8-7 16:41
赞,可惜缺 瓦斯普621

我补充了一段在之前的版本用dftd4的方法,我发现好像其实从vasp.6.1.0中已经有关于dftd4的源代码了,简单对比了一下和6.2.1没区别,应该是可以直接用。再之前的版本可以根据https://github.com/dftd4/dftd4_vasp这个页面里的方法来修改源代码。

388

帖子

1

威望

2028

eV
积分
2436

Level 5 (御坂)

发表于 Post on 2021-8-8 09:17:35 | 显示全部楼层 Show all
我很好奇“如果反过来均会报错导致编译失败,非常神奇但是不清楚为什么”具体是什么情况。

16

帖子

3

威望

1095

eV
积分
1171

Level 4 (黑子)

 楼主 Author| 发表于 Post on 2021-8-9 04:37:27 | 显示全部楼层 Show all
本帖最后由 lqid 于 2021-8-9 04:39 编辑
Daniel_Arndt 发表于 2021-8-8 09:17
我很好奇“如果反过来均会报错导致编译失败,非常神奇但是不清楚为什么”具体是什么情况。

就是在intel 2020 update 1 (19.1.1.217)环境下,用
  1. FC=ifort meson setup _build
复制代码
的时候,C compiler会用默认的gcc 10.3.0,这个时候继续运行
  1. meson test -C _build --print-errorlogs
复制代码
会在这里报错
  1. [126/133] Linking target test/api/api-tester
  2. FAILED: test/api/api-tester
复制代码
然而如果在intel 2019 update 1 (19.0.1.144)环境下用,来指定c compiler为icc的话
  1. FC=ifort CC=icc CXX=icpc meson setup _build
复制代码
则会在运行
  1. meson test -C _build --print-errorlogs
复制代码
一开始的时候报错
  1. [8/133] Compiling C object test/api/api-tester.p/example.c.o
  2. FAILED: test/api/api-tester.p/example.c.o
  3. icc -Itest/api/api-tester.p -Itest/api -I../test/api -Ilibdftd4.so.3.3.0.p -I../include -Isubprojects/mctc-lib/libmctc-lib.a.p -Isubprojects/multicharge/libmulticharge.a.p -D_FILE_OFFSET_BITS=64 -Wall -w3 -diag-disable:remark -g -traceback -O2 -g -qopenmp -MD -MQ test/api/api-tester.p/example.c.o -MF test/api/api-tester.p/example.c.o.d -o test/api/api-tester.p/example.c.o -c ../test/api/example.c
  4. In file included from /usr/include/bits/floatn.h(119),
  5.                  from /usr/include/stdlib.h(55),
  6.                  from ../test/api/example.c(18):
  7. /usr/include/bits/floatn-common.h(214): error: invalid combination of type specifiers
  8.   typedef float _Float32;
  9.                 ^

  10. In file included from /usr/include/bits/floatn.h(119),
  11.                  from /usr/include/stdlib.h(55),
  12.                  from ../test/api/example.c(18):
  13. /usr/include/bits/floatn-common.h(251): error: invalid combination of type specifiers
  14.   typedef double _Float64;
  15.                  ^

  16. In file included from /usr/include/bits/floatn.h(119),
  17.                  from /usr/include/stdlib.h(55),
  18.                  from ../test/api/example.c(18):
  19. /usr/include/bits/floatn-common.h(268): error: invalid combination of type specifiers
  20.   typedef double _Float32x;
  21.                  ^

  22. In file included from /usr/include/bits/floatn.h(119),
  23.                  from /usr/include/stdlib.h(55),
  24.                  from ../test/api/example.c(18):
  25. /usr/include/bits/floatn-common.h(285): error: invalid combination of type specifiers
  26.   typedef long double _Float64x;
  27.                       ^

  28. compilation aborted for ../test/api/example.c (code 2)
复制代码


388

帖子

1

威望

2028

eV
积分
2436

Level 5 (御坂)

发表于 Post on 2021-8-10 11:58:17 | 显示全部楼层 Show all
lqid 发表于 2021-8-9 04:37
就是在intel 2020 update 1 (19.1.1.217)环境下,用
的时候,C compiler会用默认的gcc 10.3.0,这个时候 ...

原来是这样。这种玄学报错也挺让人头疼的。

79

帖子

0

威望

2776

eV
积分
2855

Level 5 (御坂)

发表于 Post on 2022-4-21 11:45:53 | 显示全部楼层 Show all
不知道是不是我编译的问题,dft-d4比d3慢了4倍。。。楼主有比较过吗

3

帖子

0

威望

259

eV
积分
262

Level 3 能力者

发表于 Post on 2022-7-8 15:39:22 | 显示全部楼层 Show all
本帖最后由 Apostolus 于 2022-7-8 08:42 编辑

關於編譯DFT-D4,我分享一些自己的經驗:
1.
我在CentOS 7虛擬機上 (Intel® Parallel Studio XE 2019 update 1 (19.0.1.144)) 环境編譯DFT-D4 3.4.0時,和樓主恰恰相反,第一步只有加入 CC=icc CXX=icpc 命令,第二步才能正常編譯。不清楚為什麼。
  1. FC=ifort CC=icc CXX=icpc meson setup _build
复制代码


2.
而在超算集群上編譯DFT-D4 3.4.0時,因為我調用的是Intel oneAPI 2021.1環境,直接用第一步的命令會導致報錯:
  1. meson/meson.build: ERROR: Fortran shared or static library 'mkl_intel_lp64' not found
复制代码
或者
  1. meson/meson.build: ERROR: Fortran shared or static library 'mkl_intel_thread' not found
复制代码
參考Github grimme-lab裡的issue,meson cannot find mkl_intel_thread #402,我在第一步加入了-Dfortran_link_args=-qopenmp,報錯消失,最後成功編譯。  
  1. FC=ifort CC=icc CXX=icpc meson setup _build -Dfortran_link_args=-qopenmp
复制代码
順便提一句,如果超算集群上沒有 meson 和 ninja,你也沒有權限用系統命令直接安裝。這時可以試試python3,用 pip3 install mesonninja。

6672

帖子

0

威望

4002

eV
积分
10674

Level 6 (一方通行)

发表于 Post on 2022-7-8 19:05:15 | 显示全部楼层 Show all
cokoy 发表于 2022-4-21 04:45
不知道是不是我编译的问题,dft-d4比d3慢了4倍。。。楼主有比较过吗

如果你的意思是色散校正部分慢4倍,而不是总时间慢4倍的话,是正常的,本来DFT-D4就比DFT-D3多算了很多东西,来提高结果精度
BDF(https://bdf-manual.readthedocs.io/zh_CN/latest/Introduction.html)、ORCA(https://orcaforum.kofo.mpg.de/index.php)开发团队成员

本版积分规则 Credits rule

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

GMT+8, 2023-2-2 23:35 , Processed in 0.245016 second(s), 22 queries .

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