Task4

Version 3 (Andrey Golovin, 18.10.2019 16:37)

1 1 Andrey Golovin
h1. Вычисление атомных орбиталей водорода 
2 1 Andrey Golovin
3 1 Andrey Golovin
Цель занятия: опираясь на уравнение построить электронную плотность в одно-электронном атоме и сравнить с известными программами
4 1 Andrey Golovin
5 1 Andrey Golovin
Работа разделена на две части: расчёт плотности в Ipython Notebook с сохранением в формате CUBE и визуализация в Pymol. 
6 1 Andrey Golovin
7 1 Andrey Golovin
* Запустите Jupiter Notebook на kodomo и если надо настройте туннель (см занятие Хемоинформатика) .
8 1 Andrey Golovin
* В нашем notebook cначала загрузим модули scipy и numpy для эффективной работы с массивами и содержащими нужные функции
9 1 Andrey Golovin
10 1 Andrey Golovin
11 1 Andrey Golovin
<pre><code class="python"> 
12 1 Andrey Golovin
import numpy
13 1 Andrey Golovin
import scipy.special
14 1 Andrey Golovin
import scipy.misc
15 1 Andrey Golovin
</code></pre>
16 1 Andrey Golovin
17 2 Andrey Golovin
* Также вам понадобиться функция от Андрея Демкива http://kodomo.fbb.msu.ru/~golovin/ipynb/npy2cube.py , скачайте его в рабочую директорию и подключите.
18 1 Andrey Golovin
19 1 Andrey Golovin
<pre><code class="python"> 
20 1 Andrey Golovin
import npy2cube
21 1 Andrey Golovin
</code></pre>
22 1 Andrey Golovin
 
23 2 Andrey Golovin
* Давайте зададим волновую функцию, попробуйте предоставить формулу в отчёте
24 1 Andrey Golovin
25 1 Andrey Golovin
<pre><code class="python"> 
26 1 Andrey Golovin
def w(n,l,m,d):
27 1 Andrey Golovin
    
28 1 Andrey Golovin
    x,y,z = numpy.mgrid[-d:d:30j,-d:d:30j,-d:d:30j]
29 1 Andrey Golovin
    
30 1 Andrey Golovin
    r = lambda x,y,z: numpy.sqrt(x**2+y**2+z**2)
31 1 Andrey Golovin
    theta = lambda x,y,z: numpy.arccos(z/r(x,y,z))
32 1 Andrey Golovin
    phi = lambda x,y,z: numpy.arctan(y/x)
33 1 Andrey Golovin
    
34 1 Andrey Golovin
    a0 = 1.
35 1 Andrey Golovin
    
36 1 Andrey Golovin
    R = lambda r,n,l: (2*r/n/a0)**l * numpy.exp(-r/n/a0) * scipy.special.genlaguerre(n-l-1,2*l+1)(2*r/n/a0)
37 1 Andrey Golovin
    WF = lambda r,theta,phi,n,l,m: R(r,n,l) * scipy.special.sph_harm(m,l,phi,theta)
38 1 Andrey Golovin
    absWF = lambda r,theta,phi,n,l,m: numpy.absolute(WF(r,theta,phi,n,l,m))**2
39 1 Andrey Golovin
      
40 1 Andrey Golovin
    return WF(r(x,y,z),theta(x,y,z),phi(x,y,z),n,l,m)
41 1 Andrey Golovin
</code></pre>
42 1 Andrey Golovin
43 1 Andrey Golovin
* Вставьте в код комментарии про каждую внутреннюю функцию (lambda)
44 1 Andrey Golovin
45 1 Andrey Golovin
* Давайте рассчитаем значения для первых трех уровней. Функция w выдает трехмерный массив из 30*30*30 элементов с неким шагом (или grid). 
46 1 Andrey Golovin
47 1 Andrey Golovin
48 1 Andrey Golovin
* определите шаг grid при заданном диапозоне от -d до d
49 1 Andrey Golovin
50 1 Andrey Golovin
<pre><code class="python"> 
51 1 Andrey Golovin
d=.....
52 1 Andrey Golovin
step= .....
53 1 Andrey Golovin
54 1 Andrey Golovin
# Зададим цикл по перебору квантовых чисел
55 1 Andrey Golovin
56 1 Andrey Golovin
for n in range(0,4):
57 1 Andrey Golovin
    for l in range(0,n):
58 1 Andrey Golovin
        for m in range(0,l+1,1):
59 1 Andrey Golovin
            grid= .... 
60 1 Andrey Golovin
            name='%s-%s-%s' % (n,l,m)
61 1 Andrey Golovin
            # для сохранения нужно задать координаты старта grid и шаг по каждому направлению
62 1 Andrey Golovin
            npy2cube.npy2cube(grid,(-d,....),(step,.....),name+'.cube')
63 1 Andrey Golovin
</code></pre>  
64 1 Andrey Golovin
      
