Вычисление параметров для молекулярной механики

In []:
import sys
In []:
header=""" $CONTRL COORD=ZMT UNITS=ANGS   dfttyp=b3lyp RUNTYP=ENERGY $END
 $BASIS  GBASIS=N31 NGAUSS=6
 POLAR=POPN31 NDFUNC=1 $END
 $GUESS  GUESS=HUCKEL $END
 $system mwords=2 $end
 $DATA
eth
C1
 C   
 C      1   cc 
 H      2   ch   1   cchv 
 H      2   ch   1   cch   3   d1 0
 H      2   ch   1   cch   3   d2 0
 H      1   ch   2   cch   3   d3 0
 H      1   ch   2   cch   5   d3 0
 H      1   chv  2   cch   4   d3 0

cc=1.52986
ch=1.08439
chv=1.08439
cch=111.200
cchv=111.200
d1=120
d2=-120
d3=180
 $END"""

with open('et.inp', 'w') as et:
    et.write(header)

Полученный файл запустили в GAMESS, для проверки отсутствия ошибок в выходном файле.

In []:
%%bash
gms et.inp > et.log

Ошибок не было получено,следовательно, нужно создать с помощью скрипта bash 21 файла с различными значениями переменной cc.

In []:
%%bash
bash ./make_b.bash

Модернизируем скрипт для запуска расчетов для всех этих файлов, и запустим его.

In []:
%%bash
bash ./game_make.bash

Затем изменим примененный ранее скрипт так, чтобы на экран выводились значения энергии и длины связей, полученных при расчетах GAMESS.

In [2]:
%%bash
bash ./n_make.bash > bond.txt
bash ./n_make.bash
1.32986    -79.7339315289
1.34986    -79.7406173737
1.36986    -79.7462868578
1.38986    -79.7510331813
1.40986    -79.7549412921
1.42986    -79.7580886263
1.44986    -79.7605457819
1.46986    -79.7623771323
1.48986    -79.7636413832
1.50986    -79.7643920816
1.52986    -79.7646780790
1.54986    -79.7645439543
1.56986    -79.7640303992
1.58986    -79.7631745699
1.60986    -79.7620104053
1.62986    -79.7605689179
1.64986    -79.7588784564
1.66986    -79.7569649422
1.68986    -79.7548520851
1.70986    -79.7525615748
1.72986    -79.7501132582

Визуализировали полученную зависимость с помощью matplotlib

In [4]:
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
In [3]:
a=np.loadtxt('bond.txt')
x=a[:,0]
y=a[:,1]
plt.plot(x, y,'k.')
plt.xlabel("C-C bond length")
plt.ylabel("Total energy")
Out[3]:
<matplotlib.text.Text at 0x7f57c4fc9490>

Теперь проведем описание полученной зависимости функцией:

In [6]:
a=np.loadtxt('bond.txt')
x=a[:,0]
y=a[:,1]
coefficients = np.polyfit(x, y, 2)
polynomial = np.poly1d(coefficients)
xs =  np.linspace(min(x),max(x),50)
ys = polynomial(xs)

plt.plot(x, y, 'k.')
plt.plot(xs, ys)
plt.xlabel("C-C bond length")
plt.ylabel("Total energy")
print polynomial
        2
0.5636 x - 1.752 x - 78.4

Наблюдаются неточности в описываемой функции.

Далее проведем аналогичные операции для валентного угла HCH, изменяя его значения от 109.2 до 113.2. Для этого напишем аналогичные предыдущим скрипты.

In [25]:
with open("make_a.sh",'w') as file:
    file.write("""
for i in {-10..10}; do 
    nb=$(echo "scale=5; 111.200 + $i/5" | bc -l)
    sed "s/cchv=111.200/cchv=$nb/" et.inp  > a_${i}.inp
done""")
with open("game_a.sh",'w') as file:
    file.write("""
for i in {-10..10}; do 
    nb=$(echo "scale=5; 111.200 + $i/5" | bc -l)
    sed "s/cchv=111.200/cchv=$nb/" et.inp  > a_${i}.inp
gms a_${i}.inp 1>& a_${i}.log
done""")

