Pymatgenによるバンド情報の取得

本記事の概要

この記事では、Pymatgenによるバンド情報取得方法を紹介していく。
今回は、バンド図(パスタみたいなグラフ)とDOS(Density od State)を描くところまで行う。
Pythonの基礎を習得していることを前提として解説を進めていく。
目次:

バンド図の表示¶

バンド情報を取得するためには、Material IDが必要になる。事前に対象材料のMatarial IDを取得しておく必要がある。

import matplotlib
from pymatgen import MPRester
from pymatgen.electronic_structure.plotter import BSPlotter

mp_id='mp-3748' #AlCuO2 筆者が適当に選んだ化合物。
#api_key='YOUR_API_KEY' #自分でapi keyは取得してください。

def get_band(mp_id,api_key):
    with MPRester(api_key) as m:
        bs=m.get_bandstructure_by_material_id(mp_id)
        bg=bs.get_band_gap()
        dbg=bs.get_direct_band_gap()

        for k,v in zip(bg.keys(),bg.values()):
            print(k,':',v)
        print('direct_band_gap:',dbg)
        plotter=BSPlotter(bs)
        #plotter.get_plot().show()
        plotter.get_plot().savefig('BS_{}.png'.format(mp_id))
    
get_band(mp_id,api_key)

>(出力)

direct : False
energy : 1.8148
transition : (0.591,0.409,0.000)-\Gamma
direct_band_gap: 2.7100999999999997
f:id:ataruto:20210410180320p:plain
筆者は、バンド図は詳しく読めないので解説は割愛する

DOSの表示

DOSを取得する場合も、同様にMaterial IDが必要となるので注意。

import matplotlib
from pymatgen import MPRester
from pymatgen.electronic_structure.plotter import BSPlotter,DosPlotter

def get_dos(mp_id,api_key,xmin=None,xmax=None,ymin=None,ymax=None):
    with MPRester(api_key) as m:
        data = m.get_dos_by_material_id(mp_id)
        print(data)
        plotter=DosPlotter()
        name='{}_total_DOS'.format(mp_id)
        plotter.add_dos(name,data)
        plotter.get_plot(xlim=[xmin,xmax],ylim=[ymin,ymax]).savefig(name)
        
get_dos(mp_id,api_key)

>(出力)
Complete DOS for Full Formula (Al1 Cu1 O2)
Reduced Formula: AlCuO2
abc : 5.931859 5.931859 5.931859
angles: 28.086128 28.086128 28.086126
Sites (4)
# SP a b c

      • ---- -------- -------- --------

0 Al 0.5 0.5 0.5
1 Cu 0 0 0
2 O 0.889957 0.889957 0.889957
3 O 0.110043 0.110043 0.110043
f:id:ataruto:20210410180411p:plain

まとめ

上記の方法で簡単にバンド情報を取得することができる。
ただしMaterials Projectに掲載されている第一原理計算結果の情報は、結構荒い精度の計算で出されているものが多いので精度の高さには注意が必要になってくるかもしれない。それでも網羅的にバンド情報を取得できるのはすごく便利である。