Перейти к содержанию
Новое AiManual теперь в MAX Подписаться
Публикация AiManual

Метод Lattice Boltzmann: как моделировать гидродинамику без уравнений Навье-Стокса

Метод Lattice Boltzmann (LBM): моделирование гидродинамики без уравнений Навье-Стокса. Разбор физических основ, алгоритма D2Q9, параллельной C++ реализации с Op

Коротко

Что будет в материале

  1. 01

    Почему LBM? Мезоскопический взгляд на гидродинамику

  2. 02

    От кинетической теории к решёточному уравнению Больцмана

  3. 03

    Алгоритм LBM: столкновение и перенос за два шага

  4. 04

    Практическая реализация: C++, OpenMP и суперкомпьютер MareNostrum 5

Метод решёточных уравнений Больцмана (LBM) отказывается от прямого решения уравнений Навье-Стокса. Вместо этого он работает на мезоскопическом уровне - моделирует эволюцию функций распределения частиц на дискретной решётке. Вязкость, давление, вихревые дорожки Кармана и другие макроскопические эффекты возникают как статистическое следствие столкновений и переноса, а не навязываются системой дифференциальных уравнений в частных производных. Такой подход даёт два практических преимущества: автоматическую обработку сложных границ без построения сетки и естественный параллелизм на уровне отдельных узлов решётки.

Классические CFD-решатели тратят до 70% вычислительного времени на решение уравнения Пуассона для давления - глобальной операции, требующей синхронизации всех узлов. LBM обходит эту проблему: давление вычисляется локально из плотности через уравнение состояния. Результат - алгоритм, который масштабируется почти линейно на тысячах ядер. Тесты на MareNostrum 5 подтверждают: реализация на C++ с OpenMP достигает эффективности распараллеливания выше 90% при переходе от 128 к 2048 потокам для решётки размером 1024×1024.

В этой статье разберём физический фундамент метода - от кинетической теории до приближения BGK, детали алгоритма на решётке D2Q9, практические аспекты реализации и границы применимости LBM в инженерных задачах.

Почему LBM? Мезоскопический взгляд на гидродинамику

Традиционная вычислительная гидродинамика оперирует макроскопическими величинами - скоростью, давлением, плотностью - и дискретизирует уравнения Навье-Стокса на сетке. LBM спускается на уровень ниже. В каждом узле решётки хранится не вектор скорости и скаляр давления, а набор из 9 (в двумерном случае) функций распределения частиц, движущихся в дискретных направлениях.

Столкновения частиц в узле перераспределяют их по скоростным направлениям, стремясь к локальному термодинамическому равновесию. Перенос сдвигает обновлённые значения в соседние узлы. После каждого такого цикла макроскопические величины восстанавливаются как моменты функции распределения: плотность - нулевой момент (сумма всех значений), скорость - первый момент (сумма с весами скоростных векторов).

Вихревые дорожки Кармана - классический тест для верификации CFD-кодов - в LBM не задаются явно. Они самопроизвольно формируются при обтекании цилиндра как результат коллективной динамики частиц. При числе Рейнольдса около 100 дорожка становится неустойчивой, и LBM воспроизводит этот переход без дополнительных эвристик. Именно способность естественно порождать сложное поведение делает метод привлекательным для задач с вихреобразованием, кавитацией и многофазными течениями.

Три ключевых отличия LBM от классических CFD:

  • Локальность операций. Шаг столкновения затрагивает только текущий узел, шаг переноса - только прямых соседей. Никаких глобальных матриц, никаких итеративных решателей для давления.
  • Граничные условия на порядок проще. Моделирование стенки сводится к отражению частиц (bounce-back), а не к вычислению пристеночных функций и согласованию с полем давления.
  • Параллелизм «из коробки». Схема столкновение-перенос распадается на независимые операции, которые распределяются по ядрам без гонок данных при правильном выборе паттерна стриминга.