with open("n_make_a.sh",'w') as file:
    file.write("""
for i in {-10..10}; do 
    nb=$(echo "scale=5; 111.200 + $i/5" | bc -l)
    sed "s/cchv=111.200/cchv=$nb/" et.inp  > a_${i}.inp
echo -n "$nb "
awk '/TOTAL ENERGY =/{print $4}' a_${i}.log
done""")
In [8]:
%%bash
bash ./make_a.sh
In [12]:
%%bash
bash ./game_a.sh
In [26]:
%%bash
bash ./n_make_a.sh > angle.txt
less angle.txt
109.20000 -79.7645100655
109.40000 -79.7645396319
109.60000 -79.7645663700
109.80000 -79.7645902763
110.00000 -79.7646113475
110.20000 -79.7646295805
110.40000 -79.7646449722
110.60000 -79.7646575202
110.80000 -79.7646672219
111.00000 -79.7646740754
111.20000 -79.7646780790
111.40000 -79.7646792311
111.60000 -79.7646775309
111.80000 -79.7646729776
112.00000 -79.7646655711
112.20000 -79.7646553114
112.40000 -79.7646421992
112.60000 -79.7646262354
112.80000 -79.7646074214
113.00000 -79.7645857589
113.20000 -79.7645612501

In [9]:
a=np.loadtxt('angle.txt')
x=a[:,0]
y=a[:,1]
coefficients = np.polyfit(x, y, 2)
polynomial = np.poly1d(coefficients)
xs =  np.linspace(min(x),max(x),50)
ys = polynomial(xs)

plt.plot(x, y, 'k.')
plt.plot(xs, ys)
plt.xlabel("HCH angle")
plt.ylabel("Total energy")
print polynomial
           2
3.561e-05 x - 0.007932 x - 79.32

Все тоже самое сделаем для торсионного угла d3, изменяя его значения от -180 до 180 c шагом 12. Для этого напишем аналогичные предыдущим скрипты.

In [42]:
with open("make_d.sh",'w') as file:
    file.write("""
for i in {-15..15}; do 
    nb=$(echo "scale=0; 0 + $i*12" | bc -l)
     sed "s/d3=180/d3=$nb/" et.inp  > c_${i}.inp
done""")

with open("game_d.sh",'w') as file:
    file.write("""
for i in {-15..15}; do 
    nb=$(echo "scale=0; 0 + $i*12" | bc -l)
    sed "s/d3=180/d3=$nb/" et.inp  > c_${i}.inp
gms c_${i}.inp 1>& c_${i}.log
done""")

with open("n_make_d.sh",'w') as file:
    file.write("""
for i in {-15..15}; do 
    nb=$(echo "scale=0; 0 + $i*12" | bc -l)
    sed "s/d3=180/d3=$nb/" et.inp  > c_${i}.inp
gms c_${i}.inp 1>& c_${i}.log
echo -n "$nb"
awk '/TOTAL ENERGY =/{print $4}' c_${i}.log
done""")
In [1]:
%%bash
bash ./make_d.sh
In [2]:
%%bash 
bash ./game_d.sh
In [3]:
%%bash 
bash ./n_make_d.sh > d.txt
less d.txt
-180 -79.7646780790
-168 -79.7642336928
-156 -79.7630628377
-144 -79.7616148156
-132 -79.7604407798
-120 -79.7599827599
-108 -79.7604407798
-96 -79.7616148156
-84 -79.7630628377
-72 -79.7642336928
-60 -79.7646780790
-48 -79.7642336928
-36 -79.7630628377
-24 -79.7616148156
-12 -79.7604407798
0 -79.7599827599
12 -79.7604407798
24 -79.7616148156
36 -79.7630628377
48 -79.7642336928
60 -79.7646780790
72 -79.7642336928
84 -79.7630628377
96 -79.7616148156
108 -79.7604407798
120 -79.7599827599
132 -79.7604407798
144 -79.7616148156
156 -79.7630628377
168 -79.7642336928
180 -79.7646780790

In [13]:
a=np.loadtxt('d.txt')
x=a[:,0]
y=a[:,1]
plt.plot(x, y, 'k.')
plt.xlabel("d3 torsion angle")
plt.ylabel("Total energy")
Out[13]:
<matplotlib.text.Text at 0x7f0f810b69d0>

На графике отчетливо видны 3 минимума функции(-180 и 180 прядставляют собой одну и ту же точку.)

Файлы: