数据类型介绍

在 XequiNet 程序中,我们使用的数据点的类型叫做 XequiData,继承自 PyG 库的 torch_geometric.data.Data,可以参考官方文档

基本性质变量

一个 XequiData 数据点表示一个化学分子或周期性体系,包含以下基本的性质变量,(N 表示原子个数)

变量名 类型 形状 描述
atomic_numbers int [N,] 原子序数
pos float, double [N,3] 原子的笛卡尔坐标
cell float, double [1,3,3] 晶格矢量(可选)
pbc bool [1,3] 周期性边界条件(可选)
charge int [1,] 净电荷(可选)
spin int [1,] 总自旋(2S 或 M-1)(可选)

示例 1:水分子

我们以水分子作为分子的例子,如图所示:

Water

该水分子的 xyz 文件如下:

3

O         0.0000        0.0000       -0.1113
H         0.0000       -0.7830        0.4454
H         0.0000        0.7830        0.4454

那么代表这个水分子的数据点的各变量为:

>>> data.atomic_numbers
tensor([8, 1, 1])
>>> data.pos
tensor([[ 0.0000, -0.1113,  0.0000],
        [ 0.0000,  0.4454, -0.7830],
        [ 0.0000,  0.4454,  0.7830]])

示例 2:氯化钠晶体

周期性体系以 NaCl 晶体为例,如图所示:

NaCl

POSCAR 如下:

Na1 Cl1
1.0
3.502190 0.000000 0.000000
0.000000 3.502190 0.000000
0.000000 0.000000 3.502190
Na Cl
1 1
direct
0.000000 0.000000 0.000000 Na
0.500000 0.500000 0.500000 Cl

对应的各变量为:

>>> data.atomic_numbers
tensor([11, 17])
>>> data.pos
tensor([[ 0.0000, 0.0000, 0.0000],
        [ 1.7510, 1.7510, 1.7510]])
>>> data.cell
tensor([[[3.5022, 0.0000, 0.0000],
         [0.0000, 3.5022, 0.0000],
         [0.0000, 0.0000, 3.5022]]])
>>> data.pbc
tensor([[True, True, True]])

注意 pos 需换为笛卡尔坐标,计算方式为 cart_pos = frac_pos @ cell,(@ 表示矩阵乘法)

示例 3:水合氢离子

水合氢离子结构如图:

H3O+

水合氢离子带一个正电,所以净电荷值为 1:

>>> data.atomic_numbers
tensor([8, 1, 1, 1])
>>> data.pos
tensor([[ 0.0000,  0.0000,  0.0247]],
        [ 0.4521, -0.7830, -0.3396],
        [ 0.4521,  0.7830, -0.3396],
        [-0.9042,  0.0000, -0.3396]])
>>> data.charge
tensor([1])

标签性质变量

我们可以向 XequiData 添加标签性质变量用于训练,主要标签性质包含但不限于下表所示:

变量名 类型 形状 描述
energy float, double [1,] 体系的总能量
forces float, double [N,3] 原子核所收到的力,即能量对坐标的负梯度
base_energy float, double [1,] 用于 Δ-ML 的低等级的能量
base_forces float, double [N,3] 用于 Δ-ML 的低等级的力
virial float, double [1,3,3] 位力,即能量对应变的负梯度,也就是应力乘以晶胞体积(注意第一性原理软件计算结果的正负号)
atomic_charges float, double [N,] 原子电荷布居
dipole float, double [1,3] 偶极矩矢量
polar float, double [1,3,3] 极化率张量

在上述性质的基础上,也可以自定义其他性质。不过值得注意的是,对于分子级别的性质(如能量,偶极矩等)需要预留一个维度用于 Batch 操作。具体来说,分子的偶极矩的形状应是 [1, 3] 而非单纯的 [3,]