Вычисление параметров для молекулярной механики
Суть задания состоит в определении констант ковалентных взаимодействий для молекулярной механики на основе квантово-химических расчётов.$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Вместо значений длин и углов связей стоят переменные. Необходимо создать порядка 20 разных файлов для расчёта энергии в Gamess с разными значениями по длине одной из связей. Для этого в представленных координатах одна связь или угол отличается названием переменной, но не её значением. Автоматизируем процесс с помощью скрипта на 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В нем 1.52986 - стартовая длина изменяемой связи (взята из et.inp).
bash ./make_b.bashВ результате получаем 21 inp файл (в каждом - разное значение для переменной сс).
doneвставим запуск Gamess:
gms b_${i}.inp 1 > b_${i}.logЗапустим скрипт.
gms b_${i}.inp 1 > b_${i}.log####.
awk '/TOTAL ENERGY =/{print $4}' b_${i}.logТеперь удобно было бы выводить и значение длины связи. Для этого добавим перед вызовом awk распечатку переменой nb. Распечатаем переменную и несколько пробелов без переноса строки:
echo -n "$nb "Наконец, перенаправим поток вывода скрипта в файл bond:
bash ./make_b.bash > bondВ результате имеем файл bond с двумя столбцами (с длинами связи и соответствующими значениями энергии).
plot "bond"Получаем график с точками, похожими на параболу. Теперь надо найти коэффициенты в функции f(x)=a+k(x-b)^2 которые бы позволили наиболее близко описать наблюдаемую зависимость. Для этого воспользуемся возможностями Gnuplot. Сначала зададим функцию в развернутом виде, в строке gnuplot введём:
f(x)=a + k*x*x - 2*k*x*b + k*b*bИ зададим стартовые значения коэффициентов:
a=-80 k=1 b=1.5Проведём подгонку коэффициентов под имеющиеся точки в файле bond:
fit f(x) "bond" via a,k,bЗначения коэффициентов сохраним в файле koeff.
plot "bond", f(x)Изображение графика представлено ниже:
Назад