Task1
Version 1 (Andrey Golovin, 23.09.2020 17:10)
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 | 1 | 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 | 1 | 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 | 1 | 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 | 1 | Andrey Golovin | |
131 | 1 | Andrey Golovin | h2. Альтернативный способ визуализации орбиталей |
132 | 1 | Andrey Golovin | |
133 | 1 | Andrey Golovin | * Сохраним плотность в файл hdf5 |
134 | 1 | Andrey Golovin | <pre> |
135 | 1 | Andrey Golovin | import h5py |
136 | 1 | Andrey Golovin | step = [cell[0]/100,cell[1]/100,cell[2]/100] |
137 | 1 | Andrey Golovin | origin = [0,0,0] |
138 | 1 | Andrey Golovin | |
139 | 1 | Andrey Golovin | with h5py.File('cube.hdf5', 'w') as f: |
140 | 1 | Andrey Golovin | oset = f.create_dataset("origin", data = origin) |
141 | 1 | Andrey Golovin | sset = f.create_dataset("step", data = step) |
142 | 1 | Andrey Golovin | dset = f.create_dataset("grid", data = e) |
143 | 1 | Andrey Golovin | |
144 | 1 | Andrey Golovin | </pre> |
145 | 1 | Andrey Golovin | |
146 | 1 | Andrey Golovin | |
147 | 1 | Andrey Golovin | * Создадим файл py, который будет запускаться из PyMol |
148 | 1 | Andrey Golovin | <pre> |
149 | 1 | Andrey Golovin | from chempy.brick import Brick |
150 | 1 | Andrey Golovin | from pymol import cmd |
151 | 1 | Andrey Golovin | import numpy as np |
152 | 1 | Andrey Golovin | import h5py |
153 | 1 | Andrey Golovin | |
154 | 1 | Andrey Golovin | |
155 | 1 | Andrey Golovin | F = h5py.File('cube.hdf5', 'r') |
156 | 1 | Andrey Golovin | |
157 | 1 | Andrey Golovin | step = F['step'][()] |
158 | 1 | Andrey Golovin | origin = F['origin'][()] |
159 | 1 | Andrey Golovin | data = F['grid'][()] |
160 | 1 | Andrey Golovin | b = Brick.from_numpy(data, step, origin) |
161 | 1 | Andrey Golovin | |
162 | 1 | Andrey Golovin | |
163 | 1 | Andrey Golovin | cmd.load_brick(b, 'cone') |
164 | 1 | Andrey Golovin | volname = 'cone_volume' |
165 | 1 | Andrey Golovin | |
166 | 1 | Andrey Golovin | cmd.volume(volname, 'cone') |
167 | 1 | Andrey Golovin | |
168 | 1 | Andrey Golovin | F.close() |
169 | 1 | Andrey Golovin | </pre> |