Погода по температуре и суточный ход

Пилот в игре не выбирает «слабый / средний / сильный день» из списка — он задаёт то, что видит в прогнозе: дневной максимум температуры, силу и направление ветра, облачность. Всё остальное — высота термиков, кромка облаков, сила и частота подъёмов, вероятность грозы, дневной ход — модель выводит из этих чисел физически.

Как это устроено

Экран «Полёт…» задаёт три вещи: температуру днём (0…+40 °C, ползунок с подсказкой «обычно в этом месяце — …»), ветер (0…12 м/с на старте плюс направление, «встречный» или один из 8 румбов) и облачность («Ясно / Переменная / Облачно»). WeatherModel.derive (чистые функции, scripts/atmosphere/weather_model.gd, параметры — configs/weather_model.json) превращает эти три числа в тот же словарь параметров, который раньше был жёстко прописан в пресетах weak/medium/strong. Влажность отдельно не запрашивается — пилот сочла её лишней: точка росы берётся как обычная для месяца и места.

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

zdry=hv+(T+δ)−Tu−Γenv(zu−hv)9,8−Γenv z_{dry} = h_v + \frac{(T + \delta) - T_u - \Gamma_{env}(z_u - h_v)}{9{,}8 - \Gamma_{env}} zlcl=hv+0,122⋅(T−Td) z_{lcl} = h_v + 0{,}122 \cdot (T - T_d)

где h_v — высота долины (нижние 10 % рельефа в радиусе 10 км), δ = 1 К — перегрев пузыря, Γ_env = 4 К/км — климатический градиент выше слоя, T_u и T_d — табличная температура на 3000 м и точка росы для месяца. Верх подъёма — меньшее из двух: z_top = min(z_dry, z_lcl). Запас m = z_dry − z_lcl определяет, будет ли день кучевым или «голубым» (без облаков, если m < −100 м).

Для опорного места (Алтай, июль: h_v ≈ 400 м, T_u = +2 °C, T_d = +8 °C):

Температура днёмz_dryz_lclзапас mкромка над средней землёйдень
+12 °C500 м900 м−400 м300 м (минимум)почти мёртвый, голубой
+16 °C1200 м1400 м−200 м~300–500 мслабые сухие термики
+20 °C1870 м1860 м≈ 0~960 м≈ слабый (редкие облачка)
+26 °C2900 м2600 м300 м~1700 м≈ хороший день
+31 °C3760 м3210 м550 м~2300 м≈ сильный, переразвитие
+34 °C4300 м3570 м700 м~2650 мгрозовой: Cb заметно чаще

Рост кромки — примерно 120–140 м на градус разницы температуры и точки росы, как и знают пилоты по правилу «+1 °C — плюс 120 м».

Сила, размер и частота термиков берутся из кусочно-линейной таблицы опор по высоте верха подъёма (top_agl) — её строки ровно совпадают со значениями прежних пресетов (калибровка сохранена), с поправками на сезон (высота солнца в полдень) и на ветер (сильный ветер рвёт термики: множитель к силе падает с 1,0 при слабом ветре до 0,5 при 45 км/ч).

Облачность по запасу m — доля сухих (безоблачных) термиков, толщина облака, вероятность переразвития и доля термиков, дорастающих до грозовой ячейки (Cb), — всё зависит от одного числа m; подробнее про грозы — на странице «Термики».

Суточный ход

Пилот вводит дневной максимум, а не температуру на момент старта: в прогнозе крупно пишут именно максимум, а при ускорении игрового времени (×10, ×60) число не должно «плыть». Температура на момент t считается по формуле Партона — Логана — синусоида от восхода к максимуму (полдень + 2,5 ч), затем спад к закату:

T(t)=Tmax−A⋅(1−f(t)) T(t) = T_{max} - A \cdot (1 - f(t))

где A — суточная амплитуда по месяцу (июль ≈ 11 К, апрель ≈ 12 К, январь ≈ 6 К), f(t) — синус от восхода (0) до пика (1), после пика спадает к закату до f ≈ 0,65.

Инерция прогрева земли — по 9 классам поверхности (поле, скалы, лес, застройка, вода, снег…), у каждого своя постоянная времени: dS/dt = (a·I(t) − S) / τ. Луг прогревается за ≈ 0,5 ч, скалы и осыпи — за 1,5 ч, вода — за 10 ч (почти не меняется за день), лес отдаёт тепло с запаздыванием ≈ 0,6·τ — поэтому «вечерние термики с камней» и тёплых стен появляются позже, чем над открытым полем.

