Вычисление параметров для молекулярной механики
Суть задания состоит в определении констант ковалентных взаимодействий для молекулярной механики на основе квантово-химических расчётов.$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)Изображение графика представлено ниже:
Назад