ASE의 MD 모듈로 플레이

ASE (Atomic Simulation Environment)의 ase.md 모듈을 사용하여 Ni 결정의 MD 시뮬레이션을 해보십시오.

모델



Ni (fcc)의 벌크 모델을 만듭니다.
import numpy as np
from ase.build import bulk
from ase.build.supercells import make_supercell
from ase.calculators.emt import EMT

# Niバルク
Ni_bulk= bulk('Ni', 'fcc', a=3.5, cubic=True) 

# 超格子
Ni_bulk = make_supercell(Ni_bulk, np.diag([3., 3., 3.]))

# EMTを用いる
Ni_bulk.set_calculator(EMT())



MD 시뮬레이션 설정



NVT 시뮬레이션(체적·온도 일정)을 실시합니다.
시작하기 전에 시스템의 온도를 10K로 유지 한 다음 500K로 올립니다.
또한 20 스텝마다 온도의 출력도 실시합니다.
from ase import units
from ase.md.nvtberendsen import NVTBerendsen
from ase.md.velocitydistribution import MaxwellBoltzmannDistribution

dt = 2 * units.fs
temp0, nsteps0 = 10, 200
temp1, nsteps1 = 500, 400
taut = 20*units.fs

MaxwellBoltzmannDistribution(Ni_bulk, temp0*units.kB)
dyn = NVTBerendsen(Ni_bulk, dt, temp0, taut=taut, trajectory='md.traj')
def myprint():
    print(f'time={dyn.get_time() / units.fs: 5.0f} fs ' + \
          f'T={Ni_bulk.get_temperature(): 3.0f} K')
dyn.attach(myprint, interval=20)

MD 시뮬레이션 실행


dyn.run(nsteps0)

# 温度を上げる
dyn.set_temperature(temp1)
dyn.run(nsteps1)

결과 시각화



온도, 구조 및 직경 분포 함수 (RDF)의 변화는 matplotlib을 사용하여 시각화됩니다.
%matplotlib widget 

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from ase.visualize.plot import plot_atoms
from ase.io.trajectory import Trajectory
from ase.geometry.analysis import Analysis

traj =  Trajectory('md.traj')

fig, ax = plt.subplots(1, 3, figsize=(9,3), tight_layout=True)

t = np.arange(nsteps0+nsteps1+1) * dt
temp = [atoms.get_temperature() for atoms in traj]

nframes = 20

def update(iframe):
    idx = int((nsteps0+nsteps1)*iframe/nframes)

    ax[0].clear()
    ax[0].set_title('Temperature')
    ax[0].set_xlabel('time (fs)')
    ax[0].set_ylabel('T (K)')
    ax[0].plot(t, temp)
    ax[0].plot(t[idx], temp[idx], marker='X', markersize=10)

    ax[1].clear()
    ax[1].set_title('Structure')
    ax[1].axis('off')
    plot_atoms(traj[idx], ax=ax[1], rotation='45x,45y')

    distribution, distance = Analysis(traj[idx]).get_rdf(rmax=5., nbins=100, return_dists=True)[0]
    ax[2].clear()
    ax[2].set_title('RDF')
    ax[2].set_ylim((0,10))
    ax[2].set_xlabel('distance (A))')
    ax[2].set_ylabel('distribution')
    ax[2].plot(distance, distribution, color='darkblue')

ani = FuncAnimation(fig, update, np.arange(nframes), blit=True, interval=250.)
ani.save('ani.gif', writer="imagemagick")



참고


  • ASE
  • Molecular Dynamics 튜토리얼 htps : // 우우키. 파이하고 k. d. dk / ase / thor ls / md / md. HTML
  • md 모듈 htps : // 우우키. 파이하고 k. d. dk/Ase/Ase/md. HTML # 모즈 ぇ あせ. md

  • GitHub matplotlib/ipympl htps : // 기주 b. m / ma tp t t b / pympl
  • Qiita
  • 우선 해보는 분자 동역학 시뮬레이션
    htps : // 코 m / 타마키 _ 오사무 /
  • matplotlib로 애니메이션 만들기 htps : // 이 m / 유바이 s / ms / c95 바 9 f1b23 d33f에서 2

  • 좋은 웹페이지 즐겨찾기