Сегодня мы будем изучать как реализован контроль температуры в молекулярной динамике на примере GROMACS. Объект исследования это одна молекула этана.
Изменяем файл с топологией:
#смотрим файл с топологией
for line in open('et.top', encoding='utf-8').readlines():
print(line.strip())
Скачиваем все необходимые файлы. Далее, с помощью bash скриптов я:
Сначала визуально оценим то, что получилось, в Pymol
Исходя из визуального анализа, ближе всего к правде Velocity-rescale и Нуз-Хувер.
Построим графики изменения энергий
import numpy as np
import matplotlib.pyplot as plt
algs = ['be', 'vr', 'nh', 'an', 'sd']
names = {'be': 'Berendsen', 'vr': 'Velocity-rescale', 'nh':'Nooze-Hoover', 'an':'Anderson', 'sd':'Stochastic MD'}
fig, axs = plt.subplots(5, figsize=(10, 18))
for i, d in enumerate(algs):
energy = np.loadtxt(f'pr7/et_{d}.en.xvg')
t = energy[:,0]
e_pot = energy[:,1]
e_kin = energy[:,2]
axs[i].plot(t, e_pot, c='blue', alpha=0.6, label='Potential energy')
axs[i].plot(t, e_kin, c='red', alpha=0.6, label='Kinetic energy')
axs[i].legend()
axs[i].set_title(names[algs[i]])
plt.show()
В случае Берендсена обе энергии быстро стабилизируются. Нуз-Хувер - резкие скачки кинетической энергии, где-то в середине энергии тоже стабилизируются. Остальные три метода: постоянные флуктуации обеих энергий.
Построим графики распределения длин связей.
fig, axs = plt.subplots(5, figsize=(10, 18))
for i, d in enumerate(algs):
x = np.loadtxt(f'pr7/bond_{d}.xvg')
axs[i].bar(x[:,0], x[:,1], width=0.0005)
axs[i].set_title(names[algs[i]])
axs[i].set_xlim(0.14, 0.163)
plt.show()
Дисперсия распределений больше всего у стохастической МД, у Velocity-rescale тоже большая. У Андерсона высокая плотность посередине и по краям: не очень реалистично. Распределения для Берендсена и Нуза-Хувера похожи, у последнего побольше дисперсия.
Построим распределения по энергиям.
fig, axs = plt.subplots(5, figsize=(10, 18))
for i, d in enumerate(algs):
energy = np.loadtxt(f'pr7/et_{d}.en.xvg')
t = energy[:,0]
e_pot = energy[:,1]
e_kin = energy[:,2]
axs[i].hist(e_pot + e_kin, bins=100, color='purple')
axs[i].set_title(names[algs[i]])
plt.show()
Больше всего на распределение Больцмана похож результат Нуз-Хувера. Таким образом, по всем рассмотренным критериям (визуальный анализ, анализ изменения энергии, вид распределения длин связей, вид распределения по энергиям) Нуз-Хувер выглядит наиболее реалистично.
P.S. Скрипты и все файлы можно найти в /home/students/y17/darya_by/MM/pr7 на kodomo