GPAW专题

GPAW剪刀算符与分区能级修正

用两个氢分子的实际计算演示整体能级平移、占据与空态分开修正、原子区域修正,以及自洽和固定密度后处理的区别。

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

剪刀算符按用户给定的数值修正单粒子能级,例如把占据态下移、空态上移,或对不同原子区域施加不同平移。本篇用两个小氢分子,说明输入怎么写、修正后的谱怎样读取。

修正量是自己指定的模型参数,不是程序自动得到的GW准粒子修正。 先确认需要模拟的物理含义,再选择数值;不要把示例的±0.5 eV直接套用到实际材料。

1 下载与运行#

下载剪刀算符操作包,保存为gpaw-lcao-scissors.zip。普通作业可在解压目录执行sbatch job.slurm。已经分配好CPU资源时按顺序运行:

python3 -m zipfile -e gpaw-lcao-scissors.zip .
cd gpaw-lcao-scissors
bash setup.sh
bash run.sh
bash verify.sh
bash plot.sh

脚本用1个MPI进程、1个线程完成两组实际自洽:普通PBE,以及第一个H₂区域带剪刀修正的PBE;随后对每组密度做四种能级后处理。结果在results/,两张图片在plots/。

2 结构与自洽输入#

每个H₂键长0.74 Å,两个分子沿x相距4 Å,四周加3.5 Å真空。使用LCAO DZP、PBE、0.25 Å网格,4个价电子,自旋配对,不优化结构。

from ase import Atoms
from gpaw.new.ase_interface import GPAW

atoms = Atoms('H4', [[0, 0, 0], [0, 0, 0.74],
                    [4, 0, 0], [4, 0, 0.74]])
atoms.center(vacuum=3.5)
calc = GPAW(
    mode='lcao', basis='dzp', nbands='nao', h=0.25,
    xc='PBE', symmetry='off', spinpol=False,
    occupations={'name': 'fixed-uniform'},
    eigensolver={'name': 'scissors',
                 'shifts': [(-0.5, 0.5, 2)]},
    convergence={'energy': 1e-6, 'density': 1e-5,
                 'eigenstates': 1e-7},
    maxiter=200, txt='region-scissors.txt')
atoms.calc = calc
atoms.get_potential_energy()
calc.write('state.gpw', mode='all')

这里明确使用GPAW新后端。shifts中的一项是(占据态平移eV, 空态平移eV, 连续原子个数):(-0.5,0.5,2)作用于前两个原子,也就是第一个H₂;后面未指定的原子不加修正。

如果接着写第二项,它从下一批原子开始。例如[(0.2,0.2,2),(-0.2,-0.2,2)]表示第一个分子整体上移、第二个整体下移。原子计数按当前结构顺序,不能当作任意原子编号列表。

区域修正可能破坏原子间的对称映射。本例关闭对称性,避免程序把应当不同的区域视为等价。

3 固定密度后处理#

对已经自洽的计算,可以只重新构造和对角化修正后的哈密顿量,不再做SCF:

from gpaw.lcao.scissors import non_self_consistent_scissors_shift

levels = non_self_consistent_scissors_shift(
    [(-0.5, 0.5, 4)], calc.dft)
print(levels.shape)  # 自旋数、不可约k点数、带数
print(levels[0, 0])  # eV

本例的四种输入为:

名称 输入 含义
zero [] 当前密度的未修正哈密顿量
uniform [(0.2,0.2,4)] 全部4原子的能级整体上移0.2 eV
global-gap [(-0.5,0.5,4)] 完整体系的占据态下移0.5、空态上移0.5 eV
region [(-0.5,0.5,2)] 只对前两个原子区域加修正

区域的局域轨道与分子能级之间可以杂化,所以分区修正不是简单地把某几条能带机械移动±0.5 eV。

4 实际谱线#

下面取普通PBE密度,列出最低四个带,单位eV,编号从0开始;带0、1占据,2、3为空态:

带 未修正 整体+0.2 整体开隙 第一个H₂区域
0 −10.36089014 −10.16089014 −10.86089014 −10.83645840
1 −10.30945566 −10.10945566 −10.80945566 −10.33384249
2 2.10495603 2.30495603 2.60495603 2.22581608
3 2.45891313 2.65891313 2.95891313 2.83803474

整体修正前HOMO–LUMO差为12.41441169 eV,整体开隙后为13.41441169 eV。它只是这组LCAO能级的差,不能直接解释为氢分子的光学吸收峰或实验电离能。

两组实际自洽密度上的四种剪刀修正谱线

在带区域修正的自洽解上,原生自洽求解器的谱与同样区域参数的后处理谱一致;将后处理改成[]得到的是同一密度的未修正哈密顿量谱,不是“仍然保留原修正”。自洽与固定密度后处理也不能混称为同一个计算流程。

查看保存的谱:

python3 -c "import json; v=json.load(open('results/VALIDATION.json')); print([(r['name'],r['shifted']) for r in v['results']])"

实际氢分子区域示意及各带整体修正量

5 占据读取和输出文件#

附件读取原始占据的副本,再在副本上乘自旋简并因子。GPAW26.7.0这一接口版本中,默认加权占据读取可能原地改变后续计算使用的数组;在还要调用剪刀后处理时,按下面方式读取:

raw = calc.get_occupation_numbers(raw=True).copy()
weighted = raw * calc.dft.ibzwfs.spin_degeneracy

本例只有Γ点,k点权重为1。多k点时还要按实际k点权重求和,不能把这里的单k点写法直接用于所有体系。

source env.sh
python3 -c "import numpy as np; d=np.load('results/plain/fields.npz'); print('raw occupation sum:',d['raw_occupations'].sum()); print('weighted electrons:',d['weighted_occupations'].sum())"
ls -lh plots/scissors-eigenvalues.png plots/scissors-structure-shifts.png

输出包含原始/修正本征值、实际占据、赝密度、结构与JSON结果。原样复跑可用verify.sh;换体系后需要自己检查带数、区域顺序、占据与所选修正量。

6 适用范围#

本篇演示自洽区域修正和非自洽能级后处理,没有用修正后的总能量比较结构稳定性,也没有验证相应的原子力。需要GW、激子光谱或受激电子结构时,应选择相应方法,而不是仅靠剪刀参数给出结论。

环境为GPAW26.7.0新后端、GCC13.3、OpenMPI5.0.10rc2、MKL2023.2、Libxc7.0、Python3.11.16。该功能在GPAW原生说明中仍标为开发中的功能,实际使用应按所装版本核对接口。

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

查看配图

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

100%查看原图 ↗