Я пытаюсь построить список соседей в трехмерном моделировании молекулярной динамики, которое основано на моделировании частиц, и существует периодическое граничное условие.Обычный выбор для производительности - это выбор построения ячейки с шириной 0.5*r_cut
, где r_cut
- обрезание парного взаимодействия.
Однако, с выбором ширины ячейки, я не могу поставить целое число ячейки.Например, если мой r_cut
равен 2.5
, а длина поля равна 21
в направлении.Я могу поместить в нее только 8 недеформированных клеток, и останется 1 деформированная клетка с шириной 1.0
.
, когда частица не находится вокруг периодической рамки.Границу, я могу получить список соседей этой частицы, проверяя только 4 (2 в каждом положительном и отрицательном направлении) в каждом измерении.Но когда частица находится вокруг границы, недостаточно проверить 4 ячейки.Есть три случая.
1) если частица находится в ячейке, которая находится на на границе , тогда достаточно проверки 4 (= 2 + 2) ячеек.
2) если частица находится в ячейке, которая находится рядом с ячейкой, которая находится на границе, то я должен проверить 5 ячеек, поскольку из-за деформированной ячейки я должен проверить еще одну ячейку.Проверка только 2 ячейки в направлении не может сделать соседа дальше, чем 0.5*r_cut+epsilon
в худшем случае, где epsilon
- ширина деформированной ячейки.
3), если частица находится в ячейке, которая второй после ячейки, которая находится на границе, я также должен проверить 5 ячеек по той же причине, что и 2).
Я знаю, что это можно реализовать с помощью оператора if-else
с 3 ветвями, но японять, что это может быть уязвимо для ошибок из-за повышенной сложности.Есть ли более разумный способ реализации этой схемы?