Hefei-NAMD能带选择与NAC
选择原始125至136能带,连续化相位,区分重叠差与1/fs耦合,并读取实际数据。
阅读本篇目录
本专题用鸢算科技集群实际计算的Si64轨迹、128个快照波函数和非绝热动力学,演示从准备文件到读取布居和画图的操作。原版为2024.05.21固定提交b7c8fc5,DEV为2023.03.29固定提交308d694;两者是代码快照日期,不是正式版本标签。原版使用ifort 2021.10 / Intel oneAPI 2023.2,DEV配套Intel MPI 2021.10与MKL 2023.2、AVX512。
下载完整输入、实际数值、8张图与操作脚本,保存为 hefei-namd.zip:
python3 -m zipfile -e hefei-namd.zip .
cd hefei-namd-silicon-practical-wave286
bash preview.sh
ls preview/figures
预览读取已有数值。希望自己运行原生后处理时,依次执行:
bash prepare.sh
bash calculate.sh
bash extract.sh
输入复制到 work/,原生结果也在其中,CSV与独立提取结果在 results/。本包的小型CPU后处理不重新运行VASP;实际DFT输入另放 inputs/DFT-inputs/,新的DFT需要自己的授权程序和势文件,并经Slurm提交。DEV需要支持AVX512的CPU,正式生产请申请相应CPU资源。
1 哪12条能带进入动力学#
每个实际VASP快照有160条能带。本例选择原始125至136,共12条;在精简NAMD输入里重新编号为1至12:
| 原VASP能带 | NAMD局部能带 | 本例角色 |
|---|---|---|
| 125–128 | 1–4 | 较低的所选态 |
| 129 | 5 | 所选较低导带态 |
| 130 | 6 | 本例初始电子态 |
| 131–136 | 7–12 | 其余所选态 |

图中以各轨迹原始128能带的时间平均为能量零点,便于看变化;不意味着这些本征值已做真空能级校准。局部窗口还应向上下扩展测试,不能把窗口边缘当成电子绝不会离开的物理边界。
2 先处理相邻波函数的任意相位#
本例对每条能带做连续U(1)相位选择,使相邻帧同带重叠的对角元接近实数正值。它不交换能带,也不把近简并子空间任意混合。原始及相位处理后的数据都作了比较。

四条轨迹最小同带对角重叠约0.94996,Gram白化后的12维子空间最小主重叠不低于0.9993588。前者检查逐带匹配,后者检查整个所选子空间,二者不能互相代替。更强的简并混合需另做子空间处理。
3 从自己的波函数生成文本#
将同一条轨迹的原始160带标准WAVECAR按 snapshots/01/WAVECAR至 32/WAVECAR放好:
module load hefei-namd/2024.05.21
python nac.py snapshots
ls nac-result
head -n 1 nac-result/EIGTXT
助手固定选择125–136、32帧、0.5 fs。本例读取条件为非自旋、单k点、标准复系数RTAG45200;不是Gamma压缩格式读取器,也没有处理SOC、任意多k点或PAW增广重叠。换体系前先修改并核对这些前提。
这里的 nac.py是随包的自有complex128数值助手。原版CoupIJ的系数求和使用较低精度;大平面波基组下需要特别注意求和误差。本例实际动力学统一使用与独立扩展精度求和相符的助手数据,不能把它称为原版直接输出。
下载包已有四条轨迹的自有耦合与本征值,可直接使用,不需要再次计算DFT:
head -n 1 inputs/double-NAC/Si64-300K-seed11/EIGTXT
wc -l inputs/double-NAC/Si64-300K-seed11/NATXT
python - <<'PY'
import numpy as np
a=np.load('reference/nac/Si64-300K-seed11.npz')
print(a['energies_eV'].shape, a['NAC_per_fs'].shape)
print('max |d_ij| /fs =', abs(a['NAC_per_fs']).max())
PY
4 NATXT到底写什么#
相邻归一化波函数重叠为 S_ij=<ψ_i(t)|ψ_j(t+Δt)>。此版本文本NATXT保存实数矩阵差 Re(S_ij−S_ji),每行12×12=144个数,共31行;EIGTXT也有31行、12列,存相应起始帧的eV本征值。完整32帧本征值在NPZ里。
**原生传播程序读取NATXT后再除以2Δt一次。**这里Δt=0.5 fs,2Δt数值恰好为1,容易掩盖重复相除的错误。若改时间步,不能把已除过时间的 NAC_per_fs重新写入NATXT再让程序除一次。
不要凭Fortran列主序就自行转置文本;本例保持当前程序实际使用的行列约定,并用独立TDSE求解对照传播。传播操作见下一篇FSSH。