py4vasp专题

py4vasp 电声自能提取

实际非零HDF5示例,选择累加器、处理Fan/DW复数维度并恢复稀疏带号。

更新于 2026-11-05约 4 分钟阅读按任务与环境选择适用配置
阅读本篇目录

本篇处理鸢算科技集群已经完成的两份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行对应。

Γ点第4和第5带的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

本页是有限网格与有限δ的操作演示。需要定量能量修正或线宽时,要继续检查电子/声子网格、中间态带数、势导数及δ收敛;δ的影响不能直接当作材料的实验寿命。

两种网格与δ下的实际Fan虚部

来源:py4vasp电声自能接口、VASP中间态带数。

需要根据你的体系选择资源?联系讨论计算需求。实际可用软件与权限,以当前账户和运行环境为准。

查看配图

放大后可滚动查看细节,按 Esc 关闭。

100%查看原图 ↗