py4vasp专题

py4vasp 静态介电与Born电荷

用Si、NaCl和ZnS真实DFPT结果演示完整输入、可选重算、电子/离子介电响应及Born张量提取。

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

先用VASP求静态响应,再用py4vasp读取电子介电、离子贡献和Born有效电荷。这里提供Si、NaCl、ZnS三个两原子小体系的实际结果;NaCl用来展示非零Born电荷和电子/离子介电响应的差别。

1. 获取数据与选择操作#

下载py4vasp数据、输入与绘图实例包:

unzip py4vasp-quantities-wave151-*.zip -d py4vasp-examples
cd py4vasp-examples
bash run.sh list

后处理模块为 py4vasp/0.11.3,使用独立Python3.11环境;结构和静态图使用 ase/3.29.0 的Python3.11.16、NumPy2.3.5、Matplotlib3.11.2。只需已分配资源内1个CPU,不需要GPU。

bash run.sh 1    # 39个数据入口、版本和文件前提
bash run.sh 2    # 介电、Born、压电和内部应变
bash run.sh 3    # 电子收敛、带隙及CSV

也可以在新解压目录运行 bash run-all.sh,得到 analysis/ 与 figures/。另一份新目录运行 bash analyze.sh,结果写入 analysis-reference/、figures-reference/。这两条命令只处理已经提供的数据,不重新运行VASP。输出目录保护会拒绝覆盖已有结果。

8份输入包含两类实际计算:5份已有VASP6.6.1/P100 HDF5结果(NVHPC25.3、CUDA12.8),以及3份Si/NaCl/ZnS的CPU DFPT结果(vasp/6.6.1-8173m-hdf5,InteloneAPI2024.2、MPI/OpenMP、HDF51.14.6)。新CPU计算采用1个MPI进程×4个OpenMP线程;读取HDF5与计算平台分开,py4vasp本身不替代VASP求解。

2. 结构与采样先看清楚#

本篇NaCl固定原胞的常规晶格参数为5.7Å,原子顺序为Cl、Na。完整POSCAR:

Cl Na
 1.0000000000000000
     0.0000000000000000    2.8500000000000001    2.8500000000000001
     2.8500000000000001    0.0000000000000000    2.8500000000000001
     2.8500000000000001    2.8500000000000001    0.0000000000000000
 Cl  Na 
   1   1
Direct
 -0.5000000000000000  0.5000000000000000  0.5000000000000000
  0.0000000000000000  0.0000000000000000 -0.0000000000000000

共同KPOINTS:

Small response tutorial mesh; not a convergence study
0
Gamma
4 4 4
0 0 0

Si与ZnS的结构同样放在各自 inputs/名称/POSCAR。这些计算没有重新优化结构;正式研究先把基态结构、截断能和k网格准备好,再算响应。

三个实际响应计算原胞

3. 完整INCAR与关键标签#

SYSTEM = nacl-response
ENCUT = 550
PREC = Accurate
EDIFF = 1E-6
EDIFFG = -0.02
IBRION = 8
NSW = 1
ISIF = 2
ISMEAR = 0
SIGMA = 0.05
LREAL = .FALSE.
LASPH = .TRUE.
LWAVE = .FALSE.
LCHARG = .FALSE.
NELM = 150
ALGO = Normal
ISYM = 2
LORBIT = 11
NBANDS = 24
LH5 = .TRUE.
LEPSILON = .TRUE.
LRPA = .FALSE.
NPAR = 1

LEPSILON=.TRUE.计算静态离子钳制介电、Born与压电电子响应;IBRION=8同时给出振动/内部应变和相应离子贡献。LRPA=.FALSE.保留这里的DFT局域场处理。LH5=.TRUE.配合HDF5构建保存结果。

EDIFF=1E-6是电子阈值。这里的 EDIFFG=-0.02 沿用优化教程的力阈值,但本次 IBRION=8 是固定结构响应,并不会因为这个标签自动完成结构优化。NaCl、ZnS使用24条带,Si为16条带;本DFPT步骤不靠大量空带求和。