От кинетической теории к решёточному уравнению Больцмана

Фундамент LBM - кинетическая теория газов, описывающая поведение ансамбля частиц через функцию распределения f(x, v, t). Эта функция задаёт плотность вероятности найти частицу в точке x со скоростью v в момент t. Эволюция f подчиняется уравнению Больцмана, где интеграл столкновений учитывает парные взаимодействия частиц. Прямое вычисление интеграла столкновений требует перебора всех возможных скоростей - задача, нерешаемая для практических приложений.

Решение предложили Бхатнагар, Гросс и Крук в 1954 году. Их приближение BGK заменяет сложный интеграл столкновений простой релаксацией к локальному равновесию с характерным временем τ. Физический смысл: столкновения стремятся вернуть функцию распределения к максвелловскому равновесию, и скорость этого возврата определяется вязкостью среды.

Следующий шаг - дискретизация пространства скоростей. Вместо непрерывного набора направлений выбирается конечное множество векторов, достаточное для сохранения нужных моментов (массы, импульса, тензора напряжений). Так рождается решётка D2Q9 - 2 измерения, 9 скоростей - и её трёхмерные аналоги D3Q15, D3Q19, D3Q27.

Из моментов функции распределения восстанавливаются макроскопические величины:

  • Плотность ρ = Σ f_i
  • Скорость u = (1/ρ) Σ f_i e_i
  • Давление p = c_s² ρ, где c_s - скорость звука на решётке (для D2Q9: c_s = 1/√3)

Разложение Чепмена-Энскога показывает: решёточное уравнение Больцмана воспроизводит уравнения Навье-Стокса с точностью до второго порядка по числу Маха. На практике это разложение не требуется - LBM работает напрямую с функциями распределения, а уравнения гидродинамики выполняются автоматически.

Приближение BGK: столкновения как релаксация к равновесию

Оператор столкновений BGK записывается как:

f_i(x + e_i Δt, t + Δt) - f_i(x, t) = -(1/τ) [f_i(x, t) - f_i^eq(x, t)]

Здесь f_i - функция распределения для i-го скоростного направления, e_i - соответствующий вектор скорости, Δt - шаг по времени, τ - безразмерное время релаксации. Правая часть описывает экспоненциальное затухание отклонения от равновесия с характерным временем τ.

Равновесная функция распределения f_i^eq - это разложение Максвелла до второго порядка по скорости:

f_i^eq = w_i ρ [1 + (e_i · u)/c_s² + (e_i · u)²/(2c_s⁴) - u²/(2c_s²)]

Весовые коэффициенты w_i для D2Q9: 4/9 для покоящегося направления, 1/9 для четырёх ортогональных направлений, 1/36 для четырёх диагональных. Вязкость жидкости связана с τ через соотношение ν = c_s² (τ - 0.5) Δt. Это критически важная формула: при τ → 0.5 вязкость стремится к нулю, и метод теряет устойчивость. На практике τ держат в диапазоне 0.55–1.0.

Решётка D2Q9: дискретизация пространства и скоростей

D2Q9 - стандартная решётка для двумерного LBM. Девять скоростных векторов e_i:

  • e_0 = (0, 0) - покой
  • e_1,2,3,4 = (1,0), (0,1), (-1,0), (0,-1) - ортогональные направления
  • e_5,6,7,8 = (1,1), (-1,1), (-1,-1), (1,-1) - диагональные направления

Выбор D2Q9 не произволен. Решётка должна обладать достаточной симметрией, чтобы тензор напряжений был изотропным - иначе макроскопическое поведение не будет соответствовать уравнениям Навье-Стокса. D2Q9 удовлетворяет этому требованию, сохраняя моменты до четвёртого порядка.

Для трёхмерных задач используют D3Q19 (19 скоростей) как компромисс между точностью и памятью. D3Q15 даёт недостаточную изотропию для некоторых течений, D3Q27 требует на 40% больше памяти при незначительном выигрыше в точности для большинства инженерных задач.

