Переписанный с нуля двумерный решатель LBM D2Q9 с энтропийным столкновением KBC в варианте «модель D» (табл. I 2D-статьи Bösch/Chikatamarla/Karlin, arXiv:1507.02509; в трёхмерных работах — KBC-N1). Код разложен по ролям на пять файлов: математика решателя, бэкенд под процессор, бэкенд под видеокарту, оркестратор, блок гифок. Ядро сверено с первоисточниками тестами (22 шт.): * проектор на сдвиг, выписанный аналитически из представления популяций через натуральные моменты (ур. 10), совпадает с матричным до 1e-13, идемпотентен; * γ из замкнутой оценки (ур. 17) — корень условия максимума энтропии (ур. 15); * сдвиговые моменты релаксируют ровно с 2β при любой γ, вязкость по ур. (5) воспроизводится затуханием сдвиговой волны с точностью лучше 1%; * сквозной бенчмарк статьи (дважды периодический сдвиговый слой, Re=3e4) сходится с fp64-эталоном питоновского решателя 0.6035. Порог вырожденности γ относительный (доля от ⟨Δ|Δ⟩): абсолютный подменял бы γ на 2 на большинстве узлов, молча превращая KBC в LBGK. Доля таких узлов печатается в отчёте. Бэкенды взаимозаменяемы и согласованы: CPU (rayon, f64) и GPU (wgpu/WGSL, f32) на одной постановке совпадают до 4–5 значащих цифр шаг в шаг; на Intel Iris Xe GPU даёт ~105 MLUPS против ~18 у процессора. Топология задачи строится один раз в cpu.rs и загружается в буферы, дублируется только физика — в WGSL. Анимация привязана к физическому времени потока, а не к скорости счёта: задержка кадра берётся из δt = u_lat·δx/u_phys. Дробная задержка раскладывается по целым сотым долям секунды накопителем (3,3,4,3,3,4,…), поэтому накопленное время кадров не уходит от физического; режим --gif-every auto подбирает шаг под реальное время при заданной частоте. Параметризовано: скорость и направление потока, число Рейнольдса, размер домена и размер ячейки в метрах, коэффициент и границы вложенного патча измельчения, семь форм тела (цилиндр, квадрат, ромб, эллипс, профиль NACA, треугольник, пластина) с углом атаки, время и разгон, оператор столкновения, режим выхода и губка, бэкенд, вся анимация и три уровня подробности отчёта. Известное расхождение с питоновским решателем на канальном случае (Cd выше на 9%, St ниже на 12% при совпадающих ⟨ρ⟩, ⟨Cm⟩ и rms Cl) описано в README вместе с тем, что уже исключено как причина. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
69 lines
3.3 KiB
Plaintext
69 lines
3.3 KiB
Plaintext
# ---------------------------------------------------------------------------
|
|
# Сборка
|
|
# ---------------------------------------------------------------------------
|
|
# Каталог пресетов CMake целиком: объектники, SPIR-V, скопированные assets,
|
|
# и _deps — клоны зависимостей через FetchContent (только они ~775 МБ).
|
|
/build/
|
|
/out/
|
|
CMakeUserPresets.json # локальные пресеты разработчика, не общие
|
|
compile_commands.json # генерится (CMAKE_EXPORT_COMPILE_COMMANDS), часто симлинк в корень
|
|
|
|
# Зависимости, если их когда-нибудь начнут класть вручную (сейчас каталог пуст,
|
|
# всё тянет FetchContent). Убрать строку, если вендорить их в репозиторий.
|
|
/extern/*
|
|
!/extern/.gitkeep
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Артефакты выполнения приложения
|
|
# ---------------------------------------------------------------------------
|
|
# SimVulcan пишет их в текущий каталог при запуске (обычно внутри build/,
|
|
# но при запуске из другого места окажутся здесь).
|
|
imgui.ini
|
|
pipeline_cache.bin
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Python (docs/theory — исследовательский код)
|
|
# ---------------------------------------------------------------------------
|
|
__pycache__/
|
|
*.py[cod]
|
|
.ipynb_checkpoints/
|
|
.venv/
|
|
venv/
|
|
.pytest_cache/
|
|
|
|
# Числовые сводки демо-прогонов: генерятся скриптами demos_gpu/*.py на GPU-сервере
|
|
# (ноутбук цитирует их значения в markdown). Сами прогоны воспроизводимы.
|
|
docs/theory/demos_gpu/out/
|
|
docs/theory/solver_2x_sdf/out/
|
|
|
|
# ВАЖНО: docs/theory/figures/ и docs/theory/anim/ НЕ игнорируются намеренно —
|
|
# ноутбук kbc_lbm.ipynb их встраивает, и без них он нечитаем на свежем клоне
|
|
# (перегенерация требует GPU-сервера). См. заметку о них в README ветки research.
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Rust (docs/theory/2d_solver — решатель KBC на Rust)
|
|
# ---------------------------------------------------------------------------
|
|
# Каталог сборки cargo: объектники, зависимости, инкрементальный кэш.
|
|
target/
|
|
# Cargo.lock для бинарного крейта обычно коммитят (воспроизводимость прогонов) —
|
|
# он НЕ игнорируется намеренно.
|
|
|
|
# Артефакты прогонов решателя: гифки, ряды, сводки. Воспроизводятся запуском.
|
|
docs/theory/2d_solver/*.gif
|
|
docs/theory/2d_solver/*.csv
|
|
docs/theory/2d_solver/out/
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Редакторы и ОС
|
|
# ---------------------------------------------------------------------------
|
|
.vs/
|
|
.vscode/
|
|
.idea/
|
|
*.user
|
|
*.suo
|
|
*.swp
|
|
*~
|
|
.DS_Store
|
|
Thumbs.db
|
|
desktop.ini
|