ASE의 MD 모듈로 플레이
15836 단어 JupyterLab파이썬ASEmatplotlib
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")
참고
md
모듈 htps : // 우우키. 파이하고 k. d. dk/Ase/Ase/md. HTML # 모즈 ぇ あせ. mdhtps : // 코 m / 타마키 _ 오사무 /
Reference
이 문제에 관하여(ASE의 MD 모듈로 플레이), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/oyster-tempura/items/dd9c3ed201ce2eac4757텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)