![](https://habrastorage.org/files/625/afa/fc7/625afafc7d7a44e385971117f0784047.png)
Перевод поста Jason B. "Plotting electronic orbitals using Mathematica".
Выражаю благодарность за помощь в переводе участнику сообщества ВКонтакте Русскоязычной поддержки Wolfram Mathematica Курбану Магомедову.
Скачать перевод в виде документа Mathematica, который содержит весь код использованный в статье, а также дополнительные материалы, можно здесь.
Химикам часто бывает полезно изображение молекулярных орбиталей (МО). Они используются для описания волновой функции электронов в атомах или молекулах. Как правило, это результаты различных квантово-химических или квантово-физических расчетов, производимых в специализированном программном обеспечении для расчета МО, которые представлены в виде cube-файла, разработанного Gaussian. Эти файлы содержат объемные данные для построения орбиталей на трехмерной сетке.
Существует множество приложений для просмотра cube-файлов, такие как VMD или GaussView, но я хотел бы воспользоваться возможностями Mathematica, которые она дает для совмещения и создания различных типов графических объектов, а также автоматизации всего процесса, что в итоге позволило эффективно создавать кадры для видео, в котором можно наблюдать изменение МО.
Прежде всего, нам понадобится функция для извлечения данных из cube-файла. В процессе мы создадим также текст для файла XYZ (формат, также представленный Gaussian). Функция OutForm по сути имитирует работу функций PRINTF, встречающихся в других языках программирования.
In[1]:=
![Plotting electronic orbitals using Mathematica_1.png](https://habrastorage.org/getpro/habr/post_images/194/919/075/19491907502264984e9f6a0c8a6d2da7.png)
Импорт cude-файла:
In[2]:=
![Plotting electronic orbitals using Mathematica_2.png](https://habrastorage.org/getpro/habr/post_images/baf/f23/4de/baff234de6854ea6182b413b52e25376.png)
Если Вам необходимо создать cube-файл, то можно использовать следующую функцию:
In[3]:=
![Plotting electronic orbitals using Mathematica_3.png](https://habrastorage.org/getpro/habr/post_images/4a1/3f7/d44/4a13f7d44c2da56c98d5c3876d55b465.png)
Далее нам потребуется функция отображения МО:
In[4]:=
![Plotting electronic orbitals using Mathematica_4.png](https://habrastorage.org/getpro/habr/post_images/02d/1d2/fb2/02d1d2fb27739fe3b25bb458322bbe4c.png)
Давайте теперь рассмотрим как все работает на примере. Возьмем некоторый cude-файл, скажем, cys-MO35.cube и импортируем данные из него:
In[5]:=
![Plotting electronic orbitals using Mathematica_5.png](https://habrastorage.org/getpro/habr/post_images/12f/5cf/c08/12f5cfc08457896e323361ffac5aa3a8.png)
Теперь построим трехмерную модель:
In[6]:=
![Plotting electronic orbitals using Mathematica_6.png](https://habrastorage.org/getpro/habr/post_images/995/fe6/f60/995fe6f608b1a3fda78a611a4953bab8.png)
Out[6]=
![Plotting electronic orbitals using Mathematica_7.png](https://habrastorage.org/getpro/habr/post_images/258/bfe/a83/258bfea831d59713d7ad55c9a6719147.png)
Если вам необходимо создать видео файл, то вам потребуется набор изображений с одинаковой точкой обзора, которую можно задать с помощью опций ViewAngle, ViewPoint, и ViewCenter. Когда вы указываете эти опции с их значениями внутри функции CubePlot, она передает их непосредственно в функцию Show, что позволяет использовать в вашей функции отображения МО, встроенные опции стандартных функций Wolfram Language:
In[7]:=
![Plotting electronic orbitals using Mathematica_8.gif](https://habrastorage.org/getpro/habr/post_images/46e/a7c/d98/46ea7cd98b9c7d91cbda4193d1fffc5e.gif)
Out[8]=
![Plotting electronic orbitals using Mathematica_9.png](https://habrastorage.org/getpro/habr/post_images/486/530/f04/486530f04a8cf16b5d77703cf6a84149.png)
Наконец, вы также можете использовать любые опции, которые имеет встроенная функция ListContourPlot3D:
In[9]:=
![Plotting electronic orbitals using Mathematica_10.png](https://habrastorage.org/getpro/habr/post_images/cb3/bc7/126/cb3bc712633bf2e1f3b9810e294c76df.png)
Out[9]=
![Plotting electronic orbitals using Mathematica_11.png](https://habrastorage.org/getpro/habr/post_images/dd8/fcb/773/dd8fcb773c16b7f53fc52194be5be17e.png)
In[10]:=
![Plotting electronic orbitals using Mathematica_12.png](https://habrastorage.org/getpro/habr/post_images/868/918/d01/868918d012c0409db3600e07c4d59005.png)
Out[10]=
![Plotting electronic orbitals using Mathematica_13.png](https://habrastorage.org/getpro/habr/post_images/874/44e/785/87444e78528f01b994f467b71a0751fb.png)
Ресурсы для изучения Wolfram Language (Mathematica) на русском языке: habrahabr.ru/post/244451