GPAW专题

GPAW分子计算的泊松边界处理

用水分子比较普通边界、多极矩修正和扩展泊松网格,完整给出输入、提交、能量与偶极矩导出以及实际势场图片。

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

孤立分子使用非周期边界时,盒子边界仍会影响静电势。具有偶极矩的体系,可以尝试多极矩修正或单独扩大泊松方程的网格。本篇保持同一个水分子的几何和电子结构参数,实际比较六种条件,练习怎样设置、检查和导出结果。

这里的较大盒子是有限尺寸对照,并非已知的孤立极限。自己的体系仍应检查盒子、网格、基组以及所需物性的精度。

1 下载、提交和查看#

下载水分子泊松边界算例,保存为gpaw-poisson.zip。从登录节点运行时,解压后用sbatch job.slurm提交;已进入分配好的CPU资源时,可以依次执行:

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

程序使用1个MPI进程、1个线程,完成六组小体系自洽计算。结果在results/VALIDATION.json,原生输出和三维场在各条件子目录,图片在plots/。同样输入重复运行时会复用已完成结果;改变输入请在新目录运行。

2 先明确哪些网格被改变#

电子结构计算使用LCAO的dzp基组、PBE、非周期边界。原子位置固定,不做结构优化。小盒子为7.2×7.2×8.4 Å;较大盒子为12×12×13.2 Å。两个盒子的粗网格间距都为0.30 Å。

条件 电子结构粗网格 泊松方程处理
小盒普通边界 24×24×28 普通有限差分求解
大盒普通边界 40×40×44 普通有限差分求解
小盒mom4 24×24×28 前4个多极矩修正
小盒mom9 24×24×28 前9个多极矩修正
小盒extra128 24×24×28 扩展到128³细网格求解
小盒extra128,coarses=1 24×24×28 扩展细网格128³,粗化后在64³网格求解,并修正原小网格势

扩展泊松网格没有把LCAO计算盒子里的原子复制成超胞,也没有扩大电子波函数的计算盒子。它单独处理静电势边界。小盒子的原始细网格是48×48×56,实际密度和输出势场保存在这个网格上。

3 水分子输入和普通边界#

下面给出小盒子结构,O放在盒中心:

import numpy as np
from ase import Atoms
from gpaw import GPAW, FermiDirac, Mixer
from gpaw.poisson import PoissonSolver

cell = np.array([7.2, 7.2, 8.4])
positions = np.array([[0, 0, 0],
                      [0.7586, 0, 0.5043],
                      [-0.7586, 0, 0.5043]]) + cell / 2
atoms = Atoms('OH2', positions=positions, cell=cell, pbc=False)

calc = GPAW(
    legacy_gpaw=True, mode='lcao', basis='dzp', xc='PBE',
    gpts=(24, 24, 28), nbands=6, spinpol=False,
    symmetry='off', occupations=FermiDirac(0),
    poissonsolver=PoissonSolver('fd', eps=1e-12),
    mixer=Mixer(0.2, 5, 50),
    convergence={'energy': 1e-6, 'density': 1e-6,
                 'eigenstates': 1e-7},
    maxiter=200, txt='water.txt')
atoms.calc = calc
energy = atoms.get_potential_energy()
forces = atoms.get_forces()
dipole = calc.get_dipole_moment()  # e·Å

gpts明确指定网格点数,使两个盒子的网格间距保持一致。eps控制泊松方程求解容差,不等同于电子自洽的能量或密度收敛标准。

4 改用多极矩修正#

把上面的poissonsolver替换为:

from gpaw.poisson_moment import MomentCorrectionPoissonSolver

solver = MomentCorrectionPoissonSolver(
    poissonsolver=PoissonSolver('fd', eps=1e-12),
    moment_corrections=4)
# GPAW(..., poissonsolver=solver, ...)

4表示前4个多极矩,即单极和三个方向的偶极;它不表示4次自洽迭代。改成9还包括五个d型分量。本例两种条件均实际计算。

多极矩数越多,结果不一定在有限网格上单调接近某个有限盒子参考值。应比较目标物性的实际变化,而不是只看这个数字大小。

5 单独扩展泊松网格#

直接在128³扩展细网格求解:

from gpaw.poisson_extravacuum import ExtraVacuumPoissonSolver

