In [1]:
import numpy as np
import subprocess
import re
import os
import matplotlib.pyplot as plt
from scipy import optimize 
In [2]:
inp = '''!HF RHF 6-31G
* int 0 1
C 0 0 0 0 0 0
C 1 0 0 {0:.5f} 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 6 1.08439 111.200 120
H 2 1 6 1.08439 111.200 -120
*
'''
In [3]:
regex = re.compile("FINAL\sSINGLE\sPOINT\sENERGY\s+(?P<energy>[\d\-\.]+)")
def process_file(in_name):
    p = subprocess.Popen("/srv/databases/orca/orca {}".format(in_name), 
                    shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out=p.communicate()[0]
    with open(in_name + "out.txt", "w") as out_file:
        #print out
        out_file.write(out)
        
    for line in out.splitlines():
        match = regex.match(line)
        if match:
            print match.group("energy")
            return float(match.group("energy"))
            break
In [4]:
init_value = 1.0
result_bond = np.zeros(100)
values_bond = np.arange(100)  * 0.02 + init_value
for ind, val in enumerate(values_bond):
    in_name = "mol_" + str(val) + "bond.zmat"
    with open(in_name , "w") as in_file:
        in_file.write(inp.format(val))
    result_bond[ind] = process_file(in_name)
-78.736299430397
-78.789458660227
-78.837423874855
-78.880656421364
-78.919575868466
-78.954564052923
-78.985968697920
-79.014106653063
-79.039266790690
-79.061712607515
-79.081684548735
-79.099402106683
-79.115065699743
-79.128858370348
-79.140947309403
-79.151485255251
-79.160611745699
-79.168454254229
-79.175129236134
-79.180743073071
-79.185392940939
-79.189167593044
-79.192148085503
-79.194408434212
-79.196016219097
-79.197033124396
-79.197515457640
-79.197514596365
-79.197077411296
-79.196246650889
-79.195061290608
-79.193556855589
-79.191765715048
-79.189717346601
-79.187438592579
-79.184953879964
-79.182285430666
-79.179453455845
-79.176476329519
-79.173370752409
-79.170151900180
-79.166833563707
-79.163428272079
-79.159947411218
-79.156401328834
-79.152799432915
-79.149150278110
-79.145461650359
-79.141740638986
-79.137993703186
-79.134226733424
-79.130445106659
-79.126653734923
-79.122857110295
-79.119059343664
-79.115264199456
-79.111475136490
-79.107695320892
-79.103927662845
-79.100174833780
-79.096439288820
-79.092723282878
-79.089028886598
-79.085357998907
-79.081712362026
-79.078093568133
-79.074503073126
-79.070942201494
-79.067412156469
-79.063914026124
-79.060448788822
-79.057017321191
-79.053620400381
-79.050258710194
-79.046932847094
-79.043643322873
-79.040390567961
-79.037174937423
-79.033996712899
-79.030856107236
-79.027753267281
-79.024688278292
-79.021661166516
-79.018671904833
-79.015720405783
-79.012806542016
-79.009930136717
-79.007090969063
-79.004288780893
-79.001523275050
-78.998794120396
-78.996100955440
-78.993443389485
-78.990821007582
-78.988233370983
-78.985680021428
-78.983160481969
-78.980674261037
-78.978220853989
-78.975799747009
In [5]:
plt.plot(values_bond, result_bond)
plt.show()

Проделайте аналогичные операции для валентного угла HCH, его значения должны изменяться от 109.2 до 113.2. Сохраните полученные коэффициенты в отчёт. Примечание: не перезаписывайте файл со значениями энергий они Вам нужны для отчёта. Сравните полученные константы с данными из статьи о GAFF. Укажите возможные причины расхождений ваших результатов и публикацией.

In [6]:
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 {0:.5f} 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
*
'''
In [7]:
init_value = 109.2
step = 0.2
num_of_steps = (113.2 - init_value) * 5  + 1
values_angle = np.arange(num_of_steps)  * step + init_value
result_angle = np.empty_like(values_angle)

for ind, val in enumerate(values_angle):
    in_name = "mol_" + str(val) + "angle.zmat"
    with open(in_name , "w") as in_file:
        in_file.write(inp.format(val))
    result_angle[ind] = process_file(in_name)
-79.081417683755
-79.081443973015
-79.081466935659
-79.081486576367
-79.081502899787
-79.081515910519
-79.081525613135
-79.081532012154
-79.081535112060
-79.081534917294
-79.081531432275
-79.081524661364
-79.081514608894
-79.081501279151
-79.081484676390
-79.081464804820
-79.081441668614
-79.081415271924
-79.081385618844
-79.081352713424
-79.081316559700
In [8]:
plt.plot(values_angle, result_angle)
plt.show()

"Проделайте аналогичные операции для торсионного угла CC, его значения должны изменяться от -180 до 180 c шагом 12. Сохраните изображение и укажите в отчёте количество минимумов функции."

In [9]:
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 {}
H 2 1 6 1.08439 111.200 120
H 2 1 6 1.08439 111.200 -120
*
'''
In [10]:
init_value = -180
step = 12
num_of_steps = (180 - init_value) / step  + 1
values_tors = np.arange(num_of_steps)  * step + init_value
result_tors = np.empty_like(values_tors, dtype=np.float64)

for ind, val in enumerate(values_tors):
    in_name = "mol_" + str(val) + "angle.zmat"
    with open(in_name , "w") as in_file:
        in_file.write(inp.format(val))
    result_tors[ind] = process_file(in_name)
-79.197572404432
-79.197137710903
-79.195996523376
-79.194579724110
-79.193428568288
-79.192987718045
-79.193428568288
-79.194579724110
-79.195996523376
-79.197137710903
-79.197572404432
-79.197137710903
-79.195996523376
-79.194579724110
-79.193428568288
-79.192987718045
-79.193428568288
-79.194579724110
-79.195996523376
-79.197137710903
-79.197572404432
-79.197137710903
-79.195996523376
-79.194579724110
-79.193428568288
-79.192987718045
-79.193428568288
-79.194579724110
-79.195996523376
-79.197137710903
-79.197572404432
In [11]:
import matplotlib.ticker as ticker
import matplotlib.pyplot as plt

ax = plt.axes()
ax.xaxis.set_major_locator(ticker.FixedLocator(np.arange(len(values_tors) )))
ax.xaxis.set_major_formatter(ticker.FixedFormatter((values_tors)))
#ax.yaxis.set_major_locator(ticker.FixedLocator(np.arange(len(result_tors) )))
#ax.yaxis.set_major_formatter(ticker.FixedFormatter((result_tors)))
plt.xticks(rotation=70) 
plt.title("")
plt.yticks(result_tors)
plt.plot(result_tors)
plt.show()