НЕКОТОРЫЕ МОДУЛИ, НАПИСАННЫЕ НА С++

Использование языка программирования C++ для решения различных задач проводилось более десяти лет назад. Поэтому использовались устаревшие на сегодняшний день пакеты типа Microsoft Visual C++ 6 с библиотекой MFC, Borland C++, gcc. В основном решались задачи научного плана из области молекулярной спектроскопии. До работы с C++ был освоен язык С, который использовался в других проектах.

Здесь кратко описаны некоторые, разработанные мной, комплексы программ, которые решают отдельные проблемы молекулярной спектроскопии.

Фурье спектрометр с импульсной газоразрядной ячейкой

Данная работа проводилась в Японии в университете г. Окайама.

Электрический разряд позволяет получать спектры высоковозбужденных состояний молекул, а также молекул, которые не могут быть синтезированы в обычных условиях. В отличие от непрерывного разряда эксперименты в импульсном разряде позволяют проследить динамку изменения интенсивностей переходов во времени, причем как в период прохождения разряда, так и после его окончания. Кроме того, удается получить спектры тех полос, которые не наблюдаются при постоянном разряде. Однако эксперименты с импульсным разрядом намного сложнее, чем с непрерывным.

Была разработана система, позволяющая использовать непрерывно сканируемый Фурье спектрометр в экспериментах с временным разрешением. Установка была задействована для регистрации излучения от импульсного разряда смеси Ar и H2. В результате были измерены временные профили линий излучения Ar, ArH, и ArH+. Блок-схема экспериментальной установки показана на рис. 1.

Рис. 1. Схема установки для наблюдения спектра ArH в импульсном разряде.

Прежде всего следует отметить, что Фурье спектрометр представляет собой интерферометр с базой в несколько метров, длина которого непрерывно линейно изменяется и измеряется с высокой точностью (несколько микрон). Для измерения длины в спектрометре имеется втроенный гелий-неоновый лазер. Изменение длины от максимальной до минимальной называется сканом. Это промышленный спектрометр марки IFS 120 HR фирмы Bruker с известным мировым именем. Управление установкой осуществляется микроконроллером SX-28. Программа управления была написана мной на языке ассемблера этого процессора. Она приведена ниже. Микроконтроллер запускает периодическую последовательность сигналов, синхронизированную с излучением гелий-неонового лазера для создания серии поджигающющих импульсов заданной длительности. Через Фуре-спектрометр пропускается излучение от газоразрядной ячейки, которое после его прохождения, испытав интерференцию с самим собой, поступает на быстродействующий шестнадцати разрядный АЦП и далее через плату сопряжения в память компьютера. Где накапливается, обрабатывается (подвергаетя быстрому Фурье преобразованию) и выводится в графическом виде на монитор, в файл или принтер уже в виде спектра излучения. Эта часть программного обеспечения написана на C++. Система позволяет регистрировать излучение в заданные моменты времени после начала или окончания газового разряда. SX-28 в обычном режиме запускает АЦП 30 раз с перерывом в 3 мкс после начала газового разряда. Сам газовый разряд длится 30 мкс.

Временная диаграмма спектрометра приведена на рис. 2.

Рис. 2. Временная диаграмма работы Фурье спектрометра.

Пример отображения полученного спектра с временной зависимостью показан на рис. 3.


Рис. 3. Часть спектра излучения в смеси Ar и H2.

Программу для микроконтроллера SX-28 можно посмотреть здесь..


А здесь находится текст C++ программы для Фурье спектрометра, работающего в импульсном режиме.


Вывод аналитического выражения для суммы диагональных элементов матрицы эффективного вращательного гамильтониана

Одной из задач молекулярной спектроскопии является определение высокоточной структуры молекулы по ее колебательно-вращательному спектру, то есть в преобразовании информации о молекуле, заключенной в частотах линий поглощения, в набор длин связей и углов между ними и связывающих атомы сил. Это задача в настоящее время решена только для двухатомных и некотороых трехатомных молекул. Для молекул с большим числом атомов задача сильно усложняется, так как требует очень большого числа экспериментальных данных и больших объемов вычислений, длящихся месяцы, а иногда и годы. Задачу условно можно разбить на нескольких этапов. Один из них состоит в определении из измеренного спектра параметров эффективного вращательного гамильтониана (оператора энергии), с помошью которого строится теоретическая модель наблюдаемого спектра. Не вдаваясь в специфические подробности, понятные только для узкого круга специалистов, следует сказать, что параметры эффективного гамильтониана сильно коррелированы, так как гамильтониан определен с точностью до произвольного унитарного преобразования. Поэтому параметры определяются с очень низкой точностью. В то же время имеются инварианты гамильтониана, остающиеся неизменными при любых унитарных преобразованиях. Они являются функциями параметров, малокоррелированы, и могут быть определены из спектра с высокой точностью. Таким образом, необходимо знать функциональную связь между используемыми инвариантами и параметрами гамильтониана.

Для получения такой функциональной зависимости в аналитическом виде, то есть по-сути вывода формулы, была написана программа на C++, представленная ниже. Для пояснения действий, которые выполняет данная программа, прежде всего остановимся на самом эффективном гамильтониане (для простейших квазижестких молекул типа асимметричного волчка). С точностью до поправок второго порядка он имеет следующий вид:

Heff
(1)

Здесь Baa и tau_abgd параметры гамильтониана. Ja декартовые компоненты оператора углового момента.

