使用pymatgen进行扩胞

本文最后更新于:2 个月前

Pymatgen (Python Materials Genomics) is a robust, open-source Python library for materials analysis.

使用pymatgen进行扩胞非常简单,具体操作如下:

  1. 先导入pymatgen库的Structure类:

    1
    from pymatgen import Structure
  2. 然后读入想要扩胞的晶体结构,CIF格式、POSCAR格式都可以,pymatgen可以自动识别:

    1
    structure = Structure.from_file('./CsPbI3_mp-1069538_primitive.cif')

    可以用 print(structure) 打印看一下结构,结果如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Full Formula (Cs1 Pb1 I3)
    Reduced Formula: CsPbI3
    abc : 6.414145 6.414145 6.414145
    angles: 90.000000 90.000000 90.000000
    Sites (5)
    # SP a b c
    --- ---- --- --- ---
    0 Cs 0.5 0.5 0.5
    1 Pb 0 0 0
    2 I 0 0 0.5
    3 I 0 0.5 0
    4 I 0.5 0 0
  3. 扩胞操作,例如扩成 2×2×22 \times 2 \times 2 的超胞:

    1
    structure.make_supercell(scaling_matrix=[2, 2, 2], to_unit_cell=False)

    再用 print(structure) 打印看一下扩胞后的结构,结果如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Full Formula (Cs8 Pb8 I24)
    Reduced Formula: CsPbI3
    abc : 12.828290 12.828290 12.828290
    angles: 90.000000 90.000000 90.000000
    Sites (40)
    # SP a b c
    --- ---- ----- ---- -----
    0 Cs 0.25 0.25 0.25
    1 Cs 0.25 0.25 0.75
    2 Cs 0.25 0.75 0.25
    3 Cs 0.25 0.75 0.75
    4 Cs 0.75 0.25 0.25
    5 Cs 0.75 0.25 0.75
    6 Cs 0.75 0.75 0.25
    7 Cs 0.75 0.75 0.75
    8 Pb 0 0 0
    9 Pb 0 0 0.5
    10 Pb -0 0.5 -0
    11 Pb -0 0.5 0.5
    12 Pb 0.5 0 -0
    13 Pb 0.5 0 0.5
    14 Pb 0.5 0.5 -0
    15 Pb 0.5 0.5 0.5
    16 I 0 0 0.25
    17 I 0 0 0.75
    18 I -0 0.5 0.25
    19 I -0 0.5 0.75
    20 I 0.5 0 0.25
    21 I 0.5 0 0.75
    22 I 0.5 0.5 0.25
    23 I 0.5 0.5 0.75
    24 I -0 0.25 -0
    25 I -0 0.25 0.5
    26 I -0 0.75 -0
    27 I -0 0.75 0.5
    28 I 0.5 0.25 -0
    29 I 0.5 0.25 0.5
    30 I 0.5 0.75 -0
    31 I 0.5 0.75 0.5
    32 I 0.25 0 -0
    33 I 0.25 0 0.5
    34 I 0.25 0.5 -0
    35 I 0.25 0.5 0.5
    36 I 0.75 0 -0
    37 I 0.75 0 0.5
    38 I 0.75 0.5 -0
    39 I 0.75 0.5 0.5

    可以看到已经扩胞成功了。

    高级用法:这个方法中的 scaling_matrix 参数有三种输入方式:

    1. 一个 3×33 \times 3 矩阵。例如 scaling_matrix=[[2, 1, 0], [0, 3, 0], [0, 0, 1]],则会将晶胞扩成 a=2a+b,b=3b,c=ca' = 2a + b, b' = 3b, c' = c 的超胞。
    2. 一个3维向量。例如 scaling_matrix=[2, 1, 1],则会将晶胞扩成 2a×b×c2a \times b \times c 的超胞,等价于 scaling_matrix=[[2, 0, 0], [0, 1, 0], [0, 0, 1]]。(我们的例子用的就是这个方法)
    3. 也可以只输入一个数字。例如 scaling_matrix=2,等价于scaling_matrix=[2, 2, 2]
  4. 然后我们可以扩胞后的结构存为文件,这里我们存为POSCAR格式:

    1
    structure.to(fmt='POSCAR', filename='new_structure.vasp')

    PS:如果要存为CIF格式,只要将 fmt='POSCAR' 改为 fmt='cif',然后文件扩展名对应改一下,即可。


  • 完整代码如下:

    1
    2
    3
    4
    5
    from pymatgen import Structure

    structure = Structure.from_file('./CsPbI3_mp-1069538_primitive.cif')
    structure.make_supercell(scaling_matrix=[2, 2, 2], to_unit_cell=False)
    structure.to(fmt='POSCAR', filename='new_structure.vasp')

    用VESTA查看结果,如下:

    扩胞前
    扩胞后