| name | ase-basics |
| description | ASE (Atomic Simulation Environment) の基礎操作を扱うスキルです。 Atoms オブジェクトの生成・編集、ase.build.molecule, ase.build.bulk, repeat, supercell, PBC (periodic boundary conditions), cell, positions, get_chemical_formula, get_distance, translate, center, 分子と結晶の違い、構造ファイルの読み書き(ase.io.read/write) に関するコード生成時に使用してください。
|
ASE 基礎操作
概要
ASE (Atomic Simulation Environment) は原子スケールシミュレーションのための Python ライブラリで、Matlantis のすべての操作の基盤となります。このガイドでは、Atoms オブジェクトの生成・編集、分子と結晶の違い、構造ファイルの入出力、および基本的な操作パターンを解説します。
ASE を理解すれば Matlantis の操作方法がわかります。Matlantis は ASE の Calculator インターフェースを通じて PFP を利用する設計になっているためです。
中心的な概念
| 概念 | 説明 |
|---|
Atoms | 原子配置を保持するオブジェクト。座標、元素、セル、周期境界条件を持つ |
Calculator | エネルギーや力を返す計算手法。Atoms にアタッチして使用する |
| 分子 (Molecule) | 有限系。通常 pbc=False |
| 結晶 (Crystal) | 周期系。通常 pbc=True。セル (unit cell) を持つ |
分子と結晶の違いは、pbc (周期境界条件) と cell 最適化の有無で区別します。分子最適化では原子位置のみを扱い、結晶最適化では原子位置と cell の両方を扱うことが多いです。
ワークフロー
1. Create - Atoms オブジェクトを生成(builder または手動座標指定)
2. Edit - 構造を編集(平行移動、真空層追加、距離確認など)
3. Save - 構造ファイルに保存(.cif, .xyz, .traj 等)
4. Load - 保存した構造を再読み込み
NumPy 基礎
ASE の Atoms オブジェクトは内部的に NumPy 配列を使用しています。atoms.positions は shape (N, 3) の ndarray、atoms.cell は (3, 3) の ndarray です。NumPy の基本操作を理解することで、原子座標や元素の操作を効率よく行えます。
1. ブールマスクによる原子選択
ブールマスクは ASE で最も頻繁に使うパターンです。条件式が True の要素だけを取り出せます。
元素による選択
from ase.build import molecule
import numpy as np
atoms = molecule("H2O")
symbols = np.array(atoms.get_chemical_symbols())
h_mask = symbols == "H"
print(h_mask)
print(~h_mask)
h_positions = atoms.positions[h_mask]
print(h_positions.shape)
o_mask = symbols == "O"
print(atoms.positions[o_mask, 2])
条件式による選択
from ase.build import bulk
import numpy as np
atoms = bulk("Cu", "fcc", a=3.6).repeat((3, 3, 3))
z_mask = atoms.positions[:, 2] >= 5.0
upper_atoms = atoms.positions[z_mask]
print(f"上半分の原子数: {len(upper_atoms)}")
upper_indices = np.where(z_mask)[0]
print(f"インデックス: {upper_indices}")
マスクで Atoms オブジェクトを絞り込む
from ase.build import molecule
import numpy as np
atoms = molecule("H2O")
symbols = np.array(atoms.get_chemical_symbols())
h_mask = symbols == "H"
h_atoms = atoms[h_mask]
print(h_atoms.get_chemical_formula())
atoms[mask] で Atoms オブジェクトそのものをサブセット化できます。元の atoms は変更されません。
複数条件の組み合わせ
import numpy as np
mask_and = (atoms.positions[:, 2] > 2.0) & (symbols == "H")
mask_or = (symbols == "H") | (symbols == "O")
mask_not = ~(symbols == "O")
atoms.positions[mask_not, 2]
&(AND)、|(OR)、~(NOT)を使います。Python の and/or は配列に使えないため注意してください。
2. ベクトル演算とブロードキャスト
ASE に専用メソッドがある操作は numpy を直接使わず ASE メソッドを使います。代表的な構造操作には ASE や pfcc-extras の専用関数があります。numpy 実装では PBC 対応や数値誤差の処理が漏れやすいためです。
maskした原子の座標をz方向に並行移動します。
import numpy as np
from ase.build import molecule
atoms = molecule("H2O")
symbols = np.array(atoms.get_chemical_symbols())
mask_O = symbols == "O"
o_idx = np.where(mask_O)[0][0]
h_indices = np.where(~mask_O)[0]
shift_H = [0, 0, 0.2]
atoms.positions[mask_H, 2] += shift
numpy は、ASE に対応するメソッドがない操作(重心計算、変位ベクトルの一括処理、カスタム条件による統計など)に限定して使います。
実装パターン
パターン A: 分子の生成 (ase.build.molecule)
ASE に組み込まれた分子データベースから構造を取得します。
from ase.build import molecule
atoms = molecule("H2O")
print(len(atoms))
print(atoms.get_chemical_formula())
print(atoms.symbols)
print(atoms.pbc)
molecule() で利用可能な分子名の全リストは ase.collections.g2.names および ase.build.molecule.extra を参照してください。ASE のデータベースにない分子構造を作成する場合は pfcc-extras または 構造モデリング を参照してください。
パターン B: 結晶の生成 (ase.build.bulk)
結晶構造を格子定数と結晶型を指定して生成します。
from ase.build import bulk
atoms = bulk("Cu", "fcc", a=3.6)
print(atoms.cell.lengths())
print(atoms.pbc)
bulk() の主な結晶型: "fcc", "bcc", "hcp", "diamond", "rocksalt", "zincblende" など(全リストは ase.build.bulk の docstring を参照)。name に指定できる元素記号とデフォルト格子定数は ase.data.reference_states を参照してください。
パターン C: 手動座標指定による Atoms 生成
任意の原子種と座標を直接指定して構造を作成します。
from ase import Atoms
atoms = Atoms(
"CO2",
positions=[
[0.0, 0.0, 0.0],
[0.0, 0.0, 1.16],
[0.0, 0.0, -1.16],
],
)
print(atoms.get_chemical_formula())
元素記号の文字列と positions リストの順序は一致している必要があります。
パターン D: スーパーセルの作成
単位胞を繰り返してスーパーセルを作成します。大規模系のシミュレーションや、欠陥・ドーピングの導入に必要です。
from ase.build import bulk, make_supercell
import numpy as np
atoms = bulk("Si", "diamond", a=5.43)
print(f"Unit cell: {len(atoms)} atoms")
supercell = atoms.repeat((2, 2, 2))
print(f"Supercell: {len(supercell)} atoms")
supercell = atoms * [2, 2, 2]
P = np.array([[2, 0, 0],
[0, 2, 0],
[0, 0, 2]])
supercell = make_supercell(atoms, P)
repeat() と * 演算子は等価で、各軸方向に整数倍する場合に使用します。
make_supercell(atoms, P) は変換行列 P を受け取り、任意のスーパーセルを作成できます。傾いたセルや非直交スーパーセルが必要な場合に使用します。
パターン E: 周期境界条件 (PBC) の理解と設定
PBC (Periodic Boundary Conditions) は系の端で原子が反対側に繋がるかどうかを制御します。
from ase.build import molecule, bulk
mol = molecule("H2O")
print(mol.pbc)
crystal = bulk("Cu", "fcc", a=3.6)
print(crystal.pbc)
mol.pbc = False
crystal.pbc = True
crystal.pbc = [True, True, False]
pbc 属性への直接代入と set_pbc() は等価です。方向ごとに異なる設定をする場合は set_pbc([True, True, False]) のようにリストで指定します。結晶やスラブ系では必ず PBC を設定してください。PBC を設定し忘れると物理的に無意味な結果になります。
パターン F: セル情報の確認
from ase.build import bulk
atoms = bulk("Cu", "fcc", a=3.6)
lengths = atoms.cell.lengths()
print(f"Cell lengths: {lengths}")
cell_params = atoms.cell.cellpar()
print(f"a, b, c, alpha, beta, gamma = {cell_params}")
print(atoms.cell.array)
パターン G: 構造の編集
原子位置の平行移動、真空層の追加、原子間距離の測定など基本的な操作です。
shift = (0.0, 0.0, 2.0)
atoms.translate(shift)
atoms_plus = atoms.copy()
atoms_plus.positions += shift
atoms.rotate(30.0, "z", rotate_cell=False)
atoms.center(vacuum=8.0)
d = atoms.get_distance(0, 1)
print(f"Distance between atom 0 and 1: {d:.3f} A")
center(vacuum=N) は分子系でセルを設定する際に重要です。十分な真空層 (推奨 10A 以上) を確保することで、周期イメージとの不要な相互作用を防ぎます。
パターン H: 構造ファイルの読み込み
ASE の read 関数は拡張子からフォーマットを自動判別します。
from ase.io import read
atoms = read("structure.cif")
atoms = read("structure.cif", index=0)
atoms = read("structure.cif", index=-1)
index パラメータ:
-1: 最後のフレーム(デフォルト)
0: 最初のフレーム
":": 全フレームをリストで取得
パターン I: 構造ファイルの書き出し
from ase.io import write
write("output.cif", atoms)
write("output.xyz", atoms)
write("POSCAR", atoms, format="vasp")
write("output.traj", atoms)
拡張子からフォーマットが自動判定されます。POSCAR のように拡張子がない場合は format 引数で明示します。
パターン J: トラジェクトリの読み込みと操作
最適化や MD で生成された .traj ファイルから全フレームを読み込み、解析に使用します。
from ase.io import read, Trajectory
traj = Trajectory("opt.traj")
print(f"Total frames: {len(traj)}")
last_frame = traj[-1]
for i, frame in enumerate(traj):
if frame.calc is not None:
e = frame.get_potential_energy()
print(f"Frame {i}: {e:.4f} eV")
パターン K: 基本情報の確認
print(f"Number of atoms: {len(atoms)}")
print(f"Formula: {atoms.get_chemical_formula()}")
print(f"Symbols: {atoms.get_chemical_symbols()}")
print(f"Symbols object: {atoms.symbols}")
print(f"Positions shape: {atoms.positions.shape}")
print(f"PBC: {atoms.pbc}")
ベストプラクティス
-
pfcc-extras が提供する機能は ASE よりも pfcc-extras を優先する: pfcc_extras は Matlantis 環境に最適化された高レベル API を提供しています。ASE と pfcc-extras の両方で実現できる操作について、pip show pfcc-extras を実行して pfcc-extras がインストールしてあることを確認した場合は pfcc-extras を優先して使用してください。主な優先対象は以下の通りです。
- 可視化:
ase.visualize.view ではなく pfcc_extras.show_gui / view_ngl を使用
- PBC ラッピング:
atoms.wrap() ではなく pfcc_extras.structure.wrap_molecule を使用(分子断裂を防止)
- 衝突検出: 手動の距離比較ではなく
pfcc_extras.structure.collision.CollisionDetector を使用
- 近傍・結合解析: 手動の距離計算ではなく
pfcc_extras.structure.get_neighbors / get_connectivity_matrix を使用
- 部分占有: 手動処理ではなく
pfcc_extras.structure.PartialOccupancy を使用
- 軌跡変換: MDTraj / MDAnalysis への変換には
pfcc_extras.trajectory.asetraj_to_mdtraj / asetraj_to_mdanalysis を使用
-
分子と結晶を混ぜない: PBC、cell、stress の有無を明確に分けて扱ってください。分子系に stress を計算したり、結晶系で PBC を設定し忘れたりすると、物理的に無意味な結果になります。
-
真空層の確保: 分子系やスラブモデルでは center(vacuum=10.0) 以上の真空層を設けてください。15-20A が推奨です。
-
Trajectory 形式の活用: 計算結果の保存には .traj 形式が便利です。構造だけでなくエネルギー、力、応力情報もバイナリで保持されます。
-
構造確認の習慣化: 計算投入前に必ず構造を確認してください。pfcc_extras.show_gui を使えば Jupyter 環境上で 3D 可視化が可能です。
-
スーパーセルサイズの検討: シミュレーション目的に応じて適切なスーパーセルサイズを選択してください。原子数が多すぎると計算コストが増大し、少なすぎると有限サイズ効果が出ます。
-
フォーマット自動判定の活用: read / write では拡張子からフォーマットが自動判定されるため、format 引数は通常不要です。
-
物理定数・単位変換に ase.units を使用する: 1.38e-23 や 96.485 のような数値を直接コードに書いてはいけません。from ase import units を使用してください。
補足: 単位系と ase.units による単位変換
原子シミュレーションでは複数の単位系が混在します。単位変換に数値を直接書くと誤りの原因になるため、常に ase.units の定数を使用してください。
主要な単位系
| 単位系 | 長さ | エネルギー | 質量 | 圧力 | 電荷 | 用途 |
|---|
| SI | m | J | kg | Pa | C (Coulomb) | 実験・教科書 |
| 化学慣用 | Å | kJ/mol, kcal/mol | g/mol (= amu) | atm, bar | — | 熱化学・生化学 |
| eV 系 | Å | eV | amu | GPa | e (素電荷) | DFT・凝縮系物理 |
| ASE 内部 | Å | eV | amu | eV/ų | e (素電荷) | ASE の全出力はこの単位 |
ASE の Calculator が返す物理量の単位:
| 物理量 | メソッド | 単位 |
|---|
| エネルギー | get_potential_energy() | eV |
| 力 | get_forces() | eV/Å |
| 応力 | get_stress() | eV/ų |
| 質量 | get_masses() | amu |
| 電荷 | get_charges() | e (素電荷) |
| 双極子モーメント | get_dipole_moment() | eÅ |
ase.units の主な定数
from ase import units
units.kJ
units.kcal
units.mol
units.Hartree
units.kB
units.fs
units.GPa
units.bar
units.Pascal
atm = 101325 * units.Pascal
units.Bohr
units.nm
units.m
cm = 1e-2 * units.m
units.kg
units.Debye
units.C
よく使う変換パターン
from ase import units
T_K = 300.0
kBT = units.kB * T_K
energy_eV = atoms.get_potential_energy()
energy_kJmol = energy_eV * units.mol / units.kJ
energy_kcalmol = energy_eV * units.mol / units.kcal
dt = 1.0 * units.fs
pressure_GPa = 1.0 * units.GPa
pressure_bar = 1.0 * units.bar
pressure_atm = 101325 * units.Pascal
dipole_eA = atoms.get_dipole_moment()
dipole_debye = dipole_eA / units.Debye
補足: PBC が必要な系の判定基準
| 系の種類 | PBC 設定 | 理由 |
|---|
| 孤立分子 | pbc=False | 有限系。周期イメージとの相互作用は不要 |
| バルク結晶 | pbc=True (全方向) | 無限周期系の近似 |
| スラブ (表面) | pbc=[True, True, False] または pbc=True | 面内は周期、法線方向は真空層で分離 |
| ナノチューブ | pbc=[False, False, True] | 軸方向のみ周期 |
Matlantis では多くの場合 pbc=True(全方向周期)で設定し、非周期方向には十分な真空層を設けることで擬似的に有限系を表現します。
補足: Atoms オブジェクトの複製
構造を変更する前にコピーを取っておくと、元の構造を保持できます。
atoms_copy = atoms.copy()
atoms_copy = atoms.copy()
atoms_copy.calc = atoms.calc
atoms.copy() は Calculator をコピーしません。Calculator も複製する場合は明示的に再設定してください。
よくあるエラーと対処
| エラー・問題 | 原因 | 対処 |
|---|
read() でファイルが読めない | ファイルパスの誤り、またはフォーマット未対応 | パスを確認し、必要に応じて format 引数を明示してください |
pbc が意図と異なる | molecule() は pbc=False、bulk() は pbc=True がデフォルト | 生成後に atoms.pbc を確認・設定してください |
| スーパーセル後に原子数が想定と異なる | repeat() の引数の理解不足 | repeat((2,2,2)) は各軸 2 倍で原子数は 8 倍になります |
center() 後にセルが大きすぎる | vacuum パラメータが大きすぎる | 分子系は vacuum=10.0 程度から始めてください |
| Trajectory 読み込みで 1 フレームしか得られない | ase.io.read の index 指定漏れ、または Trajectory 未使用 | .traj ファイルは Trajectory("file.traj") で読み込んでください |
関連ガイド
- Calculator 初期化 (setup/SKILL.md): PFP の設定方法
- 構造モデリング (modeling/SKILL.md): 表面・分子生成の高度な手法
- 構造最適化 (optimization/SKILL.md): 構造最適化
- 分子動力学 (dynamics/SKILL.md): 分子動力学