Files
ufo/example
2024-11-21 15:17:45 +08:00
..
2024-11-21 15:17:45 +08:00
2024-11-21 15:17:45 +08:00
2024-11-21 15:17:45 +08:00
2024-11-21 15:17:45 +08:00
2024-11-21 15:17:45 +08:00
2024-11-21 15:17:45 +08:00

本例子演示一个将 4H-SiC 超胞中声子反折叠的例子。 超胞中包含 95 个原子,带有一个 C 空位;我们将把它近似反折叠到仅包含 8 个原子的原胞上。 每一步用到的文件都将给出。简单起见,我们将仅仅计算 Gamma-M 线上的声子谱。

第一步:建立模型

首先需要准备好已经已经充分弛豫的原胞模型,和在这个原胞模型基础上构造的、未弛豫的、带一个 C 空位的超胞模型。

原胞和超胞的格矢矩阵分别为:

PrimitiveCell:
  - [ 3.0799, 0, 0 ]
  - [ -1.53995, 2.66727, 0 ]
  - [ 0, 0, 10.0822 ]
SuperCell:
  - [ 9.2397, 0, 0 ]
  - [ -4.61985, 8.00181, 0 ]
  - [ 0, 0, 10.0822 ]

这里的每一行代表一个格矢(与 POSCAR 相同),单位为埃。

超胞的格矢矩阵可以看作是原胞的格矢矩阵左乘一个变换矩阵得到的:

Transformation:
  - [ 3, 0, 0 ]
  - [ 2, 4, 0 ]
  - [ 0, 0, 1 ]

变换矩阵的一定都是整数(否则将无法保持周期性)。

得到超胞模型后,对它进行弛豫。稍后的声子反折叠步骤中,需要用到弛豫后超胞模型中各个原子的位置。

注意:在稍后的声子反折叠步骤中,使用的超胞格矢矩阵是弛豫前的数据,而不是弛豫后的数据。 弛豫过程中超胞的格矢矩阵的变化通常很小,在反折叠算法中不予考虑。

注意,在从原胞模型构造超胞模型时,不能整体平移或者旋转坐标系,也不能整体平移或者旋转原子, 否则最终计算出来的结果将不正确。 缺陷导致的少数原子的位移是可以接受。

第二步:计算超胞中的 Q 点坐标

思考一个问题:原胞中 Gamma-M 线上的声子模式,对应于超胞中哪些 Q 点的模式? 这个问题经过仔细思考后并不难回答,尤其是对于那些变换矩阵为对角矩阵的超胞。 但对于一般的超胞,手动计算时容易出错,因此我写了一个功能来处理这个问题。

假定我们要求从 Gamma 到 M 点的路径上,共 11 个 Q 点的声子模式。 这 11 个 Q 点的坐标为 (0, 0, 0) 到 $(0.5, 0, 0)$。 我们可以使用以下配置文件来计算这些 Q 点在超胞中的坐标:

Transformation:
  - [ 3, 0, 0 ]
  - [ 2, 4, 0 ]
  - [ 0, 0, 1 ]
Qpoints:
  - [0, 0, 0]
  - [0.05, 0, 0]
  - [0.1, 0, 0]
  - [0.15, 0, 0]
  - [0.2, 0, 0]
  - [0.25, 0, 0]
  - [0.3, 0, 0]
  - [0.35, 0, 0]
  - [0.4, 0, 0]
  - [0.45, 0, 0]
  - [0.5, 0, 0]
OutputFile:
  Filename: fold-output.yaml
  Format: yaml

运行命令:

ufo fold fold.yaml

得到:

Qpoints:
  - [ 0.00000000, 0.00000000, 0.00000000 ]
  - [ 0.15000000, 0.09999999, 0.00000000 ]
  - [ 0.30000000, 0.19999998, 0.00000000 ]
  - [ 0.45000000, 0.29999997, 0.00000000 ]
  - [ 0.60000000, 0.39999996, 0.00000000 ]
  - [ 0.75000000, 0.49999995, 0.00000000 ]
  - [ 0.90000000, 0.59999994, 0.00000000 ]
  - [ 0.05000000, 0.69999993, 0.00000000 ]
  - [ 0.20000000, 0.79999992, 0.00000000 ]
  - [ 0.35000000, 0.89999991, 0.00000000 ]
  - [ 0.50000000, 0.99999990, 0.00000000 ]

结果表明,原胞中 Gamma-M 线经过格矢变换后分裂成了两条, 一条是 (0, 0, 0) 点到 (1, \frac23, 0) 点,另一条是 (0, \frac23, 0) 点到 (0.5, 1, 0) 点。

大致在草稿纸上画个图,可以确认这个结果是合理的:第二段在下一个周期中与第一段相连。

有时可以据此略微调整原胞中所求点的位置,使得在超胞中此处的声子可以严格求出而不需插值。 此例子不适合演示这个方法。

第三步:计算声子谱

使用 Phonopy 计算超胞中,上一步中得到的几条路径上的声子。

你可以使用任意你认为合适的参数来计算,只要能得到声子谱,之后的计算都可以进行下去。

注意:这一步需要的计算量往往比较大,常常需要计算几百或几千个模型中的原子受力。 建议先计算其中一个并输出 WAVECAR然后将 WAVECAR 软连接到其他计算中,以加速计算。

注意:如果 phonopy 输出的数据太大,可以使用 hdf5 格式的输出以加速处理。

第四步:声子谱反折叠

反折叠需要的配置比较多且复杂。

PrimativeCell:
  - [ 3.0799, 0, 0 ]
  - [ -1.53995, 2.66727, 0 ]
  - [ 0, 0, 10.0822 ]
Transformation:
  - [ 3, 0, 0 ]
  - [ 2, 4, 0 ]
  - [ 0, 0, 1 ]
PrimativeCellBasisNumber: [ 8, 8, 8 ]
AtomPositionInputFile:
  Format: yaml
  Filename: phonopy.yaml # 或 phonopy_disp.yaml
QpointDataInputFile:
  Format: yaml
  Filename: phonopy.yaml
QpointDataOutputFile:
  - Format: yaml
    Filename: phonopy_folded.yaml