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

In [5]:
import numpy as np
import subprocess
%matplotlib inline
import matplotlib.pyplot as plt
from scipy import optimize
from IPython.display import Image, display

Функция по запуску ORCA с kodomo

In [7]:
def run_orca(inp):
    with open('orca.inp', 'w') as outfile:
        outfile.write(inp)
    with subprocess.Popen("orca orca.inp", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) as p:
        out=p.communicate()[0].decode()
    for line in out.splitlines():
        if 'FINAL SINGLE POINT' in line:
            return float(line.strip().split()[4])
        return None

Варьируем длину связи

In [20]:
bond_length_template = '''!HF RHF 6-31G
* int 0 1
C 0 0 0 0 0 0 
C 1 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 5 1.08439 111.200 120
H 2 1 5 1.08439 111.200 -120
*
'''
In [21]:
bond_lengths = np.arange(1.3, 1.7, 0.02)
energies = []
for length in bond_lengths:
    energy = run_orca(bond_length_template.format(length))
    energies.append(energy)

energies
Out[21]:
[-79.032182528815,
 -79.041744463516,
 -79.049987759748,
 -79.057030879602,
 -79.06298211776,
 -79.067940474839,
 -79.07199643939,
 -79.075232719275,
 -79.077724899299,
 -79.079542052084,
 -79.080747276442,
 -79.081398220413,
 -79.081547535141,
 -79.081243296408,
 -79.080529393453,
 -79.079445881984,
 -79.07802930946,
 -79.07631301188,
 -79.07432738311,
 -79.072100131885]
In [23]:
plt.scatter(bond_lengths, energies)
Out[23]:
<matplotlib.collections.PathCollection at 0x7fca13f3b5b0>

Варьируем валентный угол HCС

