ABACUS Wannier插值与误差实操
真实2/4网格、61点直接能带、HR简并权重、55点原生路径与精度判断。
阅读本篇目录
下载完整输入、赝势、原生结果与绘图脚本,解压进入附件根目录。先查看已有数据:
bash analyze.sh
图和表在reference/figures与reference/analysis。从头运行则在计算资源环境中提交:
sbatch submit.slurm
附件run.sh会先建立独立work目录,按前置SCF→后续计算顺序运行,再生成work/analysis与work/figures。已有work时请新解压一份,避免覆盖原结果。模板申请1张P100,SCF使用GPU,Berry/Wannier接口指定CPU;每步1个MPI进程、1个线程。接口阶段仍占所申请的资源,长批次可拆分提交。你也可以只选一个结构手动计算。
ABACUS为3.10.1,模块abacus/3.10.1-p100,GNU13.3、HPC-X2.50/OpenMPI5.0.10rc2环境;本模块CUDA12.8,接口CPU路径不代表GPU加速。独立Wannier90为4.0.3串行版,Intel2024.2构建,单独子环境运行,避免与ABACUS的MPI环境混装;后处理使用ASE3.29.0及NumPy。
1 直接能带与Wannier必须对同一个k坐标#
附件diamond-direct-bands使用同一个C2结构、相同SCF密度与4个价带,直接计算Γ–X–L–Γ。完整INPUT和KPT如下,STRU与接口教程完全相同:
INPUT_PARAMETERS
suffix tutorial
pseudo_dir ../../PP_ORB
orbital_dir ../../PP_ORB
ntype 1
basis_type pw
calculation nscf
ecutwfc 50
symmetry -1
device cpu
precision double
init_chg file
pw_diag_thr 1e-11
nbands 4
smearing_method fixed
out_chg 0
cal_force 0
cal_stress 0
out_band 1
K_POINTS
4
Line
0 0 0 20
0.5 0.5 0 20
0 0.5 0 20
0 0 0 1
三个线段各20个间隔,末点计入后共61点。Wannier90的bands_num_points = 20在本路径原生绘图中实际生成55点;两个软件的采样约定不同,不能仅按数组行号相减。本例直接在ABACUS的61个实际分数k坐标上计算Wannier本征值。
2 HR里的简并权重不能漏#
diamond_hr.dat给出实空间H(R)及每个R的简并权重d(R)。在本例use_ws_distance = false条件下:
H(k) = Σ_R H(R) exp(2π i k·R) / d(R)。
k与R使用互相配对的分数坐标/整数晶格平移,H用eV。H(k)应为厄米矩阵,再用eigvalsh取排序后的4个占据能级。附件analyze.py完整实现了读HR、简并权重、厄米检查和独立比较,无需另外安装可选接口库。

两种接口网格的实际结果:
| 网格 | k点数 | 61点×4价带 RMS / eV | 最大绝对误差 / eV |
|---|---|---|---|
| 2×2×2 | 8 | 0.861764 | 2.459743 |
| 4×4×4 | 64 | 0.110871 | 0.358644 |
4×4×4明显改善,但本例仍有约0.111eV的RMS误差,不能写成高精度插值。若目标性质要求更小误差,应继续加密接口网格、核对投影与所选子空间,并另做SCF网格收敛。本例两种接口网格共享同一4×4×4密度,仅比较接口插值,不代表SCF网格也已收敛。
3 先检查网格内重建,再检查网格外误差#
独立程序在接口网格上的HR本征值与原生EIG对照,也用Wannier原生55点路径重新计算,二者最大偏差均小于1×10⁻⁴eV,主要受HR文本有限小数影响。这两项说明文件读法和权重一致;61点直接DFT对照才检验网格之间的插值效果。
读取实际误差表:
python - <<'PY'
import csv
with open('reference/analysis/wannier-mesh-errors.csv') as f:
for r in csv.DictReader(f):
print(r['mesh'],r['RMS_eV'],r['maximum_error_eV'],
r['HR_onmesh_max_error_eV'],r['native_plot_max_error_eV'])
PY
再从原始能带数组独立重算RMS:
module load ase/3.29.0
python - <<'PY'
import numpy as np
with np.load('reference/analysis/bands.npz') as a:
for mesh in [2,4]:
d=a[f'E_mesh{mesh}_eV']-a['E_direct_eV']
print(mesh,'RMS/eV',np.sqrt(np.mean(d*d)),'max/eV',np.max(abs(d)))
PY
4 用于自己的材料时改哪里#
先改结构和匹配赝势,再确定占据/目标能带范围、投影中心与轨道、SCF和接口k网格,最后沿目标路径算直接能带。存在交叠导带时不能继续照抄本例4带占据模型,应设计外窗/冻结窗并检查子空间。SOC与非共线也需要匹配的接口设置。本例没有覆盖解纠缠、自旋轨道响应或输运系数。
能量比较始终保持同一原始零点;图上仅为阅读统一减去直接采样价带顶,未分别平移两条曲线来缩小误差。四条占据价带缺少导带,不能由本图推断基本带隙。