Оператор Гамильтона может быть записан в дифференциальной форме, как в выражении (1), так и переведен в матричную форму. Инвариантом(ами) гамильтониана, о котором(ых) речь шла выше, является сумма диагональных элементов его матрицы. Обычно для записи матрицы гамильтониана в качестве базиса используются функции симметричного волчка psi_jkm. В этом базисе матрицы компонент оператора углового момента имеют диагональный вид по квантовому числу j. Ненулевые матричные элементы в символах бра кет выглядят следующим образом:

(2)
(3)

Видно, что j правой и левой функций в интегралах для ненулевых матричных элементов должно совпадать. Поэтому матрица гамльтониана приобретает блочно диагональный вид с блоками, характеризующимися конкретными значениями j. Отметим, что квантовое число j может принимать любые положительные целочисленные значения. Для каждого блока может быть вычислена своя сумма диагональных элементов, которая есть инвариантом.

Результатом работы программы по выводу аналитического выражения для суммы диагональных элементов любого блока гамильтониана (1) с матричными элементами оператора углового момента (2) и (3) является следующее. Сумма диагональных элементов диагональных блоков с определенным j равна

(4)

Вывод этого соотношения основывался на формуле произведения матриц. Так для квартичной части гамильтониана по операторам углового момента использовалась следующая формула, дающая сумму диагональных элементов отдельных членов:

,
(5)

где

,

В эту формулу подставлялись выражения (2) и (3) для отдельных матричных элементов операторов углового момента.

Программа выполнена как проект console application в VC++ 6. Она состоит из следующих исполняемых и заголовочных модулей:

  • types.h
  • functions.h
  • Jway.h
  • StdAfx.h
  • main.cpp
  • functions.cpp
  • Jway.cpp

Здесь текст C++ программы для вывода аналитического выражения суммы энергий уровней.


Вывод аналитических выражений, связывающих компоненты обобщенного оператора углового момента и декартовые компоненты этого же оператора

Эффективные вращательные гамильтонианы многоатомных молекул обычно выражаются через степенные ряды декартовых компонент оператора углового момента. К примеру, следующим образом (формула Уотсона):

(6)

Здесь h - параметры, J - оператор углового момента.

Если молекула обладает какой-либо симметрией, то часть членов в сумме (6) пропадает. Это связано с тем, что H_eff должен оставаться неизменным при всех операциях симметрии. Операциями симметрии являются повороты и отражения системы координат, которые совмещают эквивалентные атомы (то есть атомы одного сорта). Выявить, какие члены остаются, а какие пропадают в гамильтониане, записанном в виде (6), довольно сложно, так как декартовые компоненты при поворотах выражаются друг через друга и к тому же они не коммутируют. Сделать это намного проще, если записывать гамильтониан через обобщенные операторы углового момента (ООМ), которые преобразуются по неприводимым представлениям группы вращений O^+(3). Такие операторы еще называются неприводимыми тензорными операторами.

Определение обобщенного оператора углового момента.

Неприводимый тензорный оператор (НТО) характеризуется рангом L, который может быть любым целым положительным числом начиная с 0. НТО ранга L имеет 2L+1 компоненту. Каждая компонента имеет свой номер M, который может принимать любые целые значения в диапазоне от -L до L. Обозначение любой компоненты выглядит следующим образом: T_M^L. Основное соотношение, которому должны удовлетворять компоненты НТО, следующее:

Здесь J_mu циклические компоненты оператора углового момента, ccg коэффициенты Клебша - Гордона.

НТО могут быть любой природы. Если они сконструированы из компонент обычного углового момента, то тогда они называются обобщенными операторами углового момента (ООМ).

Эффективный вращательный гамильтониан, выраженный через ООМ, будет выглядеть следующим образом:

(7)

Гамильтониан в такой форме полностью эквивалентен (6), но значительно лучше приспособлен для учета симметрии молекул. В практических задачах необходимо уметь преобразовывать гамильтониан из формы (6) в форму (7) и наоборот. Для этого нужны аналитические выражения, связывающие ООМ с декартовыми компонентами углового момента.

Целью представленной ниже программы является вывод таких выражений.

Исходным выражением для решения поставленной задачи является рекуррентное соотношение между тремя компонентами ООМ с одинаковым номером и разными рангами:

(8)

Алгоритм построения выражения для произвольного T_M^L через операторы J^2, J_x, J_y, J_z состоит в последовательном применении формулы (8) с возрастающими значениями L. При этом базовые операторы T_M^L с минимально возможным L, когда L=M, определяются формулой

Программа, используя рекурентное соотношение (8), ищет T_M^L в наиболее общем виде, который имеет вид

(9)

Здесь - целые числа.

При своей работе при перемножении двух операторных многочленов программа собирает подобные члены, ищет общие множители в числителе и знаменателе и сокращает их, извлекает корни из множителей, которые представляют собой квадраты целых чисел и т.д.

Программа состоит из двух файлов, заголовочного types.h и исполняемого main.cpp.

Фрагмент распечатки результатов работы программы для тензорного оператора T35.

=========== T^5_3 ===========

Результирующий полином

val jp kp
-1 1 0
9 0 2
27 0 1
24 0 0

Числитель подкоренного выражения = 7 -> 7

7, к-во =1

Знаменатель подкоренного выражения = 16 -> 1 2 2 2 2

1, к-во =1

2, к-во =4

Эти же результаты, записанные в виде формулы, имеют вид:


Здесь текст C++ программы для вывода аналитического выражения для обобщенного тензорного оператора .