![Извержение вулкана](https://habrastorage.org/getpro/habr/post_images/b4e/1c6/1e4/b4e1c61e4b80bae70599ef1d82c093a8.jpg)
Моделирование извержения вулкана
с помощью Lattice Boltzmann Method. (с) Источник
В этой статье я расскажу о численном методе моделирования гидродинамики Lattice Boltzmann Method, LBM. На русском—метод решёточных уравнений Больцмана. Он превосходит другие известные методы (например, finite element method) в легкости распараллеливания, возможности моделирования многофазных потоков, моделировании потоков в пористых средах. Кроме того, вычислительный алгоритм содержит только простейшие арифметические операции. Метод весьма новый, первые коммерческие продукты на его основе стали появляться около 2010 года.
На хабре уже была серия статей по физике жидкости, и эта статья может быть ее логическим продолжением. Она написана с таким расчетом, чтоб как быть полезной людям, хорошо знающим гидродинамику и методы моделирования, так и понятной новичкам в этой области (например, с людям с образованием software engineer). Конечно, в связи с этим многие вещи будут излишне подробными для экспертов, а на некоторые не хватит места. Статья получилось достаточно большой, но мне не хотелось бы разбивать ее на несколько частей.
Зачем все это нужно? Точнее, в каких отраслях нужно моделировать гидродинамику:
- самолетостроение, ракетостроение, автомобилестроение (характеристики кузова, работа двигателя, сопла)
- промышленная химия (разделение веществ, химические реакторы)
- метеорология, геология (потоки жидкости сквозь пористые среды, песчаники, дамбы)
- другие инженерные отрасли (ветряные электростанции)
- медицина (потоки крови, лимфы)
Статья будет включать следующие разделы:
- Обзор физики — высокоуровневый обзор основных необходимых уравнений
- Основная идея—описание основного принципа алгоритма
- Технические детали—более подробное объяснение исходных уравнений, вывод вычислительной схемы
- Уравнение Навье-Стокса
- Уравнение Больцмана
- Дискретное уравнение Больцмана
- Иллюстрация вычислительной схемы
- Пространственные решетки
- Равновесные функции распределения
- Несжимаемость
- Вязкость и число Рейнольдса
- Еще раз, все вместе
- Разное
- Дополнения к алгоритму
- Подводные камни
- Существующие решения
- Что почитать
Обзор физики
Гидро- и аэродинамика макроскопически описывается уравнением Навье-Стокса. Оно показывает, каким будет давление, плотность и скорость жидкости в каждой точке пространства в каждый момент времени—в зависимости от начальных и граничных условий и параметров среды.
С другой стороны, для разреженных газов справедливо уравнение Больцмана, которое описывает, как меняется плотность распределения частиц по скоростям в каждой точке пространства со временем. Если проинтегрировать распределение частиц по скоростям в данной точке, можно получить плотность и макроскопическую скорость в данной точке. Другими словами, макроскопически уравнение Больцмана эквивалентно уравнению Навье-Стокса.
Основная идея
Несмотря на то, что для плотных жидкостей уравнение Больцмана не применимо, если мы научимся его моделировать, то сможем моделировать и уравнение Навье-Стокса для этих жидкостей. То есть мы тем самым заменяем нижележащий уровень абстракций (микроскопическое уравнение для плотных жидкостей) физически неправильной реализацией (микроскопическое уравнение для разреженных газов), но так, что верхний уровень (макроскопическое уравнение Навье-Стокса) описывается верно.
Ситуация иллюстрируется картинкой ниже.
![Идея Lattice Boltzmann Method](https://habrastorage.org/getpro/habr/post_images/298/583/c22/298583c2233d6c3cd1cd872974357eaa.png)
Вопросительный знак в ней символизирует тот факт, что я не знаю, какое уравненине описывает поведение плотных жидкостей на микроскопическом уровне. Иногда вместо «микроскопический» говорят «мезоскопический»—в том смысле, что микроскопическое описание—это описание поведения отдельных атомов и молекул, а уравнение Больцмана описывает потоки молекул.
Поскольку компьютер не умеет работать с непрерывными величинами, нам необходимо дискретизировать уравнение Больцмана: по времени, по пространственным координатам (получаем пространственные узлы для моделирования) и по возможным направлениям частиц в каждом пространственном узле. Направления выбираются специальным образом, и всегда указывают в некоторые соседние узлы.
Технические детали
В этом большом разделе находится более подробное объяснение исходных уравнений и вывод вычислительной схемы. Действительно важные уравнения должны быть понятны всем читателям с техническим образованием (требуются основы линейной алгебры, интегрального исчисления). Те уравнения, что непонятны, скорее всего, не важны (это те, где есть набла). Векторы обозначаются жирным шрифтом.
Уравнение Навье-Стокса
Вариант уравнения для макроскопической динамики несжимаемых жидкостей и газов выглядит так:
![Уравнение Навье-Стокса](https://habrastorage.org/getpro/habr/post_images/f63/094/e6a/f63094e6a874fe5c89101731ea2afcde.png)
здесь v – скорость потока, ρ – плотность жидкости, p – давление в жидкости, f – внешние силы (например, гравитация).
Если вы не знаете, что такое перевернутые треугольнички и частные производные—не переживайте, они нам в дальнейшем не понадобятся, а вычислительный алгоритм содержит только простейшие арифметические операции.
Подробный вывод и физический смысл можно изучить на википедии и хабре, я же здесь приведу основную идею.
Мысленно выделим в жидкости некий малый объем и проследим за его движением. Ускорение, действующее на данный объем жидкости, определяется (i) давлениями слева, справа, сверху, снизу и т.п. (притом они частично компенсируют друг друга), (ii) действием внутренних сил трения в жидкости (iii) внешними силами. С другой стороны, ускорение можно выразить через разницу скоростей в начальный момент времени в начальной точке и в некоторый следующий момент времени в той новой точке, где будет находиться объем жидкости.
Если теперь подставить эти величины в уравнение Ньютона F = ma, после несложных преобразований мы получим уравнение выше. Слева находится ma, справа—F.
Уравнение Больцмана
Это уравнение оперирует функцией распределения плотности вероятности частиц по координатам и по скоростям, f(r, v,t). Величина f(x, y, z, vx, vy, vz, t) dx dy dz dvx dvy dvz показывает, какая доля частиц в момент времени t находится в кубе от x до x+dx, от y до y + dy, от z до z + dz со скоростями в диапазоне от vx до vx + dvx, от vy до vy + dvy, от vz до vz + dvz. Ее также можно записать в виде
![f(r, v, t) d^3r d^3v](https://habrastorage.org/getpro/habr/post_images/fff/632/522/fff632522c1ed76267458a760d95c4f4.png)
Эта функция обычно нормируется на массу газа в исследуемой системе, поэтому макроскопическая плотность газа в каждой точке определяется как сумма (интеграл) от плотности вероятности в данной точке по всем возможным значениям скорости,
![Density](https://habrastorage.org/getpro/habr/post_images/460/ea4/1b0/460ea41b04293cdd1cc2acf748e5497f.png)
Аналогично, макроскопическую скорость можно определить через
![Velocity](https://habrastorage.org/getpro/habr/post_images/a56/5f3/0df/a565f30df6e731cd28e03f025272d796.png)
Основная идея для вывода уравнения похожа на вывод уравнения Навье-Стокса. Давайте мысленно выделим в данный момент времени в данном небольшом объеме пучок молекул, летящих в данном направлении (точнее, узком конусе направлений). Через небольшой промежуток времени dt они окажутся в соседней точке (благодаря наличию скорости), их скорость сама по себе изменится из-за ускорения молекул внешними силами. Кроме того, на этом отрезке пути некоторые молекулы столкнутся с другими, изменят свою скорость, и мы больше не сможем включать их в исходный пучок. С другой стороны, в результате столкновений молекул в том же объеме, летящих в другую сторону, некоторые из них приобретут нужное направление скорости, и мы добавим их в пучок.
Это можно записать в следующем виде:
![Boltzmann derivation, f \left (\mathbf{r}+\mathbf{v} d t,\mathbf{v}+\frac{\mathbf{F}}{m} d t,t+d t \right )\,d^3\mathbf{r}\,d^3\mathbf{v} - f(\mathbf{r},\mathbf{v},t)\,d^3\mathbf{r}\,d^3\mathbf{v} = dN_{coll}](https://habrastorage.org/getpro/habr/post_images/75b/64e/8a3/75b64e8a39ee08b4d701767e6168f63f.png)
где F—внешняя сила, m—масса молекулы, dNcoll—изменение числа частиц в пучке за счет столкновений.
Как определяется в общем виде величина dNcoll, от читателя останется скрытым. Нам понадобится только ее стандартное приближение—Батнагара-Гросса-Крука (BGK). В этом приближении dNcoll равно
![BGK approximation, -\frac{f - f^{eq}}{\tau}d^3\mathbf{r}\,d^3\mathbf{v}d t](https://habrastorage.org/getpro/habr/post_images/b77/e39/0d1/b77e390d1c1a1e8652f94bff584d5b54.png)
где feq—равновесная функция распределения, распределение Максвелла-Больцмана, а τ – так называемое время релаксации.
В итоге получаем
![Boltzmann derivation, f \left (\mathbf{r}+\mathbf{v} d t,\mathbf{v}+\frac{\mathbf{F}}{m} d t,t+ d t \right )\ - f(\mathbf{r},\mathbf{v},t)\ = -\frac{f - f^{eq}}{\tau} d t](https://habrastorage.org/getpro/habr/post_images/c57/925/70b/c5792570b29bc9ac5e900c2a0ee6f47a.png)
Заметим, что feq зависит от макроскопических плотности и скорости в данной точке (то есть неявно от координаты и времени). Именно это уравнение нам понадобится в дальнейшем, но обычно его делят на dt и приводят к виду
![Boltzmann equation, \frac{\partial f}{\partial t} + \mathbf{v}\cdot \nabla f +\frac{\mathbf{F}}{m}\cdot \nabla_{\mathbf{v}} f = - \frac{f- f^{eq}}{\tau}](https://habrastorage.org/getpro/habr/post_images/5ad/31e/dda/5ad31eddaf91d2228811ebff5ff9c3cf.png)
где набла с индексом v – это набла по переменным скорости.
Дискретное уравнение Больцмана
Чтоб получить возможность моделировать динамику непрерывного уравнения Больцмана на компьютере, нам необходимо его дискретизировать. Для этого сначала введем равномерную сетку пространственных координатам—шаг сетки пусть будет одинаковым по всем осям. Поведение жидкости мы будем определять именно в узлах сетки. Фактически, мы разрешаем молекулам находиться только в определенных пространственных узлах. Кроме того, мы должны дискретизировать время—мы будем определять состояние жидкости в равноотстоящие друг от друга моменты времени. Кроме того, мы позволим молекулам иметь только определенные значения скорости—такие, чтоб за шаг по времени они успевали перейти в какой-нибудь соседний узел. Эти разрешенные направления будут одинаковыми для всех пространственных узлов. Очевидно, что по диагональным направлениям скорости частиц будут больше, чем по недиагональным.
Интуитивно можно заключить, что при бесконечно малом шаге времени и шаге пространственной решетки эта дискретная система перейдет в обычное уравнение Больцмана, которое, в свою очередь, переходит к уравнению Навье-Стокса в макроскопическом пределе. Как ни странно, это не такой простой вопрос, и мы его пока отложим.
В дальнейшем изложении везде предполагается, что система единиц такова, что шаг решетки является единицей длины, а шаг по времени—единицей времени.
Для простоты ниже будем предполагать, что внешние силы отсутствуют. Мы пронумеруем разрешенные направления скорости от 1 до Q с индексом i. Если теперь массу частиц, пролетающих из данного узла в направлении i за шаг времени обозначить как fi, то уравнение (6) перейдет в
![Discrete Boltzmann, f_i \left (\mathbf{r}+\mathbf{v}_i, t + 1 \right )\ - f_i(\mathbf{r}, t)\ = -\frac{f_i - f_i^{eq}}{\tau}](https://habrastorage.org/getpro/habr/post_images/974/921/60f/97492160f412794dbdf0a84938bae549.png)
Здесь мы учли, что шаг по времени равен единице, и заменили все dt из (6) на единицу. fieq обозначает дискретную равновесную плотность распределения, зависящую от макроскопических массы и скорости в данном узле. Мы не указали, из какого именно узла будем использовать fieq —из r + vi t в момент времени t + 1 или из r в момент времени t. Для вычислительной схемы удобнее оказывается использовать узел r + vi t в момент времени t + 1. Тогда уравнение выше можно разложить на две составляющие, распространение (streaming step) и столкновение (collision step).
Streaming step:
![Streaming, \tilde{f}_i \left (\mathbf{r}+\mathbf{v}_i, t + 1 \right )\ = f_i(\mathbf{r}, t)\,](https://habrastorage.org/getpro/habr/post_images/974/921/60f/97492160f412794dbdf0a84938bae549.png)
Collision step:
![Collision, f_i \left (\mathbf{r}, t \right )\ = \tilde{f}_i(\mathbf{r}, t)\ -\frac{\tilde{f}_i - f_i^{eq}}{\tau}](https://habrastorage.org/getpro/habr/post_images/40b/c9b/ddd/40bc9bddd236e39fa92a641af1acf8b3.png)
Здесь fi с тильдой обозначает массу частиц, пришедших в узел по направлению i, но еще не столкнувшихся с остальными пришедшими частицами. Streaming step иногда называют advection step.
Для дискретизированных направлений скорости масса и макроскопическая скорость в каждом узле будут рассчитываться как
![Density and velocity discrete, \rho = \sum_{i} f_i, \rho \mathbf u = \sum_{i} f_i \mathbf v_i](https://habrastorage.org/getpro/habr/post_images/064/e2f/25b/064e2f25b3c82bd230579cd5553577aa.png)
Здесь и далее мы пишем везде плотность вместо массы, поскольку при единичном пространственном шаге решетки на каждый узел приходится единичный объем, и масса и плотность совпадут по значению.
Мы покажем, что равновесные функции распределения зависят от массы в узлах и макроскопической скорости. Поэтому после streaming step необходимо пересчитать массы и скорости в каждом узле, пересчитать равновесные функции распределения, и потом совершать collision.
Таким образом, на каждом шаге вычислительной схемы необходимо «распространить» частицы, то есть переместить частицы, летевшие из узла r в направлении i в узел r + vi (проделать это для всех частиц и направлений). После этого необходимо пересчитать массы, скорости, равновесные функции распределения. Наконец, необходимо «столкнуть» частицы, прилетевшие в данный узел—то есть перераспределить частицы по направлениям.
Иллюстрация вычислительной схемы
Проиллюстрируем вычислительную схему на примере двухмерной системы. Дискретизация на пространственные узлы и связи между ними (то есть разрешенные направления скорости) изображены на рисунке ниже. Пространственные узлы обозначены кружочками, связи между ними—тонкими линиями.
![D2Q9](https://habrastorage.org/getpro/habr/post_images/12a/ad2/68c/12aad268cc8066da2675ab30412713c3.png)
На следующем рисунке изображена одна итерация пары «streaming/collision». Цветные стрелки изображают потоки летящих молекул. Интенсивность цвета кодирует массу молекул, летящих в данном потоке, длина стрелок примерно соответствует пути, проходимом потоком за шаг по времени (лишь примерно, поскольку стрелки должны идти от центра узла до центра узла).
![CollisionAdvection](https://habrastorage.org/getpro/habr/post_images/73c/77d/42b/73c77d42b80426b0b1af7c0a58d5616f.png)
Пространственные решетки
В LBM под решеткой (lattice) понимается набор разрешенных векторов скорости (одинаковый для каждого пространственного узла). Это согласуется со стандартным математическим определением о решетке как о сущности, с помощью которой путем параллельных переносов можно получить все пространственную сетку (grid).
В LBM любая решетка должна содержать нулевой вектор из узла в себя самого—он описывает частицы, которые никуда не летят из данного узла. В LBM решетки обычно обозначаются аббревиатурой DnQm, где n—размерность пространства, m—число векторов в решетке. Например, D2Q9, D3Q19 и т.п.
В двумерном пространстве LBM решетка может состоять, например, из 5 векторов (2 вертикальных, 2 горизонтальных и нулевой вектор из узла в себя самого), а может из 9 векторов, как на иллюстрации выше (2 вертикальных, 2 горизонтальных, 4 диагональных, один нулевой). Это решетки D2Q5 и D2Q9, соответственно.
Очевидными факторами для выбора решеток являются: 1. точность моделирования (интуитивно понятно, что чем больше векторов в решетке, тем точнее моделирование) 2. вычислительные затраты (расчет на решетке D2Q5 будет быстрее расчета на D2Q9). Как ни странно, это не самые важные факторы. Самые важные факторы—это воспроизводимость уравнений Навье-Стокса и симметрия некоторых тензоров, построенных на векторах решетки.
Обычно используются решетки D2Q9, D3Q15, D3Q19. Решетки D2Q9 и D3Q19 изображены ниже. Базисные вектора решетки обычно обозначаются как ei или ci (они совпадут со скоростями vi, введенными ранее при единичном шаге по времени). Ниже мы будем использовать обозначение ei.
![D2Q9](https://habrastorage.org/getpro/habr/post_images/a8f/422/f7d/a8f422f7db993e7a2e875f851b0e6a3c.png)
![D3Q19](https://habrastorage.org/getpro/habr/post_images/cd6/3cb/94e/cd63cb94ec45376d1ca03a32de586324.png)
Выпишем базисные вектора для D2Q9:
![D2Q9 vectors \bold{e}_i = \begin{cases} (0,0) & i = 0 \\ (1,0),(0,1),(-1,0),(0,-1) & i = 1,2,3,4 \\ (1,1),(-1,1),(-1,-1),(1,-1) & i = 5,6,7,8 \\ \end{cases}](https://habrastorage.org/getpro/habr/post_images/d9a/04d/43d/d9a04d43d148b81ec33e920299bcc5a5.png)
и для D3Q19:
![D3Q19 vectors \bold{e}_i = \begin{cases} (0,0,0) & i = 0 \\ (\pm 1,0,0),(0,\pm 1,0),(0,0,\pm 1) & i = 1,2,...,5,6 \\ (\pm 1,\pm 1,0),(\pm 1,0,\pm 1),(0,\pm 1,\pm 1) & i = 7,8,...,17,18 \\ \end{cases}](https://habrastorage.org/getpro/habr/post_images/82c/994/f55/82c994f55cee7eefc3975630867d57d7.png)
Еще раз напомню, что мы везде предполагаем, что шаг по времени равен единице, поэтому vi = ei.
Равновесные функции распределения
В непрерывном случае равновесная функция распределения (распределение Максвелла-Больцмана) равна
![Maxwell distribution, f^{eq}=\frac{\rho}{(2 \pi RT)^{D/2}}e^{-\frac{(\bold{v}-\bold{u})^2}{2RT}}](https://habrastorage.org/getpro/habr/post_images/d52/9a6/d49/d529a6d497034922d95892b09d0512fb.png)
Здесь есть ранее не встречавшиеся величины: R—универсальная газовая постоянная, T—температура, D—размерность пространства, v—вектор скорости, плотность вероятности для которого мы и находим. Здесь молярная масса газа принимается равной единице (она для нас не важна—важна только макроскопическая плотность). Можно считать это изменением единицы массы в нашем моделировании. Кроме того, функция нормируется на локальную макроскопическую плотность, а не на единицу. Заметим также, что обычно от v не отнимают макроскопическую скорость газа u. Это происходит потому, что обычно распределение исследуют в случае неподвижного газа, нам же необходимо перейти в локальную инерционную систему отсчета, движущуюся с текущей скоростью газа в данной точке в данный момент времени, чтоб использовать распределение Максвелла-Больцмана. Вычитание u и является таким переходом.
Предположим, что в данной точке пространства распределение молекул по скорости оказалось равновесным. Это распределение зависит от макроскопической массы ρ и скорости u. С другой стороны, мы можем вычислить ρ и u по функции распределения (см. формулы (2) и (3)). Очевидно, это вычисление должно дать правильные ρ и u (то есть это в каком-то смысле дополнительное ограничение на функцию распределения):
![Density equilibrium, \rho = \int f^{eq} d \mathbf v](https://habrastorage.org/getpro/habr/post_images/e75/e62/e34/e75e62e34a9175160d8132c3758e49a2.png)
![Velocity equilibrium, \rho \mathbf u = \int f^{eq} \mathbf v d \mathbf v](https://habrastorage.org/getpro/habr/post_images/807/88c/d77/80788cd7738d0483a2befacaa23bab21.png)
Такое же требование мы налагаем на вычисление плотности и скорости в дискретном случае:
![Density and velocity discrete equilibrium, \rho = \sum_{i} f^{eq}_i, \rho \mathbf u = \sum_{i} f^{eq}_i \mathbf v_i](https://habrastorage.org/getpro/habr/post_images/441/4c0/20c/4414c020c045dd14fb00e80692502db0.png)
Основным требованием для дискретных равновесных функций распределения является воспроизводство уравнения Навье-Стокса в пределе бесконечно малых шага по времени и шага решетки. Это эквивалентно тому, что если при заданных ρ и u мы попытаемся их снова рассчитать по равновесным функциям распределения в непрерывном и дискретном случае, результаты совпадут (см. замечание выше о том, что в дискретном случае вместо плотности имеется в виду масса), т.е.
![Density and velocity equality, \rho = \int f^{eq} d \mathbf v = \sum_{i} f^{eq}_i, \rho \mathbf u = \int f^{eq} \mathbf v d \mathbf v = \sum_{i} f^{eq}_i \mathbf v](https://habrastorage.org/getpro/habr/post_images/0d2/ff5/7a6/0d2ff57a6b41a5d3042462138ac23d7e.png)
Для однозначного определения равновесной дискретной функции распределения нам необходимо будет также включить аналогичное требование равенства макроскопических тепловых энергий в данной точке, мы его опустим для краткости.
Если просуммировать по направлениям скорости уравнение (10) для collision step, то с учетом формулы (16) можно показать, что collision step не изменяет макроскопические массы и скорости молекул, находящихся в узле.
Оказывается, если просто подставить дискретные векторы скорости ei=vi из (11) и (12) в непрерывную равновесную функцию распределения (13), равенства (16) не будут выполняться.
Оказывается также, что мы можем заставить равенства (16) выполняться, если разложим распределение Максвелла-Больцмана (13) в ряд Тейлора до второго порядка макроскопической скорости. Это соответствует тому, что величина u/sqrt(RT) очень мала. Это ограничение всегда должно выполняться в процессе моделирования во всех узлах.
Но даже разложения в ряд Тейлора недостаточно. Мы также должны ввести в дискретизированные функции fieq специально подобранные множители wi (детали вычислений можно найти в этой прекрасной статье—есть и бесплатная версия; конечно же, все окажется немного сложнее, чем в нашем поверхностном описании—на самом деле, расчет происходит через тензоры, вплоть до четвертого ранга, построенные на векторах решетки). Окончательно получим
![Maxwell distribution discrete, f^{eq}_i = w_i \rho (1+\frac{\vec{v_i} \cdot \vec{u}}{RT}+\frac{(\vec{v_i} \cdot \vec{u})^2}{2(RT)^2}-\frac{\vec{u}^2}{2RT})](https://habrastorage.org/getpro/habr/post_images/7e9/e13/ae6/7e9e13ae6acdbd711bbb65b6ca232d53.png)
Здесь кроется подвох: мы везде предполагаем, что шаг решетки и времени являются единицами длины и времени, соответственно. Потому мы не можем взять значение R из СИ, а температура здесь не равна температуре моделируемой жидкости в Кельвинах.
Чтоб определить их значения, заметим следующее. Предположим, что в жидкости имеется возмущение—то есть в некоторых узлах есть избыточная масса. Эта масса начнет «растекаться» по пространству, притом в крайнем правом узле в области возмущения она будет двигаться в том числе и по направлению (1, 0, 0) в 3D или (1, 0) в 2D. За единицу времени молекулы вдоль этих направлений пройдут единицу длины, то есть их скорость будет равна единице. Это означает, что скорость звука как скорость распространения возмущений в нашей системе тоже равна единице. С другой стороны, скорость звука равна sqrt(γ R T / μ), где γ—это постоянная адиабаты, μ—молярная масса, которую мы приняли равной единице ранее. Постоянная адиабаты γ равна 1 + 2 / d, где d—число степеней свободы молекул. В идеальном газе оно равно размерности пространства. В нашем газе молекулы могут двигаться только вдоль прямых, соединяющих узлы, потому размерность равна не трем (или двум), а единице. То есть γ=3, а sqrt(3 R T) = 1.
Обычно в литературе по LBM под «скоростью звука» понимают величину
![Speed of sound, c_s = \sqrt{RT}=1/\sqrt{3}](https://habrastorage.org/getpro/habr/post_images/847/67c/7b4/84767c7b4f0e2000c1674f28c11c5743.png)
Теперь, окончательно,
![Maxwell distribution discrete, f^{eq}_i = w_i \rho (1+3\mathbf{e}_i \cdot \mathbf{u}+\frac{9}{2}(\mathbf{e}_i \cdot \mathbf{u})^2-\frac{3}{2}\mathbf{u}^2)](https://habrastorage.org/getpro/habr/post_images/197/1e9/08b/1971e908bd925a54d1c51045ba64262b.png)
Выпишем значения коэффициентов wi для самых распространенных решеток.
Для D2Q9:
![D2Q9 weights w_i = \begin{cases} 4/9 & i = 0 \\ 1/9 & i = 1,2,3,4 \\ 1/36 & i = 5,6,7,8 \\ \end{cases}](https://habrastorage.org/getpro/habr/post_images/5f7/d3f/26c/5f7d3f26c9b51a8659a2748860c5909b.png)
Для D3Q19:
![D3Q19 weights w_i = \begin{cases} 1/3 & i = 0 \\ 1/18 & i = 1,2,...,5,6 \\ 1/36 & i = 7,8,...,17,18 \\ \end{cases}](https://habrastorage.org/getpro/habr/post_images/e2c/cf5/783/e2ccf5783d369ac0463eb5de8ae89217.png)
Несжимаемость
Ограничение на малую макроскопическую скорость жидкости теперь можно записать как
![Incompressibility, u << speed\ of\ sound = 1](https://habrastorage.org/getpro/habr/post_images/490/faa/c4d/490faac4d8d37b980b1fbf3b68d3155a.png)
Напомним, что число Маха есть отношение характеристической скорости газа в системе к скорости звука. Тогда ограничение выше соответствует малым числам Маха или несжимаемой жидкости. Действительно, если скорость звука (скорость распространения возмущений плотности) велика, то любое возмущение плотности быстро распространится на всю систему, и плотность станет снова одинаковой. То есть сжать жидкость в какой-либо одной локальной области вам не удастся.
Хорошее максимальное значение для макроскопической скорости в узлах будет, например, 0.01.
Вязкость и число Рейнольдса
Кинематическая вязкость ν в LBM (как обычно, в единицах решетки) рассчитывается как
![Viscosity, \nu = (\tau - 1/2)c^2_s = (\tau - 1/2)/3](https://habrastorage.org/getpro/habr/post_images/860/620/b7f/860620b7f7b54dcc1c887a816d888535.png)
Здесь τ—время релаксации, введенное ранее в формуле (5), cs=1/sqrt(3)— «скорость звука», введенная в (18).
При моделировании гидродинамики без учета изменений температуры любая система с наперед заданной геометрией (например, труба с квадратным сечением) полностью описывается только одним безразмерным параметром—числом Рейнольдса, равным
![Reynolds, Re = v L / \nu](https://habrastorage.org/getpro/habr/post_images/b5b/cbe/78a/b5bcbe78a8e00f03d328561b44a99cc8.png)
где v—характеристическая скорость в системе (например, скорость в центре трубы), L—характеристическая длина в системе (например, длина стороны квадрата сечения).
Для стандартных геометрий обычно известна связь между характеристической скоростью и внешней силой (которая обеспечивает поток). Поэтому для моделирования с заданным числом Рейнольдса необходимо
- выбрать характеристическую скорость v. Как мы выяснили, она должна быть намного меньше скорости звука. Например, 0.01.
- рассчитать необходимую внешнюю силу для такой скорости
- рассчитать вязкость по (23) так, чтоб получить нужное число Рейнольдса
- рассчитать время релаксации по (24) так, чтоб получить нужную вязкость
Если задача моделирования составлена в единицах СИ (мол, сторона квадрата сечения трубы 1м, давление на входе трубы X Паскалей, на выходе—Y Паскалей), то сначала надо найти безразмерное число Рейнольдса, и воспользоваться алгоритмом выше.
Еще раз, все вместе
Перед моделированием надо задать начальные макроскопические массы и скорости в каждом узле. Потом задать потоки масс в каждом разрешенном направлении ei в каждом узле (см. Подводные камни). Самый простой способ—указать потоки из равновесного распределения.
Для моделирования в цикле совершать
- streaming step по формуле (9)
- пересчет макроскопических масс и скоростей в каждом узле по формулам (11), пересчет равновесных потоков по всем направлениям по формуле (19)
- collision step по формуле (10)
Моделирование обычно происходит до тех пора, пока система не находится в стационарном состоянии. Стационарность можно проверять, например, через разницу макроскопических скоростей и масс в каждом узле между соседними шагами, максимальную среди всех узлов.
Разное
Дополнения к алгоритму
Мы не коснулись включения внешних сил в моделирование (например, гравитации). Они приведут к небольшой добавке в уравнение (9) для streaming step.
Мы также не коснулись граничных условий—на поверхности тел и на входе и выходе системы (например, если на входе трубы задано постоянное давление или поле скоростей). В LBM есть большая свобода в моделировании таких условий, поскольку метод формулируется на микроскопическом уровне (потоки молекул), а такие граничные условия—на макроскопической уровне. Существует множество способов задать граничные условия на микроскопическом уровне—и множество алгоритмов.
Граничные условия на границе твердых тел в гидродинамике обычно выбираются как no-slip boundary conditions (то есть когда скорость жидкости на поверхности тел равна нулю). Обычно они реализуются через bounce-back conditions (когда потоки молекул отражаются в обратном направлении при пересечении твердой стенки).Об этом можно почитать здесь, раздел 4.6.
Модель столкновений, которую мы представили, называется single relaxation time. Существуют более совершенные модели, например, multiple relaxation time (в частности, double relaxation time).
LBM также поддерживает многофазность (моделирование потока смеси жидкостей или газов с разными параметрами).
Наличие теплопроводности (то есть переноса тепла в системе, изменения температуры в разных точках системы и, как следствие, изменения параметров системы—например, плотности) также поддерживается LBM. Температура моделируется как отдельный «газ», тоже по алгоритму LBM, но скорость этого газа определяется скоростью основной жидкости. Говорят, что температура в этом смысле является passive scalar. Есть немало статей по моделированию через LBM явления Rayleigh–Benard convection.
Мы совершенно не коснулись вопросов эффективной реализации и параллелизации.
Подводные камни
Если вы моделируете систему с теплопроводностью, то она будет описываться двумя безразмерными величинами. В случае Rayleigh-Benard convection обычно выбирают число Прандтля и число Рэлея. Для того, чтобы воспроизвести эту систему в единицах решетки, недостаточно просто воспроизвести обе этих безразмерных величины, правильно задав внутренние параметры системы (характеристическая скорость, внешняя сила, теплопроводность). Дело в том, что между внутренними параметрами будут существовать скрытые зависимости. Подробнее можно почитать тут.
Как мы уже сказали, при выборе характеристической скорости в системе не забывайте о том, что число Маха должно быть много меньше единицы (формула (22)).
LBM может стать нестабильным в некоторых системах при высоких числах Рейнольдса (когда поток, тем не менее, все еще ламинарный).
В LBM не выполняется галилеевская инвариантность. Впрочем, обычно это неважно.
В начале моделирования необходимо задать потоки молекул из каждого узла по всем разрешенным направлениям. Часто выбирают равновесное распределение потоков (формула (19)). Важно помнить, что равновесность не предполагает стационарность. То есть стационарные распределения при наличии градиентов скорости, внешней силы и т.п. отличаются от равновесных. Их расчет приведен здесь (формулы 12, 19, 20 по ссылке).
Существующие решения
Есть большой и очень зрелый open-source проект, целиком посвященный LBM—Palabos (PArallel LAttice BOLtzmann). У проекта есть и вики. Разработчики предоставляют платную консультацию по моделированию гидродинамики.
Здесь есть прекрасные обучающие примеры моделирования типичных систем на MATLAB. Например, Rayleigh–Benard convection (в наличии внешняя сила, теплопроводность, граничные условия, правильный перевод величин). Всего 160 строчек в MATLAB.
Есть множество коммерческих решений, например, это или это.
Подробный список коммерческих и некоммерческих пакетов по LBM можно найти на википедии.
Что почитать
Помимо всех ссылок, что есть в статье, можно порекомендовать эти списки статей и книг. В основном аналогичный список книг есть и на википедии.
На этом все,