本文へスキップ
コミュニティ

SevenNet と ASE による固定セル結晶構造最適化

ASE 結晶に確認済み SevenNet 計算器を接続し、エネルギーと力を計算して、収束状態を記録する限定ステップの固定セル最適化を行います。

難易度: 中級 費用: 無料 プライバシー: ローカル ~45 分
セットアップ開始

できるようになること

  • 追跡可能な計算候補の成果物を作成し、文書化した確認基準を点検します。

構築するもの

公式文書に基づくレビュー原稿です。本バッチでは実行しておらず、インストール、推論、最適化、実験結果は未検証です。

対象と入力

原子シミュレーション研究者向けです。利用者の完全周期結晶 CIF、SevenNet-0 の2024年7月の重み、固定セルでの ASE BFGS を基準例とします。幾何最適化であり、検証済み MD 軌跡、バンドギャップ予測、可変セル最適化ではありません。旧単一タスク重みは設定を明確にする選択で、新しいモデルより優れているとは主張しません。

接続、単位、成果物

ASE は CIF を格子、周期性、原子番号、直交座標を持つ Atoms に読み込みます。SevenNetCalculator は ASE 計算器の規約を実装し、実際の type_map で元素を確認します。未対応元素、無効座標、正でない体積を拒否します。単位はエネルギー eV、位置 Angstrom、力 eV/Angstrom で、LAMMPS の単位に置き換えません。initial.extxyz、relaxed.cif、初期・最終の力配列、optimization.log、optimization.traj、results.json を保存します。fmax=0.05 eV/Angstrom と100ステップは著者が選んだ例示条件で、一般的な収束推奨ではありません。未収束は停止条件未達として記録します。

環境、権利、限界

固定版 SevenNet 0.13.0 を確認し、機器に適した PyTorch と解決済み ASE・依存関係を記録します。CPU 例では CUDA や加速器との互換性を主張しません。SevenNet ソースは MIT、ASE は LGPL-2.1-or-later です。重みと学習データに付随する条件・由来を保存し、コードの許諾をすべてのデータへ拡張しません。入力の利用権は別です。同じ適用領域の参照エネルギー・力や DFT 比較が科学評価に必要です。収束だけで物理精度、安定性、任意の化学系への適用を証明しません。推論はローカルですが、取得はネット接続を必要とし、設定時間に最適化は含みません。

公式資料

原子エネルギーと力の計算器

SevenNet

結晶入出力と固定セル最適化器

ASE

構成リソース

SevenNet

原子エネルギーと力の計算器 · 0.13.0 source 209339d4eb4c1717f906c4cb715629159f00f88c; 7net-0 (July 2024)

公式文書に基づくレビュー原稿です。本バッチでは実行しておらず、インストール、推論、最適化、実験結果は未検証です。

コードは公開されていますが、計算・保存費用と外部サービスの条件は別途確認してください。

リソースを見る

ASE

結晶入出力と固定セル最適化器 · ASE calculator/BFGS API; record resolved version

公式文書に基づくレビュー原稿です。本バッチでは実行しておらず、インストール、推論、最適化、実験結果は未検証です。

コードは公開されていますが、計算・保存費用と外部サービスの条件は別途確認してください。

リソースを見る

互換性

クライアントOSアーキテクチャバージョン要件
Python Linux指定なし>= 3.11

セットアップとテスト

1. 利用権のある周期結晶を準備

Linux

新しい作業ディレクトリに input.cif を置き、単位、原子数、周期セル、参照計算を確認します。重みの実際の元素範囲と条件を確認し、全材料対応とはしません。

公式出典

期待される結果

有効な周期結晶とモデル・入力の由来記録があります。

2. 依存関係を隔離して導入

Linux

新しい Python 環境と適切な PyTorch を用います。ソースの宣言は Python >=3.8 ですが依存関係が上位版を要求する場合があり、例は実行確認前の Python 3.11 を対象とします。pip freeze と重みのハッシュを保存します。

python -m pip install torch
python -m pip install 'sevenn @ git+https://github.com/MDIL-SNU/SevenNet.git@209339d4eb4c1717f906c4cb715629159f00f88c' ase
python -m pip freeze
公式出典

期待される結果

記録した環境で計算器と ASE を import でき、数値結果はまだ主張しません。

3. レビュー用に作成した計算器例を保存

Linux

付属コードを sevennet0_relax.py として保存します。公式 API に基づく本レビューの作成例で、上流の試験結果ではありません。固定ソースの 7net-0 は2024年7月の重みを選び、CPU と固定セルを明示し、出力先の既存ディレクトリを拒否します。

"""Authored review example using documented SevenNet/ASE APIs; NOT executed.

Sources: sevenn.calculator.SevenNetCalculator, ASE IO and BFGS documentation.
Fixed-cell geometry optimization only. No MD, reference DFT, or accuracy claim.
"""
import argparse
import json
from pathlib import Path

import numpy as np
from ase.io import read, write
from ase.optimize import BFGS
from sevenn.calculator import SevenNetCalculator

parser = argparse.ArgumentParser()
parser.add_argument("input_cif")
parser.add_argument("output_directory")
args = parser.parse_args()
atoms = read(args.input_cif)
if len(atoms) == 0 or not np.isfinite(atoms.positions).all():
    raise ValueError("Empty structure or nonfinite coordinates")
if not atoms.pbc.all() or atoms.get_volume() <= 0:
    raise ValueError("This example requires a fully periodic crystal with positive cell volume")
# The pinned SevenNet implementation resolves 7net-0 to its July 2024 checkpoint.
# The calculator checks each atomic number against the loaded model type_map.
atoms.calc = SevenNetCalculator(model="7net-0", device="cpu")
energy_initial = float(atoms.get_potential_energy())
forces_initial = atoms.get_forces()
if not np.isfinite(energy_initial) or not np.isfinite(forces_initial).all():
    raise ValueError("Nonfinite initial energy or forces")
out = Path(args.output_directory)
out.mkdir(parents=True, exist_ok=False)
write(out / "initial.extxyz", atoms)
optimizer = BFGS(atoms, logfile=str(out / "optimization.log"), trajectory=str(out / "optimization.traj"))
# These are illustrative stopping settings, not upstream recommendations for all systems.
converged = bool(optimizer.run(fmax=0.05, steps=100))
energy_final = float(atoms.get_potential_energy())
forces_final = atoms.get_forces()
if not np.isfinite(energy_final) or not np.isfinite(forces_final).all():
    raise ValueError("Nonfinite final energy or forces; inspect the partial output")
write(out / "relaxed.cif", atoms)
np.savez(out / "forces.npz", initial=forces_initial, final=forces_final)
record = {"model": "7net-0", "device": "cpu", "atom_count": len(atoms),
          "elements": sorted(set(atoms.get_chemical_symbols())), "fixed_cell": True,
          "energy_initial_eV": energy_initial, "energy_final_eV": energy_final,
          "force_unit": "eV/Angstrom", "fmax_threshold_eV_per_Angstrom": 0.05,
          "max_steps": 100, "converged": converged,
          "final_max_force_eV_per_Angstrom": float(np.linalg.norm(forces_final, axis=1).max())}
(out / "results.json").write_text(json.dumps(record, indent=2) + "\n", encoding="utf-8")
print(json.dumps(record, indent=2))
if not converged:
    raise SystemExit("Optimization reached its step limit; do not describe it as converged")
公式出典

期待される結果

限定した BFGS の前に原子種、座標、周期セルを確認します。

4. エネルギー・力と限定最適化を計算

Linux

確認済み結晶と新しい出力先で実行します。入力と有限なエネルギー・力を保存し、100ステップで選択した力閾値に達しなければ明示的に停止します。

python sevennet0_relax.py input.cif sevennet_review
公式出典

期待される結果

初期・最終構造、forces.npz、ログ・軌跡、converged を含む results.json を期待します。有限エネルギーは DFT との一致を意味しません。

トラブルシューティング

  • 未対応元素:文書で対応する重みを選ぶか対象を拒否します。
  • 取得・import 失敗:由来と通信を確認し、重みを無断で置換しません。
  • 非有限な力:セル、重なり、適用領域を確認します。
  • 出力先が既存:結果を上書きせず新しい名前を使います。
  • 未収束:ログと構造を確認して別途方針を検討し、成功扱いにしません。
  • 参照との差:汎関数、組成、エネルギー基準、単位を先に確認します。
まだ動作しません

代替案

新しい重みは適用領域や精度タスクの異なる別設定です。DFT は独立参照であり、LAMMPS と MD は固定セル基準例の範囲外です。