%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
import subprocess
def run_orca(inp, fileout):
with open(fileout, 'w') as outfile:
outfile.write(inp)
p = subprocess.Popen("/srv/databases/orca/orca " + fileout,
shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out=p.communicate()[0]
outlines = out.splitlines()
for line in outlines:
if "FINAL SINGLE" in line:
k = line.split()
energy = float(k[-1])
return energy
def give_plot(x_o, y_o, start, end, p0):
p1, success = optimize.leastsq(errfunc, p0[:], args=(x_o, y_o))
print "Optimized params:", p1
#Plot it
plt.plot(x_o, y_o, "ro", x_o,fitfunc(p1,x_o),"r-",c='blue',alpha=0.5)
plt.xlim(start,end)
plt.show()
def give_plot_(x_o, y_o, start, end):
#Plot it
plt.plot(x_o, y_o, "ro", c='blue',alpha=0.5)
plt.xlim(start,end)
plt.show()
#function is f(x)=k(b-x)^2 + a
fitfunc = lambda p, x: p[0]*pow(p[1]-x,2) + p[2] # Target function
errfunc = lambda p, x, y: fitfunc(p, x) - y # Error function
Зависимость энергии молекулы этана от длины связи С-С:
lengths = []
energies = []
for n in range(-10, 11):
length = 1.52986 + 0.02*n
lengths.append(length)
inp = '''!HF RHF 6-31G
* int 0 1
C 0 0 0 0 0 0
C 1 0 0 %s 0 0
H 1 2 0 1.08439 111.200 0
H 1 2 3 1.08439 111.200 120
H 1 2 3 1.08439 111.200 -120
H 2 1 3 1.08439 111.200 180
H 2 1 5 1.08439 111.200 120
H 2 1 5 1.08439 111.200 -120
*
'''%(str(length))
energies.append(run_orca(inp, 'CC_bond_outfile.inp'))
print(energies)
p0 = [1,1, -79]
give_plot(lengths, energies, 1, 2, p0)
Зависимость энергии молекулы этана от размера угла H-C-C:
angles = []
energies = []
for n in range(21):
angle = 109.2 + 0.2*n
angles.append(angle)
inp = '''!HF RHF 6-31G
* int 0 1
C 0 0 0 0 0 0
C 1 0 0 1.52986 0 0
H 1 2 0 1.08439 %s 0
H 1 2 3 1.08439 111.200 120
H 1 2 3 1.08439 111.200 -120
H 2 1 3 1.08439 111.200 180
H 2 1 5 1.08439 111.200 120
H 2 1 5 1.08439 111.200 -120
*
'''%(str(angle))
energies.append(run_orca(inp, 'HCC_angle_outfile.inp'))
print(energies)
give_plot(angles, energies, 109, 114, p0)
Зависимость энергии молекулы этана от размера торсионного угла C-C:
angles = []
energies = []
for n in range(31):
angle = - 180 + 12*n
angles.append(angle)
inp = '''!HF RHF 6-31G
* int 0 1
C 0 0 0 0 0 0
C 1 0 0 1.52986 0 0
H 1 2 0 1.08439 111.200 0
H 1 2 3 1.08439 111.200 120
H 1 2 3 1.08439 111.200 -120
H 2 1 3 1.08439 111.200 %s
H 2 1 6 1.08439 111.200 120
H 2 1 6 1.08439 111.200 -120
*
'''%(str(angle))
energies.append(run_orca(inp, 'CC_angle_outfile.inp'))
print(energies)
give_plot_(angles, energies, -185, 185)
У этой функции 3 минимума, соответствующих заторможенным конформациям.
Зависимость энергии молекулы этана от длины связи С-С с увеличенным шагом при расчете:
lengths = []
energies = []
for n in range(-10, 11):
length = 1.52986 + 0.1*n
lengths.append(length)
inp = '''!HF RHF 6-31G
* int 0 1
C 0 0 0 0 0 0
C 1 0 0 %s 0 0
H 1 2 0 1.08439 111.200 0
H 1 2 3 1.08439 111.200 120
H 1 2 3 1.08439 111.200 -120
H 2 1 3 1.08439 111.200 180
H 2 1 5 1.08439 111.200 120
H 2 1 5 1.08439 111.200 -120
*
'''%(str(length))
energies.append(run_orca(inp, 'CC_bond_outfile2.inp'))
print(energies)
give_plot_(lengths, energies, 0.25, 2.5)
Эту функцию можно было бы аппроксимировать гиперболической функцией.