kpath_seekpath.py ダウンロード/コピー

kpath_seekpath.py をダウンロード

kpath_seekpath.py
kpath_seekpath.py
 1"""
 2kpath_seekpath.py
 3=================
 4
 5概要:
 6    `seekpath` ライブラリを用いて、指定された結晶構造の高対称k点経路とバンド構造計算用のk点リストを生成・表示します。
 7
 8詳細説明:
 9    本スクリプトは、CIFファイルから結晶構造を読み込み、`pymatgen` を使用してプリミティブセルに変換します。
10    その後、変換された構造情報を `seekpath` ライブラリが要求する形式に整形し、
11    以下の処理を実行します。
12    1. 結晶構造のブラベ格子に基づいて、標準的な高対称k点経路を特定します。
13    2. 特定された高対称点の座標を表示します。
14    3. バンド構造計算に利用可能な、経路上の明示的なk点リストを生成します。
15
16    デフォルトでは 'ZnO.cif' を入力ファイルとして使用しますが、
17    コマンドライン引数で別のCIFファイルを指定することも可能です。
18
19    Example:
20        python kpath_seekpath.py structure.cif
21
22関連リンク:
23    :doc:`kpath_seekpath_usage`
24"""
25# Y. Hinuma, G. Pizzi, Y. Kumagai, F. Oba, I. Tanaka, "Band structure diagram paths based on crystallography," Computational Materials Science 128, 140 (2017).
26
27import sys
28import numpy as np
29from pymatgen.core import Structure
30import seekpath
31
32infile = 'ZnO.cif'
33
34if __name__ == "__main__":
35    if len(sys.argv) > 1:
36        infile = sys.argv[1]
37
38
39def main():
40    structure = Structure.from_file(infile)
41    prim = structure.get_primitive_structure()
42
43    cell = prim.lattice.matrix
44    positions = prim.frac_coords
45    atomic_numbers = [site.specie.Z for site in prim]
46
47    spglib_cell = (cell, positions, atomic_numbers)
48
49# 標準的なk pathを取得
50    result = seekpath.get_path(spglib_cell)
51
52    print("\n=== 経路 ===")
53    for seg in result['path']:
54        print(" → ".join(seg))
55
56    print("\n=== 高対称点座標 ===")
57    for k, v in result['point_coords'].items():
58        print(f"{k:3s} : {v}")
59
60# バンド構造計算用のk点リストを取得
61    explicit = seekpath.get_explicit_k_path(spglib_cell, result['path'])
62
63#print("\n=== k点リスト (分率座標) ===")
64#for kp, label in zip(explicit['explicit_kpoints_rel'], explicit['explicit_kpoints_labels']):
65#    print(f"{label:6s} : {kp}")
66
67#print("\n=== k点リスト (絶対座標) ===")
68#for kp, label in zip(explicit['explicit_kpoints_abs'], explicit['explicit_kpoints_labels']):
69#    print(f"{label:6s} : {kp}")
70
71#print("\n=== 線形座標 (プロット用x軸) ===")
72#print(explicit['explicit_kpoints_linearcoord'])
73
74
75if __name__ == '__MAIN__':
76    main()
77