QE EPW入门:从波函数和声子到电子—声子插值
逐步准备SCF、DFPT、全网格NSCF与EPW输入,说明每步运行命令、文件衔接和结果位置。
阅读本篇目录
下载QE/EPW完整输入、真实结果与绘图脚本,保存为example.zip:
python3 -m zipfile -e example.zip .
cd qe-epw-diamond-examples
bash results.sh
bash plot.sh
以上只读取参考结果和绘图。需要自己计算时,先按完整流程提交两阶段任务;输入在inputs/,参考原生输出在reference-results/,十份数据表在data/。本组使用QE7.6/P100入口,NVHPC25.3、HPC-X2.22.1、CUDA12.8和MKL2023.2,每次一个MPI进程、两个CPU线程、一张GPU。图中的数据来自鸢算科技集群实际计算。
1. 先理解这个小模型#
本例沿用QE官方两原子金刚石结构测试模型,晶格常数约3.51503Å,PZ-LDA、模守恒赝势,平面波截断60Ry。赝势文件名C_3.98148.UPF中的分数价电荷使每原胞有7.96296个电子,不是中性、本征金刚石的8电子模型。选择它是为了快速练习EPW流程;换真实材料时应选适合该材料的赝势、电子数与能带范围。

图中叉号是Wannier中心的位置,不是轨道等值面。当前只有4个价带Wannier函数,不包含导带。本例3×3×3粗网格、6×6×6细网格和1eV展宽用于快速认识输入输出,不用于报告精确寿命、迁移率或超导临界温度。
2. 先做给声子用的SCF#
cat inputs/scf.in
&control
calculation = 'scf'
prefix = 'diam'
restart_mode = 'from_scratch'
wf_collect = .true.
pseudo_dir = './pseudo/'
outdir = './'
tprnfor = .true.
tstress = .true.
/
&system
ibrav = 2
celldm(1) = 6.64245
nat = 2
ntyp = 1
ecutwfc = 60
occupations = 'smearing'
smearing = 'mp'
degauss = 0.02
nbnd = 4
/
&electrons
diagonalization = 'david'
mixing_beta = 0.7
conv_thr = 1.0d-10
/
ATOMIC_SPECIES
C 12.01078 C_3.98148.UPF
ATOMIC_POSITIONS alat
C 0.00 0.00 0.00
C 0.25 0.25 0.25
K_POINTS automatic
6 6 6 0 0 0
celldm(1)单位是Bohr,ecutwfc单位是Ry。pseudo_dir='./pseudo'从工作目录找赝势。这里使用6×6×6电子网格,后续3×3×3的声子网格与其相容。
3. 再做整个粗网格的声子扰动#
--
&inputph
prefix = 'diam',
epsil = .false.,
outdir = './'
fildyn = 'diam.dyn',
ldisp = .true.
fildvscf = 'dvscf'
nq1=3,
nq2=3,
nq3=3,
tr2_ph = 1.0d-12,
/
ldisp启用q网格;fildvscf保存电子—声子矩阵所需的扰动势,不能只留下声子频率。tr2_ph是DFPT收敛阈值,与PW的conv_thr不同。
官方辅助程序将扰动势与动力学矩阵整理到save/,必须在第二次SCF覆盖波函数之前完成:
printf 'diam\n' | python3 prepare_epw_save.py
ls save
4. 为EPW重新准备SCF和完整NSCF网格#
SCF使用3×3×3网格;NSCF明确列出全网格27个k点,不能直接用约化到不可约布里渊区的点表代替。
&control
calculation = 'scf'
prefix = 'diam'
restart_mode = 'from_scratch'
wf_collect = .true.
pseudo_dir = './pseudo/'
outdir = './'
tprnfor = .true.
tstress = .true.
verbosity = 'high'
/
&system
ibrav = 2
celldm(1) = 6.64245
nat = 2
ntyp = 1
ecutwfc = 60
occupations = 'smearing'
smearing = 'mp'
degauss = 0.02
nbnd = 4
/
&electrons
diagonalization = 'david'
mixing_beta = 0.7
conv_thr = 1.0d-18
/
ATOMIC_SPECIES
C 12.01078 C_3.98148.UPF
ATOMIC_POSITIONS alat
C 0.00 0.00 0.00
C 0.25 0.25 0.25
K_POINTS automatic
3 3 3 0 0 0
&control
calculation = 'nscf'
prefix = 'diam'
pseudo_dir = './pseudo/'
outdir = './'
wf_collect = .true.
verbosity = 'high'
/
&system
ibrav = 2
celldm(1) = 6.64245
nat = 2
ntyp = 1
ecutwfc = 60
occupations = 'smearing'
smearing = 'mp'
degauss = 0.02
nbnd = 4
/
&electrons
diagonalization = 'david'
mixing_beta = 0.7
conv_thr = 1.0d-10
/
ATOMIC_SPECIES
C 12.01078 C_3.98148.UPF
ATOMIC_POSITIONS alat
C 0.00 0.00 0.00
C 0.25 0.25 0.25
K_POINTS crystal
27
0.0000000000000000 0.0000000000000000 0.0000000000000000 0.037037037037
0.0000000000000000 0.0000000000000000 0.3333333333333333 0.037037037037
0.0000000000000000 0.0000000000000000 0.6666666666666667 0.037037037037
0.0000000000000000 0.3333333333333333 0.0000000000000000 0.037037037037
0.0000000000000000 0.3333333333333333 0.3333333333333333 0.037037037037
0.0000000000000000 0.3333333333333333 0.6666666666666667 0.037037037037
0.0000000000000000 0.6666666666666667 0.0000000000000000 0.037037037037
0.0000000000000000 0.6666666666666667 0.3333333333333333 0.037037037037
0.0000000000000000 0.6666666666666667 0.6666666666666667 0.037037037037
0.3333333333333333 0.0000000000000000 0.0000000000000000 0.037037037037
0.3333333333333333 0.0000000000000000 0.3333333333333333 0.037037037037
0.3333333333333333 0.0000000000000000 0.6666666666666667 0.037037037037
0.3333333333333333 0.3333333333333333 0.0000000000000000 0.037037037037
0.3333333333333333 0.3333333333333333 0.3333333333333333 0.037037037037
0.3333333333333333 0.3333333333333333 0.6666666666666667 0.037037037037
0.3333333333333333 0.6666666666666667 0.0000000000000000 0.037037037037
0.3333333333333333 0.6666666666666667 0.3333333333333333 0.037037037037
0.3333333333333333 0.6666666666666667 0.6666666666666667 0.037037037037
0.6666666666666667 0.0000000000000000 0.0000000000000000 0.037037037037
0.6666666666666667 0.0000000000000000 0.3333333333333333 0.037037037037
0.6666666666666667 0.0000000000000000 0.6666666666666667 0.037037037037
0.6666666666666667 0.3333333333333333 0.0000000000000000 0.037037037037
0.6666666666666667 0.3333333333333333 0.3333333333333333 0.037037037037
0.6666666666666667 0.3333333333333333 0.6666666666666667 0.037037037037
0.6666666666666667 0.6666666666666667 0.0000000000000000 0.037037037037
0.6666666666666667 0.6666666666666667 0.3333333333333333 0.037037037037
0.6666666666666667 0.6666666666666667 0.6666666666666667 0.037037037037
nosym和noinv在NSCF阶段保留所需的完整点集;相同prefix、结构、赝势和带数衔接后续Wannier步骤。
5. Wannier化并运行EPW#
--
&inputepw
prefix = 'diam'
amass(1) = 12.01078
outdir = './'
iverbosity = 3
elph = .true.
epbwrite = .true.
epbread = .false.
etf_mem = 0
vme = 'dipole'
epwwrite = .true.
epwread = .false.
nbndsub = 4
wannierize = .true.
num_iter = 300
iprint = 2
dis_win_max = 12
dis_froz_max= 7
proj(1) = 'f=0,0,0:l=-3'
elecselfen = .true.
nest_fn = .false.
phonselfen = .false.
a2f = .false.
fsthick = 15 ! eV
temps = 300 ! K (same as PRB 76, 165108)
degaussw = 1.0 ! eV
dvscf_dir = './save/'
nkf1 = 6
nkf2 = 6
nkf3 = 6
nqf1 = 6
nqf2 = 6
nqf3 = 6
nk1 = 3
nk2 = 3
nk3 = 3
nq1 = 3
nq2 = 3
nq3 = 3
/
nbndsub=4定义4个Wannier函数,proj给出初始sp3投影。nk1..3、nq1..3是已经计算的粗网格;nkf1..3、nqf1..3是插值后的细网格,含义不同。epbwrite和epwwrite分别保存粗Bloch空间和Wannier空间数据,方便后续复用。
六个阶段的终端顺序为:
mpirun -np 1 pw.x -input scf.in > scf-ph.out
mpirun -np 1 ph.x -input ph.in > ph.out
printf 'diam\n' | python3 prepare_epw_save.py
mpirun -np 1 pw.x -input scf_epw.in > scf-epw.out
mpirun -np 1 pw.x -input nscf_epw.in > nscf-epw.out
mpirun -np 1 epw.x -input epw1.in > epw-interpolation.out
这些计算命令应在已经分配的Slurm资源内执行。资料包已封装成:
sbatch job-base.slurm
squeue -u "$USER"
首阶段完成后:
sbatch job-post.slurm
后阶段完成后:
bash extract.sh
bash plot.sh work/analysis figures-new
脚本把工作文件放在work/,保留原输出;已存在未完成目录时会停止,先看日志再处理,避免覆盖。绘图使用现成Python分析环境;这不改变QE的编译环境。
6. 最后应该拿到什么#
| 结果 | 用途 |
|---|---|
work/diam.wout |
Wannier中心、展宽与局域化过程 |
work/diam_hr.dat |
实空间电子哈密顿量 |
work/diam.epb1 |
粗Bloch空间电子—声子数据 |
work/diam.epmatwp及*data.fmt |
Wannier空间重启与插值 |
work/post/epw4/band.eig、phband.freq |
路径电子能带、声子分支 |
work/linewidth.elself.300.000K |
逐模电子自能虚部 |
work/post/epw3/specfun* |
电子谱及自能频率表 |
work/analysis/*.csv、figures-new/ |
可继续处理的数据和图片 |
本次首阶段PW/PH计算约95秒、首次EPW约12.5秒,供判断本例量级;排队时间和机器负载另计。真实材料应重新检查电子/声子网格、空带、Wannier子空间、展宽与频率范围,不能只照抄这个最小测试参数。
输入含义可对照EPW官方输入说明;本包固定使用QE7.6随附源码的参数写法,较新的在线手册可能改名。