Ветер у склона, подветренная зона, ротор и волна

Дельтаплан парит у горы, потому что ветер, наткнувшись на склон, вынужден идти вверх. За гребнем происходит обратное: воздух срывается, возникает зона опускания и болтанки — «ротор», в которую дельтапланеристы залетать избегают. Ниже — как это считается формулами (аналитика), откуда они взяты и что в них заведомо упрощено.

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

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

Весь воздух в игре пилот получает через одну функцию Atmosphere.air_velocity_at(pos) (scripts/atmosphere/atmosphere.gd), и модель полёта вызывает её сразу в трёх точках — центр крыла и обе консоли, — поэтому разный поток по размаху кренит и болтает крыло само по себе, без отдельного «крена от порыва». Рельеф атмосфера знает через кеш GroundField — сетку 30 м с высотой и уклоном в каждом узле.

Горизонтальный ветер растёт с высотой над землёй под пилотом по степенному закону и отдельно — с высотой над уровнем моря:

u=uref⋅(agl10 м)0,14⋅(1+0,6⋅msl−mslстарта1000 м) u = u_{ref} \cdot \left(\frac{agl}{10\,\text{м}}\right)^{0{,}14} \cdot \left(1 + 0{,}6 \cdot \frac{msl - msl_{старта}}{1000\,\text{м}}\right)

Направление ветра — одно на весь мир, рельеф его не поворачивает.

Склоновый подъём. У самой земли воздух идёт вдоль рельефа: чем круче склон против ветра, тем сильнее вертикальная составляющая. Точка, где берётся уклон, сдвинута вперёд по ветру (чем выше пилот — тем дальше от склона «чувствуется» подъём), а сила подъёма затухает с высотой:

wridge=clamp(0,85⋅u⋅(w^⋅∇h)⋅e−agls/250 м, ±6 м/с)⋅(1−lee) w_{ridge} = \mathrm{clamp}\Big(0{,}85 \cdot u \cdot (\hat w \cdot \nabla h) \cdot e^{-agl_s / 250\,\text{м}},\ \pm 6\ \text{м/с}\Big) \cdot (1 - lee)

где точка градиента взята со сдвигом 0,8 · agl (максимум 400 м) против ветра. Числа — из configs/atmosphere.json → ridge: efficiency 0,85, decay_height_m 250, forward_shift_factor 0,8, forward_shift_max_m 400, max_lift_ms 6.

Подветренная зона и ротор. За гребнем считается «линия тени» — граница, ниже которой при данном ветре начинается зона отрыва потока: s(p) = maxᵢ(h(p − ŵ·dᵢ) − dᵢ·tg 12°) (отсчёты против ветра на 60…1600 м). Пилот ниже этой линии — в роторе. Сила зоны растёт с глубиной под линией и с высотой самого препятствия и даёт:

  • опускание 0,25…0,7 · u · lee (доля растёт с ветром — «опасность» g от 2 до 5 м/с);
  • болтанку σ 0,5…0,9 · u · lee;
  • редкие рывки вниз в пятнах шума, переносимых ветром;
  • обратный поток у самой земли.

Замер на модельном хребте 300 м (tests/atmosphere/test_lee_rotor.gd):

ветер на стартесредний w в ротореσнаветренный w / σ
2 м/с−0,74 м/с0,94+1,2 / 0,6
5 м/с−3,8 м/с3,4+3,0 / 1,5
8 м/с−6,0 м/с5,0+4,8 / 2,4

Полёт на триммере через гребень 50 м выше него при ветре 6 м/с: −126 м за 30 с (в штиль — −25 м).

Волна (wave_field.gd) — линейная теория Скорера вдоль направления ветра: смещение линий тока — свёртка уклона рельефа с cos(k·d)·exp(−d/L), длина волны λ = 2πU/N (N — частота Брента — Вяйсяля). В гребнях волны — подъём, под ними у земли — роторы, на верхних точках рельефа — линзовидные облака. Слово «волна» пилоту нигде не показывается (оно ей незнакомо), в интерфейсе — только «ветер» и «откуда». По умолчанию волна выключена (wave_strength = 0 во всех текущих погодных сценариях); подветренная зона и ротор при этом работают всегда, от одного ветра.

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

Ключевая идея — модель тонкого возмущения над рельефом (линейная теория Джексона — Ханта): поток раскладывается на средний профиль плюс малое возмущение от формы холма, возмущение убывает с высотой на масштабе полуширины холма. Наша формула w = U·∇h с экспоненциальным затуханием — это её грубое, «орнитологическое» приближение (та же формула используется в моделях подъёма для хищных птиц), без согласования горизонтали и вертикали через уравнение неразрывности.

Реальные величины, с которыми модель сверялась (docs/research/slope_wind.md, docs/research/calibration_data.md):

