MatterSimでMD計算やってみた

汎用NNPのMatterSimでMD計算をやってみました。MatterSimはLAMMPS等のMDソルバーは使えないので、ASEでMD計算を行います。

公式サイトはこちら。

スポンサーリンク

計算内容

準備作業ですが、Python3.10以上の環境でpipするだけです。

pip install mattersim

そして以下のPythonコードを用意しました。LGPS結晶をcifファイルからロードしてMD計算を行います。

import numpy as np
from ase.build import make_supercell
from ase.io import read
from ase.md.velocitydistribution import MaxwellBoltzmannDistribution
from ase.md.velocitydistribution import Stationary
from ase.md.melchionna import MelchionnaNPT
from ase import units
from mattersim.forcefield import MatterSimCalculator

# Materials Project mp-696128
atoms = read('LGPS.cif')

P = [[2, 0, 0], [0, 2, 0], [0, 0, 1]]
atoms = make_supercell(atoms, P)

calc = MatterSimCalculator(load_path="MatterSim-v1.0.0-5M.pth", device="cuda")
atoms.calc = calc

temp = 900
p_ase = 0.0

MaxwellBoltzmannDistribution(atoms, temperature_K=temp)
Stationary(atoms)

dyn = MelchionnaNPT(
    atoms,
    timestep=1.0 * units.fs,
    temperature_K=temp,
    externalstress=p_ase,
    ttime=25 * units.fs,
    pfactor=75 * units.fs,
    trajectory='lgps_fast_md.traj',
    logfile='md.log'
)

def print_status():
    etot = atoms.get_total_energy()
    temp_now = atoms.get_temperature()
    print(f"Step: {dyn.get_number_of_steps():>5} | Temp: {temp_now:6.1f} K | Energy: {etot:.3f} eV")

dyn.attach(print_status, interval=50)

print("Starting MD simulation...")
dyn.run(1000)
print("Simulation finished! Save to lgps_fast_md.traj")

モデルは軽量1Mモデルと高精度5Mモデルがありますが、今回は5Mモデルを使用します。 MatterSimCalculator(load_path="MatterSim-v1.0.0-5M.pth", device="cuda")5M1Mに変えれば1Mモデルになります。

スポンサーリンク

計算結果

標準出力はこうなりました。

$ sh run.sh
2026-02-09 23:17:52.927 | INFO     | mattersim.forcefield.potential:from_checkpoint:891 - Loading the pre-trained mattersim-v1.0.0-5M.pth model
Starting MD simulation...
Step:     0 | Temp:  849.0 K | Energy: -840.800 eV
Step:    50 | Temp:  894.8 K | Energy: -821.501 eV
Step:   100 | Temp:  947.0 K | Energy: -803.227 eV
Step:   150 | Temp:  717.5 K | Energy: -812.401 eV
Step:   200 | Temp:  955.5 K | Energy: -803.244 eV
Step:   250 | Temp:  952.8 K | Energy: -803.820 eV
Step:   300 | Temp:  807.0 K | Energy: -813.038 eV
Step:   350 | Temp:  890.5 K | Energy: -812.633 eV
Step:   400 | Temp:  918.8 K | Energy: -813.815 eV
Step:   450 | Temp:  886.1 K | Energy: -813.216 eV
Step:   500 | Temp:  932.8 K | Energy: -811.706 eV
Step:   550 | Temp:  849.5 K | Energy: -817.327 eV
Step:   600 | Temp:  953.5 K | Energy: -815.299 eV
Step:   650 | Temp:  923.1 K | Energy: -813.259 eV
Step:   700 | Temp:  887.6 K | Energy: -814.836 eV
Step:   750 | Temp:  901.1 K | Energy: -814.263 eV
Step:   800 | Temp:  891.8 K | Energy: -813.325 eV
Step:   850 | Temp:  891.4 K | Energy: -814.375 eV
Step:   900 | Temp:  894.8 K | Energy: -816.065 eV
Step:   950 | Temp:  827.1 K | Energy: -816.982 eV
Step:  1000 | Temp:  889.2 K | Energy: -813.515 eV
Simulation finished! Save to lgps_fast_md.traj

結果のトラジェクトリはこうなりました。

スポンサーリンク

計算速度

200原子のサンプルで1000ステップの計算を行いました。
MatterSimCalculator(load_path="MatterSim-v1.0.0-5M.pth", device="cuda")
の行がdevice=”cuda”ならGPU、=”cpu”ならCPUで処理されます。

device=1000stepの計算時間 [秒]
“cuda” (NVIDIA RTX 4060 Ti)59.6
“cpu” (AMD Ryzen 7 5700X)441.2

結果はこの通り、GPUのほうが7倍ほど速いです。CPUでも時間をかければ計算はできますが、計算サンプルが大きくなったらやはりGPUが必須と考えて良いでしょう。ゲーム用のミドルGPUでも十分です。ちなみにCPUは8コア16スレッドなのですが、8スレッドで計算が動いていました。

コメント

タイトルとURLをコピーしました