py4vasp 电声自能提取
实际非零HDF5示例,选择累加器、处理Fan/DW复数维度并恢复稀疏带号。
阅读本篇目录
本篇处理鸢算科技集群已经完成的两份Si电声耦合结果:原生VASP6.6.1-P100-HDF5,NVHPC25.3/CUDA12.8构建;后处理使用py4vasp0.11.3,绘图使用ASE3.29环境中的NumPy/Matplotlib。以下命令只读已有数据,1个CPU即可,不启动VASP,不需要GPU。
下载两份HDF5、输入记录、实际数值与绘图脚本,在新目录:
unzip py4vasp-elph-selfenergy-practical*.zip -d elph-example
cd elph-example
module load py4vasp/0.11.3
bash run.sh
输出analysis/selfenergy.csv(60行)、analysis/chemical-potential.csv(6行)、analysis/RESULTS.json及4图。已有analysis时不覆盖;重新操作请另解压一份。其他电脑已安装py4vasp0.11.3、h5py、NumPy和Matplotlib,可用PY4PY=python3 PLOTPY=python3 bash run.sh。
公开HDF5重新打包并移除了整个POTCAR组,其余科学数据与原文件相同;不含POTCAR、WAVECAR、VASP程序或phelel势导数档案。本包是后处理资料。需要从头计算电声耦合时,按VASP原生电声耦合流程准备本人的授权程序和前置数据。
1. 先确认文件里有没有实际自能数组#
ls inputs/si-selfen6
python - <<'PYDATA'
import py4vasp
c=py4vasp.Calculation.from_path('inputs/si-selfen6')
q=c.electron_phonon.self_energy
print(q.read())
print(q.selections())
print(len(q))
PYDATA
这里有2个累加器,分别对应selfen_delta=0.05和0.10 eV,不是两个温度。每个累加器内有0、300、600K三个温度。read()本身只给累加器数量,要取具体数组,继续选择一个实例:
python - <<'PYDATA'
import py4vasp
c=py4vasp.Calculation.from_path('inputs/si-selfen6')
q=c.electron_phonon.self_energy
item=q.select('selfen_delta=0.05')[0]
x=item.to_dict()
print(x['metadata'])
print(x['temperatures'])
print(x['fan'].shape,x['debye_waller'].shape)
PYDATA
筛选语法是本版本实际使用的key=value,不能把其他quantity的选择字符串直接套进来。参考数据每个条件有Γ点5个态;δ是计算中的有限虚位移/展宽参数,不是温度步长。
2. Fan与DW先对齐轴,再相加#
本例Fan为[选中态,能量,温度]=(5,1,3),DW为[选中态,温度]=(5,3)。直接做隐式数组相加会把态轴广播成额外维度,本版本的直接self_energy()返回在这份数据中也有相同形状限制。这里明确补上DW的能量轴:
fan=x['fan']
dw=x['debye_waller']
total=fan+dw[:,None,:]
print(total.shape) # (5,1,3)
print(total.real)
print(total.imag)
DW本例是实数,Fan是复数;保留虚部,不要在提取时只存实部。配套脚本逐项与原生OUTCAR的re(Fan)、im(Fan)、DW及Fan+DW行对应。

6×6×6、δ=0.05eV、300K时,本例第4带的Re(Fan)约 −0.06792436eV,DW约 +0.14098004eV,合计约 +0.07305567eV。总量不是只取Fan实部。
3. 稀疏编号要区分Python索引与原生带号#
f=item.fan()[0,0,4]
w=item.debye_waller()[0,0,4]
selected=f+w[None,:]
print(f.shape,w.shape,selected.shape)
本版本稀疏接口中spin、kpoint从0开始,但带号按valid_bands使用;这份数据是1–5带,因此[0,0,4]表示原生自旋1、k点1、第4带。不要将三个数字一律减1。本次原生输出实际选择了Γ点1–5带,即使输入中请求从4带开始,也以输出的稀疏映射和带号为准。
对未计算的k点读取会得到DataMismatch,不是零自能。to_dict()里的压缩态顺序需要通过bks_idx恢复;配套脚本已经导出明确的spin/kpoint/band列。
4. 找到自己的CSV结果#
head -n 8 analysis/selfenergy.csv
python - <<'PYDATA'
import csv
for row in csv.DictReader(open('analysis/selfenergy.csv')):
if row['case']=='si-selfen6' and row['band']=='4' and row['temperature_K']=='300.0':
print(row)
PYDATA
本页是有限网格与有限δ的操作演示。需要定量能量修正或线宽时,要继续检查电子/声子网格、中间态带数、势导数及δ收敛;δ的影响不能直接当作材料的实验寿命。