Алгоритм LBM: столкновение и перенос за два шага

Ядро LBM - цикл из двух явных шагов, выполняемых на каждом временном слое. Никаких итераций, никаких неявных схем, никаких решателей СЛАУ. Эта простота - причина, по которой LBM часто реализуют «с нуля» за несколько сотен строк кода.

Псевдокод на C++ для одного временного шага:

// Шаг 1: Столкновение (collision)
for (int y = 0; y < NY; y++) {
    for (int x = 0; x < NX; x++) {
        double rho = 0.0, ux = 0.0, uy = 0.0;
        for (int i = 0; i < 9; i++) {
            rho += f[i][y][x];
            ux += f[i][y][x] * ex[i];
            uy += f[i][y][x] * ey[i];
        }
        ux /= rho; uy /= rho;
        
        for (int i = 0; i < 9; i++) {
            double cu = ex[i]*ux + ey[i]*uy;
            double feq = w[i] * rho * (1.0 + 3.0*cu + 4.5*cu*cu - 1.5*(ux*ux+uy*uy));
            f[i][y][x] += -(1.0/tau) * (f[i][y][x] - feq);
        }
    }
}

// Шаг 2: Перенос (streaming)
for (int y = 0; y < NY; y++) {
    for (int x = 0; x < NX; x++) {
        for (int i = 0; i < 9; i++) {
            int nx = x + ex[i];
            int ny = y + ey[i];
            if (nx >= 0 && nx < NX && ny >= 0 && ny < NY) {
                f_new[i][ny][nx] = f[i][y][x];
            }
        }
    }
}
swap(f, f_new);

Шаг столкновения полностью локален: обновление f_i в узле зависит только от значений в этом же узле. Шаг переноса - это просто копирование данных в соседние узлы вдоль скоростных векторов. Комбинация этих двух операций за один временной шаг эквивалентна интегрированию уравнений Навье-Стокса, но без численного решения уравнения Пуассона.

Граничные условия bounce-back: простое моделирование стенок

Bounce-back - визитная карточка LBM. Частица, достигшая узла, помеченного как стенка, отражается в противоположном направлении на следующем шаге переноса. Для решётки D2Q9 это означает: f_1 меняется с f_3, f_2 с f_4, f_5 с f_7, f_6 с f_8.

Различают два варианта:

  • Full-way bounce-back: стенка расположена на границе узла, отражение происходит немедленно при попытке переноса в запрещённый узел. Прост в реализации, но даёт первый порядок точности.
  • Half-way bounce-back: стенка расположена посередине между узлами, частица отражается и возвращается в исходный узел за один шаг. Второй порядок точности, рекомендуется для инженерных расчётов.

Для входных и выходных границ применяют условия Зоу-Хе: заданные скорость или давление преобразуются в значения функций распределения на границе через равновесную часть и поправку на не-равновесную компоненту, экстраполированную из соседнего узла.

Практическая реализация: C++, OpenMP и суперкомпьютер MareNostrum 5

Тестовая реализация LBM на C++ с распараллеливанием OpenMP запускалась на MareNostrum 5 - суперкомпьютере на базе Intel Sapphire Rapids с 6408 вычислительными узлами, каждый содержит два 56-ядерных процессора. Цель тестов: определить, насколько хорошо LBM масштабируется на многоядерных архитектурах и как паттерн доступа к памяти влияет на производительность.

Конфигурация теста: двумерная решётка 1024×1024 узлов, 100 000 временных шагов, τ = 0.6, граничные условия - движущаяся верхняя крышка (lid-driven cavity). Замерялось время выполнения 10 000 шагов после прогрева кэша.

Результаты масштабирования (ускорение относительно однопоточного режима):

