ASEとGPAWを用いてDFT計算を行ってみます.簡単な例として水素分子の原子化エネルギーを求めましょう.
- ASEは原子シミュレーション用のPythonモジュールです.多くの機能が実装されています.Calculatorクラスをインターフェースとして各種コードを呼び出すことができます.
- GPAWはPAW法とASEに基づいたDFT計算コードです.C言語とPythonにより記述されています.広く使用されています.
以下の例はJupyterLabを用いて実行しました.
インストール
Anacondaで構築したPython環境に,pipでASEとGPAWをインストールします.
$ pip install ase --user
$ pip install gpaw --user
GPAWのPAWのデータセットもダウンロードしてください.
$ gpaw install-data $HOME/gpaw-data
インストールは以上で終わりです.
この段階で私の環境は次のようになっています.
$ python --version
Python 3.7.6
$ pip list installed | grep -e ase -e gpaw
ase 3.19.1
gpaw 20.1.0
GPAWの計算条件
次の条件でGPAW
クラスをインスタンス化します.
- カットオフエネルギー: 300eV
- 汎関数: PBE
from gpaw import GPAW, PW
gpaw = GPAW(mode=PW(300), xc='PBE')
水素分子のモデルを作成
ase.build
モジュールには小分子のプリセットが含まれます.
molecule
関数に分子式を渡すだけで,3次元の分子モデルであるAtoms
オブジェクトを作成できます.
今回は孤立系の計算を行いたいので,作成したAtoms
オブジェクトのcenter
メソッドを呼び出して,モデルに3.0Aの真空層を追加しています.
from ase.build import molecule
atoms_h2 = molecule('H2')
atoms_h2.center(vacuum=3.)
view
関数で可視化することができるので,分子の構造を確認しておきましょう.
from ase.visualize import view
view(atoms_h2)
計算を実行する
Atoms
オブジェクトにGPAWのCalculator
を関連付けて,get_potential_energy
関数を呼び出すと,GPAWによる計算が実行されます.
atoms_h2.set_calculator(gpaw)
e_h2 = atoms_h2.get_potential_energy() # takes several seconds
水素原子の計算
水素原子についても同様に計算を行ってやります.
atoms_h = molecule('H')
atoms_h.center(vacuum=3.)
atoms_h.set_calculator(GPAW(mode=PW(300), xc='PBE', hund=True))
e_h = atoms_h.get_potential_energy()
結果の表示
最後に結果をまとめてみましょう.
H2の原子化エネルギー$\Delta E$は次式で得られます.
$\Delta E = 2 E_{\rm H} - E_{\rm H_2}$
同時に分子構造もNotebook上に表示してみます.
matplotlibのラッパであるase.visualize.plot
モジュールを使用します.
import matplotlib.pyplot as plt
from ase.visualize.plot import plot_atoms
delta_e = 2 * e_h - e_h2
print(f'Atomization Energy: {delta_e: 5.2f} eV')
fig, ax = plt.subplots(1, 2, figsize=(8,6))
title = f'Calculation Result for {atoms_h2.get_chemical_formula()}\n' + \
f'Total Energy : {atoms_h2.get_potential_energy(): 5.2f} eV'
ax[0].set_title(title)
ax[0].axis('off')
plot_atoms(atoms_h2, ax=ax[0], rotation='90x')
title = f'Calculation Result for {atoms_h.get_chemical_formula()}\n' + \
f'Total Energy : {atoms_h.get_potential_energy(): 5.2f} eV'
ax[1].set_title(title)
ax[1].axis('off')
plot_atoms(atoms_h, ax=ax[1], rotation='90x')
plt.show()
参考
- Atomic Simulation Environment https://wiki.fysik.dtu.dk/ase/
- GPAW https://wiki.fysik.dtu.dk/gpaw/