Прототип: клеточный автомат тепла и массы (2D-разрез хребта)

Статус: задача на прототип (29.09.2026), игру не трогает. Цель — проверить идею пользователя: вместо поля ветра «сразу» — клетки, которые обмениваются теплом и массой с соседями (как «Жизнь», как газы в Oxygen Not Included), и посмотреть, что куда течёт над прогретым склоном. Связь с планом поля ветра — docs/plan/wind_field.md, исследование — docs/research/slope_wind.md.

Идея (слова пользователя)

Горячая клетка отдаёт немного тепла соседям вбок и вверх, вверх — больше (тепло поднимается). Тепло уносит массу: у клетки массы становится меньше, и она по тому же правилу подсасывает массу из соседних холодных клеток. Итог — втекание холодного воздуха в прогретую зону снизу и течение массы вверх.

Скоуп

  • Отдельный скрипт на Python (numpy + matplotlib) в tools/research/heat_ca/ (свой venv tools/research/heat_ca/.venv, в .gitignore; зависимости — requirements.txt). Игру и её код не трогать.
  • Двумерный вертикальный разрез: ось X — поперёк хребта (≈ 6 км), ось Z — высота (≈ 3 км); клетка 25–50 м.
  • Рельеф разреза: один хребет высотой ~400–600 м со склонами разной крутизны (одна сторона круче) — клетки под землёй не участвуют.
  • Нагрев снизу: поток тепла в клетки над землёй. Сценарии:
    1. солнце на один склон (второй в тени), ветра нет;
    2. оба склона прогреты одинаково;
    3. то же с фоновым ветром поперёк хребта (фон ~3–5 м/с слева направо);
    4. с инверсией на высоте ~1,5 км над подножием (фон теплеет с высотой выше неё).
  • Фон: температура окружающего воздуха падает с высотой (задаётся «устойчивость»); «горячая» клетка — теплее фона на своей высоте.
  • Правила обмена (исполнитель уточняет, обязательно в форме потоков между парами клеток — что отдал один, получил другой):
    • тепло: диффузия к соседям + перенос вверх, если клетка теплее соседа сверху с поправкой на фон (на инверсии подъём сам гаснет; фиксированный коэффициент «вверх больше» — нельзя);
    • масса: уход массы вместе с теплом вверх; недостача массы в клетке подсасывает массу у соседей (выравнивание «давления»); масса и тепло переносятся фоновым ветром;
    • шаг по времени — устойчивый (без «пилы»); если выравнивание массы идёт медленно — многосеточное ускорение или больше итераций на шаг.
  • Прогон до установившегося состояния (изменения за шаг < порога) и запись истории для анимации.
  • Скорость воздуха в клетке — из потоков массы через её грани (для стрелок и сравнения).

Выходы (всё в tools/research/heat_ca/out/<сценарий>/)

  • temp.png — срез температуры относительно фона (цвет) с контуром рельефа;
  • flow.png — стрелки скорости (или линии тока) поверх температуры; цвет стрелок — вертикальная составляющая (подъём/опускание);
  • w_profile.png — вертикальная скорость по X на высотах 50/150/300/600 м над рельефом;
  • mass_balance.png — сохранение массы и тепла по времени (сумма, приток/отток через границы);
  • evolution.mp4 или .gif (ffmpeg есть) — как складывается циркуляция от старта до установления;
  • summary.md — числа: максимальный подъём и где, приток у подножия, опускание в долине, высота подъёма, время установления, число итераций, время счёта. Плюс общий tools/research/heat_ca/README.md: как запустить (одна команда на сценарий, одна — на все), что означают картинки.

Условия приёмки

  1. Сохранение: масса и тепло сохраняются в пределах 0,1 % (кроме явных притоков через границы и нагрева) — график mass_balance.png.
  2. Прогретый склон поднимает воздух: над прогретым склоном и гребнем — подъём, у подножия прогретого склона — приток к склону (горизонтальная скорость направлена к склону), над долиной / над теневым склоном — опускание. Видно на flow.png.
  3. Сценарий 2: схождение и подъём над гребнем, симметричная картина.
  4. Инверсия (сценарий 4): подъём гаснет у инверсии, наверху — растекание в стороны; выше инверсии возмущение малое.
  5. Фоновый ветер (сценарий 3): подъём наклонён по ветру; картина не разваливается.
  6. Устойчивость счёта: нет «пилы» и роста без предела; установление за разумное число итераций (записать сколько; оценка, сколько это было бы на 3D-сетке 200×200×32 на GPU).
  7. Отчёт: в summary.md — вывод, похоже ли на то, что говорит пилот (подъём у склона, приток снизу, потолок на инверсии), и насколько идея подходит для игры (статичный прогон до установления при загрузке/смене часа; сравнение с решателем Пуассона из плана поля ветра — это по сути он же, записанный локально).
  8. Никаких изменений в игре; коммит — только tools/research/heat_ca/ (без .venv и out/ крупнее ~5 МБ; картинки — в out/, можно закоммитить лучшие) и эта карточка.

Оценка

~0,5–1 день одного агента (Opus). Ветка не нужна — только новые файлы в tools/research/.