汎用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") の5Mを1Mに変えれば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スレッドで計算が動いていました。
コメント