Skip to content
导航

计算流程概览

BSE的计算包含scf→nscf→GW→BSE四个步骤,所有步骤都写在示例包example-k555-f888.tar.gzcreate.sh脚本中,可以结合脚本快速上手。

1.用ABACUS做scf计算,并导出band_outcoulomb_cut_{rank}.txtcoulomb_mat_{rank}.txtcoulomb_unshrinked_cut_{rank}.txtCs_data_{rank}.txtCs_shrinked_data_{rank}.txtKS_eigenvector_{index}.datshrink_sinvS_{rank}.txtvelocity_matrixvxc_outstru_out

2.用ABACUS做nscf计算,并用preprocess_abacus_for_librpa_band.py导出band_kpath_infoband_KS_eigenvalue_k_{index}.txtband_KS_eigenvector_k_{index}.txtband_vxc_k_{index}.txt

3.用LibRPA做GW计算,并导出energy_qpEXX_band_spin_{index}.txtKS_band_spin_{index}.txtGW_band_spin_{index}.txt

4.用ABACUS做BSE计算,在OUT.bse中会出现trans_dipole/analysis_{spintype}_{tdatype}.dat两个文件,里面包含了主要的计算结果。

软件安装

ABAUCS

目前ABACUS需要两个分支上的功能:abfs_moment_after_merge和BSE,需要对这两个分支分别clone下来分别编译

sh
git clone https://github.com/Fisherd99/abacus-BSE.git -b abfs_moment_after_merge /abacus-rpa
git clone https://github.com/Fisherd99/abacus-BSE.git -b BSE /abacus-BSE

具体编译流程可以参考官方文档。

LibRI

BSE的张量乘法计算功能依托于LibRI的Tensor框架,目前需要分支cvc-lr的功能

sh
git clone https://github.com/Fisherd99/LibRI.git -b cvc-lr

LibRPA

BSE基于GW的计算结果,GW需要用LibRPA执行

sh
git clone https://github.com/Fisherd99/LibRPA.git -b merge_qsgw
cmake -B build -DUSE_LIBRI=ON \
    -DCEREAL_INCLUDE_DIR=$CEREAL_PATH/include \
    -DLIBRI_INCLUDE_DIR=$LibRI_PATH/include \
    -DLIBCOMM_INCLUDE_DIR=$HLibComm_PATH/include \
    -DUSE_GREENX_API=ON
    -DCMAKE_CXX_FLAGS="-DLIBRPA_VERBOSE"

执行计算任务

在例子example-k555-f888.tar.gz中,文件夹结构如下

├ create_continue.sh                    # 重新更改密集k网格KPT_nscf后续算
├ create.sh                             # 一键执行全部任务
├ INPUT_bse
├ INPUT_nscf
├ INPUT_scf
├ KPT_nscf
├ KPT_scf
├ librpa.in                             # LibRPA的输入文件
├ plot_compare.py                       # 画GW band
├ plot.ipynb                            # 画吸收谱
├ preprocess_abacus_for_librpa_band.py  # LibRPA的输入文件
├ Si_3s3p2d1f1g_pca1e-6.abfs            # 为了降低LRI误差人为增大的辅助基
├ Si_gga_8au_100Ry_3s3p2d.orb
├ Si_ONCV_PBE-1.0.upf
└ STRU

任务流程可以阅读create.sh脚本。下面对四个步骤中的参数做具体解释

1. scf

INPUT_scf

参数描述默认值
exx_use_ewald开启后会计算coulomb_mat,它在做库伦积分时截断的方式更完整,用于GW计算中的head+wing修正0
exx_pca_threshold设为10会跳过默认的辅助基构造,直接读取.abfs文件中预设的辅助基0.0001
out_unshrinked_v开启后输出辅助基在压缩前的硬截断库伦矩阵0
shrink_abfs_pca_thr
shrink_lu_inv_thr
从初始辅助基压缩到小辅助基的筛选参数-1
1e-6
out_mat_xc输出vxc_out.dat,后续会复制为vxc_out0
rpa输出第一节中所列举的其他所有文件0

KPT_scf

做GW计算时所用的稀疏k网格

2. nscf

INPUT_nscf

参数描述默认值
out_mat_xc输出vxcsXkY_nao.txt,后续转为band_vxc_k_{index}.txt0
out_wfc_lcao输出wfsXkY_nao.txt,后续转为band_KS_eigenvector_k_{index}.txt0

