Оптимизированная структура этана в виде z-матрицы c добавленной шапкой для DFT (тип входных координат - ZMT):
$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
Проверим корректность файла, запустив GAMESS:
%%bash
gms et.inp 1 >& et.log
Создадим на основе et.inp 20 файлов с разными длинами связи cc (шаг 0.02А):
%%bash
for i in {-10..10}
do
nb=$(echo "scale=5; 1.001 + $i*0.02" | bc -l)
sed "s/cc=1.52986/cc=$nb/" et.inp > b_${i}.inp
done
Запустим рассчет энергии с помощью GAMESS для получившихся файлов:
%%bash
for i in {-10..10}; do gms b_${i}.inp 1 >& b_${i}.log; done
Запишем в один файл получившиеся значения энергий:
%%bash
for i in {-10..10}
do
nb=$(echo "scale=5; 1.001 + $i*0.02" | bc -l)
echo -n "$nb "
awk '/TOTAL ENERGY =/{print $4}' b_${i}.log
done > bond
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
xx=[];yy=[]
for line in open("bond",'r'):
x,y=map(float,line.split())
xx.append(x);yy.append(y)
plt.scatter(xx, yy)
plt.xlabel("C-C length")
plt.ylabel("Energy")
Попробуем апроксимировать зависимость функцией \(f(x)=a+k(x-b)^2\):
fit=np.polyfit(xx,yy,2)
xfit=[ min(xx)+(max(xx)-min(xx))/100*i for i in range(100) ]
plt.scatter(xx, yy)
plt.plot(xfit,np.polyval(fit, xfit),'r')
print fit
\(f(x)=7.245x^2-17.384x-69.202\)
\(k=7.245\)
\(b=17.384 / 2k=1.200\)
\(a=-69.202-kb^2=-79.635\)
Проделаем то же самое для валентного угла cchv (значения изменяются от 109.2 до 113.2):
%%bash
for i in {-10..10}
do
nb=$(echo "scale=5; 111.2 + $i*0.2" | bc -l)
sed "s/cchv=111.200/cchv=$nb/" et.inp > v_${i}.inp
done
%%bash
for i in {-10..10}; do gms v_${i}.inp 1 >& v_${i}.log; done
%%bash
for i in {-10..10}
do
nb=$(echo "scale=5; 111.2 + $i*0.2" | bc -l)
echo -n "$nb "
awk '/TOTAL ENERGY =/{print $4}' v_${i}.log
done > vangle
xx=[];yy=[]
for line in open("vangle",'r'):
x,y=map(float,line.split())
xx.append(x);yy.append(y)
plt.clf()
plt.plot(xx, yy,".")
plt.xlabel("HCC angle")
plt.ylabel("Energy")
fit=np.polyfit(xx,yy,2)
xfit=[ min(xx)+(max(xx)-min(xx))/100*i for i in range(100) ]
plt.plot(xfit,np.polyval(fit, xfit),'r')
Проделаем то же самое для торсионного угла d3 (значения изменяются от -180 до 180 c шагом 12):
%%bash
for i in {-15..15}
do
nb=$(echo "scale=5; 0 + $i*12" | bc -l)
sed "s/d3=180/d3=$nb/" et.inp > t_${i}.inp
done
%%bash
for i in {-15..15}; do gms t_${i}.inp 1 >& t_${i}.log; done
%%bash
for i in {-15..15}
do
nb=$(echo "scale=5; 0 + $i*12" | bc -l)
echo -n "$nb "
awk '/TOTAL ENERGY =/{print $4}' t_${i}.log
done > torsion
xx=[];yy=[]
for line in open("torsion",'r'):
x,y=map(float,line.split())
xx.append(x);yy.append(y)
plt.clf()
plt.plot(xx, yy,".")
plt.xlabel("Torsion angle")
plt.ylabel("Energy")
Мы наблюдаем три минимума (которые соответствуют, по-видимому, заторможенным конформациям).