计算化学公社

标题: QE个从编译到应用(不定期更新) [打印本页]

作者
Author:
万里云    时间: 2015-6-24 15:43
标题: QE个从编译到应用(不定期更新)
本帖最后由 万里云 于 2015-6-24 21:20 编辑

如今第一性原理计算领域基本VASP占了半壁江山。相比之下,Quantum Espresso(以下简称QE)的使用者就很少,相应的资料也难找,并且年代久远。现在已发布QE 5.1.2版,而百度搜到的教程还停留在4.x版。这些教程使用从软件源安装的编译器、MPI和数学库编译QE,难以保证能成功编译并通过测试。我从12年开始学习QE,从编译编译器、MPI、数学库再到编译QE,再到完成实际计算任务,基本上能折腾的都折腾过。最近有感于QE资料匮乏,为了让刚接触QE的人路尽快上手,也为了让大家批评指正,在此贴分享自己这几年间积攒的经验。此贴不是教程,而仅是一个使用者经验总结,因此肯定有纰漏之处。如果有疑问,最可靠的办法是看帮助文档和去官方邮件列表求助。

此贴将囊括以下内容,不定期更新:
(一)QE源代码下载,编译及测试;
(二)PW、PP模块介绍;
(三)常见算例;

常见算例中将包括:
(一)结构优化;
(二)自洽计算;
(三)能带计算;
(四)后期处理(分波态密度、差分电荷密度、电荷转移、功函数等);
(五)自旋极化;

受限于专业知识与研究领域,算例中将不包括:
(一)声子计算;
(二)分子动力学;
(三)NEB方法;
(四)非共线磁化与自旋轨道耦合;
(五)DFT+U与杂化泛函;

二楼开始正文。


作者
Author:
chiweijie    时间: 2015-6-24 20:15
支持,以后后跟着您的帖子学习QE了。
作者
Author:
万里云    时间: 2015-6-24 21:17
本帖最后由 万里云 于 2015-6-25 20:16 编辑

一、QE源码下载、编译及测试

1.1 源码下载
从5.0版开始,QE官方不再将各模块整合在一起发布,而是只在源码包中包含最基本的PW、CP和PP模块。其余的模块,比如做赝势的atomic,算声子的PHonon,算过渡态的neb等需要单独下载。源码包下载地址为http://qe-forge.org/gf/project/q-e/frs/?action=FrsReleaseBrowse&frs_package_id=18,如无特殊计算需求,可以只下载espresso-x.x.x.tar.gz。最新的稳定版为5.1.2,以下我们就以此版本为例,演示如何编译QE。


1.2 编译
个人认为,计算环境可分为两类:单一服务器和集群。在用户环境设置方面,单一服务器一般是自己私有的,可以为每个使用者建一个账户,可以放心大胆地修改环境变量;而集群一般是公有的,多个使用者使用同一个账户,修改环境变量必须要慎重,没有单一服务器那么自由。在任务调度方面,单一服务器一般不安装调度系统,而是直接使用mpirun提交;而集群有复杂的任务调度系统。在编译环境方面,单一服务器需要自己装编译器和MPI,而集群则预装多种编译器和对应的MPI。因此,这两种计算环境下编译QE的设置不同。


单一服务器一般会随系统附带GNU编译器,但是并不好用。我曾经用基于GNU的MPI编译过QE,编译勉强能过,测试时一堆segment fault。为了能顺利编译并通过测试,以及获得比较高的执行效率,推荐使用Intel编译器+MKL。集群则比较方便,有多种编译器和MPI可供使用。Openmpi  C / C++ / Fortran的mpi程序为 mpicc / mpic++ / mpif90,Intel MPI对应的是mpiicc / mpiicpc / mpiifort。除了GNU和Intel编译器之外,还有PGI,Pathscale等编译器,不过比较少见,一般碰不到。


1.2.1 通用准备工作
无论是在单一服务器上编译,还是在集群上编译,这一步是通用的。首先将espresso-5.1.2.tar.gz上传至服务器并解压,如果需要编译其它模块,将相应的压缩包复制到解压后的espresso-5.1.2/archive目录。在编译过程中,系统会自动解压这些压缩包,因此不要画蛇添足。编译完后测试PW模块需要赝势,而自5.0版之后源码包中附带的赝势不全,需要联网下载。由于单一服务器和集群一般不能连外网,因此测试时就会报错。解决方案是下载一份4.x版的QE,把其中pseudo子目录中的赝势添加到5.1.2版的pseudo子目录里。这一步之后,接下来的工作因计算环境而异。


1.2.2 单一服务器上编译QE
前文提到单一服务器可以自由修改环境变量,因此我们可以全部使用动态链接库,便于configure自动识别。在开始编译前,确保$HOME/.bashrc中含有这一行:
source /opt/intel/bin/compilervars.sh intel64
这一行确保了与Intel编译器和MKL相关的环境变量设置正确。

正确设置编译器之后,我们先编译openmpi。这里以1.8.5版为例,将源码上传至服务器后解压,进入源码子目录,执行如下命令:
export CC=icc
export CXX=icpc
export FC=ifort
export CFLAGS="-O3 -xHost"
export CXXFLAGS="-O3 -xHost"
export FCFLAGS="-O3 -xHost"
./configure \
        --prefix=$HOME/code/openmpi-1.8.5 \
        --enable-mpi-fortran=yes --enable-mpi-cxx=yes --enable-mpi-java=no \
        --enable-wrapper-rpath=yes --enable-cxx-exceptions=yes \
        --enable-mpi-thread-multiple=yes \
        --enable-shared=yes --enable-static=yes
配置完成后make -j 2,然后make check检查编译是否成功,最后make install安装openmpi-1.8.5至$HOME/code/openmpi-1.8.5目录。安装完之后,将如下内容添加至$HOME/.bashrc以设置相关环境变量:
export LD_LIBRARY_PATH=$HOME/code/openmpi-1.8.5/lib:$LD_LIBRARY_PATH
export PATH=$HOME/code/openmpi-1.8.5/bin:$PATH

最后执行命令source $HOME/.bashrc以更新设置。


接下来编译FFTW-3.3.4,解压源码,进入源码目录,执行如下命令:
export CC=icc
export F77=ifort
export CFLAGS="-O3 -xHost"
export FFLAGS="-O3 -xHost"
./configure --prefix=$HOME/code/fftw-3.3.4 --enable-sse2 --enable-shared
然后仿照编译openmpi,make -> make check -> make install三部曲。安装完后,将如下内容添加至$HOME/.bashrc:
export LD_LIBRARY_PATH=$HOME/code/fftw-3.3.4/lib:$LD_LIBRARY_PATH
最后执行命令source $HOME/.bashrc以更新设置。


最后编译QE。进入源码目录,执行如下命令:
export MPIF90=mpif90
export CC=icc
export FC=ifort
export F77=ifort
export CFLAGS="-O3 -xHost"
export FCFLAGS="-O3 -xHost"
export FFLAGS="-O3 -xHost"
./configure --prefix=$HOME/code/espresso-5.1.2

因为前面已经设置好了环境变量,系统会自动找到FFTW和MKL,因此configure后面不加相关设置就可启用MPI并行 + MKL + ScaLapack + FFTW。如果使用Intel MPI,系统可能无法找到对应的BLACS库,这时需要在configure后面加参数SCALAPACK_LIBS="-lmkl_scalapack_lp64 -lmkl_blacs_intelmpi_lp64"来指定。设置完之后,make pw即可编译PW模块,make cp即编译CP模块,make pp即编译PP模块,make ph即编译PHonon模块,其它依此类推。


1.2.3 集群上编译QE
集群相对不自由,不能随便设置环境变量。有的集群编译节点和计算节点给出的动态链接库不同,会导致“编译测试都没问题,但一提交任务就报错退出”这种稀奇古怪的错误,我们组在编译VASP时就遇到过这问题。一个简单粗暴的方法就是全部使用静态链接库。这种方法也有缺点,比如编译出的程序体积很大,但还没达到令人难以接受的地步。FFTW编译部分相同,不同之处在于编译QE时的设置。以下举两个例子,大家可以根据自己所用集群编译器和MKL设置进行修改。


第一个例子是天津超算中心。它使用了自己开发的MPI,mpi程序名与openmpi一致,却需要链接Intel MPI对应的BLACS库(怀疑是套了马甲的IntelMPI)。设置如下:
export MPIF90=mpif90
export F90=ifort
export F77=ifort
export FC=ifort
export CFLAGS=-O2
export FFLAGS=-O2
export FCFLAGS=-O2
export MKL_LIB_PATH=/opt/intel/composer_xe_2013.0.079/mkl/lib/intel64
export FFT_LIB_PATH=$HOME/lib/fftw-3.3.4/lib
./configure
--prefix=$HOME/code/espresso-5.1.2 \
BLAS_LIBS="-Wl,--start-group \
$MKL_LIB_PATH/libmkl_intel_lp64.a \
$MKL_LIB_PATH/libmkl_sequential.a \
$MKL_LIB_PATH/libmkl_core.a \
-Wl,--end-group" \
SCALAPACK_LIBS="-Wl,--start-group \
$MKL_LIB_PATH/libmkl_scalapack_lp64.a \
$MKL_LIB_PATH/libmkl_blacs_intelmpi_lp64.a \
-Wl,--end-group" \
FFT_LIBS="$FFT_LIB_PATH/libfftw3.a"

第二个是我们学校的超算中心,用了Intel MPI,因此环境变量MPIF90值有所变化:
export MPIF90=mpiifort
export F77=ifort
export F90=ifort
export FC=ifort
export CFLAGS=-O2
export FCFLAGS=-O2
export FFLAGS=-O2
export MKLDIR=$HOME/lib/mkl-13.0.080
./configure
--prefix=$HOME/code/espresso-5.1.2 \
BLAS_LIBS="-Wl,--start-group $MKLDIR/libmkl_intel_lp64.a $MKLDIR/libmkl_sequential.a $MKLDIR/libmkl_core.a -Wl,--end-group" \
SCALAPACK_LIBS="-Wl,--start-group $MKLDIR/libmkl_scalapack_lp64.a $MKLDIR/libmkl_blacs_intelmpi_lp64.a -Wl,--end-group" \
FFT_LIBS="$HOME/lib/fftw-3.3.4/lib/libfftw3.a"

make部分操作同单一服务器。


1.3 测试
PW模块自带一个测试脚本,该脚本默认以串行方式调用pw.x,也可以以并行方式调用。由于集群一般禁止在登录节点运行任务,因此串行方式更通用。

进入espresso-5.1.2/PW/tests目录,执行命令./check-pw.x.j即可启动该脚本。一般情况下输出是这样的:
Checking atom-lsda...passed
Checking atom-pbe...passed
Checking atom-sigmapbe...passed
Checking atom...passed
Checking b3lyp-O...passed
Checking b3lyp-h2o...passed

但也有可能遇到这样的:
Checking cluster2...discrepancy in force detected
Reference:   0.5354, You got:   0.5355
这些微小的数值误差无关紧要,只要没有ERROR就可以。

在单服务器上可以用并行模式调用pw.x,为此先打开espresso-5.1.2/environment_variables这个文件,找到这么两行:
PARA_PREFIX="mpirun -np 2"
PARA_PREFIX=" "

删除最下面那行,再执行check-pw.x.j即可并行测试。可以通过调整np后面的数值来改变所用核数,但不要设置过大,4就差不多了。


测试完成后,make install即可将程序复制到--prefix指定的目录(这里是
$HOME/code/espresso-5.1.2)。将此目录添加到环境变量PATH,在单一服务器上就可直接用"mpirun -np 16 pw.x -in abc.in > abc.out 2>&1 &"这样的命令提交任务了。集群有自己的提交方式。比如天津超算是“yhrun -J XXX -n 12 -p TH_xxx pw.x -in abc.in > abc.out 2>&1 &",使用LSF任务调度系统的则需要使用bsub命令。




作者
Author:
冰山    时间: 2015-8-24 10:30
本帖最后由 冰山 于 2015-8-24 10:33 编辑

这两天编译QE,此帖帮大忙了!
希望楼主继续啊!
顺便补一下,
我的机器上装了IMSL
所以还需要再设置一下
export F90FLAGS=-O2
不然 F90FLAGS会指向IMSL库的目录
另外:./configure里面添加了
LAPACK_LIBS="-Wl,--start-group $MKLDIR/libmkl_lapack95_lp64.a -Wl,--end-group"
不然会报错,不认 -llapack


作者
Author:
zhuceid02    时间: 2015-8-24 10:32
楼主辛苦了,期望早点更新,期待PHONON
作者
Author:
万里云    时间: 2015-8-24 15:01
本帖最后由 万里云 于 2015-8-24 15:14 编辑
冰山 发表于 2015-8-24 10:30
这两天编译QE,此帖帮大忙了!
希望楼主继续啊!
顺便补一下,

我一般用MKL,启用了ScaLAPACK就不必设置LAPACK了。
作者
Author:
冰山    时间: 2015-8-24 16:32
本帖最后由 冰山 于 2015-8-25 14:57 编辑
万里云 发表于 2015-8-24 15:01
我一般用MKL,启用了ScaLAPACK就不必设置LAPACK了。

我也是用MKL,不知道为什么还是提醒我-llapack找不到,加了lapack_lib之后就好了。

另外还想问下,QE的并行效率如何?
我刚才测试一下,感觉效率特别低,不知道为什么。
8核的49秒 单核才94秒。刚才考到本地又测了一下
8核24秒 单核 65秒

补充一下,就不单独写回帖了。
“我们发现,CPU时间和并行度成正比,wall time 实际时间和和并行度关系比较弱。”
也可能是因为这个计算过程太短,而输入输出时间相对过多造成的。

最新测试结果,PWscf 自洽过程 并行度和耗费时间测试结果。版本4.0.3 (因为要用某软件和QE接口)
8 cores
     Program PWSCF     v.4.0.3  starts ...
     PWSCF        :     1.65s CPU time,    7.45s wall time
4 cores
     Program PWSCF     v.4.0.3  starts ...
     PWSCF        :     2.30s CPU time,    7.70s wall time
2 cores
     Program PWSCF     v.4.0.3  starts ...
     PWSCF        :     3.86s CPU time,    9.15s wall time
1 cores
     Program PWSCF     v.4.0.3  starts ...
     PWSCF        :     6.58s CPU time,   11.97s wall time




作者
Author:
万里云    时间: 2015-8-24 16:58
冰山 发表于 2015-8-24 16:32
我也是用MKL,不知道为什么还是提醒我-llapack找不到,加了lapack_lib之后就好了。

另外还想问下,QE ...

我没具体测过并行效率。

主程序pw.x其实是可以接受其它命令行参数的,这些参数可以控制并行计算细节,可以看Doc/user_guide.pdf这个文件。
作者
Author:
茶味果冻    时间: 2015-8-25 09:53
刚看看 学习了,相当给力。老师对QE的MD学习多吗,这里有个问题,希望您能帮看看,谢谢了!  
http://ccc.keinsci.com/thread-1639-1-1.html
作者
Author:
rocwillow    时间: 2015-9-7 17:02
学习中,感谢分享
作者
Author:
茶味果冻    时间: 2015-9-21 13:29
您好!我做完计算,画能带,但是出现下面的问题,这是怎么回事,是我计算输入文件中保存数据少了么?还是其它问题,附件附上了输入文件,麻烦能帮看下,谢了,我在网上查了好久

作者
Author:
万里云    时间: 2015-9-21 14:33
茶味果冻 发表于 2015-9-21 13:29
您好!我做完计算,画能带,但是出现下面的问题,这是怎么回事,是我计算输入文件中保存数据少了么?还是其 ...

bands.x的输入文件呢?
作者
Author:
茶味果冻    时间: 2015-9-21 19:06
万里云 发表于 2015-9-21 14:33
bands.x的输入文件呢?

