Atomic Simulation Environment (ASE)は、原子シミュレーションのためのPythonライブラリです。
本記事では、ASEを使って原子の元素を置換する方法について説明し、具体的な置換例を示します。
目次
本記事で使用する構造について
まず、構造を作成するためにase.buildモジュールを使用して基本的なバルク構造を定義します。以下のコードで、ロジウム (Rh) の3x3x3スーパーセルを作成します。
from ase.build import bulk
atoms = bulk('Rh') * (3,3,3)
元素の置換方法
ASEでは、2通りの方法で原子の元素を変更可能です。
一括置換 (set_chemical_symbolsを使う方法)
atoms.set_chemical_symbols()メソッドで全ての原子の元素を一括で指定できます。例えば、全ての原子を金 (Au) に変更するには以下のコードを使用します。
なお['Au'] * len(atoms)は系に含まれる原子の個数だけ'Au'を繰り返したリストです。今回の場合、'Au'が27回繰り返された['Au', 'Au', 'Au', ... 'Au']となります。
atoms.set_chemical_symbols(['Au'] * len(atoms))
個別置換 (個別のatomを書き換える方法)
特定のインデックスの原子を変更する場合はatoms[i].set('symbol', element)を使用します。例えば、0番目の原子を金 (Au) に変更するには以下のようにします。
ただしatoms[0]などは、データの原本を持っておらず、特殊な情報をatomsオブジェクトに載せている場合は
atoms[0].set('symbol', 'Au')
個別置換 (atoms.numbersを書き換える方法)
元素の種類の情報は、atoms.numbersに保存されており、これを直接書き換える方法です。
操作結果自体は、個別置換 (個別のatomを書き換える方法)と同じ結果になります。
from ase.data import atomic_numbers
atoms.numbers[0] = atomic_numbers['Au']
置換例
特定のインデックスの原子を置換
例えば最初の3つの原子を金 (Au) に変更する場合、以下のどちらかのコードを使用します。
target_indices = [0, 1, 2]
for i in target_indices:
atoms[i].set('symbol', 'Au')
from ase.data import atomic_numbers
target_indices = [0, 1, 2]
atoms.numbers[target_indices] = atomic_numbers['Au']
ランダムな原子を置換
ランダムに選んだ数個の原子を異なる元素に置換する場合、numpy.randomを使用します。例えば、5個のランダムな原子を金 (Au) に変更する場合は以下のコードを使用します。
import numpy as np
random_indices = np.random.choice(len(atoms), size=5, replace=False) # 5個のランダムな原子を選択
for i in random_indices:
atoms[i].set('symbol', 'Au')
from ase.data import atomic_numbers
random_indices = np.random.choice(len(atoms), size=5, replace=False) # 5個のランダムな原子を選択
atoms.numbers[random_indices] = atomic_numbers['Au']
所望の元素の一括置換
特定の元素だけを一括で別の元素に置換することも可能です。
例えば、上記の構造にて、金(Au)のみを銀(Ag)に変換する場合、以下のコードを使用します。
このコードは、Rh(3x3x3)の構造からではなく、ランダムな原子置換を実施後の構造について
new_symbols = []
for symbol in atoms.get_chemical_symbols():
if symbol == 'Au':
# Auの場合Agに変更
new_symbols.append('Ag')
else:
# Auでない場合、受け取ったsymbolをそのまま追記
new_symbols.append(symbol)
atoms.set_chemical_symbols(new_symbols)
また、内包表記と三項演算子を利用して以下のように短く記載することも可能です。
操作内容は同一です。
new_symbols = ['Ag' if sym == 'Au' else sym for sym in atoms.get_chemical_symbols()]
atoms.set_chemical_symbols(new_symbols)
条件付きの置換
座標を判定条件に原子を別の元素に置換する場合の例を示します。
z軸の座標が4 Ang以下の原子を金 (Au) に置換する場合以下のどちらかの方法で置換が可能です。
for atom in atoms:
if atom.z <= 4:
atom.set('symbol', 'Au')
from ase.data import atomic_numbers
mask_z = atoms.positions[:,2] < 4
atoms.numbers[mask_z] = atomic_numbers['Au']
c軸の座標が50%よりも下の原子を金 (Au) に置換する場合、以下の方法で置換が可能です。
for atom in atoms:
if atom.c < 0.5:
atom.set('symbol', 'Au')