GPUMDkit 建模、表面与点缺陷
用ASE搭建真实几何,再用GPUMDkit扩胞、转换和生成三种扰动。
阅读本篇目录
下载本组输入、真实参考输出与绘图脚本,解压后进入资料包根目录。所有示例在自己的新目录执行,inputs和reference保留。默认bash run.sh all只做工具处理;需要重新训练时才提交compute.sbatch。
第一步:用ASE生成基准结构#
GPUMDkit擅长格式处理和扰动;切面和删除原子交给配套ASE。两者在同一个模块环境使用。本篇仅生成待计算结构,不给新结构沿用旧能量、旧力标签。
module load gpumdkit/1.5.8
mkdir -p work/build
cd work/build
python - <<'ASE'
from ase.build import bulk, surface
from ase.io import write
si = bulk("Si", "diamond", a=5.43, cubic=True)
bulk64 = si.repeat((2, 2, 2))
vacancy = bulk64.copy()
del vacancy[0]
slab = surface(si, (1, 1, 1), 4, vacuum=15.0, periodic=True)
for name, atoms in [("bulk64", bulk64), ("vacancy63", vacancy),
("slab111", slab)]:
atoms.pbc = True
write(name + ".vasp", atoms, format="vasp", direct=True)
print(name, len(atoms), atoms.get_volume())
ASE
本次生成64原子体相、63原子单空位及32原子(111)表面。表面两侧各留15Å真空,z晶胞长度42.54005Å;VASP/POSCAR和本例模型仍用三维周期边界,以真空隔开周期副本。它不是已优化表面,也没有表面能或空位形成能。
第二步:转换和扩胞#
gpumdkit.sh -pos2exyz bulk64.vasp bulk64.xyz
gpumdkit.sh -pos2exyz vacancy63.vasp vacancy63.xyz
gpumdkit.sh -pos2exyz slab111.vasp slab111.xyz
gpumdkit.sh -replicate bulk64.vasp supercell.vasp 256
本次目标256原子对应1×2×2重复,实际晶胞10.86×21.72×21.72ų。目标原子数入口会选择整数重复因子;自己的结构应检查实际原子数和长宽比,不能把目标值当作一定满足的承诺。
python - <<'ASE'
from ase.io import read
for f in ["bulk64.xyz", "vacancy63.xyz", "slab111.xyz", "supercell.vasp"]:
a = read(f)
print(f, len(a), a.cell.lengths(), a.pbc)
ASE

第三步:同时扰动晶胞和原子#
回到资料包根目录,复制提供的2原子Si结构:
mkdir -p work/perturb-uniform
cp inputs/sampling/POSCAR work/perturb-uniform/
cd work/perturb-uniform
python "$GPUMDkit_path/Scripts/sample_structures/perturb_structure.py" \
POSCAR 3 0.01 0.02 uniform
依次表示3个结构、晶胞扰动参数0.01、原子位移参数0.02Å、uniform分布。工具输出POSCAR_*.vasp和perturb.txt。另外在新目录把最后参数改为normal和const,分别生成另两组;三种分布对位移参数的解释不同,normal参数不应当作绝对最大位移。
本次三个uniform结构体积为41.17608、41.15393、40.97620ų;基准为40.89273ų。三种分布的9个结构均保留Si元素和原子数,实际最短周期距离2.32714–2.38261Å。扰动是随机的,再运行会得到不同坐标。
需要纯晶胞应变或纯原子位移时,把另一个扰动参数设为0;先用小样本检查是否符合自己的采样意图。生成的新结构下一步送DFT单点计算,再按标签转换教程读取E/F/virial。不能把未计算扰动直接当作带DFT标签的训练集。