构建表面 Slab
本教程介绍如何使用 Miller 指数 slab 切割器,从体相晶体生成表面 slab。
前置条件
先加载一个体相晶体结构,例如 FCC Cu、BCC Fe 或钙钛矿的 CIF 文件。Slab 切割器适用于具有明确定义晶格的周期性结构。
打开 Slab 切割器
点击工具栏中的 Slab 按钮(剪刀图标),打开 Miller Slab Cutter Pane(Miller 指数 slab 切割面板)。该面板提供以下控制项:
- Miller 指数(h, k, l)
- Slab 厚度
- 真空层厚度
步骤 1:设置 Miller 指数
输入目标 Miller 指数,以定义表面取向:
| 表面 | Miller 指数 | 说明 |
|---|---|---|
| (001) | h=0, k=0, l=1 | 立方晶胞的顶面 |
| (110) | h=1, k=1, l=0 | 对角面 |
| (111) | h=1, k=1, l=1 | 体对角面;对 FCC 来说是密排面 |
Miller 指数会自动归一化,也就是除以最大公约数。至少一个指数必须非零。
步骤 2:调整厚度和真空层
- Thickness - Slab 的最小厚度,单位为 Angstrom。它控制包含多少原子层。
- Vacuum - 真空层厚度,单位为 Angstrom。它用于在表面计算中隔开 slab 的周期镜像。
常用取值:
- Slab 厚度:8-15 Angstrom,通常对应 3-6 层,具体取决于材料
- 真空层:10-20 Angstrom,通常足以避免周期镜像之间相互作用
步骤 3:预览切割
当你调整 Miller 指数时,切割平面可视化器会在结构上叠加半透明平面,显示表面将如何切割晶体。切割平面上下的原子会淡入/淡出,用于预览最终会包含哪些原子。
预览路径在 JavaScript 中运行,因此可以提供快速、实时的反馈。
步骤 4:应用 Slab
点击 Apply 生成最终 slab。该步骤会使用 Rust/WASM 后端完成精确的 slab 生成:
- 旋转体相晶格,使表面法向与 z 轴对齐
- 复制原子以填充目标厚度
- 沿 c 方向添加真空层
- 强制晶格为右手系: (a x b) . z > 0
- 相机会自动重置并与新晶格对齐
约定
- Slab 的 a 和 b 矢量位于表面平面内
- c 矢量沿表面法向,也就是垂直于 slab
- 始终强制右手系;如果旋转矩阵产生左手晶格,会自动反转 b 矢量并调整分数坐标
切割后的常见下一步
添加真空
如果切割后还需要调整真空层,可以使用工具栏中的 Vacuum Box 弹窗,在任意方向添加真空。
构建超胞
使用 Supercell 选择器在面内扩展 slab,例如使用 2x2x1 获得更大的表面积。
寻找吸附位点
打开 Adsorption Sites 面板,在表面上寻找高对称吸附位点:
- Atop - 位于表面原子正上方
- Bridge - 位于两个表面原子之间
- Hollow - 位于 3 个或更多表面原子的中心上方
位点会按与表面的共价半径距离放置,可作为吸附分子的初始位置。
冻结底层原子
选择底部几层原子,并将它们标记为 frozen,用于后续优化。这模拟了表面 DFT 计算中常见的体相约束。
两条代码路径
Slab 切割器有两套实现:
| 路径 | 用途 | 速度 | 精度 |
|---|---|---|---|
| JavaScript(预览) | 调整参数时的实时可视化 | 快 | 近似 |
| Rust/WASM(应用) | 最终 slab 生成 | 较慢 | 精确 |
预览路径在 TypeScript 中运行 generate_slab_pipeline(),用于即时反馈。应用路径调用 wasm_generate_slab() 得到最终结果。
故障排查
Slab 看起来被翻转或镜像了
Slab 切割器会强制右手系。如果初始旋转产生左手晶格,矢量会自动修正。如果结构仍然看起来不对,可以按 R 重置相机。
层数太少或太多
厚度参数是最小值;实际 slab 可能略厚,以包含完整原子层。调整 thickness 值即可增加或减少层数。
看不到切割平面
请确认结构具有定义好的晶格,也就是有周期性边界条件。Slab 切割器不适用于孤立分子。