Random Packing

Group: Structure | Class: RandomPackingCard

功能说明

Random Packing 是原子坐标卡,不是磁性卡。它保留输入结构的 cellpbc,按输入组成或手动精确组成在 cell 内重新随机放置原子,并用全局和 pair-specific 最小距离约束挡掉明显不可能的短键初态。

这张卡解决的是“训练集缺少无序初始构型”,不是“缺少磁矩无序”。磁矩无序使用 Spin DisorderCorrelated Random Spin

操作示例

场景:模型只见过有序晶格,遇到无序初态能量排序不稳定

输入是一个已有 cell 和组成的候选结构。你希望在相同 cell 和元素计数下生成 20 个随机原子 packing,用于 amorphous seed、液相初态或高温无序初态的 DFT 采样。

参数设置:structures=20composition=""min_distance=1.5pair_min_distances="Fe-O:1.8,O-O:1.2"strict_mode=True,打开 use_seed

输出结构保留原 cell/pbc 和元素计数,坐标随机重排,Config_type 追加 RandPack(...)。检查输出时重点看最短距离分布和后续 DFT 是否仍有明显短键崩溃。

参数说明

组成和数量

Structures(structures)

int,默认 1。每个输入结构生成几个独立的随机 packing 版本。

10-20 个适合无序初始构型试探;50+ 时注意——每个输出结构都要靠随机试错来放置,高密度体系会显著变慢,而且 DFT 预算也成倍放大。

Composition(composition)

str,默认空。留空 = 沿用输入结构的元素种类和原子计数。手动指定时写整数计数,如 Fe:32, O:64

注意这一卡不接受比例(不接受 Fe:0.33 这种写法)。因为随机 packing 需要确切知道每个种类有多少个原子才能放置。

距离约束

原子是一个一个随机扔进盒子里的。每扔一个,都要检查它跟已经放置的所有原子之间的距离够不够大。下面三个参数控制”多大算够大”以及”试多少次放弃”。

Min Distance(min_distance)

float,默认 1.5 Å。全局最小原子对距离——任何两个原子都不允许比这个值更近。

设太小会放行短键坏结构,设太大在高密度 cell 里可能根本放不下所有原子。一个安全的起点是:取体系最短合理键长的 70-90%。比如 Si-Si 键约 2.35A,设 1.8A 通常没问题。

Pair Min Distances(pair_min_distances)

str,默认空。按元素对覆盖全局距离。例如 Fe-O:1.8, O-O:1.2

元素半径差异大时你会想用这个——O-O 通常比 Fe-O 可以更近一些,同时 Fe-O 可能需要比全局 min_distance 更宽松。写在 pair 里的距离覆盖全局值,没写的元素对仍然用 min_distance

Max Attempts Per Atom(max_attempts_per_atom)

int,默认 500。每个原子最多随机尝试多少次放置位置,超过就认为放不下。

增大它只增加搜索时间,不改变物理可行性。如果你发现它一直失败(几乎每次都触达 500 次上限),不是该调大它——是你的 min_distance 设大了,或者 cell 相对原子数太小。先调松距离或扩胞。

Strict Mode(strict_mode)

bool,默认 true。打开:只要有一个原子放不下,整个样本就报错,保证输出数量 = 设定值。关闭:放不下的样本被跳过,最终输出可能比你设的 structures 少。

如果你在做参数扫描、不确定什么约束组合能放得下→ 先关掉 strict,看实际产出了几个样本,再决定要不要调参数。

随机性

Use Seed(use_seed)

bool,默认 false。打开后同参数同输入 → 相同的 packing 结果。对比实验时开,纯探索可以关。

Seed(seed)

int,默认 0。仅 use_seed 打开时生效。

推荐预设

保持输入组成

{
  "class": "RandomPackingCard",
  "params": {
    "structures": 10,
    "composition": "",
    "min_distance": 1.5,
    "pair_min_distances": "",
    "max_attempts_per_atom": 500,
    "strict_mode": true,
    "use_seed": true,
    "seed": 42
  }
}

手动精确组成

{
  "class": "RandomPackingCard",
  "params": {
    "structures": 20,
    "composition": "Fe:32,O:64",
    "min_distance": 1.4,
    "pair_min_distances": "Fe-O:1.8,O-O:1.2,Fe-Fe:2.0",
    "max_attempts_per_atom": 1000,
    "strict_mode": true,
    "use_seed": true,
    "seed": 7
  }
}

推荐组合

  • Crystal Prototype Builder -> Super Cell -> Random Packing:复用目标 cell 尺度生成无序 seed。

  • Random Packing -> Geometry Filter:先生成,再过滤短键、体积和密度异常。

  • Random Packing -> Atomic Perturb:在已经满足硬距离约束的无序 seed 上叠加小位移噪声。

常见问题

为什么不接受比例组成? 因为这张卡生成真实原子列表,必须知道整数原子数。比例到整数的舍入会改变组成语义,应该在上游先确定超胞和计数。

为什么默认 strict? 链式卡片里输出数量通常会继续相乘。默认跳过失败样本会让后续数量偏离用户设定,所以默认保持严格数量契约。

输出标签

RandPack(n={atom_count},d={min_distance},s={seed})s 只在 use_seed=True 时出现。

可复现性

开启 use_seed 后,随机 packing 由 seed、输入结构稳定 ID 和 sample 序号共同决定。相同输入、相同参数、相同 seed 会生成相同坐标。