ABACUS:BSE态振幅与k点贡献
读取原生X/Y振幅,理解简并态、跃迁贡献和完整BSE的反共振分量。
阅读本篇目录
本篇接续BSE计算步骤,使用同一下载包与已完成的三种条件。无需再次计算GW或重复上篇任务。
unzip abacus-bse-wave685-*.zip
cd abacus-bse
bash results.sh
bash plot.sh
以上只读取参考数据并重绘,不启动新计算。重新计算请使用新解压的目录。
1. 先读可读表,再读原始振幅#
head -20 work/tda/OUT.autotest/trans_analysis_singlet_tda.dat
head -5 work/tda/OUT.autotest/Excitation_Amplitude_singlet_1.dat
head -5 work/full/OUT.autotest/Excitation_Amplitude_full_X_singlet_1.dat
head -5 work/full/OUT.autotest/Excitation_Amplitude_full_Y_singlet_1.dat
本例每个核有8个激发态,每个态对应8个电子—空穴跃迁(8个k点×1占据带×1空带)。原生复数写成(实部,虚部)。本组*_1.dat文件内有多个激发态,不能把文件名末尾的1理解成只保存第一个态;应按文件行和态编号读取。
TDA只有X,完整BSE同时有X/Y。完整方程不能直接套用sum(|X|²)=1,应检查相应的sum(|X|²−|Y|²)归一形式。
2. 用Python读取与求模方#
下面代码可以在实例目录直接运行:
/public/toolkit/miniconda3/envs/gpumdkit-1.5.8/bin/python - <<'PYCODE'
from pathlib import Path
import re
import numpy as np
p = Path('work/tda/OUT.autotest/Excitation_Amplitude_singlet_1.dat')
x = np.array([[complex(float(a), float(b))
for a, b in re.findall(r'\(([^,]+),([^\)]+)\)', line)]
for line in p.read_text().splitlines() if line.strip()])
print('态数、跃迁数:', x.shape)
print('每个TDA态的模方和:', np.sum(abs(x)**2, axis=1))
print('前三个简并态的平均k贡献:', np.mean(abs(x[:3])**2, axis=0))
PYCODE
真实材料若有多条占据带和空带,列索引还包含带编号,需要按程序原生跃迁索引映射回k,v,c。本例恰好每个k点只有一个跃迁,才可以直接把8列视作8个k点。
3. 为什么简并态要一起看#
本例最低三个单重态简并。简并子空间内不同线性组合都可以是合法本征态,单个态的复相位与k点权重可能随求解器变化。图中展示前三个态的平均|X|²,而不是挑一个态作为唯一电子—空穴分布。
完整BSE右图展示sum(|Y|²),用于观察本例的反共振分量。它不是激子实空间尺寸,也不能直接当成某个原子的电荷。

4. 吸收相关输出如何理解#
ls work/tda/OUT.autotest/trans_*
head -16 work/tda/OUT.autotest/trans_analysis_singlet_tda.dat
表中列出跃迁偶极和原生振子强度。本组矩阵来自小基组接口测试,不能把其振子强度绝对值当作收敛材料吸收谱或据此比较实验峰强。画谱前还需要检查跃迁空间、规范、单位、展宽与足够的态数。
已有数值:reference-data/BSE-excitation-states.csv列出激发能、X/Y归一值和Y模方;BSE-supplied-QP-and-kweights.csv记录上游QP能隙及简并子空间的平均k权重。把参考CSV与自己的结果分开保存,避免把参考输入误认为本次材料的计算输出。