ATOMKIT 结构编辑:固定、旋转、加原子与应变
用真实 Si、hBN 和水分子结构演示通用编辑操作,明确坐标、旋转和随机位移约定。
阅读本篇目录
本例使用 ATOMKIT 0.9.0 官方 Linux 预编译程序,属于 VASPKIT 团队的结构工具,与同名 Python 包不同。集群通过 module load atomkit/0.9.0 使用;二进制含 GCC 9.4 与 Intel Fortran 运行库标记,完整上游编译参数未公开,不能据此指定一套完整编译链。ASE 辅助操作使用集群 ASE 3.29.0。短小结构处理在个人目录执行,不会自动开始 VASP 等计算。
下载本篇共用结构、命令、数据与作图包。解压后进入 atomkit-menu-examples;原生错误文件保留用于比较,请先看对应限制再使用。
准备一个可直接操作的 Si 结构#
先进入资料包根目录。下面是完整的 8 原子常规胞:
module load atomkit/0.9.0
mkdir -p edit-demo
cd edit-demo
cat > POSCAR <<'EOF'
Si conventional cell, 8 atoms
1.0
5.43 0 0
0 5.43 0
0 0 5.43
Si
8
Direct
0.00 0.00 0.00
0.25 0.25 0.25
0.00 0.50 0.50
0.25 0.75 0.75
0.50 0.00 0.50
0.75 0.25 0.75
0.50 0.50 0.00
0.75 0.75 0.25
EOF
每个操作在单独目录做,避免后一个 POSCAR_REV.vasp 覆盖前一个。可直接运行 atomkit 按菜单输入;下面的命令只是把同样的按键保存下来。程序通常把新结果写到单独文件,不会自动替换你的源 POSCAR。
重定义晶胞:矩阵不是三个扩胞倍数#
printf '400
175 POSCAR
1 1 0
-1 1 0
0 0 1
175
' | atomkit
head -n 12 SUPERCELL.vasp
变换矩阵三行定义新晶格向量。行列式为 2,因此本例从 8 原子变为16原子;新胞长度约 7.67918、7.67918、5.43 Å,体积从 160.103007 增至 320.206014 ų。导出时程序可能把晶胞放到标准朝向,要比较晶胞度量及周期等价原子,不能要求所有笛卡尔坐标保持原来的方向。
如果只是 2×2×2 扩胞,用 401 更直接,见晶胞处理。
固定第一个原子#
printf '402
175 POSCAR
1
1
all
175
' | atomkit
head -n 14 POSCAR_FIX.vasp
依次选择按编号固定、原子 1、所有方向、VASP 输出。POSCAR_FIX.vasp 带 Selective dynamics,第一个原子为 F F F,其余保持可动。VASP 优化时还要选择合适的 IBRION、NSW、ISIF;这里只给位置加约束,并没有进行结构优化。
选择器也提供按层、按高度和 SELECTED_ATOMS_LIST 文件选择;可先交互运行查看编号与单位。原子编号从1开始,导出后若发生排序,不能把旧编号直接当新编号。
交换轴、按方向排序和坐标转换#
每条命令在各自目录执行:
# 405:交换 a、b 轴
printf '405
175 POSCAR
1
175
' | atomkit
# 406:沿 z,按升序排列原子
printf '406
3
1
175 POSCAR
175
' | atomkit
# 412:分数坐标转换成笛卡尔坐标
printf '412
175 POSCAR
175
' | atomkit
406 的方向/升降序先于读入文件,与 405 的提问次序不同。Si8 沿 z 排序后高度为 0,0,1.3575,1.3575,2.715,2.715,4.0725,4.0725 Å。412 保持几何不变,输出 Cartesian;反向转换时也应查看输出坐标标记,不能只改 Direct/Cartesian 文字。
旋转晶胞与旋转指定原子要分清#
晶胞整体绕 z 轴旋转:
printf '407
0 0 90
175 POSCAR
175
' | atomkit
输入的三个角度分别绕 x/y/z。此例得到 a=(0,5.43,0)、b=(-5.43,0,0),分数坐标保持,晶胞和原子整体旋转。
只旋转所选原子时,先使用资料包的水分子:
cp ../inputs/POSCAR-water POSCAR
printf '408
175 POSCAR
1
all
3
90
175
' | atomkit
选择全部原子、z轴、90°。本版这一分支实际表现为围绕盒中心顺时针90°,不同于上一条晶胞旋转的正角方向;水分子内部距离保持。图中画的是这个实际结果。希望指定旋转轴穿过某点时,用菜单提供的第4项交互输入;不要把这个盒中心例子的坐标直接套到吸附结构。

