GPAW精确交换与非自洽分析
用单电子氢原子实际比较自洽EXX、LDA和非自洽EXX,说明能量参照、轨道能与输出提取。
阅读本篇目录
本例先计算一个自旋极化的氢原子,再对比自洽精确交换与基于LDA密度的非自洽EXX。体系只有一个电子,能用解析氢原子能量检查结果,适合先熟悉GPAW的交换计算接口。
1 下载、计算和画图#
下载精确交换实操包,保存为gpaw-exx.zip。新SCF应在已分配的CPU资源中运行;从登录节点提交时,解压后使用sbatch job.slurm,脚本会依次计算、核对和绘图。下面是在CPU资源中直接操作的步骤:
python3 -m zipfile -e gpaw-exx.zip .
cd gpaw-exact-exchange
bash setup.sh
bash run.sh
bash verify.sh
bash plot.sh
例程使用1 MPI进程、1线程。结果在results/VALIDATION.json,图片在plots/;再次运行相同设置会读取已有完整结果。若修改模型或程序,请保留旧结果,并换一个新的示例目录运行。
如果暂时只想查看本篇归档结果,先执行bash setup.sh,再运行:
bash plot.sh --reference
原图会重绘到reference-plots/,不会启动SCF。
2 实际输入与计算顺序#
完整程序是附件中的run.py。自洽EXX的关键输入为:
atoms = Atoms('H', magmoms=[1.0])
atoms.center(vacuum=5.0) # 实际10×10×10 Å盒
calc = GPAW(
mode=PW(600),
mixer={'backend': 'msr1'},
xc={'name': 'EXX', 'backend': 'pw'},
convergence={'energy': 1e-6, 'density': 1e-6,
'eigenstates': 1e-10},
maxiter=180, txt='H-EXX.txt'
)
atoms.calc = calc
energy = atoms.get_potential_energy() + calc.get_reference_energy()
magmoms=[1.0]指定单电子自旋状态。这里使用PW精确交换后端;不要把EXX理解成给已经收敛的PBE能量乘一个系数。比较解析原子总能时,还要加上GPAW的PAW原子参照能。
接着用相同盒与600 eV截断做LDA,再调用:
parts = non_self_consistent_energy(lda_calc, 'EXX')
nsc_energy = parts.sum() + lda_calc.get_reference_energy()
eig_lda, v_lda, v_exx = non_self_consistent_eigenvalues(
lda_calc, 'EXX', snapshot='H-EXX-nsc-snapshot.json'
)
nsc_eigenvalues = eig_lda - v_lda + v_exx
非自洽方法使用既有LDA轨道和密度,计算交换能或轨道修正;它不会自动把密度优化成自洽EXX密度。
3 本集群实际结果#
| 方法 | 含PAW参照的总能/eV |
|---|---|
| 解析氢原子参照 | −13.60569301 |
| 自洽EXX | −13.60518482 |
| LDA | −13.02748748 |
| LDA密度上的非自洽EXX | −13.57799958 |
自洽EXX与解析参照相差约0.508 meV;非自洽EXX与自洽EXX相差约0.02719 eV。它们分别回答“完全优化该方法”和“在已有密度上作近似修正”的问题。

自洽EXX占据自旋通道的轨道能为−13.57965 eV;对应非自洽值为−13.54925 eV。空自旋通道的两个结果差别明显,不能仅因总能接近,就认为所有空态也同样准确。这个例子不把空通道数值解释成氢原子的受束缚光学激发能。
4 终端提取结果#
source env.sh
"$YS_PY" - <<'PYCODE'
import json
from pathlib import Path
f = json.loads(Path('results/VALIDATION.json').read_text())
for key in ['EXX_total_with_PAW_reference_eV',
'LDA_total_with_PAW_reference_eV',
'NSC_EXX_total_with_reference_eV']:
print(key, f[key])
print('SCF spin eigenvalues:', f['EXX_eigenvalues_eV'])
print('NSC spin eigenvalues:', f['NSC_EXX_eigenvalues_eV'])
Path('hydrogen-exchange-summary.txt').write_text(
'\n'.join(f'{k}: {f[k]}' for k in
['EXX_total_with_PAW_reference_eV',
'NSC_EXX_total_with_reference_eV']) + '\n')
PYCODE
更换体系时,先检查盒、截断、空带和自旋态,再选择适合问题的泛函。本例只说明单电子小体系的接口与参照,不表示其他分子或晶体也已达到同样误差。
程序为GPAW 26.7.0 CPU构建,GCC 13.3、HPC-X/OpenMPI 5、MKL 2023.2、Libxc 7.0.0;PAW数据26.8.0与程序版本独立。接口依据GPAW精确交换说明。需要多体响应时可继续阅读GW与RPA接口和BSE光学响应。