分层堆叠(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 或分子动力学前进行合理弛豫。

常用工作流

平整双层

  1. 输入一个法向沿笛卡尔 z 的单层 slab。

  2. 总层数 设为 2。

  3. 副本沿 z 平移量 填入材料的层间重复距离。

  4. 保持 沿笛卡尔 z 扩展晶胞 开启。

  5. 保持可选表面形变折叠。

输出只包含一个结构,其中原子数为输入的 2 倍。

给每层施加相同波纹

  1. 展开 显示可选表面形变设置

  2. 选择二维正弦波纹,或填写表达式:

    A*(sin(2*pi*x/Lx) + sin(2*pi*y/Ly))
    
  3. 参数填写:

    A=0.2, Lx=10, Ly=10
    
  4. 用“形变哪些原子”限制形变范围;注意这只限制形变,复制时仍会复制全部原子。

  5. 查看卡片底部预览,确认选中原子数、位移范围、输出原子数和晶胞长度。

这里 A 的单位是 Å,LxLy 是波长,单位也是 Å。

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,结果单位为 Å。表达式按输入结构的笛卡尔坐标计算,可使用:

  • 坐标与常数:xyzpie

  • 函数:sincostanarcsinarccosarctan

  • sinhcoshtanhexploglog10sqrt

  • absfloorceilroundwhereclipminmax

表达式经过语法白名单检查,不能访问 Python 内置对象、属性或任意函数。

表达式参数(expression_params)

str,默认空。按 name=value 定义表达式中的标量,例如:

A=0.2, Lx=10, Ly=10

参数可以引用前面已经定义的参数以及 pie

形变哪些原子(apply_mode)

int,默认 0:

Value

界面选项

形变范围

0

全部原子

所有输入原子

1

指定元素

elements 中的元素

2

笛卡尔 z 范围

z 坐标位于 z_range 内的原子

这个参数只控制 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

无随机性。同一输入和参数会得到一致输出。