solver = ExtraVacuumPoissonSolver(
    gpts=(128, 128, 128),
    poissonsolver_large=PoissonSolver('fd', eps=1e-12))

上面默认coarses=0,不传poissonsolver_small。要先粗化一档再求解,则使用:

solver = ExtraVacuumPoissonSolver(
    gpts=(128, 128, 128),
    poissonsolver_large=PoissonSolver('fd', eps=1e-12),
    coarses=1,
    poissonsolver_small=PoissonSolver('fd', eps=1e-12))

此时原生输出会显示64³的大网格求解,这是粗化后的实际网格。不要把它误读为输入中的128³没有生效。扩展网格必须容纳原细网格;更多粗化也需要满足网格与插值条件,不能只为省内存任意增大coarses。

6 集群实际结果#

下表能量差均相对于“大盒普通边界”,使用相同结构、泛函、基组和网格间距:

条件 总能/eV 能量差/meV z方向偶极矩/e·Å
小盒普通边界 −11.25306340 −8.771781 0.33930024
大盒普通边界 −11.24429162 0 0.33701302
小盒mom4 −11.24437825 −0.086633 0.33649973
小盒mom9 −11.24224473 2.046884 0.33635338
小盒extra128 −11.24269021 1.601405 0.33653543
小盒extra128,coarses=1 −11.24269288 1.598734 0.33653635

真实水分子能量与偶极矩边界对照

本例mom4的能量更接近较大盒子,mom9没有继续单调靠近。扩展网格直接求解与粗化一档的能量差约0.00000267 eV;这个数值属于本小模型和网格设置,不能直接推广到其他体系。

各条件保留了实际原子力。这里的水结构没有优化,所以不能把输出力大小当成已经满足结构优化的证据;有需要时应选择边界处理后再优化,并检查最终受力。

7 电子密度和静电势#

实际全电子密度与两种泊松边界处理引起的势场变化

左图是实际水分子全电子总密度,中、右图分别是小盒mom4和extra128相对于小盒普通边界的静电势变化,单位eV。三个图使用相同结构与截面;势场差来自完整同网格数组。密度色标下限以下统一显示为最低颜色,原始数组没有改写。

提取接口如下:

rho = calc.get_all_electron_density(gridrefinement=2)
potential = calc.get_electrostatic_potential()

本例全电子密度积分为10;PAW价电子占据和为8,因为O还包含冻结芯层电子。比较电子数时,需要区分全电子密度积分与价电子占据。

8 导出表格并重画图片#

source env.sh
"$YS_PY" - <<'PYCODE'
from pathlib import Path
import json, csv, numpy as np
r = Path('results')
v = json.loads((r / 'VALIDATION.json').read_text())
with open('water-poisson.csv', 'w', newline='') as f:
    w = csv.writer(f)
    w.writerow(['condition', 'energy_eV', 'dipole_z_e_A', 'AE_electrons'])
    for row in v['results']:
        w.writerow([row['name'], row['energy_eV'],
                    row['dipole_e_A'][2], row['AE_electrons']])
d = np.load(r / 'small-mom4/fields.npz')
print('Density shape:', d['AE_total_density_e_A3'].shape)
print('Potential shape:', d['electrostatic_potential_eV'].shape)
PYCODE

只重画附件自带参考结果:

bash setup.sh
bash plot.sh --reference
ls reference-plots

原始参考数组位于reference/,自己的计算数组位于results/;每组fields.npz保存密度、势、原子位置、晶胞、力、偶极矩和占据。附件不包含PAW数据集、GPW检查点或程序二进制。

9 环境与选择建议#

使用GPAW 26.7.0 legacy LCAO、Python 3.11.16,CPU构建采用GCC 13.3、HPC-X Open MPI 5.0.10rc2、MKL 2023.2和Libxc 7.0.0。setup.sh加载gpaw/26.7.0-8173m。

操作时先保留一个普通边界与较大盒子的对照,再比较多极矩或扩展网格;同时看能量、力和所需响应量。周期体系、表面偶极修正和带电体系还涉及各自边界约定,不能直接照搬本非周期中性分子设置。

接口参考:GPAW官方高级泊松求解器说明。

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

查看配图

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

100%查看原图 ↗