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())                # 检查对称性识别结果

导出后必须做三项核对,缺一不可:

  1. 晶格常数:POSCAR 第二行的缩放因子与三行晶格矢量是否还原出 a、c 和 120° 夹角;
  2. 原子坐标:确认写出的坐标是分数坐标(Direct)而非笛卡尔坐标(Cartesian),且 Zn/O 顺序与 POTCAR 中元素顺序一致;
  3. 对称性:用 atoms.get_spacegroup() 或外部工具重新识别,应返回 P6₃mc(No. 186),若返回 P1 说明对称性已丢失。
POSCAR 中元素顺序必须与 POTCAR 拼接顺序严格一致。若 POSCAR 为 Zn 在前、O 在后,而 POTCAR 按 O、Zn 拼接,VASP 会把 O 的赝势套到 Zn 上,计算能正常结束但结果完全错误——这是最隐蔽也最常见的结构文件事故。

结构文件三要素核对关系

下图把“建模输入 → 文件字段 → 核对判据”三者的对应关系集中呈现,便于导出后逐项比对。

纤锌矿 ZnO 结构文件三要素核对 空间群 P6₃mc (No.186) | a=b=3.25 Å, c=5.20 Å, γ=120°, u=0.375(示例值) 建模输入 六方晶胞 a₁=(a,0,0) a₂=(−a/2,√3a/2,0), a₃=(0,0,c) 分数坐标 Zn: (1/3,2/3,0) (2/3,1/3,1/2) O : (1/3,2/3,u) (2/3,1/3,u+1/2) u = 0.375 对称性来源 P6₃mc 螺旋轴 6₃ 2 个不等价原子 → 4 个原子 导出格式 POSCAR (VASP) CIF (通用交换) 结构文件字段 缩放因子 + 晶格矢量 3.25 0 0 −1.625 2.8146 0 / 0 0 5.20 元素行 + 计数行 Zn O 2 2 顺序须与 POTCAR 一致 Direct 坐标块 0.3333 0.6667 0.0000 0.3333 0.6667 0.3750 … 对称性信息 CIF: _symmetry_space_group POSCAR: 由坐标隐式决定 核对判据 晶格常数还原 |a₁|=3.25, |a₃|=5.20 夹角 γ=120° ✓ 坐标类型与顺序 Direct 而非 Cartesian Zn/O 与 POTCAR 对齐 原子总数 = 4 对称性识别 get_spacegroup() → P6₃mc 返回 P1 = 对称性丢失 ✗ 物理合理性 Zn–O 键长 ≈ 1.98 Å 无原子重叠 ✓ 写入 比对

常见错误与排查

现象可能原因排查方法
空间群识别为 P1分数坐标精度不足或原子位置被手动改动提高坐标小数位,重新用 get_spacegroup() 识别
能量异常偏低/偏高POSCAR 与 POTCAR 元素顺序不一致逐行核对元素行与 POTCAR 拼接顺序
晶胞体积错误缩放因子与晶格矢量重复相乘确认缩放因子为 1.0 或已正确折算
原子重叠报错u 值写错或分数/笛卡尔混用检查 u 是否在 0.3–0.4 区间,坐标是否 ≤1
完成本案例后,你应能独立完成:给定空间群与晶格常数 → 写出分数坐标 → 导出 POSCAR/CIF → 用三项判据验证结构文件正确性。这是后续所有能量、能带、缺陷计算的前提。