Учебный сайт Фоменко Елены

Главная Семестры Проекты Заметки

Суть задания состоит в определении констант ковалентных взаимодействий для молекулярной механики на основе квантово-химических расчётов.

1. Имеется оптимизированная структура этана в виде z-matrix, вместо значений длин и углов связей стоят переменные:

                                                            $DATA
                                                           eth
                                                           C1
                                                            C   
                                                            C      1   cc 
                                                            H      2   ch   1   cchv 
                                                            H      2   ch   1   cch   3   d1 0
                                                            H      2   ch   1   cch   3   d2 0
                                                            H      1   ch   2   cch   3   d3 0
                                                            H      1   ch   2   cch   5   d3 0
                                                            H      1   chv  2   cch   4   d3 0
                                                           
                                                           cc=1.52986
                                                           ch=1.08439
                                                           chv=1.08439
                                                           cch=111.200
                                                           cchv=111.200
                                                           d1=120
                                                           d2=-120
                                                           d3=180
                                                            $END

2. Создадим порядка 20 разных файлов для расчёта энергии в Gamess с разными значениями по длине одной из связей. Попробуем автоматизировать процесс с помощью скрипта на bash.
Составляем файл-заготовку для размножения: et.inp. Для этого к координатам добавили шапку для dft из предыдущего практикума и изменили информацию о типе входных координат, COORD=CART на COORD=ZMT:

                                                            $CONTRL COORD=ZMT UNITS=ANGS dfttyp=b3lyp RUNTYP=ENERGY $END
                                                            $BASIS  GBASIS=N31 NGAUSS=6
                                                             POLAR=POPN31 NDFUNC=1 $END
                                                            $GUESS  GUESS=HUCKEL $END
                                                            $system mwords=2 $end
                                                            $DATA
                                                           eth
                                                           C1
                                                            C   
                                                            C      1   cc 
                                                            H      2   ch   1   cchv 
                                                            H      2   ch   1   cch   3   d1 0
                                                            H      2   ch   1   cch   3   d2 0
                                                            H      1   ch   2   cch   3   d3 0
                                                            H      1   ch   2   cch   5   d3 0
                                                            H      1   chv  2   cch   4   d3 0
                                                           
                                                           cc=1.52986
                                                           ch=1.08439
                                                           chv=1.08439
                                                           cch=111.200
                                                           cchv=111.200
                                                           d1=120
                                                           d2=-120
                                                           d3=180
                                                            $END

Запускаем GAMESS. Выходной файл не содержит ошибок, так что переходим к следующему пункту.

3. Создадим текстовый файл скрипта make_b.bash со следующим содержанием:

                                                           #!/bin/bash
                                                           ### делаем цикл от -10 до 10 ##### 
                                                           
                                                           for i in {-10..10}; do 
                                                           
                                                           #### нам надо рассчитать новую длину связи #####
                                                           #### с шагом 0.02 ангстрема,               #####
                                                           #### воспользуемся калькулятором bc        #####
                                                           #### и результат поместим в переменную nb  #####
                                                           
                                                                nb=$(echo "scale=5; 1.52986 + $i/50" | bc -l)
                                                           
                                                           #### пролистаем файл et.inp и заменим указание переменной ###
                                                           #### на новое значение и пере направим результат в файл   ###
                                                           
                                                                sed "s/cc=1.52986/cc=$nb/" et.inp  > b_${i}.inp
                                                           
                                                           done

Запускаем скрипт:

                                                           bash ./make_b.bash

Получился 21 inp файл с разными значениями для переменной сс.

4. Вставим в скрипт перед done запуск Gamess:

                                                           gms b_${i}.inp 1 > b_${i}.log

Запускаем. Чтобы извлечь значение энергии из log файла, воспользуемся awk.
Сначала в нашем скрипте комментируем запуск Gamess, поставив в начало строчки c gms #. Добавим после закомментированной строчки вызов awk, при этом мы ищем строчку с TOTAL ENERGY и печатаем 4-ое поле, считая, что поля разделены пробелами:

                                                           awk '/TOTAL ENERGY =/{print $4}'  b_${i}.log

Запускаем скрипт, на экране появляется 21 значение энергии. Теперь добавляем перед вызовом awk распечатку переменой nb:

                                                           echo -n "$nb    "

Теперь запускаем получившийся скрипт и перенаправляем поток в файл:

                                                           bash ./make_b.bash > bond

Получаем файл bond с двумя колонками чисел.

5. Таким образом, у нас есть зависимость энергии молекулы от длины одной связи. Строим эту зависимость в Gnuplot:

                                                           plot "bond"

Теперь нам надо найти коэффициенты в функции f(x)=a+k(x-b)^2, которые бы позволили наиболее близко описать наблюдаемую зависимость. В строке gnuplot введём функцию и зададим стартовые значения коэффициентов:

                                                     f(x)=a + k*x*x - 2*k*x*b + k*b*b 
                                                     a=-80
                                                     k=1
                                                     b=1.5

Проведём подгонку коэффициентов под имеющиеся точки:

                                                           fit f(x) "bond" via a,k,b 

Получаем значения коэффициентов:

                                         Final set of parameters            Asymptotic Standard Error
                                         =======================            ==========================
                                         
                                         a               = -79.7652         +/- 0.0004522    (0.000567%)
                                         k               = 0.563608         +/- 0.02335      (4.142%)
                                         b               = 1.55432          +/- 0.002455     (0.1579%)

Построим графики функции и значений энергии из Gamess (рис.1):

                                                           plot "bond", f(x)


Рис.1 Зависимость энергии молекулы этана от длины связи C-C и результат аппроксимации функцией f(x).

6. Проделаем аналогичные операции для валентного угла HCH (переменная cchv), его значения должны изменяться от 109.2 до 113.2 (скрипт: make_b.bash2).


Рис.2 Зависимость энергии молекулы от величины валентного угла HCH и результат ее аппроксимации функцией f(x).

С прежними начальными коэффициентами (рис.2) аппроксимация не прошла, при их изменении (a=-70, k= 10, b=110) все получилось, причем точнее, чем в предыдущий раз:


Рис.3 Зависимость энергии от величины валентного угла HCH и результат аппроксимации зависимости при измененных начальных коэффциентах.

Полученные итоговые коэффициенты:

                                         Final set of parameters            Asymptotic Standard Error
                                         =======================            ==========================
                                         
                                         a               = -79.7647         +/- 1.21e-008    (1.517e-008%)
                                         k               = 3.56076e-005     +/- 6.229e-009   (0.01749%)
                                         b               = 111.38      

7. Сделаем то же самое для торсионного угла d3, его значения должны изменяться от -180 до 180 c шагом 12 (скрипт: make_b.bash3).


Рис.4 Зависимость энергии от величины торсионного угла d3.

Количество минимумов функции - 3 (180 и -180 аналогичны).


© Фоменко Елена.