65 1 Andrey Golovin
* В результате работы скрипта появятся cube файлы, попробуйте их открыть в PyMol и построить volume для них или воспользуйтесь  Ipyvolume (https://github.com/maartenbreddels/ipyvolume).
66 1 Andrey Golovin
67 1 Andrey Golovin
68 1 Andrey Golovin
* Попробуйте изменить окраску с помощью panel в colors
69 1 Andrey Golovin
70 1 Andrey Golovin
* Давайте создадим скрипт для PyMol для визуализации всех файлов
71 1 Andrey Golovin
72 1 Andrey Golovin
<pre><code class="python"> 
73 1 Andrey Golovin
### Откуда эти цифры? 
74 1 Andrey Golovin
pml='''
75 1 Andrey Golovin
### cut below here and paste into script ###
76 1 Andrey Golovin
cmd.volume_ramp_new('ramp007', [\
77 1 Andrey Golovin
      0.005, 0.00, 0.00, 1.00, 0.00, \
78 1 Andrey Golovin
      0.01,  0.00, 1.00, 1.00, 0.20, \
79 1 Andrey Golovin
      0.015, 0.00, 0.00, 1.00, 0.00, \
80 1 Andrey Golovin
    ])
81 1 Andrey Golovin
### cut above here and paste into script ###
82 1 Andrey Golovin
'''
83 1 Andrey Golovin
84 1 Andrey Golovin
for n in range(0,4):
85 1 Andrey Golovin
    for l in range(0,n):
86 1 Andrey Golovin
        for m in range(0,l+1,1):
87 1 Andrey Golovin
            name='%s-%s-%s' % (n,l,m)
88 1 Andrey Golovin
            # Загрузить cube файл
89 1 Andrey Golovin
            # Отобразить электронную плотность (hint: volume)
90 1 Andrey Golovin
            # Покрасить ее разумным образом 
91 1 Andrey Golovin
92 1 Andrey Golovin
# запишите переменную в файл
93 1 Andrey Golovin
v=open(.....
94 1 Andrey Golovin
</code></pre>
95 1 Andrey Golovin
96 1 Andrey Golovin
97 1 Andrey Golovin
* Модифицируйте скрипт как Вам нравится для наилучшего отображения
98 1 Andrey Golovin
99 1 Andrey Golovin
* Загрузите изображения в Ipython Notebook
100 1 Andrey Golovin
101 1 Andrey Golovin
102 1 Andrey Golovin
<pre><code class="python"> 
103 1 Andrey Golovin
from IPython.display import display,Image
104 1 Andrey Golovin
display(Image=(file))
105 1 Andrey Golovin
</code></pre>
106 1 Andrey Golovin
  
107 2 Andrey Golovin
* Рассчитаем орбитали в программе Orca. Создадим текстовый файл h.inp:
108 1 Andrey Golovin
109 1 Andrey Golovin
<pre>
110 1 Andrey Golovin
! UHF SVP XYZFile
111 1 Andrey Golovin
%plots Format Cube
112 1 Andrey Golovin
 MO("H-1.cube",1,0);
113 1 Andrey Golovin
 MO("H-2.cube",2,0);
114 1 Andrey Golovin
 MO("H-3.cube",3,0);
115 1 Andrey Golovin
 MO("H-4.cube",4,0);
116 1 Andrey Golovin
end
117 1 Andrey Golovin
* xyz 0 4
118 1 Andrey Golovin
 H 0 0 0
119 1 Andrey Golovin
*
120 1 Andrey Golovin
</pre>
121 1 Andrey Golovin
122 1 Andrey Golovin
 запустим Orca
123 1 Andrey Golovin
124 1 Andrey Golovin
125 1 Andrey Golovin
<pre><code class="bash"> 
126 1 Andrey Golovin
export PATH=${PATH}:/tmp
127 1 Andrey Golovin
orca h.inp
128 1 Andrey Golovin
</code></pre>
129 1 Andrey Golovin
 * Сравните визуально Ваши орбитали и рассчитанные программой Orca 
130 3 Andrey Golovin
131 3 Andrey Golovin
h2. Альтернативный способ визуализации орбиталей
132 3 Andrey Golovin
 
133 3 Andrey Golovin
* Сохраним плотность в файл hdf5
134 3 Andrey Golovin
<pre>
135 3 Andrey Golovin
import h5py
136 3 Andrey Golovin
step = [cell[0]/100,cell[1]/100,cell[2]/100]
137 3 Andrey Golovin
origin = [0,0,0]
138 3 Andrey Golovin
139 3 Andrey Golovin
with h5py.File('cube.hdf5', 'w') as f:
140 3 Andrey Golovin
    oset = f.create_dataset("origin", data = origin)
141 3 Andrey Golovin
    sset = f.create_dataset("step", data = step)
142 3 Andrey Golovin
    dset = f.create_dataset("grid", data = e)
143 3 Andrey Golovin
144 3 Andrey Golovin
</pre>
145 3 Andrey Golovin
146 3 Andrey Golovin
147 3 Andrey Golovin
* Создадим файл py, который будет запускаться из PyMol
148 3 Andrey Golovin
<pre>
149 3 Andrey Golovin
from chempy.brick import Brick
150 3 Andrey Golovin
from pymol import cmd
151 3 Andrey Golovin
import numpy as np
152 3 Andrey Golovin
import h5py
153 3 Andrey Golovin
154 3 Andrey Golovin
155 3 Andrey Golovin
F = h5py.File('cube.hdf5', 'r')
156 3 Andrey Golovin
157 3 Andrey Golovin
step = F['step'][()]
158 3 Andrey Golovin
origin = F['origin'][()]
159 3 Andrey Golovin
data = F['grid'][()] 
160 3 Andrey Golovin
b = Brick.from_numpy(data, step, origin)
161 3 Andrey Golovin
162 3 Andrey Golovin
163 3 Andrey Golovin
cmd.load_brick(b, 'cone')
164 3 Andrey Golovin
volname =  'cone_volume'
165 3 Andrey Golovin
166 3 Andrey Golovin
cmd.volume(volname, 'cone')
167 3 Andrey Golovin
168 3 Andrey Golovin
F.close()
169 3 Andrey Golovin
</pre>