ПотоковВремя (сек)УскорениеЭффективность
1847.21.00×100%
4218.33.88×97.0%
1656.814.91×93.2%
6415.156.11×87.7%
2564.2201.7×78.8%
10241.3651.7×63.6%
20480.81059.0×51.7%

Падение эффективности после 256 потоков объясняется переходом в режим memory-bound: пропускная способность подсистемы памяти перестаёт успевать за вычислительными ядрами. Для решётки 1024×1024 каждая итерация читает и записывает около 72 МБ данных (9 функций распределения × 8 байт × 2 буфера). На 2048 потоках каждый поток обрабатывает всего 512 узлов, и накладные расходы на синхронизацию начинают доминировать.

Интересный эффект: при увеличении размера решётки до 4096×4096 эффективность на 2048 потоках возрастает до 78%. Больше работы на поток - меньше относительные потери на синхронизацию. Этот результат типичен для memory-bound алгоритмов и хорошо изучен в контексте оптимизации инференса LLM, где аналогичные проблемы решаются через PagedAttention и continuous batching.

Pull vs Push: как паттерн стриминга влияет на производительность

Шаг переноса можно реализовать двумя способами:

  • Push (запись вперёд): каждый узел записывает свои f_i в соседние узлы. Требует двух буферов (текущий и следующий временной слой) и атомарных операций или блокировок при параллельной записи в один узел.
  • Pull (чтение назад): каждый узел собирает f_i от соседей. Естественно избегает гонок данных, но требует нестандартного порядка обхода для сохранения локальности кэша.

На MareNostrum 5 pull-реализация оказалась на 23% быстрее push при 256 потоках. Причина: в push-режиме множественные потоки пишут в одни и те же кэш-линии соседних узлов, вызывая false sharing и сброс кэш-линий. Pull-режим читает из соседей, и каждый поток владеет своими выходными данными монопольно. При 2048 потоках разрыв сокращается до 8% - накладные расходы на синхронизацию начинают доминировать над эффектами кэш-когерентности.

Вывод для практиков: если целевая платформа - многоядерный CPU с общей памятью, выбирайте pull. Для GPU-реализаций (CUDA) паттерн меняется: warp-уровневый параллелизм лучше ложится на push с атомарными операциями, как показано в разборе архитектуры Project Zero для инференса LLM на чистом C.

Где LBM незаменим: сложные геометрии, пористые среды и микроканалы

LBM раскрывает свои преимущества в задачах, где построение качественной расчётной сетки для классических CFD требует дней работы инженера. Три области, где метод стал стандартом де-факто:

Пористые среды. Моделирование фильтрации в геологии, распространения загрязнений в грунтовых водах, оптимизация каталитических нейтрализаторов. Геометрия порового пространства задаётся бинарной маской (узел - либо жидкость, либо твёрдое тело), и bounce-back автоматически обрабатывает границы любой сложности. Классическим методам требуется построение пристеночных призматических слоёв и ручная коррекция качества ячеек.

Микроканалы и системы охлаждения. При характерных размерах каналов 10–500 мкм течение остаётся ламинарным (Re < 100), что идеально попадает в «комфортную зону» LBM. Моделирование объектов с уникальной топологией микроканалов - например, биомиметических теплообменников, повторяющих структуру кровеносных сосудов - выполняется без построения сетки. Достаточно воксельного представления геометрии из CAD-модели.

Подвижные границы и многофазные течения. Расширения LBM (метод погружённых границ, свободная энергия, цветной градиент) позволяют моделировать движение частиц в потоке, слияние капель, смачивание поверхностей. Привлекательность подхода в том, что перестроение сетки при движении границы не требуется - достаточно обновить маску узлов.

Отдельный класс задач - аэроакустика низкоскоростных вентиляторов и оптимизация систем охлаждения электроники. LBM напрямую воспроизводит акустические волны как часть решения, без постобработки нестационарного поля давления через аналогию Лайтхилла.

Ограничения LBM: когда метод не работает

