Опубликован: 11.10.2012 | Доступ: свободный | Студентов: 307 / 58 | Длительность: 07:36:00
Самостоятельная работа 8:

Оптимизация и распараллеливание вычислительной программы на примере моделирования системы взаимодействующих частиц методом молекулярной динамики

Метод молекулярной динамики

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

Будем рассматривать систему N частиц, динамика которых описывается уравнением второго закона Ньютона:

\mathbf{F}_i = m_i\mathbf{a}_i

Здесь \mathbf{F}_i - равнодействующая всех сил, действующих на i-ю частицу, m_i - ее масса и \mathbf{a}_i - ускорение, с которым частица двигается под действием силы. Это обыкновенное дифференциальное уравнение второго порядка, которое можно записать в виде:

\mathbf{F}_i = m_i \frac {d^2\mathbf{r}_i}{dt^2}

где \mathbf{r}_i - радиус-вектор i-й частицы.

Равнодействующая сил, является суммой парных взаимодействий i-й частицы со всеми остальными частицами:

\mathbf{F}_i \equiv \mathbf{F}(\mathbf{r}_i)= \sum\limits^N_{i \neq j =1}\mathbf{F}(\mathbf{r}_i,\mathbf{r}_j)

или

\mathbf{F}_i = \sum\limits^{i-1}_{j =1}\mathbf{F}(\mathbf{r}_i,\mathbf{r}_j) + \sum\limits^N_{j = i+1}\mathbf{F}(\mathbf{r}_i,\mathbf{r}_j)

Сила взаимодействия связана с потенциалом взаимодействия. В расчетах молекулярных систем часто используют потенциал Леннарда-Джонса:

V(r)=4\varepsilon\left[\left(\frac{\sigma}{r}\right)^{12}-\left(\frac{\sigma}{r}\right)^{6}\right]

Здесь r = \left|\mathbf{r}\right| , а \varepsilon и \sigma - параметры потенциала. Первый определяет интенсивность взаимодействия, а второй – положение минимума (см. рис. 1).

Потенциал Леннарда-Джонса

Рис. 13.1. Потенциал Леннарда-Джонса

Потенциал Леннарда-Джонса хорошо описывает взаимодействие между атомами Аргона. Для аргона m \approx 6.69 \times 10^{-23}, \sigma \approx 3.405 \times 10^{-10} , \varepsilon \approx 1.654 \times 10^{-21}. Будем считать, что массы всех частиц одинаковы, система единиц выбрана таким образом, что m = 1, \varepsilon = 1 и \sigma = 1. Тогда сила парного взаимодействия:


  \mathbf{F}(\mathbf{r}_i,\mathbf{r}_j) = \frac{24(\mathbf{r}_i-\mathbf{r}_j)}{\left|\mathbf{r}_i-\mathbf{r}_j\right|^2}\left[\frac{2}{\left|\mathbf{r}_i-\mathbf{r}_j\right|^{12}}-\frac{1}{\left|\mathbf{r}_i-\mathbf{r}_j\right|^6}\right]

Интерес могут представлять траектории частиц или термодинамические характеристики системы, например, зависимость температуры от времени:


  T(t)=\frac{1}{3Nk_B}\sum\limits^N_{i=1}\left|\frac{d\mathbf{r}_i(t)}{dt}\right|^2

где k_B\approx1.38 \times 10^{-23} - постоянная Больцмана.

Для вычисления траекторий в методе молекулярной динамики используются различные алгоритмы. Они основаны на замене непрерывного времени дискретным набором значений t \to t^k=t^0+k\Delta t, k = 1, 2,\ldots. Одним из алгоритмов является метод Верле:


  \mathbf{r}_i^{k+1} = 2\mathbf{r}_i^k - \mathbf{r}_i^{k-1} + \mathbf{F}(\mathbf{r}_i^k)\frac{\Delta t^2}{m_i}

Здесь \mathbf{r}_i^k = \mathbf{r}_i(t^k) . Наиболее трудоемким является вычисление силы, действующей на частицу.

Для оптимизации вычисления сил иногда вводится радиус обрезания – некоторый фиксированный (достаточно большой) радиус, такой, что пересчет сил, действующих между частицами, оказавшимися внутри этого радиуса, производится на каждом шаге. Пересчет сил, действующих со стороны более удаленных частиц, производится через несколько шагов. Такая стратегия позволяет уменьшить количество трудоемких операций расчета парных сил. Номера «ближайших» частиц могут храниться в специальном массиве. Такой массив называется списком. Обычно используются два массива целого типа. Каждый элемент первого массива (list_nb) содержит количество ближайших соседей соответствующей частицы:

k0 = 0
j0 = 0
do i = 1, n
    do j =1, n
        if(abs(x(i) – x(j)) < rcutoff) then
            j0 = j0 + 1
            list_nb(i) = j
        end if
    end do
    i_nb(i) = j0 – k0
end do
  

Во втором массиве содержатся номера соседей каждой частицы. Положения хранятся в элементах, начиная с start(i) и заканчивая finish(i):

start(1) = 1
finish(1) = i_nb(1)
do i = 2, n
    start(i) = finish(i – 1) + 1
    finish(i) = finish(i – 1) + i_nb(i)
end do