KPT_nscf

做BSE计算时所用的密集k网格,也可以用于指定GW band所采用的k path

3. GW

librpa.in

参数描述默认值
task = g0w0_band告诉LibRPA执行g0w0band任务rpa
option_dielect_func = 3设为3时在GW任务中做head+wing修正2
replace_w_head = t配合option_dielect_func = 3使用t
use_shrink_abfs = t在计算介电函数ε时使用压缩后的小辅助基f
use_shrink_chi = f在计算响应函数χ时使用未压缩前的大辅助基t
output_Wc_Rf_mat = 1输出辅助基下的静态屏蔽库伦矩阵W(R,iω0)0
output_gw_sigc_mat_rf = t输出原子基下的自能矩阵Σ(R,iω)f
band_continue = f是否从自能矩阵出发续算f
output_energy_qp = t输出energy_qpf

4. BSE

INPUT_bse

参数描述默认值
esolver_type需设为lr,配合xc_kernel bse共同指定计算任务为BSEksdft
xc_kernel需设为bse,配合esolver_type lr共同指定计算任务为BSElda
lr_nstates指定要求解的激发态的数量,-1表示全部求解1
nocc指定计入电子空穴对的价带数量-1
nvirt指定计入电子空穴对的导带数量1
out_wfc_lr是否在对角化BSE矩阵后输出本征值和本征向量0
lr_solverelpa代表完整地求解BSE矩阵,spectrum代表读入对角化BSE矩阵后的结果计算吸收谱(依赖于上一任务开启out_wfc_lrdav
bse_spin_types支持singlettripletrpaipa,可以一个任务中同时计算singlet triplet
bse_tda支持tdafullbothtda
bse_use_fine_kgrid1使用密集k网格计算BSE;0使用稀疏k网格(强烈推荐设为1)0
bse_ri_hartree开启后,V矩阵将用LocalRI算法加速,否则用格点积分的方式计算1
bse_write_ab输出AB矩阵和V_A、W_A、V_B、W_B0
bse_continue0不续算;1从V_A续算;2从W_A续算;3从V_B续算;4从W_B续算(依赖于上一任务开启bse_write_ab0
bse_mem_save开启后,程序不再单独存储V和W矩阵,这对于节省内存有很大帮助,但会自动关闭bse_continue并自动开启bse_ri_hartree0
abs_gauge支持velocitylength,仅在分子体系且分子的结构位于超胞中央时,length的结果才是可靠的velocity

BSE自旋类型参数说明

bse_spin_types参数对应的公式为:

Aaik1,bjk2BSE=(Eak1GWEik1GW)δabδijδk1k2+α(aik1|V|jbk2)+β(jk2,ik1|W|ak1,bk2)Baik1,bjk2BSE=α(aik1|V|bjk2)+β(bk2,ik1|W|ak1,jk2)
spin typeαβ
singlet2-1
triplet0-1
rpa20
ipa00

对于示例包example-k555-f888.tar.gz,经过计算,可以在abacus-bse.log中看到TDA和full的激子结合能为

Excition binding energies (eV):0.03598
.......
Excition binding energies (eV):0.0360718

激子的振子强度(oscilation strength)满足f-sum rule

23NeNkMΩMN|M|r^|N|2=23NeNkMΩS|aikik|v|akEaEiXaikS|2=1

两者分别给出

Total oscillator strength = 0.939865
.......
Total oscillator strength = 1.07042

执行plot.ipynb后应当得到这样的吸收谱:

Si吸收谱

图中显示了Si的吸收谱,包含TDA(Tamm-Dancoff近似)和Full(完整BSE)两种计算结果。计算完成后,OUT.bse/目录下会生成以下主要输出文件:

文件名说明
trans_dipole_singlet_tda.datTDA近似下的跃迁偶极矩数据(自旋单态)
trans_dipole_singlet_full.dat完整BSE计算的跃迁偶极矩数据(自旋单态)
trans_analysis_singlet_tda.datTDA近似下的跃迁分析数据(自旋单态)
trans_analysis_singlet_full.dat完整BSE计算的跃迁分析数据(自旋单态)

GW和BSE的相关输出文件可参考:/example-k555-f888/ref

该示例使用k555×f888网格:

  • LibRPA GW计算:约3小时(48核)
  • BSE计算:约50分钟
  • 总计算时间:约4小时

Released under the MIT License.