In [ ]:
angle_template = '''!MP2 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 {:.3f} 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 [26]:
angle_HCC = np.arange(109.2, 113.2, 0.02)
energies = []
for angle in angle_HCC:
    energy = run_orca(angle_template.format(angle))
    energies.append(energy)

energies
Out[26]:
[-79.491750170985,
 -79.491752168993,
 -79.491754756419,
 -79.491757355061,
 -79.491759927303,
 -79.491762470476,
 -79.491764984416,
 -79.491767469126,
 -79.491769924615,
 -79.491772350877,
 -79.491774747926,
 -79.491777115755,
 -79.491779454372,
 -79.491781763771,
 -79.491784043965,
 -79.491786294952,
 -79.491788516736,
 -79.491790709317,
 -79.491792872696,
 -79.491795006887,
 -79.491797111883,
 -79.491799187685,
 -79.491801234296,
 -79.491803251728,
 -79.49180523997,
 -79.491807199035,
 -79.491809128921,
 -79.491811029636,
 -79.491812901172,
 -79.491814743544,
 -79.491816556741,
 -79.491818340777,
 -79.491820095648,
 -79.491821821357,
 -79.491823517911,
 -79.491825185309,
 -79.49182682357,
 -79.491828432646,
 -79.491830012602,
 -79.491831563407,
 -79.491833085068,
 -79.491834577589,
 -79.491836040979,
 -79.491837475224,
 -79.491838880343,
 -79.491840256327,
 -79.491841603188,
 -79.491842920924,
 -79.491844209533,
 -79.491845469028,
 -79.491846699405,
 -79.491847900668,
 -79.491849072815,
 -79.491850215852,
 -79.491851329787,
 -79.491852414615,
 -79.49185347034,
 -79.491854496966,
 -79.491855494499,
 -79.491856462931,
 -79.491857402273,
 -79.491858312525,
 -79.491859193688,
 -79.491860045768,
 -79.491860868767,
 -79.491861662682,
 -79.491862427527,
 -79.491863163289,
 -79.491863869983,
 -79.491864547602,
 -79.491865196158,
 -79.491865815652,
 -79.491866406075,
 -79.49186696744,
 -79.491867499751,
 -79.491868003007,
 -79.491868477199,
 -79.491868922358,
 -79.491869338458,
 -79.491869725517,
 -79.491870083549,
 -79.491870412511,
 -79.491870712446,
 -79.491870983348,
 -79.491871225215,
 -79.491871438051,
 -79.491871621854,
 -79.491871776636,
 -79.491871902397,
 -79.491871999135,
 -79.491872066855,
 -79.491872105559,
 -79.491872115248,
 -79.491872095925,
 -79.491872047588,
 -79.491871970252,
 -79.49187186391,
 -79.491871728565,
 -79.491871564222,
 -79.491871370881,
 -79.491871148546,
 -79.491870897214,
 -79.491870616902,
 -79.491870307595,
 -79.491869969303,
 -79.491869602032,
 -79.491869205775,
 -79.491868780545,
 -79.491868326339,
 -79.491867843156,
 -79.491867331008,
 -79.491866789889,
 -79.491866219802,
 -79.491865620752,
 -79.49186499274,
 -79.491864335769,
 -79.491863649845,
 -79.491862934964,
 -79.491862191135,
 -79.491861418351,
 -79.491860616625,
 -79.49185978595,
 -79.491858926333,
 -79.491858037777,
 -79.491857120284,
 -79.49185617385,
 -79.491855198484,
 -79.491854194196,
 -79.491853160971,
 -79.491852098822,
 -79.491851007745,
 -79.491849887757,
 -79.491848738846,
 -79.491847561013,
 -79.49184635427,
 -79.491845118612,
 -79.491843854045,
 -79.491842560572,
 -79.491841238192,
 -79.491839886913,
 -79.491838506725,
 -79.49183709764,
 -79.491835659668,
 -79.491834192792,
 -79.49183269703,
 -79.49183117238,
 -79.491829618837,
 -79.491828036413,
 -79.491826425106,
 -79.491824784921,
 -79.491823115854,
 -79.49182141791,
 -79.4918196911,
 -79.49181793542,
 -79.491816150867,
 -79.491814337449,
 -79.491812495165,
 -79.491810624015,
 -79.491808724014,
 -79.491806795154,
 -79.491804837437,
 -79.491802850869,
 -79.49180083545,
 -79.491798791182,
 -79.491796718066,
 -79.49179461611,
 -79.491792485313,
 -79.491790325673,
 -79.491788137204,
 -79.49178591989,
 -79.491783673748,
 -79.491781398776,
 -79.491779094972,
 -79.491776762349,
 -79.491774400902,
 -79.491772010631,
 -79.491769591544,
 -79.491767143635,
 -79.491764666915,
 -79.491762161378,
 -79.49175962703,
 -79.491757063875,
 -79.491754471917,
 -79.491751851154,
 -79.491749201589,
 -79.491746523224,
 -79.491743816067,
 -79.491741080111,
 -79.491738315364,
 -79.491735521823,
 -79.491732699497,
 -79.491729848386,
 -79.491726968488,
 -79.491724059808,
 -79.491721122353,
 -79.491718156115,
 -79.491715161102,
 -79.491712137324,
 -79.49170908477,
 -79.491706003444]
In [27]:
plt.scatter(angle_HCC, energies)
Out[27]:
<matplotlib.collections.PathCollection at 0x7fca13eacf10>

Варьируем торсионный угол CC

In [25]:
torsion_template = '''!MP2 6-311G**
* 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 {:d}
H 2 1 6 1.08439 111.200 120
H 2 1 6 1.08439 111.200 -120
*'''
In [28]:
torsion_CC = np.arange(-180, 180, 12)
energies = []
for angle in torsion_CC:
    energy = run_orca(torsion_template.format(angle))
    energies.append(energy)

energies
Out[28]:
[-79.57057866153,
 -79.570088211971,
 -79.568801463954,
 -79.56719663617,
 -79.565883213577,
 -79.565376395094,
 -79.565883310378,
 -79.567195117626,
 -79.568803379288,
 -79.570088352708,
 -79.570578512044,
 -79.570088210764,
 -79.568803183426,
 -79.567196661502,
 -79.565881455739,
 -79.565376402808,
 -79.565881592055,
 -79.567196834885,
 -79.568803406237,
 -79.570088352401,
 -79.570578512034,
 -79.570088210767,
 -79.568803183427,
 -79.567196661501,
 -79.565881455738,
 -79.565376402813,
 -79.565881592058,
 -79.567196834887,
 -79.56880340624,
 -79.570088352402]
In [29]:
plt.scatter(torsion_CC, energies)
Out[29]:
<matplotlib.collections.PathCollection at 0x7fca13e20b80>

Минимумы энергии соответствуют конформации этана с максимальным удалением атомов водорода друг от друга. Таких различных случаев возможно 3.