ABACUS 专题

ABACUS Wannier插值与误差实操

真实2/4网格、61点直接能带、HR简并权重、55点原生路径与精度判断。

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

下载完整输入、赝势、原生结果与绘图脚本,解压进入附件根目录。先查看已有数据:

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坐标的原生能带与插值误差

两种接口网格的实际结果:

网格 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与非共线也需要匹配的接口设置。本例没有覆盖解纠缠、自旋轨道响应或输运系数。

能量比较始终保持同一原始零点;图上仅为阅读统一减去直接采样价带顶,未分别平移两条曲线来缩小误差。四条占据价带缺少导带,不能由本图推断基本带隙。

参阅Wannier90 HR文件说明与本例使用的参数。

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

查看配图

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

100%查看原图 ↗