VTST格式转换:POSCAR、CON、XYZ与CIF
实际转换Si₈和NH₃结构,说明元素首行、晶胞、六位小数和CIF转换方向。
阅读本篇目录
结构能打开,不等于元素、晶胞和精度都完全保留。本篇用VTST1040的2con.py、con2xyz.py、xyz2con.py、pos2xyz.py和pos2cif.pl逐项演示。
1. 下载和准备#
下载完整输入、原生结果和绘图包,保存为example.zip:
python3 -m zipfile -e example.zip .
cd vtst-python-geometry-paths
bash results.sh
bash read.sh
bash plot.sh
这些命令直接读取随包实算结果;reference-results/存原生输出,data/存CSV,figures/存图片。read.sh和plot.sh默认使用集群ASE环境的Python,无需重新计算。自己的Python须安装NumPy、ASE和Matplotlib,可用YS_ANALYSIS_PYTHON指定解释器。
先按几何工具准备私有兼容副本:
py=/public/toolkit/miniconda3/envs/ase-3.29.0/bin/python
"$py" prepare.py
root="$PWD"
mkdir -p manual/convert
cp inputs/Si8-symbol-header.POSCAR manual/convert/POSCAR
cd manual/convert
本例是晶格常数5.43 Å的8原子Si立方常规胞,用于格式演示,不代表这里重新优化了Si晶格。
2. POSCAR转CON,再转XYZ#
"$py" "$root/compat-run.py" "$root/.private-scripts/2con.py" POSCAR model.con
"$py" "$root/compat-run.py" "$root/.private-scripts/con2xyz.py" model.con
head -n 12 model.con
head -n 12 model.xyz
这里的旧aselite.py从POSCAR首行注释判断元素,不能仅依赖VASP5元素行。因此随包Si8-symbol-header.POSCAR首行为Si;普通VASP可以读取的任意注释不一定被这个旧读取器接受。不要为兼容旧工具改变原子顺序或把多个元素写错。
CON保存盒子和坐标,但这一写入器只输出6位坐标小数。随包Si坐标恰好可用6位表示,实测转换坐标误差为0;任意分子坐标可能产生约5×10⁻⁷ Å舍入,不能因此认为所有转换都保持任意精度。
3. XYZ返回CON,要明确盒子#
"$py" "$root/compat-run.py" "$root/.private-scripts/xyz2con.py" model.xyz 5.43
cd "$root"
5.43明确指定立方盒边长,单位Å。普通XYZ只有元素和坐标,没有原来的周期晶胞或完整选择性约束。这里的Si输入最小坐标为0,转换没有额外平移。斜晶胞、各向异性盒子和跨边界结构要使用能保留这些信息的格式与工具。
4. NH₃直接写XYZ#
mkdir -p manual/xyz
cp inputs/POSCAR manual/xyz/POSCAR
cd manual/xyz
"$py" "$root/compat-run.py" "$root/.private-scripts/pos2xyz.py" POSCAR
cat POSCAR.xyz
cd "$root"
本例坐标得到保留,但XYZ不再带12 Å晶胞;导入可视化软件时应单独设置盒子。
5. 写CIF#
mkdir -p manual/cif
cp inputs/Si8.POSCAR manual/cif/POSCAR
cd manual/cif
export PERL5LIB=/public/software/vasp/vtstscripts/1040
perl /public/software/vasp/vtstscripts/1040/pos2cif.pl POSCAR
head -n 25 POSCAR.cif
cd "$root"
本例原生pos2cif.pl写出CIF,经独立ASE读回,原子坐标误差为0、体积不变。这里测试的是POSCAR→CIF。同一套旧脚本的反向cif2pos.pl可能改变晶胞手性,不把它作为任意晶体尤其手性结构的通用推荐;反向操作可用ASE并比较晶胞行列式、元素、体积和分数坐标。
"$py" - <<'PYCODE'
from ase.io import read, write
atoms = read('manual/cif/POSCAR.cif')
write('manual/cif/POSCAR.ase', atoms, format='vasp', direct=True, vasp5=True)
print('Volume / Angstrom^3:', atoms.get_volume())
PYCODE
该ASE命令是补充操作方式;随包VTST原生结果来自上面的正向转换。保留源文件,转换结果用于后续计算前再确认晶胞与边界条件。