来了,在附件中,麻烦您了

作者
Author:
万里云    时间: 2015-9-22 09:11
茶味果冻 发表于 2015-9-21 19:06
来了,在附件中,麻烦您了

prefix和上面那个输入文件不一致。
作者
Author:
茶味果冻    时间: 2015-9-22 10:44
万里云 发表于 2015-9-22 09:11
prefix和上面那个输入文件不一致。

您好!按照说的我调了,但是运算有出现错误了,附件是我的band计算的输入文件 和scf、bands计算的输出文件和产生band.dat的输出文件,错误信息如图片所示,slurm-2721910文件中也有.是我第二步calculation = 'bands',计算k点设置的问题嘛还是其它原因,这是小木虫上一个类似的错误问题,http://emuch.net/bbs/viewthread. ... =1&target=blank,是这样吗?麻烦大神帮看下,谢谢了!

作者
Author:
万里云    时间: 2015-9-22 14:11
本帖最后由 万里云 于 2015-9-22 14:12 编辑
茶味果冻 发表于 2015-9-22 10:44
您好!按照说的我调了,但是运算有出现错误了,附件是我的band计算的输入文件 和scf、bands计算的输出文 ...

从input_tmpband.in来看,CELL_PARAMETERS和K_POINTS后面都缺少参数,导致程序认错了跟在后面的坐标类型。

这很危险。建议看手册把缺少的参数补上。
作者
Author:
茶味果冻    时间: 2015-9-22 15:07
万里云 发表于 2015-9-22 14:11
从input_tmpband.in来看,CELL_PARAMETERS和K_POINTS后面都缺少参数,导致程序认错了跟在后面的坐标类型 ...

OK~
作者
Author:
茶味果冻    时间: 2015-12-21 11:38
楼主好久不更新了啊,我能催更嘛,相看看后续的具体计算
作者
Author:
冰山    时间: 2015-12-21 13:42
楼主,麻烦问两个问题:
1.
http://theossrv1.epfl.ch/Main/Pseudopotentials   里面的相对论norm conserving pseudopotentials ,好用么?
需要特别设置什么么?
2.
计算soc的时候,如果必须用模守恒的赝势,有什么好的赝势推荐么?有什么注意事项?

作者
Author:
万里云    时间: 2015-12-21 14:26
冰山 发表于 2015-12-21 13:42
楼主,麻烦问两个问题:
1.
http://theossrv1.epfl.ch/Main/Pseudopotentials   里面的相对论norm conser ...

1. 没用过这里的赝势,无法给出参考;

2. QE赝势选择界面上可以看到每种赝势的信息,其中标有"Classification controlled by xxxxx“的比较可靠。
作者
Author:
冰山    时间: 2015-12-23 10:12
万里云 发表于 2015-12-21 14:26
1. 没用过这里的赝势,无法给出参考;

2. QE赝势选择界面上可以看到每种赝势的信息,其中标有"Classif ...

多谢楼主啦。
我用的元素需要用到的摸守恒赝势,没有完全相对论修正的。
QE网站上还推荐了一些赝势来源,赝势页面左侧 More about pseudopotentials
这里面有些赝势库还不错。可惜也没有我要用到的,
打算转openmx试试了。
作者
Author:
万里云    时间: 2015-12-23 19:35
冰山 发表于 2015-12-23 10:12
多谢楼主啦。
我用的元素需要用到的摸守恒赝势,没有完全相对论修正的。
QE网站上还推荐了一些赝势来源 ...

