Task4

Version 9 (Andrey Golovin, 13.11.2025 18:38)

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 8 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 4 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 4 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 4 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 4 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 5 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 9 Andrey Golovin
* Рассчитаем орбитали в модуле Psi4
103 1 Andrey Golovin
104 1 Andrey Golovin
<pre>
105 9 Andrey Golovin
import psi4
106 9 Andrey Golovin
import numpy as np
107 9 Andrey Golovin
psi4.core.set_output_file('output.dat')
108 1 Andrey Golovin
</pre>
109 1 Andrey Golovin
110 9 Andrey Golovin
. Создадим input:
111 9 Andrey Golovin
<pre>
112 9 Andrey Golovin
g = '''
113 9 Andrey Golovin
         0 1
114 9 Andrey Golovin
         C     0.000000     0.000000     0.000000
115 9 Andrey Golovin
'''
116 9 Andrey Golovin
</pre>
117 1 Andrey Golovin
118 9 Andrey Golovin
* запустим
119 1 Andrey Golovin
120 9 Andrey Golovin
121 9 Andrey Golovin
122 9 Andrey Golovin
<pre>
123 9 Andrey Golovin
m = psi4.geometry(g)
124 9 Andrey Golovin
psi4.set_options({"maxiter": 200, "fail_on_maxiter" :  True})
125 9 Andrey Golovin
ener=psi4.energy('scf/cc-pvtz', molecule = m )
126 9 Andrey Golovin
127 9 Andrey Golovin
Расчёт орбиталей в Psi4:  информация  об api https://psicode.org/psi4manual/1.4.0/api/psi4.core.cubeproperties
128 9 Andrey Golovin
</pre>
129 9 Andrey Golovin
130 1 Andrey Golovin
 * Сравните визуально Ваши орбитали и рассчитанные программой Orca 
131 3 Andrey Golovin
132 3 Andrey Golovin
h2. Альтернативный способ визуализации орбиталей
133 3 Andrey Golovin
 
134 3 Andrey Golovin
* Сохраним плотность в файл hdf5
135 3 Andrey Golovin
<pre>
136 3 Andrey Golovin
import h5py
137 3 Andrey Golovin
step = [cell[0]/100,cell[1]/100,cell[2]/100]
138 3 Andrey Golovin
origin = [0,0,0]
139 3 Andrey Golovin
140 3 Andrey Golovin
with h5py.File('cube.hdf5', 'w') as f:
141 3 Andrey Golovin
    oset = f.create_dataset("origin", data = origin)
142 3 Andrey Golovin
    sset = f.create_dataset("step", data = step)
143 3 Andrey Golovin
    dset = f.create_dataset("grid", data = e)
144 3 Andrey Golovin
145 3 Andrey Golovin
</pre>
146 3 Andrey Golovin
147 3 Andrey Golovin
148 3 Andrey Golovin
* Создадим файл py, который будет запускаться из PyMol
149 3 Andrey Golovin
<pre>
150 3 Andrey Golovin
from chempy.brick import Brick
151 3 Andrey Golovin
from pymol import cmd
152 3 Andrey Golovin
import numpy as np
153 3 Andrey Golovin
import h5py
154 3 Andrey Golovin
155 3 Andrey Golovin
156 3 Andrey Golovin
F = h5py.File('cube.hdf5', 'r')
157 3 Andrey Golovin
158 3 Andrey Golovin
step = F['step'][()]
159 3 Andrey Golovin
origin = F['origin'][()]
160 3 Andrey Golovin
data = F['grid'][()] 
161 3 Andrey Golovin
b = Brick.from_numpy(data, step, origin)
162 3 Andrey Golovin
163 3 Andrey Golovin
164 3 Andrey Golovin
cmd.load_brick(b, 'cone')
165 3 Andrey Golovin
volname =  'cone_volume'
166 3 Andrey Golovin
167 3 Andrey Golovin
cmd.volume(volname, 'cone')
168 3 Andrey Golovin
169 3 Andrey Golovin
F.close()
170 3 Andrey Golovin
</pre>