Task3

Version 1 (Andrey Golovin, 05.10.2022 11:45)

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