Честный список ситуаций, где LBM проигрывает классическим CFD-решателям:

Высокоскоростные течения. Стандартный LBM ограничен числом Маха Ma < 0.3. Причина - разложение равновесной функции распределения до второго порядка, которое теряет точность при больших отклонениях от равновесия. Для трансзвуковых и сверхзвуковых течений требуются модели с расширенным набором скоростей (D2Q17, D2Q21) или гибридные схемы, но они кратно увеличивают требования к памяти и теряют простоту базового алгоритма.

Сжимаемость и теплоперенос. Базовая формулировка LBM изотермична и слабосжимаема (уравнение состояния p = c_s² ρ). Моделирование тепловой конвекции требует добавления отдельной функции распределения для температуры (double-distribution-function approach), а учёт сжимаемости - перехода к моделям с большим числом скоростей и многоуровневым временным шагом.

Память для трёхмерных задач. Решётка D3Q19 хранит 19 чисел с плавающей точкой в каждом узле. Для сетки 512³ это 19 × 512³ × 8 байт ≈ 19.5 ГБ только под функции распределения (с двумя буферами - 39 ГБ). Сетка 1024³ требует 312 ГБ. Классический конечно-объёмный решатель для тех же задач хранит 5 переменных (ρ, u_x, u_y, u_z, p) - в 4–8 раз меньше.

Выбор параметров решётки. Точность LBM чувствительна к соотношению между шагом решётки, шагом по времени и временем релаксации. При τ, близком к 0.5, метод теряет устойчивость из-за недостаточной численной вязкости. При τ > 1.0 возрастает численная диффузия, «размазывающая» вихри. Оптимальный диапазон τ ∈ [0.55, 0.8] накладывает ограничения на разрешение решётки при заданном числе Рейнольдса.

Существуют расширения, частично снимающие эти ограничения: энтропийный LBM для улучшенной устойчивости, многоскоростные модели для сжимаемых течений, схемы с локальным измельчением решётки. Но каждое расширение добавляет сложности, постепенно размывая главное преимущество метода - его концептуальную простоту.

Заключение: LBM как инструмент в арсенале CFD-инженера

Метод решёточных уравнений Больцмана не заменяет классические CFD-решатели - он дополняет их в нише, где традиционные подходы буксуют. Сложная геометрия, пористые среды, микромасштабные течения, задачи с подвижными границами - здесь LBM даёт результат быстрее и с меньшими трудозатратами на подготовку модели.

Ключевые выводы для принятия решения:

  • Если задача требует моделирования сжимаемых течений с Ma > 0.3 - выбирайте конечно-объёмный решатель.
  • Если геометрия настолько сложна, что построение сетки занимает дни - LBM сэкономит время.
  • Если нужна параллельная эффективность выше 90% на сотнях ядер - LBM с pull-стримингом даст её «из коробки».
  • Если доступная память ограничена, а сетка трёхмерная и крупная - считайте объём данных заранее, LBM может не вписаться в бюджет.

Для старта экспериментов используйте открытые библиотеки: Palabos (C++, поддерживает MPI/OpenMP, богатый набор граничных условий и моделей), OpenLB (C++, модульная архитектура, активное сообщество), LB3D (Fortran, специализация на многофазных течениях). Все три библиотеки имеют документацию с примерами и бенчмарками для верификации.

Связь с современными трендами в области вычислений прослеживается напрямую: те же проблемы параллелизма, локальности данных и баланса между вычислениями и памятью, что и в оптимизации инференса LLM, рассмотренной в разборе эффективности обучения 20B Looping Model. Архитектурные паттерны, отработанные в LBM за 30 лет, перекликаются с подходами к распределённым вычислениям в AI: локальность операций, минимизация синхронизаций, эффективное использование подсистемы памяти. Инженеру, владеющему обоими инструментами, проще увидеть эти параллели и применить кросс-дисциплинарные оптимизации.

Подписаться на канал