2. 晶体结构建模与初始结构文件生成
为什么结构文件是 DFT 计算的“第一道关口”
DFT 计算的全部结果都建立在初始晶体结构之上。结构文件一旦出错——晶格常数写错、原子坐标分数/笛卡尔混用、空间群对称性丢失——后续无论截断能和 k 点设得多精细,得到的都是错误体系的能量。因此本案例的任务是:用晶体建模工具构建给定空间群的晶体结构,导出 DFT 软件可读的结构文件,并逐项核对原子坐标、晶格常数与对称性设置。
我们以纤锌矿结构 ZnO(空间群 P6₃mc,No. 186)为教学对象。它同时包含六方晶格、两套不等价原子位置和沿 c 轴的内坐标 u,是检验“晶格 + 分数坐标 + 对称性”三要素是否写对的理想样本。
结构参数与对称性约定
纤锌矿 ZnO 的晶格为六方,晶格常数 a = b ≠ c,夹角 α = β = 90°、γ = 120°。原子位置用分数坐标表示:
- Zn:位于 (1/3, 2/3, 0) 和 (2/3, 1/3, 1/2),即 Wyckoff 2b 位置;
- O:位于 (1/3, 2/3, u) 和 (2/3, 1/3, u+1/2),即 Wyckoff 2b 位置,u ≈ 0.375。
这里 u 是 O 原子沿 c 轴相对 Zn 层的偏移,是纤锌矿结构唯一可自由优化的内坐标。P6₃mc 的对称操作会把 (1/3, 2/3, z) 与 (2/3, 1/3, z+1/2) 关联起来,因此只需给出两个不等价原子,其余两个由对称性生成。教学示例参数取 a = 3.25 Å、c = 5.20 Å、u = 0.375(示例值,非实测)。
分数坐标与笛卡尔坐标的换算:对六方晶格,r = x·a₁ + y·a₂ + z·a₃,其中 a₁ = (a, 0, 0),a₂ = (−a/2, √3a/2, 0),a₃ = (0, 0, c)。导出文件前务必确认软件读取的是分数坐标还是笛卡尔坐标。
建模与导出流程
推荐用 ASE(Atomic Simulation Environment)以脚本方式建模,好处是参数可复现、可批量生成、便于版本管理。核心思路是:先定义六方晶胞,再按分数坐标放入 Zn 和 O,最后写出目标格式文件。
from ase import Atoms
from ase.io import write
a, c, u = 3.25, 5.20, 0.375 # 示例参数
cell = [[a, 0.0, 0.0],
[-a/2, a*3**0.5/2, 0.0],
[0.0, 0.0, c]]
# 分数坐标:Zn 2b + O 2b
frac = [(1/3, 2/3, 0.0), (2/3, 1/3, 0.5),
(1/3, 2/3, u), (2/3, 1/3, u + 0.5)]
symbols = ['Zn', 'Zn', 'O', 'O']
atoms = Atoms(symbols=symbols, scaled_positions=frac, cell=cell, pbc=True)
write('zno.vasp', atoms, format='vasp') # VASP POSCAR
write('zno.cif', atoms, format='cif') # 通用 CIF
print(atoms.get_spacegroup()) # 检查对称性识别结果
导出后必须做三项核对,缺一不可:
- 晶格常数:POSCAR 第二行的缩放因子与三行晶格矢量是否还原出 a、c 和 120° 夹角;
- 原子坐标:确认写出的坐标是分数坐标(Direct)而非笛卡尔坐标(Cartesian),且 Zn/O 顺序与 POTCAR 中元素顺序一致;
- 对称性:用
atoms.get_spacegroup()或外部工具重新识别,应返回 P6₃mc(No. 186),若返回 P1 说明对称性已丢失。
POSCAR 中元素顺序必须与 POTCAR 拼接顺序严格一致。若 POSCAR 为 Zn 在前、O 在后,而 POTCAR 按 O、Zn 拼接,VASP 会把 O 的赝势套到 Zn 上,计算能正常结束但结果完全错误——这是最隐蔽也最常见的结构文件事故。
结构文件三要素核对关系
下图把“建模输入 → 文件字段 → 核对判据”三者的对应关系集中呈现,便于导出后逐项比对。
常见错误与排查
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 空间群识别为 P1 | 分数坐标精度不足或原子位置被手动改动 | 提高坐标小数位,重新用 get_spacegroup() 识别 |
| 能量异常偏低/偏高 | POSCAR 与 POTCAR 元素顺序不一致 | 逐行核对元素行与 POTCAR 拼接顺序 |
| 晶胞体积错误 | 缩放因子与晶格矢量重复相乘 | 确认缩放因子为 1.0 或已正确折算 |
| 原子重叠报错 | u 值写错或分数/笛卡尔混用 | 检查 u 是否在 0.3–0.4 区间,坐标是否 ≤1 |
完成本案例后,你应能独立完成:给定空间群与晶格常数 → 写出分数坐标 → 导出 POSCAR/CIF → 用三项判据验证结构文件正确性。这是后续所有能量、能带、缺陷计算的前提。