添加一个 Ge 原子#
回到 Si8 源结构,并单独运行:
printf '409
175 POSCAR
1
Ge 0.5 0.5 0.5
175
' | atomkit
head -n 12 POSCAR_REV.vasp
1 选择分数坐标,结果为 Ge1Si8,共9原子,新 Ge 在 (2.715,2.715,2.715) Å。本例只是演示加原子,没有能量/缺陷形成能结论。程序可能重新排列元素,后续必须按新 POSCAR 元素顺序准备 POTCAR。
移动、删除、替换和跨结构复制对应403/404/410/411,已有空位与替位及界面拼接实际例子。
元素重排的可靠办法#
本次在 hBN 输入 413→N B,VASP 导出仍是 B、N。若确实需要 N 在前,明确用 ASE 重排,并检查输出:
/public/toolkit/miniconda3/envs/ase-3.29.0/bin/python - <<'PYCODE'
from ase.io import read, write
a = read('inputs/POSCAR-hBN', format='vasp')
order = [i for s in ['N','B'] for i,x in enumerate(a.get_chemical_symbols()) if x == s]
write('hBN-N-first.vasp', a[order], format='vasp', direct=True, sort=False)
print(read('hBN-N-first.vasp').get_chemical_symbols())
PYCODE
应得到 ['N','B']。不要拿未重排成功的 B、N POSCAR 配上 N、B 的 POTCAR。
随机位移和镜面反射#
# 在 Si8 源结构目录中,选择全部原子,各分量上限0.05 Å。
printf '414
175 POSCAR
1
all
0.05
175
' | atomkit
# 在 hBN 源结构目录中,关于XY平面反射。
printf '415
1
175 POSCAR
175
' | atomkit
414 本例各位移分量在0到0.05 Å之间,因此位移矢量长度可以大于0.05 Å;观察到的位移不以零为均值。它适合破坏对称性,不等同于指定温度的热平衡位移,也不是声子振幅。若需要零均值可复现扰动,应明确用带固定 seed 的对称随机数,并消除整体平移;资料包 alternatives/Si-zero-mean-displacements.vasp 给出独立构造的例子。
415 的反射可在周期胞中折回:本例 hBN 原先 z=14 Å,XY 反射后 z=6 Å,与−14 Å周期等价。几何镜像本身不表示新的弛豫构型。
一次生成三份应变结构#
cat > INPUT.in <<'EOF'
1
3D
3
-0.01 0.00 0.01
1.0 0.0 0.0 0.0 0.0 0.0
EOF
printf '416
175 POSCAR
175
' | atomkit
ls strain_*.vasp
1 生成结构,3D 表示体相,第三行是真实应变数目;下一行必须有同样数量的应变值。最后六项依次为 xx、yy、zz、yz、xz、xy 的分量模式,本例只做 xx。
得到 x 长度 5.3757、5.43、5.4843 Å,y/z不变,分数坐标不变。这里只演示无剪切的小应变输入,不从该命令推断剪切分量约定。要算弹性常数还要逐个做应力/能量计算和方法收敛检查,不能把本图的体积曲线当成弹性模量。
资料包的 bash run.sh strain-series 可在新 work 目录生成这些结构;Atomkit-edit-examples.csv 列出实际原子数、体积和处理结果。