Вычислительная гидродинамика на Python: моделируем 2D-течение несжимаемой жидкости
В данном материале рассматривается численное моделирование двумерного течения в замкнутой каверне — классической задачи гидродинамики [4]. Для ее решения мы реализуем на Python алгоритм численного интегрирования системы дифференциальных уравнений в частных производных, описывающей динамику несжимаемой вязкой среды:
Первое соотношение представляет собой уравнение Навье — Стокса (закон сохранения импульса), второе — уравнение неразрывности [1], [4].
Подробный аналитический вывод этих уравнений изложен в статье [15].
Выполним дискретизацию расчетной области на равномерной сетке 100 × 100 с помощью конечно-разностного подхода [18]:
Центрально-разностная аппроксимация первой производной по x:
Аппроксимация второй производной по координате x:
Дискретный аналог дивергенции векторного поля скорости:
Конечно-разностная форма оператора Лапласа для скорости:
Для расщепления по физическим процессам задействуем проекционный метод Чорина[13], опирающийся на теорему о разложении Гельмгольца [14]:
Вычислительная процедура разбивается на последовательность шагов:
Предикторный этап (прогноз скорости): уравнения конвективного переноса и диффузии решаются без учета градиента давления, что дает промежуточное (несоленоидальное) поле скоростей.
При необходимости вычисляется предварительная проекция, позволяющая подавить накапливающиеся погрешности дивергенции.
Корректорный этап: на основе промежуточного поля формируется и итерационно решается уравнение Пуассона для поля давления.
Финальная проекция: вычисленный градиент давления используется для коррекции поля скорости, обеспечивая строгое выполнение условия несжимаемости на новом временном слое.
images = [Image.fromarray(frame) for frame in frames]
gif_path="navier_stokes_cavity.gif"
images[0].save(
gif_path,
save_all=True,
append_images=images[1:],
duration=100, # мс на кадр
loop=0
)
print(f"GIF сохранён: {os.path.abspath(gif_path)}")
Результат моделирования.
Визуализация наглядно демонстрирует формирование первичного вихря и неоднородность поля скоростей. Расчетное число Рейнольдса [16] для заданной конфигурации достигает 10 000 — это многократно превышает критический порог и переводит течение в турбулентный режим.
При этом явные конечно-разностные схемы обладают строгими ограничениями по устойчивости: малейшая корректировка шага интегрирования по времени существенно трансформирует итоговую динамику.
Рассмотрим, к примеру, поведение потока при увеличении шага по времени до dt = 0.0019:
Шаг по времени 0.0019
При шаге dt = 0.002 критерий Куранта нарушается, и численная схема катастрофически расходится:
шаг по времени 0.002
Оценим чувствительность картины течения к изменению вязкостных свойств среды и параметров пространственной дискретизации. Зададим следующие начальные условия:
# --- Параметры задачи ---
L = 1.0
Nx, Ny = 20, 150
dx = L / (Nx - 1)
dy = L / (Ny - 1)
dt = 0.01
nu = 0.001
U_lid = 1
nt = 1000 # сколько шагов по времени (можно уменьшить для теста)
save_every = 10 # сохранять каждый N-й кадр (чтобы GIF не был огромным)
В данном тесте кинематическая вязкость снижена на порядок, а сетка задана резко анизотропной (20 узлов по горизонтали против 150 по вертикали).
При этом граничная скорость движения крышки также уменьшена в 10 раз, благодаря чему инвариантное число Рейнольдса [16] и общий гидродинамический режим остаются неизменными.
Эволюция потока представлена ниже:
Уменьшаем вязкость
Снижение диссипации импульса приводит к росту мелкомасштабных вихрей и выраженным нестационарным пульсациям.
Для демонстрации крайнего случая анизотропии предельно сожмем сетку вдоль оси X (всего 5 ячеек) и детализируем по оси Y (200 ячеек):
# --- Параметры задачи ---
L = 2.0
Nx, Ny = 5, 200
dx = L / (Nx - 1)
dy = L / (Ny - 1)
dt = 0.0001
nu = 0.05
U_lid = 10
nt = 1000 # сколько шагов по времени (можно уменьшить для теста)
save_every = 10 # сохранять каждый N-й кадр (чтобы GIF не был огромным)
В результате формируется характерная слоистая динамика:
Слишком узкая сетка
Вывод: мы успешно построили действующую конечно-разностную модель на Python, численно интегрирующую уравнения Навье — Стокса [1], [4], [15] для плоского случая несжимаемой среды.
Варьируя шаг по времени, вязкость и геометрию расчетной сетки, мы проследили трансформацию структуры течения. Представленный код открыт для экспериментов, позволяя исследовать нестандартные краевые условия и физические параметры.
Анализ фазовой динамики показывает: наиболее интенсивные изменения происходят на начальном переходном этапе, после чего в системе наступает установившееся квазистационарное состояние.
Примечание: переход к полноценному трехмерному (3D) моделированию связан с рядом серьезных сложностей:
Размерность расчетной сетки. Сетка 100 × 100 в 2D содержит 10 000 узлов, тогда как эквивалентная трехмерная модель требует уже 1 000 000 ячеек, а качественная дискретизация — десятки миллионов.
Вычислительные затраты. Резко возрастает потребление оперативной памяти, замедляется сходимость эллиптического решателя Пуассона и кратно возрастает трудоемкость каждого шага.
Условия устойчивости (CFL). Критерии Куранта [17] в 3D требуют предельно малого временного шага dt, что делает прямой расчет ресурсоемким даже на мощных рабочих станциях.
Рендеринг и постпроцессинг. Вместо плоских векторных диаграмм требуются алгоритмы построения изоповерхностей, объемный рендеринг (volumetric rendering) и методы прореживания векторных полей.
По этой причине промышленное моделирование 3D гидродинамики выполняется в специализированных CFD-пакетах (ANSYS Fluent, OpenFOAM, COMSOL и др.) [17] на базе высокопроизводительных кластеров.
Тем не менее, на обычном ПК удалось получить базовую псевдо-3D визуализацию:
Псевдо-3D
Важно подчеркнуть, что фундаментальный вопрос о глобальном существовании и гладкости решений уравнений Навье — Стокса в трехмерном пространстве остается нерешенным и входит в список семи Задач тысячелетия [11], учрежденных Математическим институтом Клэя [12] с наградой в $1 000 000.
Для двумерного случая корректность постановки строго доказана. В 1969 году выдающийся советский математик Ольга Александровна Ладыженская[10] в фундаментальном труде «Математические вопросы динамики вязкой несжимаемой жидкости»[9] установила глобальную однозначную разрешимость начально-краевой задачи для двумерной системы уравнений Навье — Стокса [1], [4], [15].
Статья носит научно-популярный и демонстрационный характер.
Автор делится инженерным опытом реализации и не претендует на статус академического эксперта в области теоретической физики.
Если подобные задачи появятся в школьных экзаменах — это станет серьезным испытанием для нервной системы любого абитуриента!