Утренняя приземная инверсия держит термики низко, пока прогрев её не пробьёт: кромка поднимается всё утро, а не сразу стоит на месте максимума. Сила термиков растёт с потоком тепла как (поток/пик)^(1/3) (масштаб Дирдорфа), доля рождений — как (поток/пик)^1, поэтому вечером термиков заметно меньше, они шире и мягче (мягкость определяется тем же отношением потока к пику: увеличенный радиус, ослабленное ядро, слабее болтанка на краю). Ближе к закату механическая болтанка снижается — воздух у земли успокаивается, а сам склон работает как днём: «тёплый, очень хороший мягкий воздух, хорошая динамика у склона, термиков мало» (слова пилота, легли в основу этого раздела модели).

Погода в игре пересчитывается раз в 60 игровых секунд и «ведётся» плавно (за ~5 минут) без пересоздания поля: живые термики доживают со старыми параметрами, а рождаются уже новые.

Расчёт течения над рельефом с устойчивым слоем (инверсией) — прототип модели воздуха

Физика: законы и приближения

Модель опирается на стандартные приближения авиационной метеорологии: сухая адиабата 9,8 К/км, правило LCL (уровень конденсации) ≈ 122–125 м на градус разницы температуры и точки росы — теоретическое значение подтверждается замерами по параплановым трекам (Франция, 2017–2024): наклон «потолок/спред» 101–133 м/°C в зависимости от рельефа, теория даёт 125 м/°C. Климатический профиль выше перемешанного слоя и суточный ход по Партону — Логану — общепринятые упрощения: реальная атмосфера, конечно, не идеально перемешана и не идеально синусоидальна по времени, но для игры этого достаточно, чтобы «жарче у земли при том же воздухе наверху» физически осмысленно означало «термики выше и злее» — то есть весенние +15 °C при холодном воздухе наверху дают такой же хороший день, как июльские +26 °C.

Границы модели

  • Точка росы постоянна в течение дня (берётся по таблице для месяца) — в жизни она тоже плывёт, хотя гораздо медленнее температуры; влажность как отдельный параметр пилот не задаёт.
  • Источники термиков не смещаются во времени иначе, чем через силу и долю — позиции клеток (thermal_spacing_m) фиксированы на весь день по пиковому потоку, иначе термики «прыгали» бы при каждом пересчёте; это сознательное упрощение ради стабильной картины неба.
  • Высота солнца для выбора источников термиков берётся мгновенно от текущего направления на солнце, а вот сам поток тепла в грунт (и, значит, сила) — с инерцией по классу поверхности; то есть «где будет термик» реагирует на солнце быстрее, чем «насколько он будет силён».
  • Таблица опор по top_agl кусочно-линейна, а не выведена заново из потока тепла в каждой точке: строки таблицы — калиброванные значения прежних пресетов, не прямой расчёт по нагреву конкретного участка склона.
  • Снег на рельефе не рисуется — зимний холодный воздух с термиками от прогретого леса против снежного поля упомянут как идея на будущее, но в модели пока не реализован.
  • Волна скрыта и выключена по умолчанию (wave.enabled = false): физика подветренной волны (сильный ветер поперёк хребта + устойчивый воздух) существует в коде, но слова «волна» пилот не знает, и по умолчанию она не включается — подробнее на странице «Ветер у склона».

Что рассматривали и почему так

Раньше пилот выбирала из пяти готовых пресетов погоды («Слабый / Средний / Сильный день / Гроза / Волна») — по отзыву это выглядело странно: в реальном прогнозе таких категорий нет, есть температура и ветер. Пресеты убраны из интерфейса совсем (без сохранения совместимости со старыми настройками — у игры ещё нет пользователей, которых нужно было бы переносить), но сами значения weak/medium/strong остались во внутренних эталонах и тестах как калибровочные точки: убедиться, что +20/+26/+31 °C дают примерно те же дни, что раньше давали старые пресеты.

Отдельно рассматривался — и был отвергнут в пользу более широкого плана — вариант «поле ветра на сетке, согласованное по массе» (docs/archive/plan/wind-field.md): решать уравнение неразрывности по рельефу и получать физически согласованный ветер без ручных формул для склона. У этого плана не было ни тепла (то есть ни термиков, ни разницы прогретого и холодного склона, ни инверсии), ни инерции (пересчёт по смене погоды был бы мгновенным, без плавного суточного хода). План заменён более общим — docs/plan/air_model.md, «Модель воздуха в трёх масштабах», где тепло и инерция заложены с самого начала.

Дальше

В игре единое физическое поле воздуха на три масштаба: среднее поле (где дует, где держит склон, потолок термиков — установившееся решение уравнений Буссинеска, пересчитывается каждые 15 игровых минут и при смене ветра или погоды), термики (модель пузырей, но источники и сила — из поля, а не из таблицы опор) и возмущения (болтанка и порывы — из статистики турбулентности поля). Суточный ход, инерция прогрева по классам поверхности и температура как входной параметр остались теми же — поле берёт их как вход. Подробнее — модель воздуха, docs/guide/air-model.md.

Подробнее