哦。那祝好。
作者
Author:
didi_dudu    时间: 2016-4-12 16:28
大神求组 我最近在算AlN的phonon frequency,计算时候发现设置不同的k点,在ph那一部分输出的对称性不一样。比如如果用自动取点,ph输出的对称性就是C1,然后我用了这种取点方式
==============
K_POINTS
  20
   0.1250000  0.1250000  0.1250000   1.00
   0.1250000  0.1250000  0.3750000   1.00
   0.3750000  0.1250000  0.1250000   2.00
   0.1250000  0.1250000  0.6250000   1.00
   0.6250000  0.1250000  0.1250000   2.00
   0.1250000  0.1250000  0.8750000   1.00
   0.8750000  0.1250000  0.1250000   2.00
   0.1250000  0.3750000  0.3750000   2.00
   0.3750000  0.3750000  0.1250000   1.00
   0.1250000  0.3750000  0.6250000   2.00
   0.6250000  0.3750000  0.1250000   2.00
   0.1250000  0.6250000  0.3750000   2.00
   0.1250000  0.3750000  0.8750000   2.00
   0.3750000  0.8750000  0.1250000   2.00
   0.1250000  0.8750000  0.3750000   2.00
   0.1250000  0.6250000  0.6250000   2.00
   0.6250000  0.6250000  0.1250000   1.00
   0.3750000  0.3750000  0.3750000   1.00
   0.3750000  0.6250000  0.3750000   2.00
   0.3750000  0.3750000  0.6250000   3.00
=============================
ph部分输出的对称性就是c3v。
然而文献中aln的对称性是c6v。
想请问一下k点的选取和对称性有关系么?如果有的话怎么设置k点可以得到c6v的对称性呢。或者qe里面是否有可以指定对称性的功能。我查了相关手册等,都没有找到讲解。
谢谢!
作者
Author:
万里云    时间: 2016-4-14 09:29
didi_dudu 发表于 2016-4-12 16:28
大神求组 我最近在算AlN的phonon frequency,计算时候发现设置不同的k点,在ph那一部分输出的对称性不一样 ...

我群论学得很烂的。

1. AlN似乎是六方晶系的,为了同时取到M点和K点,MP网格应该是6的倍数,最小是6*6*2这样的,从你的数据看不是六等分的;
2. 和中心反演、镜面对称等相关的对称性和体系几何中心相关,把体系几何中心放到(0,0,0)和(0.5,0.5,0.5)处可能会提高对称性;
作者
Author:
didi_dudu    时间: 2016-4-15 15:52
万里云 发表于 2016-4-14 09:29
我群论学得很烂的。

1. AlN似乎是六方晶系的,为了同时取到M点和K点,MP网格应该是6的倍数,最小是 ...

意思是用自动取点的方式取6-6-2这样?我尝试了自动取点6-6-2,输出中还是不能得到C6V对称性。大神能不能举个简单例子? 另外, 体系几何中心放到(0,0,0)处是怎么体现的呢?  
------------------------------------------
如能回答 万分感谢!  
不能回答 也万分感谢!   
作者
Author:
万里云    时间: 2016-4-16 09:58
didi_dudu 发表于 2016-4-15 15:52
意思是用自动取点的方式取6-6-2这样?我尝试了自动取点6-6-2,输出中还是不能得到C6V对称性。大神能不能 ...

就是求原子坐标的平均值,如果平均值不是(0,0,0),就把所有原子坐标都平移平均值和(0,0,0)的差值。
作者
Author:
shaofeng    时间: 2016-12-20 22:47
万里云 发表于 2015-6-24 21:17
一、QE源码下载、编译及测试

1.1 源码下载

非常好的编译方法,但是我用mkl库编译完以后,采用lda+U计算含有铁和砷的晶体时,结果中会出现很多Intel MKL ERROR: Parameter 10 was incorrect on entry to DGEMM . 的错误,但是最终优化的结构是合理的。请教下是什么原因。采用的是模守恒赝势,但是采用超软赝势时没有问题。由于模守恒赝势更接近实验值,希望能采用模守恒赝势计算。
作者
Author:
obaica    时间: 2017-6-9 16:50
楼主求更新啊,拯救我等小白!谢谢啊!
作者
Author:
ChemG    时间: 2021-5-21 22:36
真实用好方法,虽然并没有进行更多比对,使用i7-9750H的Y7000,仅通过两个原子si原胞vc_relax测试,相比gnu编译的44s,此方法编译的能提升至仅需13s。后面会在工作站上安装再测试




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3