Методы контроля температуры

Молекулярное моделирование биополимеров, 2017. Факультет биоинженерии и биоинформатики, МГУ им. М. В. Ломоносова

In [1]:
%matplotlib inline
from os import system
from IPython.display import Image,display
import numpy as np
import pylab as plt
import seaborn as sns
In [2]:
! wget http://kodomo.fbb.msu.ru/FBB/year_08/term6/etane.gro 
! mv etane.gro ethane.gro
--2017-05-26 11:13:33--  http://kodomo.fbb.msu.ru/FBB/year_08/term6/etane.gro
Resolving kodomo.fbb.msu.ru... 192.168.180.1
Connecting to kodomo.fbb.msu.ru|192.168.180.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 399
Saving to: `etane.gro'

100%[======================================>] 399         --.-K/s   in 0s      

2017-05-26 11:13:33 (32.4 MB/s) - `etane.gro' saved [399/399]

Напишем топологию

In [3]:
cat ethane.top
#include "/usr/share/gromacs/top/oplsaa.ff/forcefield.itp"

[ moleculetype ]
; Name            nrexcl
et            3

[ atoms ]
;   nr  type  resnr  residue  atom   cgnr     charge       mass
    1   opls_135   1    ETH      C1      1    -0.189      12.01
    2   opls_135   1    ETH      C2      2    -0.155      12.01
    3   opls_140   1    ETH      H1      3     0.0059       1.008
    4   opls_140   1    ETH      H2      4     0.0059       1.008
    5   opls_140   1    ETH      H3      5     0.0059       1.008
    6   opls_140   1    ETH      H4      6     0.0056       1.008
    7   opls_140   1    ETH      H5      7     0.0056       1.008
    8   opls_140   1    ETH      H6      8     0.0056       1.008
    
[ bonds ]
;  ai    aj funct  b0       kb
     1   2   1  
     1   3   1
     1   4   1  
     1   5   1  
     2   6   1  
     2   7   1  
     2   8   1  

[ angles ]
;  ai    aj    ak funct  phi0   kphi
;around c1
    3     1     4     1  
    4     1     5     1  
    3     1     5     1  
    2     1     3     1  
    2     1     4     1  
    2     1     5     1  
;around c2
    1     2     6     1  
    1     2     7     1  
    1     2     8     1  
    6     2     7     1  
    6     2     8     1  
    7     2     8     1  

[ dihedrals ]
;  ai    aj    ak    al funct  
    3    1     2     6      3  
    3    1     2     7      3  
    3    1     2     8      3  
    4    1     2     6      3  
    4    1     2     7      3  
    4    1     2     8      3  
    5    1     2     6      3  
    5    1     2     7      3  
    5    1     2     8      3  
 
[ pairs ]
; список атомов 1-4
;  ai    aj funct
   3  6
   3  7
   3  8
   4  6
   4  7
   4  8
   5  6
   5  7
   5  8

[ System ]
; any text here
first one
[ molecules ]
;Name count
 et    1

Индекс-файл для считывания длины связи

In [2]:
! echo [ cc ] > cc.ndx
! echo 1 2 >> cc.ndx

Произведем расчеты

In [4]:
for mdparam in ('be','vr','nh','an','sd'):
    
    # get MD parameters
    system('wget http://kodomo.fbb.msu.ru/FBB/year_08/term6/%s.mdp' % mdparam)
    
    # run MD
    system('grompp -f %s.mdp -c ethane.gro -p ethane.top -o ethane_%s.tpr' % (mdparam,mdparam))
    system('mdrun -deffnm ethane_%s -nt 1' % mdparam)
    
    # dump trajectory
    system('echo 0 | trjconv -f ethane_%s.trr -s ethane_%s.tpr -o ethane_%s.pdb' % (mdparam, mdparam, mdparam))
    
    # calculate energy. U - potential, T - kinetic
    system('echo 10 | g_energy -f ethane_%s.edr -o ethane_%s_U.xvg -xvg none' % (mdparam,mdparam))
    system('echo 11 | g_energy -f ethane_%s.edr -o ethane_%s_T.xvg -xvg none' % (mdparam,mdparam))
    
    # dump bond length
    system('g_bond -f ethane_%s.trr -s ethane_%s.tpr -o ethane_%s_bond.xvg -n cc.ndx -xvg none' % (mdparam,mdparam,mdparam))

Посмотрим на траектории расчетов

Термостат Андерсона
Не происходит никаких вращений. Связь C-C вибрирует с постоянной частотой и амплитудой около 0.04 ангстрем.

Термостат Нозе-Хувера
Происходят врящения метильных групп, наблюдаемых изменений длины связи нет. Целиком как твердое тело молекула не движется.

Velocity Rescale
Происходит вращение метильных групп и небольшой поворот молекулы как целого.

Термостат Берендсена
Происходит вращение метильных групп и поворот молекулы как целого, выраженный лучше, чем в случае Velocity Rescale

Стохастическая динамика
Движения всей системы стохастичны

Rolling-window function for analysis

In [5]:
def rolling(array, window, func):
    if (window-1) % 2 == 0:
        margin_l = margin_r = (window-1) // 2
    else:
        margin_l = (window-1) // 2
        margin_r = margin_l + 1
    tmp_array = np.zeros(len(array) + window - 1)
    tmp_array[margin_l:-margin_r] = array
    res_array = [func(tmp_array[j:j+window]) for j in range(len(tmp_array)-window+1)]
    return res_array

Energy-plot function

In [8]:
def en_plot():
    for mdparam in ('be','vr','nh','an','sd'):
        plt.figure(figsize=(14,4))
        print mdparam.upper(), 'Kinetic', 'Potential'
        for var in (('T',121),('U',122)):
            X = np.loadtxt('ethane_%s_%s.xvg' % (mdparam, var[0]))
            plt.subplot(var[1])
            plt.plot(X[:,0],X[:,1],linewidth = 0.5)
            plt.plot(X[25:-25,0],rolling(X[:,1], 50, np.mean)[25:-25], linewidth = 2.0)
        plt.show()

In [9]:
en_plot()
BE Kinetic Potential
VR Kinetic Potential
NH Kinetic Potential
AN Kinetic Potential
SD Kinetic Potential

Лучше всего сходится Берендсен. Нозе-Хувер тоже, если закрыть глаза на выбросы.

Построим распределение длин связи C-C. Предполагаем форму, похожую на распределение Максвелла-Больцмана. По этому параметру неплохо выглядят все варианты, кроме Андерсона, хотя тяжелого правого хвоста не наблюдается ни в одном случае.

In [10]:
for mdparam in ('be','vr','nh','an','sd'):
    print 'C-C bond length in MD using %s temperature control' % mdparam.upper()
    X = np.loadtxt('ethane_%s_bond.xvg' % mdparam)
    plt.bar(X[:,0],X[:,1],X[1,0]-X[0,0])
    plt.show()
C-C bond length in MD using BE temperature control
C-C bond length in MD using VR temperature control
C-C bond length in MD using NH temperature control
C-C bond length in MD using AN temperature control
C-C bond length in MD using SD temperature control
In [11]:
! grep Performance *log > perf.txt

Рассчитаем быстродействие

In [12]:
with open('perf.txt','r') as perf:
    print 'method','\t','ns/day'
    for line in perf:
        method = line.split(':')[0][7:9].upper()
        ns_day = line.split()[3]
        print method,'\t',ns_day
    
method 	ns/day
AN 	5524.319
BE 	5386.556
NH 	5179.877
SD 	4778.781
VR 	5242.740

Хорошие результаты по сходимости, форме распределения длин связи C-C и быстродействию показал термостат Берендсона