离线编译支持HDF5的Quantum Espresso并使用Perturbo(以QE 7.0版本为例)

0.前言

Perturbo是用于计算电荷传输和材料中超快载流子动力学的第一性原理的软件包。主要着重于电子-声子相互作用,并可以计算声子限制的传输特性,例如电导率,载流子迁移率和塞贝克系数。它也可以在存在电子-声子散射的情况下模拟超快非平衡电子动力学,为定量研究金属,半导体,绝缘体和2D材料中的电子-声子相互作用和载流子动力学提供了有效的计算工具。由于编译Perturbo需要用到支持HDF5版本的QE程序,编译过程较为繁琐,因此在此记录一下编译的全部过程。

1.安装Intel Oneapi

在Intel官网(https://www.intel.com/content/www/us/en/developer/tools/oneapi/toolkits.html)获取Intel® oneAPI Base Toolkit和Intel® oneAPI HPC Toolkit,并按照页面指示安装,配置环境变量

2.安装HDF5库

在这里统一使用Intel编译器进行编译,并且我们需要使用–enable-fortran选项来支持fortran。可以使用本文提供的一键脚本进行快速编译,也可参照脚本内容进行手动操作。

将下面的脚本保存为install.sh,执行即可自动下载HDF5库并安装。如果离线安装需要在脚本目录下建立_tmp文件夹,并将下载好的HDF5库hdf5.tar.gz手动放入再执行即可。

#!/bin/bash

# Specify the installation directory
INSTALL_DIR=./hdf5
TMP_DIR=_tmp

# Convert INSTALL_DIR to an absolute path
INSTALL_DIR=$(readlink -f $INSTALL_DIR)

# Specify the installation version
HDF5_VERSION=1_14_2

# Branch name
BRANCH_NAME=hdf5_$HDF5_VERSION

# Check if INSTALL_DIR exists, if not, create it
if [ ! -d "$INSTALL_DIR" ]; then
    mkdir -p $INSTALL_DIR
fi

# Check if Intel oneAPI environment has been sourced
if [ "$MKLROOT" == "" ]; then
    echo "Error: Intel oneAPI environment is not detected. Please source Intel oneAPI environment first."
    exit 1
fi

# Create _pkgs directory
mkdir -p $TMP_DIR

# Download the specified version of HDF5 from GitHub as a tar.gz package, skip if already downloaded
if [ ! -f "$TMP_DIR/hdf5.tar.gz" ]; then
    wget -O $TMP_DIR/hdf5.tar.gz https://github.com/HDFGroup/hdf5/archive/refs/heads/$BRANCH_NAME.tar.gz
fi

# Extract the tar.gz package
tar -xzf $TMP_DIR/hdf5.tar.gz -C $TMP_DIR
cd $TMP_DIR/hdf5-$BRANCH_NAME

# Configure HDF5 with parallel support enabled and specify the installation directory
FC=ifort CC=icc CXX=icpc ./configure --prefix=$INSTALL_DIR --enable-fortran

# Compile
make -j4

# Install
make install

# Clear the folder in _pkgs directory, keep the tar.gz package
cd ../..
rm -rf $TMP_DIR

echo "HDF5 has been successfully installed to $INSTALL_DIR"

3.编译Quantum Espresso

(1)下载源码https://github.com/QEF/q-e/releases/并解压。

(2)进行configure,需要指定HDF5库路径,将/path/to/hdf5换成刚才安装的实际hdf5库路径

./configure --with-hdf5=yes --with-hdf5-libs="-L/path/to/hdf5/lib -lhdf5 -lhdf5_fortran" --with-hdf5-include="/path/to/hdf5/include"

完成configure之后,检查屏幕上的提示,如果有类似下面的内容,说明配置成功。

The following libraries have been found:
BLAS_LIBS= -lmkl_intel_lp64 -lmkl_sequential -lmkl_core
LAPACK_LIBS=
FFT_LIBS=
HDF5_LIBS=-L/path/to/hdf5/lib -lhdf5 -lhdf5_fortran

如果没有正确显示HDF5_LIBS,说明可能需要检查上面的HDF5库路径是否正确(如lib和lib64得区别),或者尝试使用–with-hdf5=”/path/to/hdf5″替代上面的命令。如果BLAS_LIBS没有MKL,说明可能没有正确使用Intel编译器的环境变量。

(3)准备devicexlib

在较新版本的QE中,编译时会联网获取devicexlib库,这对于离线安装非常不友好。观察编译过程发现在进行下载前其会先判断./external/devxlib目录下是否存在可以configure的文件再进行下都,因此可以手动下载该库来解决这个问题。

首先在https://gitlab.com/max-centre/components/devicexlib/-/archive/0.1.0/devicexlib-0.1.0.tar.gz获取该库,放置于目录./external/devxlib内,再通过命令tar xzf devicexlib-0.1.0.tar.gz –strip-components=1 -C .解压。

(4)编译

使用make all -jN(N为编译使用的核数)进行编译即可。

如果一切顺利,./bin目录下会出现各模块的二进制文件了。

4.运行Quantum Espresso

之后可以测试一下刚编译的QE程序,运行时需要添加HDF5库的环境变量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/hdf5/lib

5.安装Perturbo

(1)找到官方文档(https://perturbo-code.github.io/mydoc_installation.html)给出的申请表格地址,填写个人信息,邮箱会收到自动发送的程序源码。根据官方的版本适配信息(https://perturbo-code.github.io/mydoc_versions.html),选择与QE版本相兼容合适的Perturbo版本,如QE 7.0需要使用2.0,QE 7.2需要使用2.1。下载源码并解压,放置于QE源码的根目录,也就是和其他内置模块一样。

(2)修改make.sys

进入perturbo目录,编辑make.sys,找到下面两行,去掉注释并修改HDF5目录为实际HDF5目录。

IFLAGS += -I/path/to/hdf5/include
HDF5_LIBS = -L/path/to/hdf5/lib -lhdf5 -lhdf5_fortran

注:对于较新版本,可能需要先使用下面的命令复制.sys到perturbo的根目录

cp config/make_gcc_serial.sys make.sys

之后可以执行make进行编译,如果编译成功,可以在./perturbo/bin目录下找到编译好的二进制文件了。

Perturbo官网提供了丰富的使用样例(https://perturbo-code.github.io/mydoc_org.html),可参考官网样例学习输入格式,进行练习和测试。

6.安装Wannier 90

在Wannier 90官网(https://wannier.org/download/)获取最新版本Wannier 90的源代码,应该是压缩包格式的,如v3.1.0.tar.gz。

放入QE源码根目录下面的archive文件夹,并将压缩包改名为版本号,如./archive/v3.1.0,这里不需要后缀名。

回到根目录,执行编译命令。

make w90

在LAMMPS中使用CHGNet

0.前言

CHGNet是一种基于图神经网络的机器学习原子势,近期发表于Nature Machine Intelligence volume 5, pages1031–1041 (2023)。笔者注意到近期有开发者已经完成了CHGNet的LAMMPS接口(https://github.com/CederGroupHub/chgnet/issues/57)。但目前网络上还没有相关的使用教程,因此在此记录一下笔者编译以及测试的过程。

此教程也可用于M3GNet和MatGL接口的使用。

1.安装并配置Anaconda

由于CHGNet使用Python实现,因此需要先确保服务器配置了Python环境,如果没有安装推荐安装Anaconda(官方文档:https://docs.anaconda.com/free/anaconda/install/linux/)来配置Python环境。并需要确保已经安装了chgnet,可以使用下面的命令进行安装。

pip install chgnet

2.获取源代码

实现了CHGNet接口的LAMMPS程序源码可以在Github上获取到(https://github.com/advancesoftcorp/lammps)。提供了2Aug2023和2Aug2023两个版本可供选择,下载源码并解压。Lammps提供了基于CMake和make的两种编译方式,本文使用make进行编译。

3.修改Makefile

进入下载好的源代码的./src/MAKE目录,找到Makefile文件。由于CHGNet接口仅支持调用GPU和OpenMP,而不支持MPI并行,因此本文以编译串行(Serial)版本为例,也就是修改Makefile.serial。共有三处需要修改。

(1)修改CCFLAGS和LINKFLAGS(如果需要使用OpenMP)

根据官网文档(https://docs.lammps.org/Build_extras.html#openmp),使用OpenMP需要修改compiler/linker settings部分的下面两行,加入-fopenmp参数。

CCFLAGS = -g -O3 -std=c++11 -fopenmp
LINKFLAGS = -g -O -std=c++11 -fopenmp

如果使用Intel编译器,则需要将CCFLAGS替换成-qopenmp -restrict,LINKFLAGS替换成-qopenmp。

(2)加入Python相关的includes和library变量

在Makefile的build rules and dependencies之前的位置加入下列内容,your_path/anaconda3需要替换成本地实际的Python路径,python3.x需要替换成实际的python版本号,如python3.11,如果不确定可以通过find命令进行查找。这里需要注意如果服务器上有多个Python环境,务必使用安装了chgnet的环境的路径进行添加

# Python library and includes (for conda)
PYTHON_INC = -I/your_path/anaconda3/include/python3.x
PYTHON_LIB = -L/your_path/anaconda3/lib -lpython3.x

(3)修改EXTRA_INC和EXTRA_LIB,加入Python的相关变量

这两行位于build rules and dependencies部分,分别加入$(PYTHON_INC)和$(PYTHON_LIB)。

EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PYTHON_INC) $(PKG_SYSINC)
EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PYTHON_LIB) $(PKG_SYSLIB) $(DYN_LIB)

修改好Makefile后,我们就可以回到./src目录,开始正式的编译安装了。

4.编译安装

LAMMPS在编译时,如果需要编译额外的可选包,需要使用如下的命令,name需要替换成实际的包名(https://docs.lammps.org/Build_extras.html):

make yes-name

同理也可以使用make no-name删除某个可选包。

在这里,我们需要加入CHGNet和OpenMP(可选),即

make yes-OPENMP
make yes-ML-CHGNET

之后进行正式编译,将-jN中的N替换为编译实际使用的核数。

make serial -jN

这里特别提醒,如果之前编译过其他版本,需要使用下面的命令进行清理再重新进行编译。

make clean-all

完成编译后,如果没有报错,src目录下应该出现了名为lmp_serial的二进制文件,即为我们编译的LAMMPS程序了。可以复制到其他目录,配置环境变量,以方便使用。

5.运行测试

在./examples/CHGNET,我们可以看到开发者提供的输入样例inp.lammps,其中pair_style和pair_coeff格式如下:

pair_style chgnet ../../potentials/CHGNET 
#pair_style chgnet/d3 ../../potentials/CHGNET 
#pair_style chgnet/gpu ../../potentials/CHGNET 
#pair_style chgnet/d3/gpu ../../potentials/CHGNET
# 使用MPtrj预训练模型
pair_coeff    * *  MPtrj-efsm  Zr O
# 使用自己的pt模型
pair_coeff    * *  path ./users_model.pt  Zr O

使用命令env OMP_NUM_THREADS=N lmp_serial -sf omp -in inp.lammps,我们可以使用N个OpenMP threads来执行任务。OpenMP的使用细节可以参考官方文档:https://docs.lammps.org/Speed_omp.html。

此外,需要注意的是,如果要在集群的作业系统上提交,我们还需要在作业脚本中加入LD_LIBRARY_PATH环境变量,与Makefile中的修改类似,将/your_path/anaconda3改成实际的Python目录:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your_path/anaconda3/lib

6.常见问题

(1)LAMMPS运行时警告:WARNING: OpenMp support not enabled during compilation: using 1 thread only.

检查Makefile是否有加入-fopenmp,以及是否有启用make yes-OPENMP。

(2)LAMMPS运行时报错:ERROR: Cannot initialize python for pair_coeff of CHGNet

说明CHGNet的Python环境未正确配置,需要调整Python环境。

使用Material Project时需要注意的能量修正问题

当我们在某些计算问题中需要比较Material Project(MP)的能量数据与本地DFT的计算结果时,如形成能的计算(https://blog.csdn.net/qq_36996539/article/details/128066249)。经过测试发现,即使在使用相同的输入参数的情况下,这两种方法得到的结果可能会有所不同。通过查阅Material Project官方文档,才发明很多人可能忽略了MP中对于能量进行的修正,这对于比较能量是非常重要的。

在MP中,为了提高其DFT计算的准确性,采用了两种修正:阴离子修正GGA/GGA+U混合修正

  1. 阴离子修正:
    • 对于许多在固体中呈负氧化态的元素,由于元素和固体之间电子定位的差异,从DFT计算得到的形成能可能存在显著的误差。这对于其标准状态为气态的元素尤为明显。
    • 为了解决这个问题,MP对14种阴离子应用了能量修正,包括“氧化物”(oxides)、“过氧化物”(peroxide)、“超氧化物”(superoxides)、S、F、Cl、Br、I、N、H、Se、Si、Sb和Te。
    • 对于含氧化物的化合物,根据氧在材料中的特定键合环境,分为氧化物、超氧化物和过氧化物的修正,根据最近邻键长确定的(超氧化物<1.35 Å,过氧化物<1.49 Å,否则为氧化物)。例如,Na2O接收’氧化物’修正,而NaO2接收超氧化物修正。
    • 只有当材料中被修正的元素作为阴离子时,才应用阴离子修正。例如,’H’修正应用于LiH,但不应用于H2O。如果估计的氧化态(如果可用)为负,或者它是材料中最具电负性的元素,那么它被分类为阴离子。
    • 具体数值可以参考参考文献1。
  2. GGA / GGA+U混合修正:
    • 众所周知,对于不同的化合物有些适用于+U修正计算,而其他化合物通常不采用。带有+U修正的能量与不带+U修正的能量不直接可比
    • MP中,GGA+U计算的结果添加了能量修正项,从而使得两种计算结果可以混合比较。

References:

  1. 1.A. Jain, G. Hautier, C. Moore, S.P. Ong, C.C. Fischer, T. Mueller, K.A. Persson, G. Ceder., A High-Throughput Infrastructure for Density Functional Theory Calculations, Computational Materials Science, vol. 50, 2011, pp. 2295-2310. DOI:10.1016/j.commatsci.2011.02.023
  2. 2.A. Jain, G. Hautier, S.P. Ong, C. Moore, C.C. Fischer, K.A. Persson, G. Ceder, Accurate Formation Enthalpies by Mixing GGA and GGA+U calculations, Physical Review B, vol. 84, 2011, p. 045115. DOI:10.1103/PhysRevB.84.045115
  3. Anion and GGA/GGA+U Mixing – Materials Project Documentation