4. 可选:从输入实际重算#

若只学习读取,直接执行第1节的菜单2。需要重新求解时,先在已分配的至少4个CPU中准备你获授权使用的PBE64赝势,顺序必须与POSCAR一致。本集群对应文件的组合与本例一致:

cp /public/software/vasp/potcar/version64/PBE/Si/POTCAR inputs/si-response/POTCAR
cat /public/software/vasp/potcar/version64/PBE/Cl/POTCAR \
    /public/software/vasp/potcar/version64/PBE/Na/POTCAR > inputs/nacl-response/POTCAR
cat /public/software/vasp/potcar/version64/PBE/S/POTCAR \
    /public/software/vasp/potcar/version64/PBE/Zn/POTCAR > inputs/zns-response/POTCAR
bash run-native.sh
bash analyze-native.sh

它依次实际计算三个DFPT条件,原始结果写入 work/名称/,新结果分析写入 analysis-native/、figures-native/。包内 run.slurm 按CPU分区56核整节点规则申请,计算程序实际使用1MPI×4OpenMP;按账户资源提交。下载包不提供POTCAR或VASP程序。

5. 直接读取和导出#

module load py4vasp/0.11.3
python - <<'PYCODE'
import numpy as np
import py4vasp
c = py4vasp.Calculation.from_path("inputs/nacl-response")
eps = c.dielectric_tensor.read()
z = c.born_effective_charge.read()
print("method:", eps["method"])
print("electronic:", eps["clamped_ion"])
print("electronic + ionic:", eps["relaxed_ion"])
print("elements:", z["structure"]["elements"])
print(z["charge_tensors"])
np.savetxt("epsilon-electronic.csv", eps["clamped_ion"], delimiter=",")
np.savetxt("epsilon-total.csv", eps["relaxed_ion"], delimiter=",")
for i, tensor in enumerate(z["charge_tensors"], 1):
    np.savetxt(f"born-ion{i}.csv", tensor, delimiter=",")
PYCODE

clamped_ion为电子响应;relaxed_ion是电子加离子总响应,并不是单独的离子贡献。若需要离子项,用后者减去前者;independent_particle又是不同的局域场近似,不能混作总介电常数。

这里的relaxed-ion是线性响应意义上的离子可弛豫总响应,不表示脚本又做了一遍零场几何优化。

6. 本例实际读到的数值#

体系 电子介电对角值 电子+离子总对角值 按POSCAR顺序的Born各向同性分量
Si 23.836947 23.836947 Si: +0.000000;Si: -0.000000
NaCl 2.445408 7.026047 Cl: -1.104534;Na: +1.104534
ZnS 8.083465 12.962066 S: -2.407823;Zn: +2.407823

介电常数无量纲,Born张量单位为基本电荷绝对值 |e|。Born有效电荷是电场与原子位移的动态耦合,不是Bader电荷或直接的氧化数。本例立方对称使三个对角分量相等;一般材料不能只看一个对角数。

本次固定550eV、4×4×4,目的是演示完整操作。Si的23.836947尚未经过k网格收敛检验,不能作为推荐的材料介电常数;其他数值同样不作收敛材料参数。 在自己的材料上逐步加密k点和检查结构,直到目标张量稳定,再作物理比较。

电子与离子介电响应及Born电荷

7. 从哪里核对最终结果#

python - <<'PYCODE'
from pathlib import Path
text = Path("inputs/nacl-response/OUTCAR").read_text()
for key in ["MACROSCOPIC STATIC DIELECTRIC TENSOR", "BORN EFFECTIVE CHARGES"]:
    print(key, "last position:", text.rfind(key))
PYCODE

应查看OUTCAR最后的累计张量;stdout里各扰动方向的中间数字不等于最后的完整Born张量。配套 response/ 或 analysis/response/ 提供按单位区分的JSON结果,保留了实际原子顺序和完整矩阵。

方法与标签参考VASP LEPSILON说明;继续看压电与内部应变。

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

查看配图

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

100%查看原图 ↗