Atomic Simulation Environment (ASE)とは
- 第一原理計算/量子化学計算を行うPythonのライブラリ
- 第一原理計算の主要部分は
calculatorとして条件を設定し、実際の計算のインプットを編集することなく計算を実行できる - さまざまな計算パッケージを
calculatorに用いることができる - (更新-2026/05/17) NNPとしてMACEに統一
ASEを使う利点
- 第一原理計算や分子動力学計算を行う計算プログラムは非常に数が多く、それぞれが独自のインプット・アプトプットを持つ
- これらのプログラムを用いて計算を行うためには、インプットの作成方法やアウトプットの解析方法に習熟していることが望ましく、学習コストが高い
- ASEを用いることで、
calculatorの設定を通して計算プログラムのインプット作成処理ができる --> 計算プログラムのインプットの詳細を知っていなくても計算ができる(もちろん知っていた方が利点は多い) - Pythonをベースとして用いるため、for文によるループ処理やif文による分岐が簡単に導入できる
環境設定
- ASEのインストール:
pip install ase - ASEに組み込まれているポテンシャル(EMT)を用いる場合はこれ以外の設定は不要
VASPを用いる場合
- 第一原理計算としてメジャーなソフトウェアであるVASPを用いる場合は設定が必要
- VASPがインストールされていることが前提(実行ファイルは
~/vasp.X.X.X/bin/vasp_stdとする) - ASEから参照するVASP実行用のPythonスクリプト(
run_vasp.pyとする)を用意する
import os
exitcode = os.system('~/vasp.X.X.X/bin/vasp_std')
# exitcode = os.system('mpirun -np 2 ~/vasp.X.X.X/bin/vasp_std') # MPI並列の場合はこちらを使う
-
~/.bashrcに上記のVASP_SCRIPTの場所と擬ポテンシャルの場所(VASP_PP_PATH)を設定する
$ export VASP_SCRIPT=$HOME/somewhere/run_vasp.py
$ export VASP_PP_PATH=$HOME/vasp/potentials/
-
run_vasp.pyや擬ポテンシャルの場所は適宜設定すること
エネルギー計算
- ASEを用いた計算の最も基本的な使い方としてエネルギー計算を行う
- Pt結晶のself-consistent field (SCF)計算を行う
ここでは以下のcalculatorを用いる。それぞれ異なる計算手法となっており、計算コスト・計算精度が違ってくる
- EMT (多体ポテンシャル)
- MACE (ニューラルネットワーク・ポテンシャル)
- DFT (VASP)
1. EMT
- Effective medium theory (EMT): 多体ポテンシャルの一種
- 対応している元素: Al, Cu, Ag, Au, Ni, Pd, Pt, H, C, N, O
from ase.build import bulk
from ase.calculators.emt import EMT
solid = bulk(name="Pt", crystalstructure="fcc", a=3.9)
solid.calc = EMT()
energy = solid.get_potential_energy()
print(f"energy = {energy:5.3} eV")
2. MACE
- ニューラルネットワーク・ポテンシャルの1種
- トレーニングセットと計算系の相性がいい場合は、密度汎関数理論(DFT)並みの精度が出て計算速度はそれより早い
- インストール:
pip install mace-torch
from ase.build import bulk
from mace.calculators import mace_mp
solid = bulk(name="Pt", crystalstructure="fcc", a=3.9)
solid.calc = mace_mp(model="small", device=device)
nergy = solid.get_potential_energy()
print(f"energy = {energy:5.3} eV")
-
model=("small" | "medium" | "large")を指定可能。精度とコストが順に増加する - さらに高精度な計算がしたい場合はmodelを
medium-omat-0,mace-matpes-pbe-0などにするとよい。詳細は公式GitHub参照
3. DFT
- Vienna ab initio simulation package (VASP)によるDFT計算からエネルギーを求める
from ase.build import bulk
from ase.calculators.vasp import Vasp
solid = bulk(name="Pt", crystalstructure="fcc", a=3.9)
solid.calc = Vasp(xc="pbe", pp="potpaw_PBE.64")
energy = solid.get_potential_energy()
print(f"energy = {energy:5.3} eV")
-
Vaspのxcは汎函数, ppは擬ポテンシャルの種類を指定する -
RuntimeError: Looking for PP for potpaw_PBE/Pt/POTCARが出力される場合はVASP_PP_PATHもしくはppの指定がうまくいっていない - 上記だと
$VASP_PP_PATH/potpaw_PBE.64以下が参照される
構造最適化
- Ptのfcc(111)面を構築して構造最適化計算を行う
- 原子層は4層とし、上2層のみを最適化(下2層は固定)
1. EMT
from ase.calculators.emt import EMT
from ase.build import fcc111
from ase.optimize import FIRE
from ase.constraints import FixAtoms
surf = fcc111(symbol="Pt", size=[1, 1, 4], a=3.9, vacuum=12.0)
surf.pbc = True
c = FixAtoms(indices=[atom.index for atom in surf if atom.tag >= 3])
surf.constraints = c
# calculatorを指定
calc = EMT()
surf.calc = calc
opt = FIRE(surf, trajectory="pt-relax.traj")
# 構造最適化を実行
opt.run(fmax=0.05, steps=100)
-
fcc111はlayer numberに応じてAtomのtagを自動的に決める- 第一層: tag=1, 第二層: tag=2, 吸着子: tag=0, などとなる。このtagを用いて原子層を選択する。tagを確認するには
print(atoms.get_tags())
- 第一層: tag=1, 第二層: tag=2, 吸着子: tag=0, などとなる。このtagを用いて原子層を選択する。tagを確認するには
- ASEでよく使われるoptimizerはBFGSだが、FIREやFIRE2のほうが素性がよいかもしれない
-
.trajファイルの可視化:ase gui pt-relax.traj
2. MACE
- ニューラル・ネットワーク・ポテンシャルの一種
- maceのインストール:
pip install mace-torch
from mace.calculators import mace_mp
from ase.build import fcc111
from ase.optimize import FIRE
from ase.constraints import FixAtoms
device = "cpu" # GPUが使える時は"cuda"
surf = fcc111(symbol="Pt", size=[1, 1, 4], a=3.9, vacuum=12.0)
surf.pbc = True
c = FixAtoms(indices=[atom.index for atom in surf if atom.tag >= 3])
surf.constraints = c
# calculatorを指定
surf.calc = mace_mp(model="small", device=device)
opt = FIRE(surf, trajectory="pt-relax.traj")
# 構造最適化を実行
opt.run(fmax=0.05, steps=100)
3. VASP
from ase.calculators.vasp import Vasp
from ase.build import fcc111
from ase.constraints import FixAtoms
surf = fcc111(symbol="Pt", size=[1, 1, 4], a=3.9, vacuum=12.0)
surf.pbc = True
c = FixAtoms(indices=[atom.index for atom in surf if atom.tag >= 3])
surf.constraints = c
surf.calc = Vasp(xc="pbe", pp="potpaw_PBE.64", ibrion=2, nsw=10,potim=0.1, directory="pt_relax")
surf.get_potential_energy()
- EMTのようにASEのoptimizerを使うのでも良いが、VASPの最適化を用いた方が収束が早い(と思う)
-
Vaspのibrion,nsw,potimはVASPのINCARで指定するものと同じ -
directoryは必須ではないが、設定した場合そのディレクトリで(ない場合は作成される)VASPの計算が行われるので設定しておくとよい。以下のどちらかで設定できるAtoms.calc.directory = "some_directory"Vasp(direcoty="some_directory")
おわりに
- ここではASEの基本的な使い方としてエネルギー計算と構造最適化の例を示した
- CalculatorにはEMTとVASPを用いた。EMTはASEに含まれておりそのまま利用でき計算も早いが、計算精度が相当悪いのと、利用できる元素の種類が非常に少ない(H, C, N, O, Al, Cu, Ag, Au, Ni, Pd, Ptのみ)が欠点であり、コードの確認だけに用いた方がよい
- NNP(この場合はmace)を使うとより多くの元素を扱うことができる
- 他の機能は別ページで説明する予定