ABACUS+Bader charge 分析教程
作者:黄一珂,邮箱:huangyk@aisi.ac.cn
最后更新时间:2024 年 7 月 13 日
前言
我们在软件开发时不可避免遇到化学相关应用场景的需求,其中一个可能重点关注的信息便是“价态”。尽管从原理上考虑,“价态”这个量的定义并不明确,但化学场景的使用者总希望找到各式各样的方法来契合他们的“化学直觉”,便诞生了各种布居分析(Population Analysis)方法:如 Mulliken、Hirshfeld、Hirshfeld-Iterative (Hirshfeld-I)、ADCH、DDEC6、CM5、Mayer、Bader 等,以及各种电子的定域化分析方法,如 Wannier、ELF 等。尽管他们各自存在或致命或物理上定义不明的问题,如 Mulliken 电荷具有非常显著的基组相关效应,Hirshfeld 电荷经常对过渡元素计算出携带负电,Bader 对于电荷分布极其不均匀的体系会得出异常结果等,但仍然有足够普遍的受众群体。
Bader charge 是将电子密度进行类似于 Voronoi tesellation 的剖分,在原子间以电荷密度的梯度为 0 处创建截面,然后将原子周围所有截面包络出的 cell 进行实空间积分,即为 Bader charge。考虑实际计算,我们总能对价电子的密度进行切分,但对近核电子的处理则有所差别:CP2K 支持构造出核电荷分布,VASP 支持从 PAW 势中重建核电荷分布,而 QE 和 ABACUS 则不支持以上处理方式。
Bader 分析软件部署
网站:https://theory.cm.utexas.edu/henkelman/code/bader/
我们可以直接运行 linux 命令以下载 Bader 电荷分析软件的可执行文件版本,也可以选择下载源码然后手动编译:
wget https://theory.cm.utexas.edu/henkelman/code/bader/download/bader_lnx_64.tar.gz
tar -zxvf bader_lnx_64.tar.gz
chmod +x bader
下载源码:
wget https://theory.cm.utexas.edu/henkelman/code/bader/download/bader.tar.gz
tar -zxvf bader.tar.gz
cd bader
make
chmod +x bader
使用示例
在了解 bader charge 的原理后,我们首先从 nspin 1(only one spin channel)开始讲解具体使用。
nspin 1 case
生成所需 cube 文件
bader 程序需要读取以 cube 方式,或者 CHGCAR 格式存储的实空间电荷密度,因此运行 ABACUS 时,只需要添加
out_chg 1
即可输出电荷密度。
运行 bader 电荷分析
只需要以
/path/to/bader Si2-ELECTRON_DENSITY.cube
即可,屏幕会有如下输出:
GRID BASED BADER ANALYSIS (Version 1.05 08/19/23)
OPEN ... Si2-ELECTRO
GAUSSIAN-STYLE INPUT FILE
DENSITY-GRID: 60 x 60 x 60
CLOSE ... Si2-Si2.cube-ELECTRO
RUN TIME: 0.02 SECONDS
CALCULATING BADER CHARGE DISTRIBUTION
0 10 25 50 75 100
PERCENT DONE: **********************
REFINING AUTOMATICALLY
ITERATION: 1
EDGE POINTS: 97653
REASSIGNED POINTS: 7908
RUN TIME: 0.23 SECONDS
CALCULATING MINIMUM DISTANCES TO ATOMS
0 10 25 50 75 100
PERCENT DONE: **********************
RUN TIME: 0.02 SECONDS
WRITING BADER ATOMIC CHARGES TO ACF.dat
WRITING BADER VOLUME CHARGES TO BCF.dat
NUMBER OF BADER MAXIMA FOUND: 8
SIGNIFICANT MAXIMA FOUND: 8
VACUUM CHARGE: 0.0000
NUMBER OF ELECTRONS: 8.00001
同时生成了 ACF.dat,AVF.dat 和 BCF.dat 文件,ACF.dat 中即是 bader 切分该电荷密度后在“Voronoi cell”切分的结果:
# X Y Z CHARGE MIN DIST ATOMIC VOL
--------------------------------------------------------------------------------
1 3.653762 2.109500 1.491642 3.999891 1.952476 137.965434
2 0.000000 0.000000 0.000000 4.000124 1.952474 137.962879
--------------------------------------------------------------------------------
VACUUM CHARGE: 0.0000
VACUUM VOLUME: 0.0000
NUMBER OF ELECTRONS: 8.0000
我们将“CHARGE”列数据和赝势中 PP_HEADER
部分的 z_valence
值相减,即可得到该原子所携带电荷量。
nspin 2 case
ABACUS 目前分 spin channel 进行电荷密度的输出,若 nspin 2,则会在目录下输出 SPIN1_CHG.cube 和 SPIN2_CHG.cube。然而,直接对每一个 spin channel 进行体积剖分,然后按照原子序号相加的结果可能是错误的,因为两个 spin channel 中不一定每个原子均具有位置相同的“0 梯度面”。因此对同一原子,可能在两个 spin channel 中具有不同大小的 cell。为了避免这种情况,可以首先将两 cube 文件进行加和,之后再调用 bader.x。
Cube manipulator
Cube manipulator 是处理 Gaussian cube 格式 3D 实空间格点数据的小工具,可以在 ABACUS 代码包 tools 文件夹下找到(https://github.com/deepmodeling/abacus-develop/blob/develop/tools/plot-tools/cube_manipulator.py)。
通过 --help
可以查看可用选项:
myaccount@mycomputer:~/abacus-develop/examples/spin_polarized/AFM/OUT.ABACUS# python3 cube_manipulator.py --help
usage: cube_manipulator.py [-h] [-i INP] [-o OUT] [-s SCALE] [--p1d P1D] [--s2d S2D] [-p PLUS] [-m MINUS]
manipulate the Gaussian cube format volumetric data.
options:
-h, --help show this help message and exit
-i INP, --inp INP the input Gaussian cube file.
-o OUT, --out OUT the output file.
-s SCALE, --scale SCALE
scale the Gaussian cube file by a factor.
--p1d P1D integrate the Gaussian cube file in 2D, followed by the axis: 'x', ...
--s2d S2D slice the Gaussian cube file along one axis, followed by string like 'x=0.0', 'y=0.0', 'z=0.0'. Note: should be fractional coodinate.
-p PLUS, --plus PLUS plus the two Gaussian cube files.
-m MINUS, --minus MINUS
minus the two Gaussian cube files.
Once meet any problem, please submit an issue at: https://github.com/deepmodeling/abacus-develop/issues
生成所需 cube 文件
我们选择 abacus-develop/examples/spin_polarized/AFM
算例,将 INPUT 文件中 out_chg
flag 修改为 1,得到两个 cube 文件分别对应于两个 spin channel。此时我们只需要将两个 SPIN*_CHG.cube 相加即可:
python3 cube_manipulator.py -i SPIN1_CHG.cube -p SPIN2_CHG.cube -o ELECTRONIC_DENSITY.cube
运行 bader 电荷分析
对文件 ELECTRONIC_DENSITY.cube
使用 bader.x,得到:
GRID BASED BADER ANALYSIS (Version 1.05 08/19/23)
OPEN ... ELECTRONIC_DENSITY.c
GAUSSIAN-STYLE INPUT FILE
DENSITY-GRID: 36 x 36 x 36
CLOSE ... ELECTRONIC_DENSITY.c
RUN TIME: 0.00 SECONDS
CALCULATING BADER CHARGE DISTRIBUTION
0 10 25 50 75 100
PERCENT DONE: **********************
REFINING AUTOMATICALLY
ITERATION: 1
EDGE POINTS: 39985
REASSIGNED POINTS: 6753
RUN TIME: 0.07 SECONDS
CALCULATING MINIMUM DISTANCES TO ATOMS
0 10 25 50 75 100
PERCENT DONE: **********************
RUN TIME: 0.00 SECONDS
WRITING BADER ATOMIC CHARGES TO ACF.dat
WRITING BADER VOLUME CHARGES TO BCF.dat
NUMBER OF BADER MAXIMA FOUND: 108
SIGNIFICANT MAXIMA FOUND: 108
VACUUM CHARGE: 0.0000
NUMBER OF ELECTRONS: 31.99909
该例为,呈反铁磁态,每个 Fe 原子有 16 个价电子,最终积分得到电子数量为 31.99909,因此符合预期。同样查看 ACF.dat 文件:
# X Y Z CHARGE MIN DIST ATOMIC VOL
--------------------------------------------------------------------------------
1 0.000000 0.000000 0.000000 15.999544 2.060461 76.704205
2 2.676622 2.676622 2.676622 15.999544 2.060459 76.704205
--------------------------------------------------------------------------------
VACUUM CHARGE: 0.0000
VACUUM VOLUME: 0.0000
NUMBER OF ELECTRONS: 31.9991
发现两 Fe 原子均为电中性,同样符合预期。
附录:cube manipulator 更多的使用方法
Cube manipulator 还有除了加法之外的更多功能,例如两 cube 文件进行减法、一个 cube 文件进行乘法等,以及还有面向更实际的应用场景,2D 平面积分与 cube 3D 内容切片。
AXPY 类操作
AXPY 是 BLAS 中函数,代表了诸如:
的操作。因此-p flag 即为$\alpha=1, \beta=1$,-m flag 即为$\alpha=1,\beta=-1$,-s 为$\alpha=?, \beta=0$。
例如将 SPIN1_CHG.cube 和 SPIN2_CHG.cube 相减可以获得自旋密度:
python3 cube_manipulator.py -i SPIN1_CHG.cube -m SPIN2_CHG.cube -o SPIN_DENSITY.cube
Profile1d 操作
在进行表面模型的功函数计算时,需要对 Hartree 势进行面积分,得到沿某个轴的 1 维曲线。我们分别使用 ELECTRON_DENSITY.cube 和 SPIN_DENSITY.cube 对该功能进行演示:
python3 cube_manipulator.py -i ELECTRON_DENSITY.cube --p1d x -o charge1d.dat
python3 cube_manipulator.py -i SPIN_DENSITY.cube --p1d x -o spin1d.dat
即对 yz 平面进行积分,进行简单的绘图:
Slice2d 操作
有时我们会考察某个截面的电子密度,对原子周围电子的局域化程度进行分析。我们仍然分别使用 ELECTRON_DENSITY.cube 和 SPIN_DENSITY.cube 对该功能进行演示:
python3 cube_manipulator.py -i ELECTRON_DENSITY.cube --s2d x=0 -o charge2d_000.dat
python3 cube_manipulator.py -i ELECTRON_DENSITY.cube --s2d x=0.25 -o charge2d_025.dat
python3 cube_manipulator.py -i ELECTRON_DENSITY.cube --s2d x=0.5 -o charge2d_050.dat
python3 cube_manipulator.py -i SPIN_DENSITY.cube --s2d x=0 -o spin2d_000.dat
python3 cube_manipulator.py -i SPIN_DENSITY.cube --s2d x=0.25 -o spin2d_025.dat
python3 cube_manipulator.py -i SPIN_DENSITY.cube --s2d x=0.5 -o spin2d_050.dat
进行简单绘图,电荷密度:
自旋密度:
Have a question? Submit issue!
如果在使用 ABACUS+Bader Analysis 过程中发现了 bug 或者运行结果不达预期,可以在 deepmodeling/abacus-develop 仓库下提交 issue。