分层堆叠(Layer Copy)
Group: Structure | Class: LayerCopyCard
这张卡做什么
Layer Copy 把完整输入结构沿笛卡尔 z 方向平移复制,合并成一个多层结构。复制前还可以用 dz=f(x,y,z) 对选定原子施加一次 z 向形变;所有副本使用同一份形变结果,因此波纹同相,不会为每层随机生成不同形状。
它适合从一个已经定向到 xy 平面的单层 slab 构造同质双层或多层初态。它不是普通三维扩胞,也不能把两种不同材料自动拼成异质结。
默认设置是平整双层:不施加形变,复制平移量为 3.35 Å,并沿 z 扩展晶胞。
先理解“副本平移量”
distance 是相邻副本对应原子之间的原点到原点平移量,不是两层外表面之间的真空间隙。
若输入 slab 的 z 向厚度为 (t),相邻层的表面间隙近似为:
[ g = d - t ]
其中 (d) 是 distance。例如,MoS₂ 单层本身有厚度,若希望得到合理的层间表面间隙,不能直接把该间隙填入 distance,而应使用完整的层间重复距离。
卡片不会自动判断原子是否重叠,也不会弛豫层间距。生成后应继续用 Geometry Filter 检查过短距离,并在 DFT 或分子动力学前进行合理弛豫。
常用工作流
平整双层
输入一个法向沿笛卡尔 z 的单层 slab。
总层数设为 2。副本沿 z 平移量填入材料的层间重复距离。保持
沿笛卡尔 z 扩展晶胞开启。保持可选表面形变折叠。
输出只包含一个结构,其中原子数为输入的 2 倍。
给每层施加相同波纹
展开
显示可选表面形变设置。选择二维正弦波纹,或填写表达式:
A*(sin(2*pi*x/Lx) + sin(2*pi*y/Ly))
参数填写:
A=0.2, Lx=10, Ly=10
用“形变哪些原子”限制形变范围;注意这只限制形变,复制时仍会复制全部原子。
查看卡片底部预览,确认选中原子数、位移范围、输出原子数和晶胞长度。
这里 A 的单位是 Å,Lx 和 Ly 是波长,单位也是 Å。
Parameters
堆叠参数
总层数(layers)
int,默认 2,必须至少为 1。总层数包含原始层:
1:只保留一份结构,可用于仅施加表面形变。
2:原始层加一个副本。
3:原始层加两个副本。
输出原子数为“输入原子数 × 总层数”。
副本沿 z 平移量(distance)
float,默认 3.35 Å。相邻完整副本沿笛卡尔 z 的平移量。总层数大于 1 时必须为正数。
第 (k) 层相对第一层的平移量为:
[ \Delta z_k = k d,\qquad k=0,1,\ldots,L-1 ]
沿笛卡尔 z 扩展晶胞(extend_cell_z)
bool,默认 true。开启后,卡片把下面的长度加到第三条晶格矢量的 z 分量:
[ (L-1)d + v ]
其中 (v) 是 extra_vacuum。a、b 晶格矢量和第三条晶格矢量的 x、y 分量不变。
该选项不会重新居中原子。输入 slab 最好已经采用“层面在 xy 平面、法向沿 z”的常见定向。
额外顶部真空(extra_vacuum)
float,默认 0 Å,必须非负。仅在扩展晶胞开启时生效,增加到堆叠结构顶部。即使 layers=1,也可以用它增加 z 向晶胞长度。
折回最终周期晶胞(wrap)
bool,默认 false。开启后,所有复制和形变完成后才把周期方向上的坐标折回最终晶胞。折回需要非奇异晶胞。
通常建议先保持关闭并检查几何;如果扩胞关闭,折回可能把位于盒外的副本折到已有原子附近。
可选表面形变
z 位移表达式(dz_expr)
str,默认 0,结果单位为 Å。表达式按输入结构的笛卡尔坐标计算,可使用:
坐标与常数:
x、y、z、pi、e函数:
sin、cos、tan、arcsin、arccos、arctansinh、cosh、tanh、exp、log、log10、sqrtabs、floor、ceil、round、where、clip、min、max
表达式经过语法白名单检查,不能访问 Python 内置对象、属性或任意函数。
表达式参数(expression_params)
str,默认空。按 name=value 定义表达式中的标量,例如:
A=0.2, Lx=10, Ly=10
参数可以引用前面已经定义的参数以及 pi、e。
形变哪些原子(apply_mode)
int,默认 0:
Value |
界面选项 |
形变范围 |
|---|---|---|
0 |
全部原子 |
所有输入原子 |
1 |
指定元素 |
|
2 |
笛卡尔 z 范围 |
z 坐标位于 |
这个参数只控制 z 形变范围。无论选择哪种模式,后续每层都会复制完整输入结构。
指定元素(elements)
str,仅 apply_mode=1 时使用。支持逗号或空格分隔,例如 S, Se。
笛卡尔 z 范围(z_range)
tuple[float, float],仅 apply_mode=2 时使用,单位 Å。上下限写反时会自动交换。
配置示例
平整双层
{
"class": "LayerCopyCard",
"check_state": true,
"params": {
"preset_index": 1,
"dz_expr": "0",
"expression_params": "",
"apply_mode": 0,
"elements": "",
"z_range": [-1000000.0, 1000000.0],
"wrap": false,
"extend_cell_z": true,
"extra_vacuum": 0.0,
"layers": 2,
"distance": 6.5
}
}
只让表面 S 原子起伏
{
"class": "LayerCopyCard",
"check_state": true,
"params": {
"preset_index": 2,
"dz_expr": "A*(sin(2*pi*x/Lx) + sin(2*pi*y/Ly))",
"expression_params": "A=0.2, Lx=10, Ly=10",
"apply_mode": 1,
"elements": "S",
"z_range": [-1000000.0, 1000000.0],
"wrap": false,
"extend_cell_z": true,
"extra_vacuum": 5.0,
"layers": 3,
"distance": 6.5
}
}
Recommended combinations
Super Cell → Layer Copy:先扩大面内尺寸,再沿 z 堆叠。Layer Copy → Geometry Filter:检查复制后是否出现过短原子间距。Layer Copy → Atomic Perturb:在规则堆叠基础上加入局域热扰动。
Common questions
为什么填了 3 Å,层间却重叠?
因为 3 Å 是完整副本的平移量,不是表面间隙。应把输入层厚度计入,使用层间重复距离。
为什么只选择了 S,输出仍复制了 Mo?
元素选择只限制表面形变。每一层始终复制完整结构,否则会破坏原层的化学组成。
为什么每层波纹完全一样?
表达式先作用于输入结构,再复制同一份形变结果。当前卡片不生成逐层相位差、交替起伏或随机波纹。
为什么扩胞后结构没有居中?
扩胞只增加第三条晶格矢量的 z 分量,不平移已有原子。需要居中时,应在输入前或后续流程中显式处理。
Output labels
LayerStack(L={总层数},step={副本平移量})
Reproducibility
无随机性。同一输入和参数会得到一致输出。