ЯвлениеТипичные значенияИсточник
Ускорение ветра над вершиной (у земли)ΔS_max ≈ B·H/L: B ≈ 2,0 (длинный хребет), 1,6 (сопка), 0,8 (уступ)Jackson & Hunt 1975; Taylor & Lee 1984
Спад ускорения с высотойΔS(z) ≈ ΔS_max·exp(−A·z/L), A ≈ 2,5–4Taylor & Lee 1984, ASCE 7
Askervein (H = 116 м)ускорение на вершине на 10 м ≈ +80 %Taylor & Teunissen 1987
Седловина (натурные замеры)+40…60 % к подходу на 10 м AGLNeal 1982, Gebbies Pass
Отрыв потока за гребнемначинается при подветренном уклоне ≳ 15–20°Wood 1995
Полоса подъёма≈ высота склона от подножия, на хорошем хребте — до 1–2 высотFAA AC 00-6A; York Soaring, Condor

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

  • Высота полосы подъёма не зависит от размера склона. У нас затухание всегда exp(−agl/250 м). В жизни масштаб затухания — ширина самого склона L: над узким крутым гребнем подъём в модели тянется выше, чем должен, над широким пологим — гаснет слишком рано.
  • Нет ускорения ветра над гребнем. Реально на бровке ветер на 30–90 % сильнее, чем перед склоном; у нас горизонтальный ветер зависит только от высоты над морем, а не от формы рельефа.
  • Мелкий рельеф «бьёт» на любой высоте. Уклон берётся в одной точке с базой 60 м, поэтому лощинка шириной 100 м даёт такой же провал на высоте 100 м, как у земли — только умноженный на общую экспоненту. Физически возмущение от детали размером λ должно затухать с высотой как exp(−2πz/λ).
  • Поток не трёхмерный. Уединённая сопка, отрог («нос») и цирк («чаша») с одинаковым уклоном вдоль ветра дают у нас одинаковый подъём; реально сопку воздух частично обтекает с боков (подъём слабее), в чаше поток сходится (подъём сильнее).
  • Угол ветра к хребту учтён только как косинус; поворот ветра вдоль хребта, усиление болтанки при косом ветре — нет.
  • Седловина / перевал («труба») не усилены — в модели, наоборот, слабее: ниже высота над морем и положе уклон вдоль ветра дают меньший, а не больший подъём и ветер. Сжатия потока в понижении нет.
  • Нет устойчивости атмосферы. Склоновый поток одинаков в устойчивый и неустойчивый день; в жизни при устойчивой стратификации воздух не переваливает через высокие вершины, а обтекает их и уходит в понижения — «труба» в перевалах должна быть сильнее именно тогда.
  • Масса не сохраняется: горизонталь и вертикаль считаются независимо друг от друга.
  • Отрыв — только через линию тени с фиксированным углом 12°, без зависимости от шероховатости поверхности и формы бровки; наветренного «пузыря» у подножия крутого обрыва нет.

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

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

Сравнение нашей формулы с потенциальным обтеканием двумерного хребта (профиль Аньези) показало: сила подъёма у земли в целом правдоподобна (расхождение 10–20 %), но перечисленные выше пункты — нет. Рассмотренные варианты доработки (от дешёвого к дорогому):

  • Улучшенная аналитика (сглаживание уклона по высоте, масштаб затухания = ширина склона, ускорение над гребнем по Тейлору — Ли, признак седловины) — дни работы, рантайм почти не меняется; закрывает почти все найденные расхождения, но остаётся набором эвристик.
  • Линейная 3D-теория через БПФ рельефа — согласованные подъём, ускорение над гребнем, обтекание сопок сбоку, поворот ветра; отрыва всё равно нет.
  • Массосогласованное диагностическое поле (WindNinja-подобное) — плюс блокировка и «труба» в перевалах при устойчивом воздухе; всё ещё без реального отрыва и роторов.
  • Офлайн-CFD — отрыв и реальные роторы, но только для встроенных локаций, сотни МБ данных, и даже CFD плохо предсказывает турбулентность в следе (проверено на полигоне Askervein).

Ни один из вариантов сам по себе не выбран: вместо точечной доработки склона решено считать одно физическое поле воздуха сразу для ветра, подъёма и термиков (план docs/plan/air_model.md), и это сделано — см. модель воздуха. Рассматривался и более узкий план — поле ветра на сетке, согласованное только по массе (docs/archive/plan/wind-field.md) — но в нём не было ни тепла (значит, ни термиков, ни разницы нагретого и холодного склона), ни инерции (мгновенный пересчёт при смене погоды); план воздуха в трёх масштабах его заменил.

Дальше

Модель воздуха в трёх масштабах (страница, docs/guide/air-model.md) даёт разгон на бровке, седловину, обтекание сопок сбоку и ротор не отдельными формулами для склона, а как следствие одного уравнения для всего поля воздуха. Там же — что она пока не умеет: например, разгон у бровки занижен на 15–20 %, а седловина даёт ×2,05 вместо ×1,5.

Подробнее