ABACUS 到独立Wannier90实操
C2占据价带的完整win、接口文件传递、独立环境、中心与展宽。
阅读本篇目录
下载完整输入、赝势、原生结果与绘图脚本,解压进入附件根目录。先查看已有数据:
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 先明确要拟合的能带范围#
本例是2原子金刚石C,4个占据价带、4个Wannier函数;不包含导带,因此不能从这个模型读取CBM、带隙或光学跃迁。分别使用2×2×2与4×4×4接口网格,同用4×4×4 SCF密度,比较插值误差。
完整结构与SCF输入:
ATOMIC_SPECIES
C 12.011 C.pz-vbc.UPF
LATTICE_CONSTANT
6.74
LATTICE_VECTORS
-0.5 0.0 0.5
0.0 0.5 0.5
-0.5 0.5 0.0
ATOMIC_POSITIONS
Direct
C
0.0
2
0.875 0.875 0.875 0 0 0
0.125 0.125 0.125 0 0 0
INPUT_PARAMETERS
pseudo_dir ../../PP_ORB
orbital_dir ../../PP_ORB
ntype 1
ecutwfc 50
calculation scf
scf_thr 1e-6
out_chg 1
device gpu
ks_solver cg
suffix tutorial
scf_nmax 200
precision double
symmetry 1
cal_force 0
cal_stress 0
out_bandgap 1
nbands 8
dft_functional pz
K_POINTS
0
Gamma
4 4 4 0 0 0
本例为C的LDA赝势,晶格常数6.74Bohr。STRU使用非标准排列的fcc原胞;Wannier90的晶胞向量必须与它逐项对应,不能拿经过可视化软件旋转后的晶胞直接替换。
2 准备diamond.win和均匀k网格#
4×4×4输入如下。num_wann = 4与num_bands = 4限定占据子空间,四个s型投影中心放在键中心。这里没有做外窗/冻结窗解纠缠。
num_wann = 4
num_bands = 4
num_iter = 200
conv_tol = 1.0e-10
conv_window = 5
write_hr = true
write_u_matrices = true
use_ws_distance = false
bands_plot = true
bands_num_points = 20
wannier_plot = false
begin atoms_frac
C -0.125 -0.125 -0.125
C 0.125 0.125 0.125
end atoms_frac
begin projections
f=0,0,0:s
f=0,0,0.5:s
f=0,0.5,0:s
f=0.5,0,0:s
end projections
begin unit_cell_cart
-1.783327200733 0.000000000000 1.783327200733
0.000000000000 1.783327200733 1.783327200733
-1.783327200733 1.783327200733 0.000000000000
end unit_cell_cart
mp_grid = 4 4 4
begin kpoints
0.000000000000 0.000000000000 0.000000000000
0.250000000000 0.000000000000 0.000000000000
0.500000000000 0.000000000000 0.000000000000
0.750000000000 0.000000000000 0.000000000000
0.000000000000 0.250000000000 0.000000000000
0.250000000000 0.250000000000 0.000000000000
0.500000000000 0.250000000000 0.000000000000
0.750000000000 0.250000000000 0.000000000000
0.000000000000 0.500000000000 0.000000000000
0.250000000000 0.500000000000 0.000000000000
0.500000000000 0.500000000000 0.000000000000
0.750000000000 0.500000000000 0.000000000000
0.000000000000 0.750000000000 0.000000000000
0.250000000000 0.750000000000 0.000000000000
0.500000000000 0.750000000000 0.000000000000
0.750000000000 0.750000000000 0.000000000000
0.000000000000 0.000000000000 0.250000000000
0.250000000000 0.000000000000 0.250000000000
0.500000000000 0.000000000000 0.250000000000
0.750000000000 0.000000000000 0.250000000000
0.000000000000 0.250000000000 0.250000000000
0.250000000000 0.250000000000 0.250000000000
0.500000000000 0.250000000000 0.250000000000
0.750000000000 0.250000000000 0.250000000000
0.000000000000 0.500000000000 0.250000000000
0.250000000000 0.500000000000 0.250000000000
0.500000000000 0.500000000000 0.250000000000
0.750000000000 0.500000000000 0.250000000000
0.000000000000 0.750000000000 0.250000000000
0.250000000000 0.750000000000 0.250000000000
0.500000000000 0.750000000000 0.250000000000
0.750000000000 0.750000000000 0.250000000000
0.000000000000 0.000000000000 0.500000000000
0.250000000000 0.000000000000 0.500000000000
0.500000000000 0.000000000000 0.500000000000
0.750000000000 0.000000000000 0.500000000000
0.000000000000 0.250000000000 0.500000000000
0.250000000000 0.250000000000 0.500000000000
0.500000000000 0.250000000000 0.500000000000
0.750000000000 0.250000000000 0.500000000000
0.000000000000 0.500000000000 0.500000000000
0.250000000000 0.500000000000 0.500000000000
0.500000000000 0.500000000000 0.500000000000
0.750000000000 0.500000000000 0.500000000000
0.000000000000 0.750000000000 0.500000000000
0.250000000000 0.750000000000 0.500000000000
0.500000000000 0.750000000000 0.500000000000
0.750000000000 0.750000000000 0.500000000000
0.000000000000 0.000000000000 0.750000000000
0.250000000000 0.000000000000 0.750000000000
0.500000000000 0.000000000000 0.750000000000
0.750000000000 0.000000000000 0.750000000000
0.000000000000 0.250000000000 0.750000000000
0.250000000000 0.250000000000 0.750000000000
0.500000000000 0.250000000000 0.750000000000
0.750000000000 0.250000000000 0.750000000000
0.000000000000 0.500000000000 0.750000000000
0.250000000000 0.500000000000 0.750000000000
0.500000000000 0.500000000000 0.750000000000
0.750000000000 0.500000000000 0.750000000000
0.000000000000 0.750000000000 0.750000000000
0.250000000000 0.750000000000 0.750000000000
0.500000000000 0.750000000000 0.750000000000
0.750000000000 0.750000000000 0.750000000000
end kpoints
begin kpoint_path
G 0 0 0 X 0.5 0.5 0
X 0.5 0.5 0 L 0 0.5 0
L 0 0.5 0 G 0 0 0
end kpoint_path
write_hr = true输出实空间哈密顿量,write_u_matrices = true输出最终变换矩阵。这里明确设use_ws_distance = false,便于按HR文件的简并权重直接独立重建H(k);采用其他距离约定时应同时处理所需平移信息。
接口完整INPUT和KPT如下,KPT为全均匀网格,顺序必须与win一致:
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
towannier90 1
nnkpfile diamond.nnkp
out_wannier_unk 0
out_chg 0
cal_force 0
cal_stress 0
K_POINTS
64
Direct
0.000000000000 0.000000000000 0.000000000000 0.015625000000
0.250000000000 0.000000000000 0.000000000000 0.015625000000
0.500000000000 0.000000000000 0.000000000000 0.015625000000
0.750000000000 0.000000000000 0.000000000000 0.015625000000
0.000000000000 0.250000000000 0.000000000000 0.015625000000
0.250000000000 0.250000000000 0.000000000000 0.015625000000
0.500000000000 0.250000000000 0.000000000000 0.015625000000
0.750000000000 0.250000000000 0.000000000000 0.015625000000
0.000000000000 0.500000000000 0.000000000000 0.015625000000
0.250000000000 0.500000000000 0.000000000000 0.015625000000
0.500000000000 0.500000000000 0.000000000000 0.015625000000
0.750000000000 0.500000000000 0.000000000000 0.015625000000
0.000000000000 0.750000000000 0.000000000000 0.015625000000
0.250000000000 0.750000000000 0.000000000000 0.015625000000
0.500000000000 0.750000000000 0.000000000000 0.015625000000
0.750000000000 0.750000000000 0.000000000000 0.015625000000
0.000000000000 0.000000000000 0.250000000000 0.015625000000
0.250000000000 0.000000000000 0.250000000000 0.015625000000
0.500000000000 0.000000000000 0.250000000000 0.015625000000
0.750000000000 0.000000000000 0.250000000000 0.015625000000
0.000000000000 0.250000000000 0.250000000000 0.015625000000
0.250000000000 0.250000000000 0.250000000000 0.015625000000
0.500000000000 0.250000000000 0.250000000000 0.015625000000
0.750000000000 0.250000000000 0.250000000000 0.015625000000
0.000000000000 0.500000000000 0.250000000000 0.015625000000
0.250000000000 0.500000000000 0.250000000000 0.015625000000
0.500000000000 0.500000000000 0.250000000000 0.015625000000
0.750000000000 0.500000000000 0.250000000000 0.015625000000
0.000000000000 0.750000000000 0.250000000000 0.015625000000
0.250000000000 0.750000000000 0.250000000000 0.015625000000
0.500000000000 0.750000000000 0.250000000000 0.015625000000
0.750000000000 0.750000000000 0.250000000000 0.015625000000
0.000000000000 0.000000000000 0.500000000000 0.015625000000
0.250000000000 0.000000000000 0.500000000000 0.015625000000
0.500000000000 0.000000000000 0.500000000000 0.015625000000
0.750000000000 0.000000000000 0.500000000000 0.015625000000
0.000000000000 0.250000000000 0.500000000000 0.015625000000
0.250000000000 0.250000000000 0.500000000000 0.015625000000
0.500000000000 0.250000000000 0.500000000000 0.015625000000
0.750000000000 0.250000000000 0.500000000000 0.015625000000
0.000000000000 0.500000000000 0.500000000000 0.015625000000
0.250000000000 0.500000000000 0.500000000000 0.015625000000
0.500000000000 0.500000000000 0.500000000000 0.015625000000
0.750000000000 0.500000000000 0.500000000000 0.015625000000
0.000000000000 0.750000000000 0.500000000000 0.015625000000
0.250000000000 0.750000000000 0.500000000000 0.015625000000
0.500000000000 0.750000000000 0.500000000000 0.015625000000
0.750000000000 0.750000000000 0.500000000000 0.015625000000
0.000000000000 0.000000000000 0.750000000000 0.015625000000
0.250000000000 0.000000000000 0.750000000000 0.015625000000
0.500000000000 0.000000000000 0.750000000000 0.015625000000
0.750000000000 0.000000000000 0.750000000000 0.015625000000
0.000000000000 0.250000000000 0.750000000000 0.015625000000
0.250000000000 0.250000000000 0.750000000000 0.015625000000
0.500000000000 0.250000000000 0.750000000000 0.015625000000
0.750000000000 0.250000000000 0.750000000000 0.015625000000
0.000000000000 0.500000000000 0.750000000000 0.015625000000
0.250000000000 0.500000000000 0.750000000000 0.015625000000
0.500000000000 0.500000000000 0.750000000000 0.015625000000
0.750000000000 0.500000000000 0.750000000000 0.015625000000
0.000000000000 0.750000000000 0.750000000000 0.015625000000
0.250000000000 0.750000000000 0.750000000000 0.015625000000
0.500000000000 0.750000000000 0.750000000000 0.015625000000
0.750000000000 0.750000000000 0.750000000000 0.015625000000
3 预处理→ABACUS接口→独立Wannier90#
前置diamond-scf完成后,在附件根目录执行:
cd work/cases/diamond-wannier4
(module purge; module load wannier90/4.0.3-serial; wannier90.x -pp diamond)
mkdir -p OUT.tutorial
cp ../diamond-scf/OUT.tutorial/SPIN1_CHG.cube OUT.tutorial/
module purge
module load abacus/3.10.1-p100
mpirun -np 1 abacus > interface.log
cp OUT.tutorial/diamond.amn OUT.tutorial/diamond.mmn OUT.tutorial/diamond.eig .
(module purge; module load wannier90/4.0.3-serial; wannier90.x diamond)
-pp先读win生成nnkp,ABACUS再写接口数据。注意:ABACUS把diamond.amn/mmn/eig写在OUT.tutorial,独立Wannier90则在当前目录找这些文件,所以中间那条cp不能省略。子括号中的模块环境随子进程结束,ABACUS与Intel构建的Wannier90各用各的环境。
三个文件分别是:AMN初始投影、MMN相邻k点的波函数重叠、EIG本征值。MMN不是每一块都必须酉,AMN也不要求每个投影都恰好归一;最终占据子空间变换U才检查U†U≈I。
4 查看原生收敛、中心和展宽#
查看diamond.wout最后的Final State、四个中心与展宽、Omega Total,并确认正常结束。本例4×4×4最终总展宽2.657728391Ų。小展宽说明局域化程度,不保证任意k点插值都足够准。

图中叉号仅是原生中心的位置标记,没有计算波函数实空间等值面。中心可相差一个周期平移,所以比较位置时需考虑晶格等价性。
python - <<'PY'
import json
with open('reference/analysis/RESULTS.json') as f:
a=json.load(f)
for r in a['wannier']:
print(r['mesh'],r['total_spread_A2'],r['U_unitarity_error'])
PY
接着看独立插值与误差实操,用相同k坐标的ABACUS直接能带决定网格是否够用。